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 <fcntl.h> 17094332d3Sopenharmony_ci#include <hdf_io_service_if.h> 18094332d3Sopenharmony_ci#include <hdf_log.h> 19094332d3Sopenharmony_ci#include <osal_file.h> 20094332d3Sopenharmony_ci#include <osal_mem.h> 21094332d3Sopenharmony_ci#include <osal_mutex.h> 22094332d3Sopenharmony_ci#include <osal_thread.h> 23094332d3Sopenharmony_ci#include <osal_time.h> 24094332d3Sopenharmony_ci#include <pthread.h> 25094332d3Sopenharmony_ci#include <securec.h> 26094332d3Sopenharmony_ci#include <signal.h> 27094332d3Sopenharmony_ci#include <stdio.h> 28094332d3Sopenharmony_ci#include <sys/time.h> 29094332d3Sopenharmony_ci#include <unistd.h> 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_ci#include "usb_dev_test.h" 32094332d3Sopenharmony_ci 33094332d3Sopenharmony_ci#define HDF_LOG_TAG cdc_acm_speed 34094332d3Sopenharmony_ci 35094332d3Sopenharmony_cienum UsbSerialCmd { 36094332d3Sopenharmony_ci USB_SERIAL_OPEN = 0, 37094332d3Sopenharmony_ci USB_SERIAL_CLOSE, 38094332d3Sopenharmony_ci USB_SERIAL_READ, 39094332d3Sopenharmony_ci USB_SERIAL_WRITE, 40094332d3Sopenharmony_ci USB_SERIAL_GET_BAUDRATE, 41094332d3Sopenharmony_ci USB_SERIAL_SET_BAUDRATE, 42094332d3Sopenharmony_ci USB_SERIAL_SET_PROP, 43094332d3Sopenharmony_ci USB_SERIAL_GET_PROP, 44094332d3Sopenharmony_ci USB_SERIAL_REGIST_PROP, 45094332d3Sopenharmony_ci USB_SERIAL_WRITE_SPEED, 46094332d3Sopenharmony_ci USB_SERIAL_WRITE_GET_TEMP_SPEED, 47094332d3Sopenharmony_ci USB_SERIAL_WRITE_SPEED_DONE, 48094332d3Sopenharmony_ci USB_SERIAL_WRITE_GET_TEMP_SPEED_UINT32, 49094332d3Sopenharmony_ci}; 50094332d3Sopenharmony_ci 51094332d3Sopenharmony_cistatic struct HdfSBuf *g_data; 52094332d3Sopenharmony_cistatic struct HdfSBuf *g_reply; 53094332d3Sopenharmony_cistatic struct HdfIoService *g_acmService; 54094332d3Sopenharmony_cistatic bool g_readRuning = false; 55094332d3Sopenharmony_cistatic sigset_t g_mask; 56094332d3Sopenharmony_ci 57094332d3Sopenharmony_cistatic void TestSpeed(void) 58094332d3Sopenharmony_ci{ 59094332d3Sopenharmony_ci HdfSbufFlush(g_reply); 60094332d3Sopenharmony_ci int32_t status = g_acmService->dispatcher->Dispatch(&g_acmService->object, 61094332d3Sopenharmony_ci USB_SERIAL_WRITE_SPEED, g_data, g_reply); 62094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 63094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_WRITE_SPEED failed status = %{public}d", 64094332d3Sopenharmony_ci __func__, status); 65094332d3Sopenharmony_ci return; 66094332d3Sopenharmony_ci } 67094332d3Sopenharmony_ci} 68094332d3Sopenharmony_ci 69094332d3Sopenharmony_cistatic void GetTempSpeed(void) 70094332d3Sopenharmony_ci{ 71094332d3Sopenharmony_ci const float calc = 10000; 72094332d3Sopenharmony_ci uint32_t speed = 0; 73094332d3Sopenharmony_ci HdfSbufFlush(g_reply); 74094332d3Sopenharmony_ci int32_t status = g_acmService->dispatcher->Dispatch(&g_acmService->object, 75094332d3Sopenharmony_ci USB_SERIAL_WRITE_GET_TEMP_SPEED_UINT32, g_data, g_reply); 76094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 77094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_WRITE_GET_TEMP_SPEED failed status = %{public}d", 78094332d3Sopenharmony_ci __func__, status); 79094332d3Sopenharmony_ci return; 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci if (!HdfSbufReadUint32(g_reply, &speed)) { 82094332d3Sopenharmony_ci HDF_LOGE("%{public}s: HdfSbufReadFloat failed", __func__); 83094332d3Sopenharmony_ci return; 84094332d3Sopenharmony_ci } 85094332d3Sopenharmony_ci if (speed > 0) { 86094332d3Sopenharmony_ci printf("speed : %f MB/s\n", (float)speed / calc); 87094332d3Sopenharmony_ci } 88094332d3Sopenharmony_ci} 89094332d3Sopenharmony_ci 90094332d3Sopenharmony_cistatic void WriteSpeedDone(void) 91094332d3Sopenharmony_ci{ 92094332d3Sopenharmony_ci int32_t status = g_acmService->dispatcher->Dispatch(g_acmService, 93094332d3Sopenharmony_ci USB_SERIAL_WRITE_SPEED_DONE, g_data, g_reply); 94094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 95094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_WRITE_SPEED_DONE failed status = %{public}d", 96094332d3Sopenharmony_ci __func__, status); 97094332d3Sopenharmony_ci return; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci} 100094332d3Sopenharmony_ci 101094332d3Sopenharmony_cistatic void *StopHandler(void *arg) 102094332d3Sopenharmony_ci{ 103094332d3Sopenharmony_ci (void)arg; 104094332d3Sopenharmony_ci int32_t signo; 105094332d3Sopenharmony_ci while (1) { 106094332d3Sopenharmony_ci int32_t err = sigwait(&g_mask, &signo); 107094332d3Sopenharmony_ci if (err != 0) { 108094332d3Sopenharmony_ci printf("Sigwait failed: %d\n", err); 109094332d3Sopenharmony_ci } 110094332d3Sopenharmony_ci 111094332d3Sopenharmony_ci switch (signo) { 112094332d3Sopenharmony_ci case SIGINT: 113094332d3Sopenharmony_ci case SIGQUIT: 114094332d3Sopenharmony_ci printf("AcmSpeedWrite exit\n"); 115094332d3Sopenharmony_ci WriteSpeedDone(); 116094332d3Sopenharmony_ci g_readRuning = false; 117094332d3Sopenharmony_ci return NULL; 118094332d3Sopenharmony_ci default: 119094332d3Sopenharmony_ci printf("Unexpected signal %d\n", signo); 120094332d3Sopenharmony_ci } 121094332d3Sopenharmony_ci } 122094332d3Sopenharmony_ci} 123094332d3Sopenharmony_ci 124094332d3Sopenharmony_cistatic pthread_t g_threads; 125094332d3Sopenharmony_cistatic void StartStopHandler(void) 126094332d3Sopenharmony_ci{ 127094332d3Sopenharmony_ci sigemptyset(&g_mask); 128094332d3Sopenharmony_ci sigaddset(&g_mask, SIGINT); 129094332d3Sopenharmony_ci sigaddset(&g_mask, SIGQUIT); 130094332d3Sopenharmony_ci if ((pthread_sigmask(SIG_BLOCK, &g_mask, NULL)) != 0) { 131094332d3Sopenharmony_ci printf("SIG_BLOCK error\n"); 132094332d3Sopenharmony_ci return; 133094332d3Sopenharmony_ci } 134094332d3Sopenharmony_ci if (pthread_create(&g_threads, NULL, StopHandler, NULL) != 0) { 135094332d3Sopenharmony_ci printf("Could not create core thread\n"); 136094332d3Sopenharmony_ci return; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci} 139094332d3Sopenharmony_ci 140094332d3Sopenharmony_ciint32_t AcmSpeedWrite(int32_t argc, const char *argv[]) 141094332d3Sopenharmony_ci{ 142094332d3Sopenharmony_ci (void)argc; 143094332d3Sopenharmony_ci (void)argv; 144094332d3Sopenharmony_ci int32_t status; 145094332d3Sopenharmony_ci 146094332d3Sopenharmony_ci g_acmService = HdfIoServiceBind("usbfn_cdcacm"); 147094332d3Sopenharmony_ci if (g_acmService == NULL || g_acmService->dispatcher == NULL || g_acmService->dispatcher->Dispatch == NULL) { 148094332d3Sopenharmony_ci HDF_LOGE("%{public}s: GetService err", __func__); 149094332d3Sopenharmony_ci return HDF_FAILURE; 150094332d3Sopenharmony_ci } 151094332d3Sopenharmony_ci 152094332d3Sopenharmony_ci g_data = HdfSbufObtainDefaultSize(); 153094332d3Sopenharmony_ci g_reply = HdfSbufObtainDefaultSize(); 154094332d3Sopenharmony_ci if (g_data == NULL || g_reply == NULL) { 155094332d3Sopenharmony_ci HDF_LOGE("%{public}s: GetService err", __func__); 156094332d3Sopenharmony_ci return HDF_FAILURE; 157094332d3Sopenharmony_ci } 158094332d3Sopenharmony_ci 159094332d3Sopenharmony_ci status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_OPEN, g_data, g_reply); 160094332d3Sopenharmony_ci if (status) { 161094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_OPEN err", __func__); 162094332d3Sopenharmony_ci return HDF_FAILURE; 163094332d3Sopenharmony_ci } 164094332d3Sopenharmony_ci StartStopHandler(); 165094332d3Sopenharmony_ci TestSpeed(); 166094332d3Sopenharmony_ci g_readRuning = true; 167094332d3Sopenharmony_ci while (g_readRuning) { 168094332d3Sopenharmony_ci sleep(0x2); 169094332d3Sopenharmony_ci if (g_readRuning) { 170094332d3Sopenharmony_ci GetTempSpeed(); 171094332d3Sopenharmony_ci } 172094332d3Sopenharmony_ci } 173094332d3Sopenharmony_ci 174094332d3Sopenharmony_ci status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_CLOSE, g_data, g_reply); 175094332d3Sopenharmony_ci if (status != HDF_SUCCESS) { 176094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Dispatch USB_SERIAL_CLOSE err", __func__); 177094332d3Sopenharmony_ci return HDF_FAILURE; 178094332d3Sopenharmony_ci } 179094332d3Sopenharmony_ci 180094332d3Sopenharmony_ci HdfSbufRecycle(g_data); 181094332d3Sopenharmony_ci HdfSbufRecycle(g_reply); 182094332d3Sopenharmony_ci HdfIoServiceRecycle(g_acmService); 183094332d3Sopenharmony_ci return 0; 184094332d3Sopenharmony_ci} 185