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