summaryrefslogtreecommitdiffstats
path: root/ipc_unit_test
diff options
context:
space:
mode:
authorNaoto Yamaguchi <i33399_yamaguchi@aisin-aw.co.jp>2021-08-04 09:35:49 +0000
committerNaoto Yamaguchi <i33399_yamaguchi@aisin-aw.co.jp>2021-08-04 09:39:44 +0000
commitb27fb69aa966866920e86b10f7d10326a0042e33 (patch)
treef90fec01a1f9dcbc0aedd7ecad199148e8dd335c /ipc_unit_test
parent8203dc658421473aed7e2236aabb1992a9011dfe (diff)
parent61bf7d8b56d97e1600980f44ffd97df07febfb80 (diff)
Import cluster-ipc source code from experimental repositorylamprey_12.0.1lamprey/12.0.1koi_11.0.4koi/11.0.412.0.111.0.4
Maruyama-san et al. are developing instrument cluster ipc library in in experimental repository. This patch is upstreaming that source code. Previous commit message is not match AGL commit message requirement. But, that commit message need to record who is contributed. Merge remote-tracking branch 'github/main' Signed-off-by: Naoto Yamaguchi <i33399_yamaguchi@aisin-aw.co.jp>
Diffstat (limited to 'ipc_unit_test')
-rw-r--r--ipc_unit_test/CMakeLists.txt22
-rw-r--r--ipc_unit_test/ipc_unit_test_client.c171
-rw-r--r--ipc_unit_test/ipc_unit_test_common.c100
-rw-r--r--ipc_unit_test/ipc_unit_test_common.h34
-rw-r--r--ipc_unit_test/ipc_unit_test_server.c218
5 files changed, 545 insertions, 0 deletions
diff --git a/ipc_unit_test/CMakeLists.txt b/ipc_unit_test/CMakeLists.txt
new file mode 100644
index 0000000..944ad0b
--- /dev/null
+++ b/ipc_unit_test/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Copyright (c) 2021, Nippon Seiki Co., Ltd.
+# SPDX-License-Identifier: Apache-2.0
+
+# Define project Targets
+set(TEST_CLIENT_NAME ipc_unit_test_client)
+set(TEST_SERVER_NAME ipc_unit_test_server)
+
+add_executable(${TEST_CLIENT_NAME} ipc_unit_test_client.c ipc_unit_test_common.c)
+target_link_libraries(${TEST_CLIENT_NAME} ${TARGET_NAME})
+target_include_directories(${TEST_CLIENT_NAME} PRIVATE
+ ./
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
+)
+
+add_executable(${TEST_SERVER_NAME} ipc_unit_test_server.c ipc_unit_test_common.c)
+target_link_libraries(${TEST_SERVER_NAME} ${TARGET_NAME})
+target_include_directories(${TEST_SERVER_NAME} PRIVATE
+ ./
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
+)
+
+
diff --git a/ipc_unit_test/ipc_unit_test_client.c b/ipc_unit_test/ipc_unit_test_client.c
new file mode 100644
index 0000000..cc09d2a
--- /dev/null
+++ b/ipc_unit_test/ipc_unit_test_client.c
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2021, Nippon Seiki Co., Ltd.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <cluster_ipc.h>
+
+#include "ipc_unit_test_common.h"
+
+IPC_DATA_IC_SERVICE_S g_dataIcService;
+
+static void changeNotifyCb(void* pData, signed int size, int kind);
+static void helpPrint(void);
+static void listPrint(void);
+
+int main(void)
+{
+ IPC_RET_E ret;
+ char command[10];
+ char dummy[10];
+ bool isRunning = true;
+ signed int size;
+ char *pRetStr;
+
+ memset(&g_dataIcService, 0, sizeof(g_dataIcService));
+
+ ret = ipcClientStart(IPC_USAGE_TYPE_IC_SERVICE);
+ if (ret != IPC_RET_OK) {
+ printf("ipcClientStart Error:%d\n", ret);
+ goto end;
+ }
+
+ ret = ipcRegisterCallback(IPC_USAGE_TYPE_IC_SERVICE, changeNotifyCb);
+ if (ret != IPC_RET_OK) {
+ printf("ipcRegisterCallback Error:%d\n", ret);
+ goto end;
+ }
+
+ while(isRunning) {
+ printf("command (h=help, q=quit):");
+ pRetStr = fgets(command, 10, stdin);
+ if (pRetStr == NULL) {
+ continue;
+ }
+ memcpy(dummy, command, 10);
+
+ while(strlen(dummy) == 9 && dummy[8] != '\n') {
+ pRetStr = fgets(dummy, 10, stdin);
+ if (pRetStr == NULL) {
+ break;
+ }
+ }
+
+ command[strlen(command)-1] = '\0';
+
+ switch(command[0]) {
+ case 'h':
+ helpPrint();
+ break;
+ case 'q':
+ isRunning = false;
+ break;
+ case 'r':
+ size = sizeof(g_dataIcService);
+ ret = ipcReadDataPool(IPC_USAGE_TYPE_IC_SERVICE, &g_dataIcService, &size);
+ printf("ipcReadDataPool return:%d\n", ret);
+ listPrint();
+ break;
+ default:
+ break;
+ }
+ }
+
+end:
+ ipcClientStop(IPC_USAGE_TYPE_IC_SERVICE);
+ printf("bye...\n");
+ sleep(1);
+
+ return 0;
+}
+
+static void changeNotifyCb(void* pData, signed int size, int kind)
+{
+ signed long longVal;
+ signed int intVal;
+ signed short shortVal;
+ signed char charVal;
+
+ printf("Enter %s\n", __func__);
+
+ switch(size) {
+ case 8:
+ longVal = *((signed long*)pData);
+ printf("kind = %d, size = %d, data=%ld\n", kind, size, longVal);
+ break;
+ case 4:
+ intVal = *((signed int*)pData);
+ printf("kind = %d, size = %d, data=%d\n", kind, size, intVal);
+ break;
+ case 2:
+ shortVal = *((signed short *)pData);
+ printf("kind = %d, size = %d, data=%d\n", kind, size, shortVal);
+ break;
+ default:
+ charVal = *((signed char *)pData);
+ printf("kind = %d, size = %d, data=%d\n", kind, size, charVal);
+ break;
+ }
+ printf("Leave %s\n", __func__);
+ return;
+}
+
+static void helpPrint(void)
+{
+ printf("\n-----------\n");
+ printf("'h' : help\n");
+ printf("'q' : quit\n");
+ printf("'r' : read from Client data pool\n");
+ printf("-----------\n\n");
+}
+
+static void listPrint(void)
+{
+ int i;
+ signed long longVal;
+ signed int intVal;
+ signed short shortVal;
+ signed char charVal;
+ void *pValue;
+
+ for (i = 0; i < IC_SERVICE_LIST_NUM; i++) {
+ pValue = (void *)&g_dataIcService + IcServiceList[i].offset;
+ switch(IcServiceList[i].size) {
+ case 8:
+ longVal = *((signed long*)pValue);
+ printf("%3d: %s(%d) = %ld\n", i, IcServiceList[i].name, IcServiceList[i].size, longVal);
+ break;
+ case 4:
+ intVal = *((signed int*)pValue);
+ printf("%3d: %s(%d) = %d\n", i, IcServiceList[i].name, IcServiceList[i].size, intVal);
+ break;
+ case 2:
+ shortVal = *((signed short *)pValue);
+ printf("%3d: %s(%d) = %d\n", i, IcServiceList[i].name, IcServiceList[i].size, shortVal);
+ break;
+ default:
+ charVal = *((signed char *)pValue);
+ printf("%3d: %s(%d) = %d\n", i, IcServiceList[i].name, IcServiceList[i].size, charVal);
+ break;
+ }
+ }
+}
+
diff --git a/ipc_unit_test/ipc_unit_test_common.c b/ipc_unit_test/ipc_unit_test_common.c
new file mode 100644
index 0000000..26d4830
--- /dev/null
+++ b/ipc_unit_test/ipc_unit_test_common.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2021, Nippon Seiki Co., Ltd.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <cluster_ipc.h>
+#include "ipc_unit_test_common.h"
+
+IPC_UNIT_TEST_DATA_LIST IcServiceList[] = {
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, turnR),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, turnL),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, brake),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, seatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, frontRightSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, frontCenterSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, frontLeftSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, mid1RightSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, mid1CenterSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, mid1LeftSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, mid2RightSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, mid2CenterSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, mid2LeftSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, rearRightSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, rearCenterSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, rearLeftSeatbelt),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, highbeam),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, door),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, frontRightDoor),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, frontLeftDoor),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, rearRightDoor),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, rearLeftDoor),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, trunkDoor),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, hoodDoor),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, eps),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, srsAirbag),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, abs),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, lowBattery),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, oilPress),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, engine),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, fuel),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, immobi),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, tmFail),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, espAct),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, espOff),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, adaptingLighting),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, autoStop),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, autoStopFail),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, parkingLights),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, frontFog),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, exteriorLightFault),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, accFail),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, ldwOff),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, hillDescent),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, autoHiBeamGreen),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, autoHiBeamAmber),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, sportsMode),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, ldwOperate),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, generalWarn),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, drivingPowerMode),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, hotTemp),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, lowTemp),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, gearAtVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, gearMtVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, spAnalogVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, spAnaDigUnitVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, taAnalogVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, trcomTripAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, trcomTripBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, trcomOdoVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, trcomUnitVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, avgSpeedAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, avgSpeedBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, hourAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, hourBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, minuteAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, minuteBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, secondAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, secondBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, oTempVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, oTempUnitVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, cruRangeVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, avgFuelAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, avgFuelBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, insFuelAVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, insFuelBVal),
+ DEFINE_STRUCT_DATA(IPC_DATA_IC_SERVICE_S, fuelEconomyUnitVal)
+};
+
diff --git a/ipc_unit_test/ipc_unit_test_common.h b/ipc_unit_test/ipc_unit_test_common.h
new file mode 100644
index 0000000..e0a3ed5
--- /dev/null
+++ b/ipc_unit_test/ipc_unit_test_common.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2021, Nippon Seiki Co., Ltd.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef IPC_UNIT_TEST_COMMON_H
+#define IPC_UNIT_TEST_COMMON_H
+#include <stddef.h>
+
+#define DEFINE_STRUCT_DATA(struct_name, member) \
+ {#member, offsetof(struct_name, member), sizeof(((struct_name *)0)->member)}
+#define IC_SERVICE_LIST_NUM (77)
+
+typedef struct {
+ const char *name;
+ int offset;
+ int size;
+} IPC_UNIT_TEST_DATA_LIST;
+
+extern IPC_UNIT_TEST_DATA_LIST IcServiceList[];
+
+#endif // IPC_UNIT_TEST_COMMON_H
diff --git a/ipc_unit_test/ipc_unit_test_server.c b/ipc_unit_test/ipc_unit_test_server.c
new file mode 100644
index 0000000..807db2c
--- /dev/null
+++ b/ipc_unit_test/ipc_unit_test_server.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2021, Nippon Seiki Co., Ltd.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#include <cluster_ipc.h>
+
+#include "ipc_unit_test_common.h"
+
+static void helpPrint(void);
+static void helpWritePrint(void);
+static void listPrint(void);
+static void writeData(void);
+static void writeDataToStruct(int id, long value);
+
+IPC_DATA_IC_SERVICE_S g_dataIcService;
+
+int main(void)
+{
+ IPC_RET_E ret;
+ char command[10];
+ char dummy[10];
+ bool isRunning = true;
+ char *pRetStr;
+
+ memset(&g_dataIcService, 0, sizeof(g_dataIcService));
+
+ ret = ipcServerStart(IPC_USAGE_TYPE_IC_SERVICE);
+ if (ret != IPC_RET_OK) {
+ printf("ipcServerStart Error:%d\n", ret);
+ goto end;
+ }
+
+ while(isRunning) {
+ printf("command (h=help, q=quit):");
+ pRetStr = fgets(command, 10, stdin);
+ if (pRetStr == NULL) {
+ continue;
+ }
+ memcpy(dummy, command, 10);
+
+ while(strlen(dummy) == 9 && dummy[8] != '\n') {
+ pRetStr = fgets(dummy, 10, stdin);
+ if (pRetStr == NULL) {
+ break;
+ }
+ }
+
+ command[strlen(command)-1] = '\0';
+
+ switch(command[0]) {
+ case 'h':
+ helpPrint();
+ break;
+ case 'q':
+ isRunning = false;
+ break;
+ case 'l':
+ listPrint();
+ break;
+ case 'w':
+ writeData();
+ break;
+ case 's':
+ ret = ipcSendMessage(IPC_USAGE_TYPE_IC_SERVICE, (const void*)&g_dataIcService, sizeof(g_dataIcService));
+ printf("ipcSendMessage return:%d\n", ret);
+ break;
+ default:
+ break;
+ }
+ }
+
+end:
+ ipcServerStop(IPC_USAGE_TYPE_IC_SERVICE);
+ printf("bye...\n");
+ sleep(1);
+
+ return 0;
+}
+
+static void helpPrint(void)
+{
+ printf("\n-----------\n");
+ printf("'h' : help\n");
+ printf("'q' : quit\n");
+ printf("'l' : list of Server data\n");
+ printf("'w' : write to Server data\n");
+ printf("'s' : send data to Client\n");
+ printf("-----------\n\n");
+}
+
+static void listPrint(void)
+{
+ int i;
+ signed long longVal;
+ signed int intVal;
+ signed short shortVal;
+ signed char charVal;
+ void *pValue;
+
+ for (i = 0; i < IC_SERVICE_LIST_NUM; i++) {
+ pValue = (void *)&g_dataIcService + IcServiceList[i].offset;
+ switch(IcServiceList[i].size) {
+ case 8:
+ longVal = *((signed long*)pValue);
+ printf("%3d: %s(%d) = %ld\n", i, IcServiceList[i].name, IcServiceList[i].size, longVal);
+ break;
+ case 4:
+ intVal = *((signed int*)pValue);
+ printf("%3d: %s(%d) = %d\n", i, IcServiceList[i].name, IcServiceList[i].size, intVal);
+ break;
+ case 2:
+ shortVal = *((signed short *)pValue);
+ printf("%3d: %s(%d) = %d\n", i, IcServiceList[i].name, IcServiceList[i].size, shortVal);
+ break;
+ default:
+ charVal = *((signed char *)pValue);
+ printf("%3d: %s(%d) = %d\n", i, IcServiceList[i].name, IcServiceList[i].size, charVal);
+ break;
+ }
+ }
+}
+
+static void writeData(void)
+{
+ char command[40];
+ char dummy[40];
+ bool isRunning = true;
+ int i;
+
+ int id;
+ long value;
+
+ char *pRetStr;
+
+ while(isRunning) {
+ printf("write command (h=help q=goto main menu):");
+ pRetStr = fgets(command, 40, stdin);
+ if (pRetStr == NULL) {
+ continue;
+ }
+ memcpy(dummy, command, 40);
+
+ while(strlen(dummy) == 39 && dummy[38] != '\n') {
+ pRetStr = fgets(dummy, 40, stdin);
+ if (pRetStr == NULL) {
+ break;
+ }
+ }
+
+ command[strlen(command)-1] = '\0';
+ switch(command[0]) {
+ case 'h':
+ helpWritePrint();
+ break;
+ case 'q':
+ isRunning = false;
+ break;
+ case 'l':
+ listPrint();
+ break;
+ default:
+ // write data
+ id = (int)strtol(command, NULL, 0);
+ value = 0;
+ for (i = 0; i < strlen(command); i++) {
+ if (command[i] == ' ') {
+ value = (int)strtol(&command[i], NULL, 0);
+ }
+ }
+ writeDataToStruct(id, value);
+ }
+ }
+}
+
+static void helpWritePrint(void)
+{
+ printf("\n-----------\n");
+ printf("'h' : help\n");
+ printf("'q' : goto main menu\n");
+ printf("'l' : list of Server data\n");
+ printf("<ID> <value>: write data\n");
+ printf(" ex)\n");
+ printf(" write command 2 4\n");
+ printf(" -> 2: brake = 4\n");
+ printf("-----------\n\n");
+}
+
+static void writeDataToStruct(int id, long value)
+{
+ void *pValue;
+
+ if (id < 0 || IC_SERVICE_LIST_NUM < id) {
+ return;
+ }
+
+ pValue = (void *)&g_dataIcService + IcServiceList[id].offset;
+ memcpy(pValue, (void *)&value, IcServiceList[id].size);
+}
+