1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <stdio.h>
17 #include <sys/time.h>
18 #include <unistd.h>
19
20 #include "hdf_io_service_if.h"
21 #include "hdf_log.h"
22 #include "osal_mem.h"
23 #include "osal_mutex.h"
24 #include "osal_thread.h"
25 #include "osal_time.h"
26 #include "securec.h"
27 #include "usb_dev_test.h"
28
29 #define HDF_LOG_TAG hcs_prop
30 #define ACM_SERVICE_NAME "usbfn_cdcacm"
31
32 enum UsbSerialCmd {
33 USB_SERIAL_OPEN = 0,
34 USB_SERIAL_CLOSE,
35 USB_SERIAL_READ,
36 USB_SERIAL_WRITE,
37 USB_SERIAL_GET_BAUDRATE,
38 USB_SERIAL_SET_BAUDRATE,
39 USB_SERIAL_SET_PROP,
40 USB_SERIAL_GET_PROP,
41 USB_SERIAL_REGIST_PROP,
42 };
43
44 static struct HdfSBuf *g_data;
45 static struct HdfSBuf *g_reply;
46 static struct HdfIoService *g_acmService;
47
ShowUsage(void)48 static void ShowUsage(void)
49 {
50 HDF_LOGE("Usage options:");
51 HDF_LOGE("g : name of getting prop, as: g idProduct");
52 HDF_LOGE("s : name of setting prop, as: s idProduct 0xa4b7");
53 HDF_LOGE("r : register prop, as: r testa aaaaa");
54 HDF_LOGE("h : show this help message");
55 }
56
DispatcherInit(void)57 static int32_t DispatcherInit(void)
58 {
59 g_acmService = HdfIoServiceBind("usbfn_cdcacm");
60 if (g_acmService == NULL) {
61 HDF_LOGE("%{public}s: GetService err", __func__);
62 return HDF_FAILURE;
63 }
64
65 g_data = HdfSbufObtainDefaultSize();
66 g_reply = HdfSbufObtainDefaultSize();
67 if (g_data == NULL || g_reply == NULL) {
68 HDF_LOGE("%{public}s: GetService err", __func__);
69 return HDF_FAILURE;
70 }
71 return HDF_SUCCESS;
72 }
73
DispatcherDeInit(void)74 static void DispatcherDeInit(void)
75 {
76 HdfSbufRecycle(g_data);
77 HdfSbufRecycle(g_reply);
78 }
79
TestPropGet(const char * propName)80 static int32_t TestPropGet(const char *propName)
81 {
82 int32_t status = -1;
83 const char *propVal = NULL;
84 if (!HdfSbufWriteString(g_data, propName)) {
85 HDF_LOGE("%{public}s:failed to write result", __func__);
86 goto FAIL;
87 }
88 status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_GET_PROP, g_data, g_reply);
89 if (status != HDF_SUCCESS) {
90 HDF_LOGE("%{public}s: Dispatch USB_SERIAL_GET_PROP failed status = %{public}d", __func__, status);
91 goto FAIL;
92 }
93 propVal = HdfSbufReadString(g_reply);
94 if (propVal == NULL) {
95 HDF_LOGE("%{public}s:failed to write result", __func__);
96 goto FAIL;
97 }
98 printf("%s: %s = %s\n", __func__, propName, propVal);
99
100 FAIL:
101 return status;
102 }
103
TestPropSet(const char * propName,const char * propValue)104 static int32_t TestPropSet(const char *propName, const char *propValue)
105 {
106 int32_t status = -1;
107 if (!HdfSbufWriteString(g_data, propName)) {
108 HDF_LOGE("%{public}s:failed to write propName : %{public}s", __func__, propName);
109 goto FAIL;
110 }
111 if (!HdfSbufWriteString(g_data, propValue)) {
112 HDF_LOGE("%{public}s:failed to write propValue : %{public}s", __func__, propValue);
113 goto FAIL;
114 }
115 status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_SET_PROP, g_data, g_reply);
116 if (status != HDF_SUCCESS) {
117 HDF_LOGE("%{public}s: Dispatch USB_SERIAL_SET_PROP failed", __func__);
118 }
119 FAIL:
120 return status;
121 }
122
TestPropRegist(const char * propName,const char * propValue)123 static int32_t TestPropRegist(const char *propName, const char *propValue)
124 {
125 int32_t status;
126
127 status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_OPEN, g_data, g_reply);
128 if (status != HDF_SUCCESS) {
129 HDF_LOGE("%{public}s: Dispatch USB_SERIAL_OPEN err", __func__);
130 return HDF_FAILURE;
131 }
132 if (!HdfSbufWriteString(g_data, propName)) {
133 HDF_LOGE("%{public}s:failed to write propName : %{public}s", __func__, propName);
134 goto FAIL;
135 }
136 if (!HdfSbufWriteString(g_data, propValue)) {
137 HDF_LOGE("%{public}s:failed to write propValue : %{public}s", __func__, propValue);
138 goto FAIL;
139 }
140 status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_REGIST_PROP, g_data, g_reply);
141 if (status != HDF_SUCCESS) {
142 HDF_LOGE("%{public}s: Dispatch USB_SERIAL_SET_PROP failed status = %{public}d", __func__, status);
143 }
144 FAIL:
145 status = g_acmService->dispatcher->Dispatch(&g_acmService->object, USB_SERIAL_CLOSE, g_data, g_reply);
146 if (status != HDF_SUCCESS) {
147 HDF_LOGE("%{public}s: Dispatch USB_SERIAL_CLOSE err", __func__);
148 return HDF_FAILURE;
149 }
150
151 return status;
152 }
153
TestProp(const char * propName,const char * propValue,bool setProp,bool getProp,bool registProp)154 static int32_t TestProp(const char *propName, const char *propValue, bool setProp, bool getProp, bool registProp)
155 {
156 int32_t ret = HDF_SUCCESS;
157 if (DispatcherInit() != HDF_SUCCESS) {
158 return HDF_FAILURE;
159 }
160 if (getProp) {
161 ret = TestPropGet(propName);
162 } else if (setProp) {
163 ret = TestPropSet(propName, propValue);
164 } else if (registProp) {
165 ret = TestPropRegist(propName, propValue);
166 }
167 DispatcherDeInit();
168 return ret;
169 }
170
PropTest(int32_t argc,const char * argv[])171 int32_t PropTest(int32_t argc, const char *argv[])
172 {
173 int32_t ch;
174 const char *propName = NULL;
175 const char *propValue = NULL;
176 bool setProp = false;
177 bool getProp = false;
178 bool registProp = false;
179
180 ch = *(argv[1]);
181 switch (ch) {
182 case 'r':
183 propName = argv[0x2];
184 propValue = argv[0x3];
185 registProp = true;
186 break;
187 case 'g':
188 propName = argv[0x2];
189 getProp = true;
190 break;
191 case 's':
192 propName = argv[0x2];
193 propValue = argv[0x3];
194 setProp = true;
195 break;
196 case 'h':
197 case '?':
198 ShowUsage();
199 return 0;
200 default:
201 break;
202 }
203 return TestProp(propName, propValue, setProp, getProp, registProp);
204 }
205