1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include <pthread.h> 17094332d3Sopenharmony_ci#include <stdio.h> 18094332d3Sopenharmony_ci#include <sys/time.h> 19094332d3Sopenharmony_ci#include <unistd.h> 20094332d3Sopenharmony_ci 21094332d3Sopenharmony_ci#include "hdf_io_service_if.h" 22094332d3Sopenharmony_ci#include "hdf_log.h" 23094332d3Sopenharmony_ci#include "osal_mem.h" 24094332d3Sopenharmony_ci#include "osal_mutex.h" 25094332d3Sopenharmony_ci#include "osal_thread.h" 26094332d3Sopenharmony_ci#include "osal_time.h" 27094332d3Sopenharmony_ci#include "securec.h" 28094332d3Sopenharmony_ci#include "usb_dev_test.h" 29094332d3Sopenharmony_ci 30094332d3Sopenharmony_ci#define HDF_LOG_TAG cdc_acm_test 31094332d3Sopenharmony_ci 32094332d3Sopenharmony_cienum UsbSerialCmd { 33094332d3Sopenharmony_ci USB_SERIAL_OPEN = 0, 34094332d3Sopenharmony_ci USB_SERIAL_CLOSE, 35094332d3Sopenharmony_ci USB_SERIAL_READ, 36094332d3Sopenharmony_ci USB_SERIAL_WRITE, 37094332d3Sopenharmony_ci USB_SERIAL_GET_BAUDRATE, 38094332d3Sopenharmony_ci USB_SERIAL_SET_BAUDRATE, 39094332d3Sopenharmony_ci USB_SERIAL_SET_PROP, 40094332d3Sopenharmony_ci USB_SERIAL_GET_PROP, 41094332d3Sopenharmony_ci USB_SERIAL_REGIST_PROP, 42094332d3Sopenharmony_ci}; 43094332d3Sopenharmony_ci 44094332d3Sopenharmony_cistatic struct HdfSBuf *g_data; 45094332d3Sopenharmony_cistatic struct HdfSBuf *g_reply; 46094332d3Sopenharmony_cistatic struct HdfIoService *g_acmService; 47094332d3Sopenharmony_cistatic struct OsalMutex g_lock; 48094332d3Sopenharmony_ci 49094332d3Sopenharmony_cistatic void TestWrite(const char *buf) 50094332d3Sopenharmony_ci{ 51094332d3Sopenharmony_ci HdfSbufFlush(g_data); 52094332d3Sopenharmony_ci (void)HdfSbufWriteString(g_data, buf); 53094332d3Sopenharmony_ci int32_t status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_WRITE, g_data, g_reply); 54094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 55094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_WRITE failed status = %{public}d", __func__, status); 56094332d3Sopenharmony_ci } 57094332d3Sopenharmony_ci} 58094332d3Sopenharmony_ci 59094332d3Sopenharmony_cistatic void TestRead(void) 60094332d3Sopenharmony_ci{ 61094332d3Sopenharmony_ci HdfSbufFlush(g_reply); 62094332d3Sopenharmony_ci int32_t status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_READ, g_data, g_reply); 63094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 64094332d3Sopenharmony_ci printf("%s: Dispatch USB_SERIAL_READ failed status = %d", __func__, status); 65094332d3Sopenharmony_ci return; 66094332d3Sopenharmony_ci } 67094332d3Sopenharmony_ci if (HdfSbufGetDataSize(g_reply) != 0) { 68094332d3Sopenharmony_ci const char *tmp = HdfSbufReadString(g_reply); 69094332d3Sopenharmony_ci if (tmp && strlen(tmp) > 0) { 70094332d3Sopenharmony_ci printf("%s: read : %s \n", __func__, tmp); 71094332d3Sopenharmony_ci } 72094332d3Sopenharmony_ci } 73094332d3Sopenharmony_ci} 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_cistatic bool g_readRuning = false; 76094332d3Sopenharmony_ci#define SLEEP_READ 100 77094332d3Sopenharmony_cistatic void ReadThread(void *arg) 78094332d3Sopenharmony_ci{ 79094332d3Sopenharmony_ci (void)arg; 80094332d3Sopenharmony_ci while (g_readRuning) { 81094332d3Sopenharmony_ci OsalMutexLock(&g_lock); 82094332d3Sopenharmony_ci TestRead(); 83094332d3Sopenharmony_ci OsalMutexUnlock(&g_lock); 84094332d3Sopenharmony_ci OsalMDelay(SLEEP_READ); 85094332d3Sopenharmony_ci } 86094332d3Sopenharmony_ci} 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_cistatic void StartPThreadRead(void) 89094332d3Sopenharmony_ci{ 90094332d3Sopenharmony_ci pthread_t tid; 91094332d3Sopenharmony_ci if ((pthread_create(&tid, NULL, ReadThread, NULL)) == -1) { 92094332d3Sopenharmony_ci printf("create error!\n"); 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci} 95094332d3Sopenharmony_ci 96094332d3Sopenharmony_ci#define STR_LEN 256 97094332d3Sopenharmony_ci#define SLEEP_GETCHAR 100000 98094332d3Sopenharmony_cistatic void Test02(void) 99094332d3Sopenharmony_ci{ 100094332d3Sopenharmony_ci char str[STR_LEN] = {0}; 101094332d3Sopenharmony_ci char *getStr = NULL; 102094332d3Sopenharmony_ci if (OsalMutexInit(&g_lock) != HDF_SUCCESS) { 103094332d3Sopenharmony_ci HDF_LOGE("%{public}s: init lock fail!", __func__); 104094332d3Sopenharmony_ci return; 105094332d3Sopenharmony_ci } 106094332d3Sopenharmony_ci while (1) { 107094332d3Sopenharmony_ci printf("\ninput: \nr: for read acm\nw: for write acm \nq: for exit \n"); 108094332d3Sopenharmony_ci char ch = (char)getchar(); 109094332d3Sopenharmony_ci if (ch == 'r') { 110094332d3Sopenharmony_ci printf("input: 'q' quit reading\n"); 111094332d3Sopenharmony_ci g_readRuning = true; 112094332d3Sopenharmony_ci StartPThreadRead(); 113094332d3Sopenharmony_ci while (getchar() != 'q') { 114094332d3Sopenharmony_ci printf("input: 'q' quit reading\n"); 115094332d3Sopenharmony_ci usleep(SLEEP_GETCHAR); 116094332d3Sopenharmony_ci } 117094332d3Sopenharmony_ci g_readRuning = false; 118094332d3Sopenharmony_ci } else if (ch == 'w') { 119094332d3Sopenharmony_ci printf("input strings and press enter to send\n"); 120094332d3Sopenharmony_ci getchar(); 121094332d3Sopenharmony_ci getStr = gets_s(str, STR_LEN - 1); 122094332d3Sopenharmony_ci if (getStr == NULL) { 123094332d3Sopenharmony_ci HDF_LOGE("%{public}s: gets_s failed", __func__); 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci TestWrite(str); 126094332d3Sopenharmony_ci } else if (ch == 'q') { 127094332d3Sopenharmony_ci return; 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci } 130094332d3Sopenharmony_ci} 131094332d3Sopenharmony_ci 132094332d3Sopenharmony_ciint32_t AcmTest(int32_t argc, const char *argv[]) 133094332d3Sopenharmony_ci{ 134094332d3Sopenharmony_ci (void)argc; 135094332d3Sopenharmony_ci (void)argv; 136094332d3Sopenharmony_ci int32_t status; 137094332d3Sopenharmony_ci g_acmService = HdfIoServiceBind("usbfn_cdcacm"); 138094332d3Sopenharmony_ci if (g_acmService == NULL || g_acmService->dispatcher == NULL || g_acmService->dispatcher->Dispatch == NULL) { 139094332d3Sopenharmony_ci HDF_LOGE("%{public}s: GetService err", __func__); 140094332d3Sopenharmony_ci return HDF_FAILURE; 141094332d3Sopenharmony_ci } 142094332d3Sopenharmony_ci 143094332d3Sopenharmony_ci g_data = HdfSbufObtainDefaultSize(); 144094332d3Sopenharmony_ci g_reply = HdfSbufObtainDefaultSize(); 145094332d3Sopenharmony_ci if (g_data == NULL || g_reply == NULL) { 146094332d3Sopenharmony_ci HDF_LOGE("%{public}s: GetService err", __func__); 147094332d3Sopenharmony_ci return HDF_FAILURE; 148094332d3Sopenharmony_ci } 149094332d3Sopenharmony_ci 150094332d3Sopenharmony_ci status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_OPEN, g_data, g_reply); 151094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 152094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_OPEN err", __func__); 153094332d3Sopenharmony_ci return HDF_FAILURE; 154094332d3Sopenharmony_ci } 155094332d3Sopenharmony_ci 156094332d3Sopenharmony_ci Test02(); 157094332d3Sopenharmony_ci 158094332d3Sopenharmony_ci status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_CLOSE, g_data, g_reply); 159094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 160094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_CLOSE err", __func__); 161094332d3Sopenharmony_ci return HDF_FAILURE; 162094332d3Sopenharmony_ci } 163094332d3Sopenharmony_ci 164094332d3Sopenharmony_ci HdfSbufRecycle(g_data); 165094332d3Sopenharmony_ci HdfSbufRecycle(g_reply); 166094332d3Sopenharmony_ci return HDF_SUCCESS; 167094332d3Sopenharmony_ci} 168