From 68e5436aae8d519eef629dfb9447f266e88f75a7 Mon Sep 17 00:00:00 2001 From: wlyu Date: Mon, 14 Mar 2022 18:13:13 +0800 Subject: [PATCH 1/6] remove default config --- Ubiquitous/XiZi/board/ok1052-c/board.c | 13 +++++++++++-- .../XiZi/board/ok1052-c/third_party_driver/Kconfig | 6 +++--- .../board/ok1052-c/third_party_driver/spi/Makefile | 6 +++++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Ubiquitous/XiZi/board/ok1052-c/board.c b/Ubiquitous/XiZi/board/ok1052-c/board.c index 55786560d..7ff852c2b 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/board.c +++ b/Ubiquitous/XiZi/board/ok1052-c/board.c @@ -17,10 +17,10 @@ File name: board.c Description: support imxrt1052-board init function Others: take SDK_2.6.1_MIMXRT1052xxxxB for references -History: +History: 1. Date: 2022-01-25 Author: AIIT XUOS Lab -Modification: +Modification: 1. support imxrt1052-board MPU、clock、memory init 2. support imxrt1052-board uart、semc、sdio driver init 3. support imxrt1052-board I2C, SPI, ADC, RTC driver init @@ -68,9 +68,18 @@ int MountSDCard(void) #include #include + +#ifdef BSP_USING_ADC #include +#endif + +#ifdef BSP_USING_SPI #include +#endif + +#ifdef BSP_USING_RTC #include +#endif #define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority 4 bits for subpriority */ diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig index ed032333a..0ec9c3aa4 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig @@ -22,7 +22,7 @@ menuconfig BSP_USING_GPIO menuconfig BSP_USING_I2C bool "Using I2C device" - default y + default n select RESOURCES_I2C if BSP_USING_I2C @@ -31,7 +31,7 @@ menuconfig BSP_USING_I2C menuconfig BSP_USING_ADC bool "Using ADC device" - default y + default n select RESOURCES_ADC if BSP_USING_ADC @@ -40,7 +40,7 @@ menuconfig BSP_USING_ADC menuconfig BSP_USING_SPI bool "Using SPI device" - default y + default n select RESOURCES_SPI if BSP_USING_SPI diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile index 7eaf163ae..8765fdab1 100755 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile @@ -1,3 +1,7 @@ -SRC_FILES := fsl_lpspi.c connect_spi.c connect_flash_spi.c +SRC_FILES := fsl_lpspi.c connect_spi.c + +ifeq ($(CONFIG_RESOURCES_SPI_SFUD),y) + SRC_FILES += connect_flash_spi.c +endif include $(KERNEL_ROOT)/compiler.mk From e5d124231c72798f7f77b842cc8c631b79043914 Mon Sep 17 00:00:00 2001 From: wlyu Date: Wed, 16 Mar 2022 18:34:55 +0800 Subject: [PATCH 2/6] support plc socket and optimize LWIP test demo cases --- .../socket_demo/lwip_tcp_socket_demo.c | 24 +- .../socket_demo/lwip_udp_socket_demo.c | 6 +- .../control_app/opcua_demo/opcua_demo.c | 38 +- .../control/plc/interoperability/Kconfig | 6 +- .../control/plc/interoperability/Makefile | 4 + .../plc/interoperability/opcua/open62541.c | 6 +- .../plc/interoperability/opcua/ua_api.c | 7 +- .../plc/interoperability/opcua/ua_api.h | 3 +- .../plc/interoperability/opcua/ua_client.c | 42 +- .../plc/interoperability/opcua/ua_test.c | 6 +- .../plc/interoperability/socket/Kconfig | 11 + .../plc/interoperability/socket/Makefile | 4 + .../plc/interoperability/socket/br_socket.c | 1867 +++++++++++++++++ .../plc/interoperability/socket/plc_socket.c | 322 +++ .../plc/interoperability/socket/plc_socket.h | 67 + Ubiquitous/XiZi/kernel/thread/msgqueue.c | 1 + .../resources/ethernet/LwIP/api/api_lib.c | 2 +- .../resources/ethernet/LwIP/arch/lwipopts.h | 22 +- .../resources/ethernet/LwIP/arch/sys_arch.c | 14 +- .../ethernet/cmd_lwip/lwip_config_demo.c | 16 +- .../ethernet/cmd_lwip/lwip_dhcp_demo.c | 34 +- .../ethernet/cmd_lwip/lwip_ping_demo.c | 2 +- .../ethernet/cmd_lwip/lwip_tcp_demo.c | 50 +- .../ethernet/cmd_lwip/lwip_udp_demo.c | 32 +- .../XiZi/resources/ethernet/cmd_lwip/ping.c | 10 +- .../resources/ethernet/cmd_lwip/tcpecho_raw.c | 4 +- 26 files changed, 2442 insertions(+), 158 deletions(-) create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/Kconfig create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/Makefile create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h diff --git a/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c b/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c index d30248442..a09866fa9 100755 --- a/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c +++ b/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c @@ -67,7 +67,7 @@ static void TCPSocketRecvTask(void *arg) } lw_print("tcp bind success, start to receive.\n"); - lw_pr_info("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); + lw_notice("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); // setup socket fd as listening mode if (listen(fd, 5) != 0 ) @@ -78,7 +78,7 @@ static void TCPSocketRecvTask(void *arg) // accept client connection clientfd = accept(fd, (struct sockaddr *)&tcp_addr, (socklen_t*)&addr_len); - lw_pr_info("client %s connected\n", inet_ntoa(tcp_addr.sin_addr)); + lw_notice("client %s connected\n", inet_ntoa(tcp_addr.sin_addr)); while(1) { @@ -86,8 +86,8 @@ static void TCPSocketRecvTask(void *arg) recv_len = recvfrom(clientfd, recv_buf, TCP_DEMO_BUF_SIZE, 0, (struct sockaddr *)&tcp_addr, &addr_len); if(recv_len > 0) { - lw_pr_info("Receive from : %s\n", inet_ntoa(tcp_addr.sin_addr)); - lw_pr_info("Receive data : %d - %s\n\n", recv_len, recv_buf); + lw_notice("Receive from : %s\n", inet_ntoa(tcp_addr.sin_addr)); + lw_notice("Receive data : %d - %s\n\n", recv_len, recv_buf); } sendto(clientfd, recv_buf, recv_len, 0, (struct sockaddr*)&tcp_addr, addr_len); } @@ -113,7 +113,7 @@ void TCPSocketRecvTest(int argc, char *argv[]) sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); } - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip); sys_thread_new("TCPSocketRecvTask", TCPSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } @@ -133,7 +133,7 @@ static void TCPSocketSendTask(void *arg) if (fd < 0) { lw_print("Socket error\n"); - goto __exit; + return; } struct sockaddr_in tcp_sock; @@ -145,25 +145,23 @@ static void TCPSocketSendTask(void *arg) if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) { lw_print("Unable to connect\n"); - goto __exit; + closesocket(fd); + return; } lw_print("tcp connect success, start to send.\n"); - lw_pr_info("\n\nTarget Port:%d\n\n", LWIP_TARGET_PORT); + lw_notice("\n\nTarget Port:%d\n\n", LWIP_TARGET_PORT); while (cnt --) { lw_print("Lwip client is running.\n"); snprintf(send_msg, sizeof(send_msg), "TCP test package times %d\r\n", cnt); sendto(fd, send_msg, strlen(send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); - lw_pr_info("Send tcp msg: %s ", send_msg); + lw_notice("Send tcp msg: %s ", send_msg); MdelayKTask(1000); } -__exit: - if (fd >= 0) - closesocket(fd); - + closesocket(fd); return; } diff --git a/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c b/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c index 4dd23b9e2..24a1a374f 100755 --- a/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c +++ b/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c @@ -78,8 +78,8 @@ static void UdpSocketRecvTask(void *arg) { memset(recv_buf, 0, UDP_BUF_SIZE); recv_len = recvfrom(socket_fd, recv_buf, UDP_BUF_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len); - lw_pr_info("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); - lw_pr_info("Receive data : %s\n\n", recv_buf); + lw_notice("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); + lw_notice("Receive data : %s\n\n", recv_buf); sendto(socket_fd, recv_buf, recv_len, 0, (struct sockaddr*)&server_addr, addr_len); } @@ -151,7 +151,7 @@ static void UdpSocketSendTask(void *arg) { snprintf(send_str, sizeof(send_str), "UDP test package times %d\r\n", cnt); sendto(socket_fd, send_str, strlen(send_str), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); - lw_pr_info("Send UDP msg: %s ", send_str); + lw_notice("Send UDP msg: %s ", send_str); MdelayKTask(1000); } diff --git a/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c b/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c index c8a0e8d54..e1edcf29a 100755 --- a/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c +++ b/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c @@ -11,7 +11,7 @@ */ /** - * @file ua_demo.c + * @file opcua_demo.c * @brief Demo for OpcUa function * @version 1.0 * @author AIIT XUOS Lab @@ -29,7 +29,6 @@ * Definitions ******************************************************************************/ -#define TCP_LOCAL_PORT 4840 #define UA_URL_SIZE 100 #define UA_STACK_SIZE 4096 #define UA_TASK_PRIO 15 @@ -66,18 +65,17 @@ static void UaConnectTestTask(void* arg) UA_ClientConfig_setDefault(config); snprintf(ua_uri, sizeof(ua_uri), "opc.tcp://%d.%d.%d.%d:4840", test_ua_ip[0], test_ua_ip[1], test_ua_ip[2], test_ua_ip[3]); - ua_pr_info("ua uri: %d %s\n", strlen(ua_uri), ua_uri); + ua_notice("ua uri: %d %s\n", strlen(ua_uri), ua_uri); retval = UA_Client_connect(client,ua_uri); if(retval != UA_STATUSCODE_GOOD) { - ua_pr_info("ua: [%s] connected failed %x\n", __func__, retval); + ua_notice("ua: [%s] connected failed %x\n", __func__, retval); UA_Client_delete(client); return; } - ua_pr_info("ua: [%s] connected ok!\n", __func__); - UA_Client_disconnect(client); + ua_notice("ua: [%s] connected ok!\n", __func__); UA_Client_delete(client); } @@ -92,12 +90,13 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | void UaBrowserObjectsTestTask(void* param) { + static int test_cnt = 0; UA_Client* client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start %d ...\n", __func__, test_cnt++); if(client == NULL) { - ua_print("ua: [%s] tcp client null\n", __func__); + ua_error("ua: [%s] tcp client NULL\n", __func__); return; } @@ -107,18 +106,17 @@ void UaBrowserObjectsTestTask(void* param) if(retval != UA_STATUSCODE_GOOD) { - ua_print("ua: [%s] connect failed %#x\n", __func__, retval); + ua_error("ua: [%s] connect failed %#x\n", __func__, retval); UA_Client_delete(client); return; } - ua_print("ua: [%s] connect ok!\n", __func__); - ua_pr_info("--- start read time ---\n", __func__); + ua_notice("--- start read time ---\n", __func__); ua_read_time(client); - ua_pr_info("--- get server info ---\n", __func__); + ua_notice("--- get server info ---\n", __func__); ua_test_browser_objects(client); + /* Clean up */ - UA_Client_disconnect(client); UA_Client_delete(client); /* Disconnects the client internally */ } @@ -130,7 +128,7 @@ void* UaBrowserObjectsTest(int argc, char* argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return NULL; } } @@ -147,7 +145,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | void UaGetInfoTestTask(void* param) { UA_Client* client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start ...\n", __func__); if(client == NULL) { @@ -167,7 +165,7 @@ void UaGetInfoTestTask(void* param) } ua_print("ua: [%s] connect ok!\n", __func__); - ua_pr_info("--- interactive server ---\n", __func__); + ua_notice("--- interactive server ---\n", __func__); ua_test_interact_server(client); /* Clean up */ UA_Client_disconnect(client); @@ -182,7 +180,7 @@ void* UaGetInfoTest(int argc, char* argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return NULL; } } @@ -199,7 +197,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | void UaAddNodesTask(void* param) { UA_Client* client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start ...\n", __func__); if(client == NULL) { @@ -219,7 +217,7 @@ void UaAddNodesTask(void* param) } ua_print("ua: [%s] connect ok!\n", __func__); - ua_pr_info("--- add nodes ---\n", __func__); + ua_notice("--- add nodes ---\n", __func__); ua_add_nodes(client); /* Clean up */ UA_Client_disconnect(client); @@ -234,7 +232,7 @@ void* UaAddNodesTest(int argc, char* argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return NULL; } } diff --git a/APP_Framework/Framework/control/plc/interoperability/Kconfig b/APP_Framework/Framework/control/plc/interoperability/Kconfig index 66ae5f182..6a7cb0324 100755 --- a/APP_Framework/Framework/control/plc/interoperability/Kconfig +++ b/APP_Framework/Framework/control/plc/interoperability/Kconfig @@ -2,5 +2,9 @@ menuconfig USING_CONTROL_PLC_OPCUA bool "PLC support OPCUA" default y - depends on RESOURCES_LWIP + depends on RESOURCES_LWIP +menuconfig USING_CONTROL_PLC_SOCKET + bool "PLC support SOCKET" + default y + depends on RESOURCES_LWIP diff --git a/APP_Framework/Framework/control/plc/interoperability/Makefile b/APP_Framework/Framework/control/plc/interoperability/Makefile index 7f542f711..d329b91fb 100755 --- a/APP_Framework/Framework/control/plc/interoperability/Makefile +++ b/APP_Framework/Framework/control/plc/interoperability/Makefile @@ -6,6 +6,10 @@ ifeq ($(CONFIG_USING_CONTROL_PLC_OPCUA), y) SRC_DIR += opcua endif +ifeq ($(CONFIG_USING_CONTROL_PLC_SOCKET), y) + SRC_DIR += socket +endif + endif SRC_FILES += interoperability.c diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c b/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c index 3da01d2b7..fc525aa8d 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c @@ -68231,11 +68231,11 @@ UA_Log_Stdout_log(void *context, UA_LogLevel level, UA_LogCategory category, // (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]); // vprintf(msg, args); - KPrintf("%s/%s" ANSI_COLOR_RESET "\t", + ua_print("%s/%s" ANSI_COLOR_RESET "\t", logLevelNames[level], logCategoryNames[category]); vsnprintf(str, sizeof(str) - 1, msg, args); - KPrintf(msg, str); - KPrintf("\n"); + ua_print(msg, str); + ua_print("\n"); // printf("\n"); fflush(stdout); diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c index e2e5fdb3e..4512368be 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c @@ -28,7 +28,7 @@ int ua_open(void *dev) param->client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start ...\n", __func__); if (param->client == NULL) { @@ -39,11 +39,11 @@ int ua_open(void *dev) UA_ClientConfig *config = UA_Client_getConfig(param->client); UA_ClientConfig_setDefault(config); - ua_pr_info("ua: [%s] %d %s\n", __func__, strlen(param->ua_remote_ip), param->ua_remote_ip); + ua_notice("ua: [%s] %d %s\n", __func__, strlen(param->ua_remote_ip), param->ua_remote_ip); UA_StatusCode retval = UA_Client_connect(param->client, param->ua_remote_ip); if(retval != UA_STATUSCODE_GOOD) { - ua_pr_info("ua: [%s] deleted ret %x!\n", __func__, retval); + ua_notice("ua: [%s] deleted ret %x!\n", __func__, retval); return (int)retval; } return EOK; @@ -52,7 +52,6 @@ int ua_open(void *dev) void ua_close(void *dev) { UaParamType *param = (UaParamType *)dev; - UA_Client_disconnect(param->client); UA_Client_delete(param->client); /* Disconnects the client internally */ } diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h index 903d9c6aa..7da7a4faa 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h @@ -43,8 +43,9 @@ typedef struct UaParam #define ua_print //KPrintf #define ua_trace() //KPrintf("ua: [%s] line %d checked!\n", __func__, __LINE__) -#define ua_pr_info KPrintf +#define ua_notice KPrintf #define ua_debug //KPrintf +#define ua_error KPrintf extern const char *opc_server_url; extern char test_ua_ip[]; diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c index 65a4ecb43..749025f75 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c @@ -42,7 +42,7 @@ static UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId } UA_NodeId* parent = (UA_NodeId*)handle; - ua_pr_info("%d, %d --- %d ---> NodeId %d, %d\n", + ua_notice("%d, %d --- %d ---> NodeId %d, %d\n", parent->namespaceIndex, parent->identifier.numeric, referenceTypeId.identifier.numeric, childId.namespaceIndex, childId.identifier.numeric); @@ -81,38 +81,38 @@ void ua_print_value(UA_Variant* val) if(val->type == &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]) { UA_LocalizedText* ptr = (UA_LocalizedText*)val->data; - ua_pr_info("%.*s (Text)\n", ptr->text.length, ptr->text.data); + ua_notice("%.*s (Text)\n", ptr->text.length, ptr->text.data); } else if(val->type == &UA_TYPES[UA_TYPES_UINT32]) { UA_UInt32* ptr = (UA_UInt32*)val->data; - ua_pr_info("%d (UInt32)\n", *ptr); + ua_notice("%d (UInt32)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_BOOLEAN]) { UA_Boolean* ptr = (UA_Boolean*)val->data; - ua_pr_info("%i (BOOL)\n", *ptr); + ua_notice("%i (BOOL)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_INT32]) { UA_Int32* ptr = (UA_Int32*)val->data; - ua_pr_info("%d (Int32)\n", *ptr); + ua_notice("%d (Int32)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_INT16]) { UA_Int16* ptr = (UA_Int16*)val->data; - ua_pr_info("%d (Int16)\n", *ptr); + ua_notice("%d (Int16)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_STRING]) { UA_String* ptr = (UA_String*)val->data; - ua_pr_info("%*.s (String)\n", ptr->length, ptr->data); + ua_notice("%*.s (String)\n", ptr->length, ptr->data); } else if(val->type == &UA_TYPES[UA_TYPES_DATETIME]) { UA_DateTime* ptr = (UA_DateTime*)val->data; UA_DateTimeStruct dts = UA_DateTime_toStruct(*ptr); - ua_pr_info("%d-%d-%d %d:%d:%d.%03d (Time)\n", + ua_notice("%d-%d-%d %d:%d:%d.%03d (Time)\n", dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec); } } @@ -144,14 +144,14 @@ void ua_print_nodeid(UA_NodeId *node_id) switch(node_id->identifierType) { case UA_NODEIDTYPE_NUMERIC: - ua_pr_info(" NodeID n%d,%d ", node_id->namespaceIndex, node_id->identifier.numeric); + ua_notice(" NodeID n%d,%d ", node_id->namespaceIndex, node_id->identifier.numeric); break; case UA_NODEIDTYPE_STRING: - ua_pr_info(" NodeID n%d,%.*s ", node_id->namespaceIndex, node_id->identifier.string.length, + ua_notice(" NodeID n%d,%.*s ", node_id->namespaceIndex, node_id->identifier.string.length, node_id->identifier.string.data); break; case UA_NODEIDTYPE_BYTESTRING: - ua_pr_info(" NodeID n%d,%s ", node_id->namespaceIndex, node_id->identifier.byteString.data); + ua_notice(" NodeID n%d,%s ", node_id->namespaceIndex, node_id->identifier.byteString.data); break; default: break; @@ -160,7 +160,7 @@ void ua_print_nodeid(UA_NodeId *node_id) void ua_print_object(UA_BrowseResponse* res) { - ua_pr_info("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME"); + ua_notice("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME"); for(size_t i = 0; i < res->resultsSize; ++i) { @@ -170,14 +170,14 @@ void ua_print_object(UA_BrowseResponse* res) if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC) { - ua_pr_info("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, + ua_notice("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length, ref->browseName.name.data, (int)ref->displayName.text.length, ref->displayName.text.data); } else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING) { - ua_pr_info("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, + ua_notice("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, (int)ref->nodeId.nodeId.identifier.string.length, ref->nodeId.nodeId.identifier.string.data, (int)ref->browseName.name.length, ref->browseName.name.data, @@ -188,7 +188,7 @@ void ua_print_object(UA_BrowseResponse* res) } } - ua_pr_info("\n"); + ua_notice("\n"); } UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValueId* array) @@ -203,7 +203,7 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu || (response.resultsSize != array_size)) { UA_ReadResponse_clear(&response); - ua_pr_info("ua: [%s] read failed 0x%x\n", __func__, + ua_notice("ua: [%s] read failed 0x%x\n", __func__, response.responseHeader.serviceResult); return UA_STATUSCODE_BADUNEXPECTEDERROR; } @@ -215,11 +215,11 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu if((response.results[i].status == UA_STATUSCODE_GOOD) && (response.results[i].hasValue)) { - ua_pr_info("node %s: ", ua_get_nodeid_str(&array[i].nodeId)); + ua_notice("node %s: ", ua_get_nodeid_str(&array[i].nodeId)); ua_print_value(&response.results[i].value); } } - ua_pr_info("\n"); + ua_notice("\n"); free(arr_ret); UA_ReadResponse_clear(&response); @@ -229,7 +229,7 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu void ua_browser_id(UA_Client* client, UA_NodeId id) { /* Browse some objects */ - ua_pr_info("Browsing nodes in objects folder:\n"); + ua_notice("Browsing nodes in objects folder:\n"); UA_BrowseRequest bReq; UA_BrowseRequest_init(&bReq); bReq.requestedMaxReferencesPerNode = 0; @@ -327,7 +327,7 @@ void ua_write_nodeid_value(UA_Client* client, UA_NodeId id, char* value) if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD) { - ua_pr_info("write new value is: %s\n", value); + ua_notice("write new value is: %s\n", value); } UA_WriteRequest_clear(&wReq); @@ -489,7 +489,7 @@ void ua_read_time(UA_Client* client) { UA_DateTime raw_date = *(UA_DateTime*) value.data; UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date); - ua_pr_info("date is: %d-%d-%d %d:%d:%d.%03d\n", + ua_notice("date is: %d-%d-%d %d:%d:%d.%03d\n", dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec); } diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c index 329118bfc..d11b86896 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c @@ -53,7 +53,7 @@ void ua_test_browser_objects(UA_Client *client) ua_browser_id(client, UA_TEST_BROWSER_NODEID); ua_browser_id(client, UA_TEST_BROWSER_NODEID1); test_id = UA_TEST_BROWSER_NODEID1; - ua_pr_info("Show values in %s:\n", ua_get_nodeid_str(&test_id)); + ua_notice("Show values in %s:\n", ua_get_nodeid_str(&test_id)); ua_test_read_array(client); return; } @@ -64,11 +64,11 @@ void ua_test_write_attr(UA_Client *client) char val_str[UA_NODE_LEN]; UA_NodeId id = UA_TEST_WRITE_NODEID; - ua_pr_info("--- Test write %s ---\n", ua_get_nodeid_str(&id)); + ua_notice("--- Test write %s ---\n", ua_get_nodeid_str(&id)); ua_read_nodeid_value(client, id, &value); ua_write_nodeid_value(client, id, itoa(value + 1, val_str, 10)); ua_read_nodeid_value(client, id, &value); - ua_pr_info("\n"); + ua_notice("\n"); } int ua_test_interact_server(UA_Client *client) diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/Kconfig b/APP_Framework/Framework/control/plc/interoperability/socket/Kconfig new file mode 100755 index 000000000..d8325aa40 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/Kconfig @@ -0,0 +1,11 @@ + +menuconfig USING_CONTROL_PLC_OPCUA + bool "PLC support OPCUA" + default y + depends on RESOURCES_LWIP + +menuconfig USING_CONTROL_PLC_SOCKET + bool "PLC support SOCKET" + default y + depends on RESOURCES_LWIP + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/Makefile b/APP_Framework/Framework/control/plc/interoperability/socket/Makefile new file mode 100755 index 000000000..2c3e00b48 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/Makefile @@ -0,0 +1,4 @@ +SRC_FILES := plc_socket.c + +include $(KERNEL_ROOT)/compiler.mk + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c new file mode 100755 index 000000000..a655a0a67 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c @@ -0,0 +1,1867 @@ +#include +#include +#include "plc_socket.h" + +#define xs_kprintf KPrintf +#define xs_device_t uint32_t + + +static unsigned char data_head = 0x5A; +static char device_s14[] = "S14"; +static char device_s15[] = "S15"; +static char device_s16[] = "S16"; +static char device_s17[] = "S17"; +static char device_s18[] = "S18"; +static char data_end[] = "#"; +unsigned char redis_data[1024]; + +// 创建一个信号量,用于接收消息的同步 +static sem_t Ch_Sem = NULL; +static sem_t Rx_Sem = NULL; + +extern xs_device_t ec200t; + +//for SIEMENS TCP read data cmd +const unsigned char handshake_first[] = +{ + 0x3, 0x00, 0x00, 0x16, 0x11, 0xe0, 0x00, 0x00, 0x02, + 0xc8,0x00,0xc1,0x02,0x02,0x01,0xc2,0x02,0x02,0x01,0xc0,0x01,0x0a +}; + +const unsigned char handshake_second[] = +{ + 0x3,0x00,0x00,0x19,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x00,0x0d,0x00,0x08,0x00,0x00,0xf0,0x00,0x00,0x01,0x00,0x01,0x00,0xf0 +}; + +const unsigned char siemens_read_data[] = +{ + 0x3,0x00,0x00, 0x1f,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x33,0x01,0x00,0x0e,0x00,0x00,0x04,0x01,0x12,0x0a,0x10,0x02,0x00,0xD2,0x00,0x34,0x84,0x00,0x00,0x00 +}; + +//for OML UDP read data cmd +const unsigned char UDP_read_data[] = +{ + 0x80,0x00,0x02,0x00,0x03,0x00,0x00,0x7E,0x00,0x00,0x01,0x01,0x82,0x0F,0xA0,0x00,0x00,0x20 +}; + +//for SIEMENS 1200 read data cmd +const unsigned char handshake_1200_first[] = +{ + 0x03, 0x00, 0x00, 0x16, 0x11, 0xE0, 0x00, 0x00, 0x02, 0xC8, 0x00, 0xC1, 0x02, 0x02, 0x01, 0xC2, 0x02, 0x02, 0x01, 0xC0, 0x01, 0x0A +}; + +const unsigned char handshake_1200_second[] = +{ + 0x03, 0x00, 0x00, 0x19, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x08, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xF0 +}; + +const unsigned char siemens_1200_read_data[] = +{ + 0x03, 0x00, 0x00, 0x1F, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, 0xD2, 0x00, 0x34, 0x84, 0x00, 0x00, 0x00 +}; + +#define PUT_ULONG_BE(n,b,i) \ +{ \ + (b)[(i) ] = (uint8_t) ( (n) >> 24 ); \ + (b)[(i) + 1] = (uint8_t) ( (n) >> 16 ); \ + (b)[(i) + 2] = (uint8_t) ( (n) >> 8 ); \ + (b)[(i) + 3] = (uint8_t) ( (n) ); \ +} + +#define GET_ULONG_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} + +#define XS_SERIAL_RB_BUFSZ 128 + +char rx_buffer_cmp[256 + 1]; +char msg_pool[256]; +char rx_buffer[XS_SERIAL_RB_BUFSZ + 1] = {0}; +#define WIFI_RESET 73 + +#define LEN_PARA_BUF 128 +uint8_t server_addr_wifi[LEN_PARA_BUF] = "192.168.23.181"; //??????? +uint8_t server_port_wifi[LEN_PARA_BUF] = "9999"; //?????? + +uint8_t WIFI_ssid[LEN_PARA_BUF] = "xiaoshanos"; //WIFI? +uint8_t WIFI_pwd[LEN_PARA_BUF] = "12345678"; //WIFI???? + +#if 0 +/* ?????? */ +xs_device_t hfa21; +/* ??????? */ +struct xs_MessageQueue* rx3_mq; +/* ???????? */ + +void hfa21_sta_config(void) +{ + xs_kprintf("hfa21_sta_config start\r\n"); + uint8_t i,step; + uint8_t cmd[LEN_PARA_BUF]; + step = 1; + strcpy(cmd, "+++"); + //send + xs_DeviceWrite(hfa21, 0, cmd, 3); + xs_kprintf("cmd.%d=%s\r\n",step,cmd); + step = 2; + memset(cmd,0,sizeof(cmd)); + xs_MdelayKTask(100); + strcpy(cmd,"a"); + //send + xs_DeviceWrite(hfa21, 0, cmd, 1); + xs_kprintf("cmd.%d=%s\r\n",step,cmd); + step = 3; + memset(cmd,0,sizeof(cmd)); + xs_MdelayKTask(2500); + strcpy(cmd, "AT+FCLR\r\n"); + + //send + for(i=0; i 1000) + { + xs_kprintf("data length too long\n "); + return; + } + + xs_DeviceWrite(hfa21, 0, buf, len); + return ; +} + +void msg_send_once(void) +{ + uint8_t msg[1024] = { 0}; + uint32_t i = 0; + xs_kprintf("ap test, send msg to server : "); + memset(msg,0x37,1024); + xs_memcpy(msg,"arm:dev7,data:",14); + msg[1023] = '\n'; + xs_DeviceWrite(hfa21,0, msg, 1024); + // xs_MdelayKTask(1000); + return ; +} +MSH_CMD_EXPORT(msg_send_once, asd); + +void msg_send_nointerval(void) +{ + uint8_t msg[1024] = { 0}; + uint32_t i = 1; + uint32_t index = 0; + uint8_t seq[10] = { 0}; + uint8_t* prefix = "{board:stm32f407-st-discovery,arch:arm,device:7,seq:"; + xs_kprintf("ap test, send msg to server : "); + + for(;;) + { + index = 0; + memset(msg,0x37,1024); + memset(seq,0,10); + msg[1021] = '}'; + msg[1022] = '\n'; + msg[1023] = 0; + xs_memcpy(msg,prefix,strlen(prefix)); + index = index + strlen(prefix); + PUT_ULONG_BE(i, msg, index) + index = index + 4; + xs_memcpy(msg+index,",data:",6); + xs_DeviceWrite(hfa21,0, msg, 1024); + ++ i; + } + + return ; +} +MSH_CMD_EXPORT(msg_send_nointerval, asd); + +void msg_send_interval(void) +{ + uint8_t msg[1024] = { 0}; + uint32_t i = 1; + uint32_t index = 0; + uint8_t seq[4] = { 0}; + uint8_t* prefix = "{board:stm32f407-st-discovery,arch:arm,device:7,seq:"; + xs_kprintf("ap test, send msg to server : "); + + for(;;) + { + index = 0; + memset(msg,0x37,1024); + memset(seq,0,10); + msg[1021] = '}'; + msg[1022] = '\n'; + msg[1023] = 0; + xs_memcpy(msg,prefix,strlen(prefix)); + index = index + strlen(prefix); + PUT_ULONG_BE(i, msg, index) + index = index + 4; + xs_memcpy(msg+index,",data:",6); + xs_DeviceWrite(hfa21,0, msg, 1024); + xs_MdelayKTask(1000); + ++ i; + } + + return ; +} +MSH_CMD_EXPORT(msg_send_interval, asd); + +struct xs_Ringbuffer* ringbuffer; + +uint8_t stack[256] = {0}; +xs_uint16 data_index = 0 ; +uint8_t start = 0xaa; +uint8_t end = 0xbb; + +uint8_t lora_buffer[8][256] = {0}; + +static void read_ringbuffer_thread_entry(void* parameter) +{ + uint8_t ch = 0; + xs_uint16 index = 0 ; + uint8_t devicenumber; + + while(1) + { + if(1 == xs_GetRingBufferchar(ringbuffer,&ch)) + { + if(data_index < 256) + { + stack[data_index++] = ch; + + if(data_index > 2) + { + if(stack[data_index-1] == start && stack[data_index-2] == start) + { + data_index = 0; + stack[data_index++] == start; + stack[data_index++] == start; + } + else if(stack[data_index-1] == end && stack[data_index-2] == end) + { + //end + devicenumber = stack[3] - 0x30; + + if(devicenumber > 0 && devicenumber < 8) + { + memset(lora_buffer[devicenumber-1],0,256); + memcpy(lora_buffer[devicenumber-1], &stack[2],data_index - 4); + // xs_kprintf("lora data: %s\n",lora_buffer[devicenumber-1]); + } + + data_index = 0; + } + } + } + else + { + data_index = 0; + } + } + else + { + xs_MdelayKTask(20); + } + } +} +#endif + +#if 0 +/***********************************************************************/ +//欧姆龙PLC IP 192.168.250.3 port 9600 + +static xs_err_t oml_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(Ch_Sem); + return XS_EOK; +} + +static void oml_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(Ch_Sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + rx_length = xs_DeviceRead(hfa21, 0, redis_data + 1 + sizeof(device_s14) + total_rx_length, 78); + xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 1 + sizeof(device_s14) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((78 == total_rx_length) && (0xC0 == redis_data[1 + sizeof(device_s14)]) + && (0x00 == redis_data[1 + sizeof(device_s14) + 1]) + && (0x02 == redis_data[1 + sizeof(device_s14) + 2]) + && (0x00 == redis_data[1 + sizeof(device_s14) + 3])) + { + /******format redis data******/ + memcpy(redis_data, &data_head, 1); + memcpy(redis_data + 1, device_s14, sizeof(device_s14)); + memcpy(redis_data + 1 + sizeof(device_s14) + total_rx_length, data_end, sizeof(data_end)); + length = 1 + sizeof(device_s14) + total_rx_length + sizeof(data_end); + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(Rx_Sem); + } + } + } +} + +int OML_UDP(void) +{ + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + hfa21 = xs_DeviceFind("uart3"); + + if(!hfa21) + { + xs_kprintf("find dev.hfa21 failed!\r\n"); + return XS_ERROR; + } + + Ch_Sem = xs_KCreateSemaphore("Ch_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Ch_Sem == NULL) + { + xs_kprintf("create Ch_sem failed .\n"); + return XS_ERROR; + } + + Rx_Sem = xs_KCreateSemaphore("Rx_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Rx_Sem == NULL) + { + xs_kprintf("create Rx_sem failed .\n"); + return XS_ERROR; + } + + //hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(hfa21,XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(hfa21, oml_uart_input); + xs_kprintf("hfa21 init success!\r\n"); + TaskDescriptorPointer thread_oml_plc = xs_KTaskCreate("oml_hfa21", oml_plc_thread, NULL, 1024, 25); + + if(thread_oml_plc != NULL) + { + xs_StartupKTask(thread_oml_plc); + } + else + { + return XS_ERROR; + } + + xs_MdelayKTask(10000); + xs_kprintf("The UDP send_receive function is running......\n"); + + while(1) + { +// CH438UARTSend(6, UDP_read_data, sizeof(UDP_read_data)); //UDP_read_data + xs_DeviceWrite(hfa21, 0, UDP_read_data, sizeof(UDP_read_data)); + xs_kprintf("hfa21 write cmd\n"); + xs_KSemaphoreObtain(Rx_Sem, XS_WAITING_FOREVER); + xs_MdelayKTask(1000); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(OML_UDP, oml); + +/*********************************************************************************************/ +// IP 192.168.250.50 port 102 tcp + +//工控机的测试代码,数据帧头FF,帧尾FE,数据帧长度不固?static struct xs_MessageQueue *ipc_mq; +xs_device_t ipc_hfa21; + +static xs_err_t ipc_uart_input(xs_device_t dev, xs_size_t size) +{ + struct rx_msg msg; + xs_err_t result; + msg.dev = dev; + msg.size = size; + result = xs_KMsgQueueSend(ipc_mq, &msg, sizeof(msg)); + + if(result == -XS_EFULL) + { + xs_kprintf("ipc_mq message queue full!\r\n"); + } + + xs_KSemaphoreAbandon(Ch_Sem); + return result; +} + +static void ipc_plc_thread(void* parameter) +{ + struct rx_msg msg; + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(Ch_Sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + xs_memset(&msg, 0, sizeof(msg)); + ret = xs_KMsgQueueRecv(ipc_mq, &msg, sizeof(msg), XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + rx_length = xs_DeviceRead(ipc_hfa21, 0, redis_data + 2 + sizeof(device_s15) + total_rx_length, msg.size); + xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s15) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((0x46 == redis_data[2 + sizeof(device_s15)]) && (0x46 == redis_data[2 + sizeof(device_s15) + 1]) && + (0x45 == redis_data[2 + sizeof(device_s15) + total_rx_length - 1]) && (0x46 == redis_data[2 + sizeof(device_s15) + total_rx_length - 2])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_IPC_FLAG; + memcpy(redis_data + 2, device_s15, sizeof(device_s15)); + length = 2 + sizeof(device_s15) + total_rx_length; + /******end******/ + // xs_kprintf("redis data : \n"); + // for(i = 0; i < length; ++i) + // xs_kprintf("0x%x ", redis_data[i]); + // xs_kprintf("\n"); + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(Rx_Sem); + } + } + } + } +} + +int BRL_IPC(void) +{ + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + ipc_hfa21 = xs_DeviceFind("uart3"); + + if(!ipc_hfa21) + { + xs_kprintf("find ipc_hfa21 failed!\r\n"); + return XS_ERROR; + } + + Ch_Sem = xs_KCreateSemaphore("Ch_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Ch_Sem == NULL) + { + xs_kprintf("BRL_IPC create sem failed .\n"); + return XS_ERROR; + } + + Rx_Sem = xs_KCreateSemaphore("Rx_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Rx_Sem == NULL) + { + xs_kprintf("BRL_IPC create Rx_sem failed .\n"); + return XS_ERROR; + } + + ipc_mq = xs_KCreateMsgQueue("ipc_mq", + sizeof(struct rx_msg), + sizeof(msg_pool), + XS_LINKLIST_FLAG_FIFO); + + if(ipc_mq == NULL) + { + xs_kprintf("create ipc_mq mutex failed.\n"); + return -1; + } + + //ipc_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(ipc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(ipc_hfa21,XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(ipc_hfa21, ipc_uart_input); + xs_kprintf("ipc_hfa21 init success!\r\n"); + TaskDescriptorPointer thread_ipc_plc = xs_KTaskCreate("ipc_hfa21", ipc_plc_thread, NULL, 1024, 25); + + if(thread_ipc_plc != NULL) + { + xs_StartupKTask(thread_ipc_plc); + } + else + { + return XS_ERROR; + } + + xs_kprintf("start to receive data...\n"); + + while(1) + { + xs_MdelayKTask(100); + xs_KSemaphoreObtain(Rx_Sem, XS_WAITING_FOREVER); + xs_kprintf("\n"); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(BRL_IPC, IPC server); + +/*********************************************************************************************/ +// IP 192.168.250.150 port 9898 tcp + +//金凤工控机的测试代码,数据帧头FF,帧尾EF +xs_device_t jf_ipc_hfa21; +static sem_t jf_input_sem = NULL; +static sem_t jf_ec200t_sem = NULL; + +static xs_err_t jf_ipc_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(jf_input_sem); + return XS_EOK; +} + +static void jf_ipc_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(jf_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + rx_length = xs_DeviceRead(jf_ipc_hfa21, 0, redis_data + 2 + sizeof(device_s16) + total_rx_length, 512); + xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s16) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if(((((unsigned int)redis_data[2 + sizeof(device_s16) + 2] & 0x000000FF) << 8) | ((unsigned int)redis_data[2 + sizeof(device_s16) + 3] & 0x000000FF) == total_rx_length) && + (0xFF == redis_data[2 + sizeof(device_s16)]) && (0x20 == redis_data[2 + sizeof(device_s16) + 1])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_JF_IPC_FLAG; + memcpy(redis_data + 2, device_s16, sizeof(device_s16)); + length = 2 + sizeof(device_s16) + total_rx_length; + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(jf_ec200t_sem); + } + } + } +} + +int JF_IPC(void) +{ + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + jf_ipc_hfa21 = xs_DeviceFind("uart3"); + + if(!jf_ipc_hfa21) + { + xs_kprintf("find jf_ipc_hfa21 failed!\r\n"); + return XS_ERROR; + } + + jf_ec200t_sem = xs_KCreateSemaphore("jf_ec200t_sem",0,XS_LINKLIST_FLAG_FIFO); + + if(jf_ec200t_sem == NULL) + { + xs_kprintf("JF_IPC create jf_ec200t_sem failed .\n"); + return XS_ERROR; + } + + jf_input_sem = xs_KCreateSemaphore("jf_input_sem",0,XS_LINKLIST_FLAG_FIFO); + + if(jf_input_sem == NULL) + { + xs_kprintf("JF_IPC create jf_input_sem failed .\n"); + return XS_ERROR; + } + + //jf_ipc_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(jf_ipc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(jf_ipc_hfa21,XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(jf_ipc_hfa21, jf_ipc_uart_input); + xs_kprintf("jf_ipc_hfa21 init success!\r\n"); + TaskDescriptorPointer thread_jf_ipc_plc = xs_KTaskCreate("jf_ipc_hfa21", jf_ipc_plc_thread, NULL, 1024, 25); + + if(thread_jf_ipc_plc != NULL) + { + xs_StartupKTask(thread_jf_ipc_plc); + } + else + { + return XS_ERROR; + } + + xs_kprintf("start to receive data...\n"); + + while(1) + { + xs_MdelayKTask(100); + xs_KSemaphoreObtain(jf_ec200t_sem, XS_WAITING_FOREVER); + xs_kprintf("JF send data to server done\n"); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(JF_IPC, JF IPC client); + +/*********************************************************************************************/ +//西门子PLC IP 192.168.250.9 port 102 + +static xs_device_t siemens_hfa21; +static sem_t siemens_input_sem = NULL; +static sem_t siemens_ec200t_sem = NULL; + +static xs_err_t siemens_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(siemens_input_sem); + return XS_EOK; +} + +static void siemens_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + static char shakehand_cnt = 0; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(siemens_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + //rx_length = xs_DeviceRead(siemens_hfa21, 0, redis_data, 234); + // xs_kprintf("siemens dst data length %d\n", rx_length); + // for(i = 0; i < rx_length; ++i) + // xs_kprintf("0x%x ", redis_data[i]); + // xs_kprintf("\n"); + if(shakehand_cnt < 2) + { + //ignore first two siemens input sem + xs_DeviceRead(siemens_hfa21, 0, redis_data + 2 + sizeof(device_s17), 87); + shakehand_cnt++; + continue; + } + + rx_length = xs_DeviceRead(siemens_hfa21, 0, redis_data + 2 + sizeof(device_s17) + total_rx_length, 87); + xs_kprintf("siemens dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s17) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((87 == total_rx_length) && (0x03 == redis_data[2 + sizeof(device_s17)]) + && (0x00 == redis_data[2 + sizeof(device_s17) + 1]) + && (0x00 == redis_data[2 + sizeof(device_s17) + 2]) + && (0x57 == redis_data[2 + sizeof(device_s17) + 3])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_SIEMENS_FLAG; + memcpy(redis_data + 2, device_s17, sizeof(device_s17)); + length = 2 + sizeof(device_s17) + total_rx_length; + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(siemens_ec200t_sem); + } + } + } +} + +int SIEMENS_TCP(void) +{ + xs_err_t result; + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + siemens_hfa21 = xs_DeviceFind("uart3"); + + if(!siemens_hfa21) + { + xs_kprintf("find siemens_hfa21 failed!\r\n"); + return XS_ERROR; + } + + siemens_input_sem = xs_KCreateSemaphore("siemens_input_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_input_sem == NULL) + { + xs_kprintf("siemens_hfa21 create siemens_input_sem failed.\n"); + return XS_ERROR; + } + + siemens_ec200t_sem = xs_KCreateSemaphore("siemens_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_ec200t_sem == NULL) + { + xs_kprintf("siemens_hfa21 create siemens_ec200t_sem failed.\n"); + return XS_ERROR; + } + + //siemens_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(siemens_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(siemens_hfa21, XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(siemens_hfa21, siemens_uart_input); + TaskDescriptorPointer thread_siemens_plc = xs_KTaskCreate("siemens_hfa21", siemens_plc_thread, NULL, 1024, 25); + + if(thread_siemens_plc != NULL) + { + xs_StartupKTask(thread_siemens_plc); + } + else + { + return XS_ERROR; + } + + //step1 : send handshake_first cmd, waiting for response sem + xs_kprintf("siemens_hfa21 start send handshake_first!\r\n"); + //CH438UARTSend(6, handshake_first, sizeof(handshake_first)); + xs_DeviceWrite(siemens_hfa21, 0, handshake_first, sizeof(handshake_first)); + xs_MdelayKTask(3000); + xs_DeviceWrite(siemens_hfa21, 0, handshake_first, sizeof(handshake_first)); + xs_MdelayKTask(500); + //step2 : send handshake_second cmd, waiting for response sem + xs_kprintf("siemens_hfa21 start send handshake_second!\r\n"); + //CH438UARTSend(6, handshake_second, sizeof(handshake_second)); + xs_DeviceWrite(siemens_hfa21, 0, handshake_second, sizeof(handshake_second)); + xs_kprintf("siemens_hfa21 init success!\r\n"); + xs_MdelayKTask(500); + + while(1) + { + //CH438UARTSend(6, siemens_read_data, sizeof(siemens_read_data)); //read_data + xs_DeviceWrite(siemens_hfa21, 0, siemens_read_data, sizeof(siemens_read_data)); + xs_kprintf("siemens hfa21 write cmd\n"); + xs_KSemaphoreObtain(siemens_ec200t_sem, XS_WAITING_FOREVER); + xs_MdelayKTask(1000); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(SIEMENS_TCP, Siemens TCP PLC); + +/*********************************************************************************************/ +//西门?1200 PLC IP 192.168.250.107 port 102 + +static xs_device_t siemens_1200_hfa21; +static sem_t siemens_1200_input_sem = NULL; +static sem_t siemens_1200_ec200t_sem = NULL; + +static xs_err_t siemens_1200_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(siemens_1200_input_sem); + return XS_EOK; +} + +static void siemens_1200_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + static char shakehand_cnt = 0; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(siemens_1200_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + if(shakehand_cnt < 2) + { + //ignore first two siemens input sem + xs_DeviceRead(siemens_1200_hfa21, 0, redis_data + 2 + sizeof(device_s18), 235); + shakehand_cnt++; + continue; + } + + rx_length = xs_DeviceRead(siemens_1200_hfa21, 0, redis_data + 2 + sizeof(device_s18) + total_rx_length, 235); + xs_kprintf("siemens 1200 dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s18) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((235 == total_rx_length) && (0x03 == redis_data[2 + sizeof(device_s18)]) + && (0x00 == redis_data[2 + sizeof(device_s18) + 1]) + && (0x00 == redis_data[2 + sizeof(device_s18) + 2]) + && (0xEB == redis_data[2 + sizeof(device_s18) + 3])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_SIEMENS_1200_FLAG; + memcpy(redis_data + 2, device_s18, sizeof(device_s18)); + length = 2 + sizeof(device_s18) + total_rx_length; + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(siemens_1200_ec200t_sem); + } + } + } +} + +int SIEMENS_1200(void) +{ + xs_err_t result; + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + siemens_1200_hfa21 = xs_DeviceFind("uart3"); + + if(!siemens_1200_hfa21) + { + xs_kprintf("find siemens_1200_hfa21 failed!\r\n"); + return XS_ERROR; + } + + siemens_1200_input_sem = xs_KCreateSemaphore("siemens_1200_input_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_1200_input_sem == NULL) + { + xs_kprintf("siemens_1200_hfa21 create siemens_1200_input_sem failed.\n"); + return XS_ERROR; + } + + siemens_1200_ec200t_sem = xs_KCreateSemaphore("siemens_1200_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_1200_ec200t_sem == NULL) + { + xs_kprintf("siemens_1200_hfa21 create siemens_1200_ec200t_sem failed.\n"); + return XS_ERROR; + } + + //siemens_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(siemens_1200_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(siemens_1200_hfa21, XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(siemens_1200_hfa21, siemens_1200_uart_input); + TaskDescriptorPointer thread_siemens_1200_plc = xs_KTaskCreate("siemens_1200_hfa21", siemens_1200_plc_thread, NULL, 1024, 25); + + if(thread_siemens_1200_plc != NULL) + { + xs_StartupKTask(thread_siemens_1200_plc); + } + else + { + return XS_ERROR; + } + + //step1 : send handshake_1200_first cmd, waiting for response sem + xs_kprintf("siemens_1200_hfa21 start send handshake_1200_first!\r\n"); + //CH438UARTSend(6, handshake_1200_first, sizeof(handshake_1200_first)); + xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_first, sizeof(handshake_1200_first)); + xs_MdelayKTask(3000); + xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_first, sizeof(handshake_1200_first)); + xs_MdelayKTask(500); + //step2 : send handshake_1200_second cmd, waiting for response sem + xs_kprintf("siemens_1200_hfa21 start send handshake_1200_second!\r\n"); + //CH438UARTSend(6, handshake_1200_second, sizeof(handshake_1200_second)); + xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_second, sizeof(handshake_1200_second)); + xs_kprintf("siemens_1200_hfa21 init success!\r\n"); + xs_MdelayKTask(500); + + while(1) + { + //CH438UARTSend(6, siemens_1200_read_data, sizeof(siemens_1200_read_data)); //read_data + xs_DeviceWrite(siemens_1200_hfa21, 0, siemens_1200_read_data, sizeof(siemens_1200_read_data)); + xs_kprintf("siemens 1200 hfa21 write cmd\n"); + xs_KSemaphoreObtain(siemens_1200_ec200t_sem, XS_WAITING_FOREVER); + xs_MdelayKTask(1000); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(SIEMENS_1200, Siemens 1200 PLC); +#endif + +/*********************************************************************************************/ +//贝加莱PLC IP 192.168.250.4 port 12000 +static unsigned char brl_redis_data[2048]; +static xs_device_t brl_plc_hfa21; +static sem_t brl_plc_input_sem = NULL; +static sem_t brl_plc_ec200t_sem = NULL; + +static xs_err_t brl_plc_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(brl_plc_input_sem); + return XS_EOK; +} + +static void brl_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(brl_plc_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + xs_kprintf("before total %d\n", total_rx_length); + rx_length = xs_DeviceRead(brl_plc_hfa21, 0, brl_redis_data + 2 + total_rx_length, 1640); + xs_kprintf("brl dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length / 10; i ++) + { + xs_kprintf("0x%x ", brl_redis_data[i + 2 + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if(total_rx_length > 1640) + { + xs_kprintf("ERROR : rx_buffer is full total_rx_length %d\n", total_rx_length); + total_rx_length = 0; + memset(brl_redis_data, 0, sizeof(brl_redis_data)); + xs_KSemaphoreAbandon(brl_plc_ec200t_sem); + continue; + } + + if((1640 == total_rx_length) && (0x53 == brl_redis_data[2])) + { + /******format redis data******/ + brl_redis_data[0] = data_head; + brl_redis_data[1] = PLC_BRL_FLAG; + length = 2 + total_rx_length; + + /******end******/ + for(i = 0; i < 10; i ++) + { + xs_kprintf("0x%x ", brl_redis_data[i + 1478]); + } + + xs_kprintf("\n"); + xs_DeviceWrite(ec200t, 0, brl_redis_data, length); + total_rx_length = 0; + memset(brl_redis_data, 0, sizeof(brl_redis_data)); + xs_KSemaphoreAbandon(brl_plc_ec200t_sem); + } + } + } +} + +int BRL_PLC(void) +{ + xs_err_t result; + const unsigned char brl_reply_data[] = {0x1, 0x1, 0x1}; + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + brl_plc_hfa21 = xs_DeviceFind("uart3"); + + if(!brl_plc_hfa21) + { + xs_kprintf("find brl_plc_hfa21 failed!\r\n"); + return XS_ERROR; + } + + brl_plc_input_sem = xs_KCreateSemaphore("brl_plc_input_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(brl_plc_input_sem == NULL) + { + xs_kprintf("brl_plc_hfa21 create brl_plc_input_sem failed.\n"); + return XS_ERROR; + } + + brl_plc_ec200t_sem = xs_KCreateSemaphore("brl_plc_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(brl_plc_ec200t_sem == NULL) + { + xs_kprintf("brl_plc_hfa21 create brl_plc_ec200t_sem failed.\n"); + return XS_ERROR; + } + + //brl_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = 2048; + config3.parity = PARITY_NONE; + xs_DeviceControl(brl_plc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(brl_plc_hfa21, XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(brl_plc_hfa21, brl_plc_uart_input); + TaskDescriptorPointer thread_brl_plc = xs_KTaskCreate("brl_plc_hfa21", brl_plc_thread, NULL, 1024, 25); + + if(thread_brl_plc != NULL) + { + xs_StartupKTask(thread_brl_plc); + } + else + { + return XS_ERROR; + } + + xs_kprintf("brl_plc_hfa21 init success!\r\n"); + xs_MdelayKTask(500); + + while(1) + { + //CH438UARTSend(6, brl_reply_data, sizeof(brl_reply_data)); + xs_kprintf("brl_plc hfa21 write cmd\n"); //read_data + xs_DeviceWrite(brl_plc_hfa21, 0, brl_reply_data, sizeof(brl_reply_data)); + xs_KSemaphoreObtain(brl_plc_ec200t_sem, XS_WAITING_FOREVER); + } + + return XS_EOK; +} + +MSH_CMD_EXPORT(BRL_PLC, Brl PLC); + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c new file mode 100755 index 000000000..e61202f05 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2022 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * @file plc_socket.c + * @brief Demo for PLC socket communication function + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022.03.16 + */ + +#include "transform.h" +#include "plc_socket.h" +#include "sys_arch.h" +#include "lwip/sockets.h" + +#define PLC_SOCK_CMD_NUM 10 + +// for saving PLC command +int plc_cmd_index = 0; + +//siemens test +PlcBinCmdType TestPlcCmd[PLC_SOCK_CMD_NUM] = +{ +#ifdef SUPPORT_PLC_SIEMENS + // handshake1 repeat 1 + { + 0, 3000, 22, + { + 0x03, 0x00, 0x00, 0x16, 0x11, 0xE0, 0x00, 0x00, + 0x02, 0xC8, 0x00, 0xC1, 0x02, 0x02, 0x01, 0xC2, + 0x02, 0x02, 0x01, 0xC0, 0x01, 0x0A + } + }, + // handshake2 + { + 1, 500, 25, + { + 0x03, 0x00, 0x00, 0x19, 0x02, 0xF0, 0x80, 0x32, + 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x08, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0xF0 + } + }, + // read command + { + 2, 1000, 31, + { + 0x03, 0x00, 0x00, 0x1F, 0x02, 0xF0, 0x80, 0x32, + 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x0E, 0x00, + 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, + 0xD2, 0x00, 0x34, 0x84, 0x00, 0x00, 0x00 + } + } + // oml plc +#else// SUPPORT_PLC_OML + { + 0, 1000, 18, + { + 0x80, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x01, 0x01, 0x82, 0x0F, 0xA0, 0x00, + 0x00, 0x20 + } + } +#endif +}; + +//SIEMENS PLC IP: 192.168.250.9 Port: 102 +//S7-200 192.168.250.8 +//S7-1200 192.168.250.6 +//OML 192.168.250.3 port 9600 +PlcSocketParamType plc_socket_demo_data = { + .ip = {192, 168, 250, 3}, + .port = 9600, + .device_type = PLC_DEV_TYPE_OML, + .socket_type = SOCK_STREAM, //SOCK_DGRAM, //udp + .step = 0, + .cmd_num = 3, + .buf_size = PLC_TEST_SIZE, + .buf = NULL, +}; + +#define OML_HEADER_LEN 78 +#define CHECK_OML_HEADER(_s) ((0xC0 == *(_s)) && (0x00 == *(_s + 1)) && (0x02 == *(_s + 2)) && (0x00 == *(_s + 3))) + +/******************************************************************************/ + +static void *PlcSocketStart(void *arg) +{ + int fd = -1; + int recv_len; + int step = 0; + char *recv_buf; + struct sockaddr_in sock_addr; + socklen_t addr_len = sizeof(struct sockaddr_in); + PlcSocketParamType *param = (PlcSocketParamType *)&plc_socket_demo_data; + + plc_print("start %d.%d.%d.%d:%d dev %d sock %d\n", + param->ip[0], + param->ip[1], + param->ip[2], + param->ip[3], + param->port, + param->device_type, + param->socket_type); + + //malloc memory + recv_buf = (char *)malloc(param->buf_size); + if (recv_buf == NULL) + { + plc_error("No memory\n"); + return NULL; + } + + fd = socket(AF_INET, param->socket_type, 0); + if (fd < 0) + { + plc_error("Socket error %d\n", param->socket_type); + free(recv_buf); + return NULL; + } + + plc_print("start %d.%d.%d.%d:%d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3], param->port); + + sock_addr.sin_family = AF_INET; + sock_addr.sin_port = htons(param->port); + sock_addr.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(param->ip[0], param->ip[1], param->ip[2], param->ip[3])); + memset(&(sock_addr.sin_zero), 0, sizeof(sock_addr.sin_zero)); + + if (connect(fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)) < 0) + { + plc_error("Unable to connect\n"); + closesocket(fd); + free(recv_buf); + return NULL; + } + + lw_notice("client %s connected\n", inet_ntoa(sock_addr.sin_addr)); + + while(step < param->cmd_num) + { + sendto(fd, TestPlcCmd[step].cmd, TestPlcCmd[step].cmd_len, 0, (struct sockaddr*)&sock_addr, addr_len); + lw_notice("Send Cmd: %d - ", TestPlcCmd[step].cmd_len); + for(int i = 0; i < TestPlcCmd[step].cmd_len; i++) + { + lw_notice(" %#x", TestPlcCmd[step].cmd[i]); + } + lw_notice("\n"); + MdelayKTask(TestPlcCmd[step].delay_ms); + + memset(recv_buf, 0, param->buf_size); + while(1) + { + recv_len = recvfrom(fd, recv_buf, param->buf_size, 0, (struct sockaddr *)&sock_addr, &addr_len); + if(recv_len > 0) + { + if(param->device_type == PLC_DEV_TYPE_OML) + { + if((recv_len == OML_HEADER_LEN) && (CHECK_OML_HEADER(recv_buf))) + { + lw_notice("This is Oml package!!!\n"); + } + } + lw_notice("Receive from : %s\n", inet_ntoa(sock_addr.sin_addr)); + lw_notice("Receive data : %d -", recv_len); + for(int i = 0; i < recv_len; i++) + { + lw_notice(" %#x", recv_buf[i]); + } + lw_notice("\n"); + break; + } + } + step ++; + } + + closesocket(fd); + free(recv_buf); + return NULL; +} + +void PlcGetParamCmd(char *cmd) +{ + const char s[2] = ","; + char *token; + uint16_t cmd_index = 0; + char bin_cmd[PLC_BIN_CMD_LEN] = {0}; + token = strtok(cmd, s); + while(token != NULL) + { + sscanf(token, "%x", &bin_cmd[cmd_index]); + plc_print("%d - %s %d\n", cmd_index, token, bin_cmd[cmd_index]); + token = strtok(NULL, s); + cmd_index ++; + } + TestPlcCmd[plc_cmd_index].cmd_len = cmd_index; + memcpy(TestPlcCmd[plc_cmd_index].cmd, bin_cmd, cmd_index); + plc_print("get %d cmd len %d\n", plc_cmd_index, TestPlcCmd[plc_cmd_index].cmd_len); + plc_cmd_index ++; + plc_socket_demo_data.cmd_num = plc_cmd_index; +} + +void PlcShowUsage(void) +{ + plc_notice("------------------------------------\n"); + plc_notice("PlcSocket [ip].[ip].[ip].[ip]:[port]\n"); + plc_notice("PlcSocket support other param:\n"); + plc_notice("plc=[] 0: OML 1:SIEMENS\n"); + plc_notice("tcp=[] 0: udp 1:tcp\n"); + plc_notice("ip=[ip.ip.ip.ip]\n"); + plc_notice("port=port\n"); + plc_notice("------------------------------------\n"); +} + +void PlcCheckParam(int argc, char *argv[]) +{ + int i; + PlcSocketParamType *param = &plc_socket_demo_data; + plc_cmd_index = 0; + + for(i = 0; i < argc; i++) + { + char *str = argv[i]; + int is_tcp = 0; + char cmd_str[PLC_BIN_CMD_LEN] = {0}; + + plc_print("check %d %s\n", i, str); + + if(sscanf(str, "ip=%d.%d.%d.%d", + ¶m->ip[0], + ¶m->ip[1], + ¶m->ip[2], + ¶m->ip[3]) == 4) + { + plc_print("find ip %d %d %d %d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3]); + continue; + } + + if(sscanf(str, "port=%d", ¶m->port) == 1) + { + plc_print("find port %d\n", param->port); + continue; + } + + if(sscanf(str, "tcp=%d", &is_tcp) == 1) + { + plc_print("find tcp %d\n", is_tcp); + param->socket_type = is_tcp ? SOCK_STREAM:SOCK_DGRAM; + continue; + } + + if(sscanf(str, "plc=%d", ¶m->device_type) == 1) + { + plc_print("find device %d\n", param->device_type); + continue; + } + + if(sscanf(str, "cmd=%s", cmd_str) == 1) + { + plc_print("find cmd %s\n", cmd_str); + PlcGetParamCmd(cmd_str); + continue; + } + } + + if(argc >= 2) + { + if(sscanf(argv[1], "%d.%d.%d.%d:%d", + ¶m->ip[0], + ¶m->ip[1], + ¶m->ip[2], + ¶m->ip[3], + ¶m->port) != EOF) + { + return; + } + + if(sscanf(argv[1], "%d.%d.%d.%d", + ¶m->ip[0], + ¶m->ip[1], + ¶m->ip[2], + ¶m->ip[3]) != EOF) + { + return; + } + } + else + { + PlcShowUsage(); + } +} + + +void PlcSocketTask(int argc, char *argv[]) +{ + int result = 0; + pthread_t th_id; + + pthread_attr_t attr; + attr.schedparam.sched_priority = LWIP_DEMO_TASK_PRIO; + attr.stacksize = LWIP_TASK_STACK_SIZE; + PlcSocketParamType *param = &plc_socket_demo_data; + + PlcCheckParam(argc, argv); + + lwip_config_net(lwip_ipaddr, lwip_netmask, param->ip); + PrivTaskCreate(&th_id, &attr, PlcSocketStart, param); +} + + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), + PlcSocket, PlcSocketTask, Test PLC Socket); + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h new file mode 100755 index 000000000..363877083 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * @file plc_socket.h + * @brief Demo for PLC socket communication function + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022.03.16 + */ + +#ifndef __PLC_SOCKET_H_ +#define __PLC_SOCKET_H_ + +#define PLC_BIN_CMD_LEN 512 + +typedef struct +{ + uint8_t step; + uint16_t delay_ms; + uint8_t cmd_len; + uint8_t cmd[PLC_BIN_CMD_LEN]; +}PlcBinCmdType; + +enum PlcDeviceType { + PLC_DEV_TYPE_OML = 0, + PLC_DEV_TYPE_IPC, + PLC_DEV_TYPE_BRL, + PLC_DEV_TYPE_SIEMENS, + PLC_DEV_TYPE_SIEMENS_1200, + PLC_DEV_TYPE_JF_IPC, + PLC_DEV_TYPE_HG, + /* ...... */ + PLC_DEV_TYPE_END, +}; + +#define PLC_IP_SIZE 16 +#define PLC_DEV_SIZE 32 +#define PLC_TEST_SIZE 65536 + +typedef struct PlcSocketParamStruct{ + char ip[PLC_IP_SIZE]; + uint32_t port; + uint32_t device_type; //PlcDeviceType + uint32_t socket_type; //UDP or TCP + char device[PLC_DEV_SIZE]; + uint32_t step; // communication step + uint32_t cmd_num; // command number + uint32_t buf_size; + uint8_t *buf; +}PlcSocketParamType; + +//debug command +#define plc_print //KPrintf +#define plc_error KPrintf +#define plc_notice KPrintf + +#endif diff --git a/Ubiquitous/XiZi/kernel/thread/msgqueue.c b/Ubiquitous/XiZi/kernel/thread/msgqueue.c index 3c690011a..9480afdb5 100644 --- a/Ubiquitous/XiZi/kernel/thread/msgqueue.c +++ b/Ubiquitous/XiZi/kernel/thread/msgqueue.c @@ -297,6 +297,7 @@ static x_err_t _DeleteMsgQueue(struct MsgQueue *mq) KERNEL_FREE(mq->msg_buf); lock = CriticalAreaLock(); + IdRemoveObj(&k_mq_id_manager, mq->id.id); DoubleLinkListRmNode(&(mq->link)); CriticalAreaUnLock(lock); KERNEL_FREE(mq); diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c index a2c136f0b..e03b8b745 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c @@ -246,7 +246,7 @@ netconn_delete(struct netconn *conn) } else #endif /* LWIP_NETCONN_FULLDUPLEX */ { -// err = netconn_prepare_delete(conn); + err = netconn_prepare_delete(conn); } if (err == ERR_OK) { netconn_free(conn); diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h index ff32bc38b..a8f4b5be8 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h @@ -74,7 +74,7 @@ a lot of data that needs to be copied, this should be set high. */ #define MEMP_NUM_TCP_PCB_LISTEN 2 /* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. */ -#define MEMP_NUM_TCP_SEG 120 +#define MEMP_NUM_TCP_SEG 20 /* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. */ #define MEMP_NUM_SYS_TIMEOUT 6 @@ -212,26 +212,19 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums --------------------------------- */ -#define DEFAULT_RAW_RECVMBOX_SIZE 10 -#define DEFAULT_UDP_RECVMBOX_SIZE 10 -#define DEFAULT_TCP_RECVMBOX_SIZE 10 -#define DEFAULT_ACCEPTMBOX_SIZE 10 +#define DEFAULT_RAW_RECVMBOX_SIZE 8 +#define DEFAULT_UDP_RECVMBOX_SIZE 8 +#define DEFAULT_TCP_RECVMBOX_SIZE 8 +#define DEFAULT_ACCEPTMBOX_SIZE 8 #define DEFAULT_THREAD_PRIO 20 #define DEFAULT_THREAD_STACKSIZE 1024 #define TCPIP_THREAD_NAME "tcp" #define TCPIP_THREAD_STACKSIZE 8192 -#define TCPIP_MBOX_SIZE 10 +#define TCPIP_MBOX_SIZE 8 #define TCPIP_THREAD_PRIO 15 -//#define IPERF_SERVER_THREAD_NAME "iperf_server" -//#define IPERF_SERVER_THREAD_STACKSIZE 1024 -//#define IPERF_SERVER_THREAD_PRIO 0 - -//#define BLOCK_TIME 250 -//#define BLOCK_TIME_WAITING_FOR_INPUT ( ( portTickType ) 100 ) - /* ---------------------------------------- ---------- Lwip Debug options ---------- @@ -259,7 +252,8 @@ typedef unsigned int nfds_t; #define lw_print //KPrintf #define lw_trace() //KPrintf("lw: [%s][%d] passed!\n", __func__, __LINE__) #define lw_error() //KPrintf("lw: [%s][%d] failed!\n", __func__, __LINE__) -#define lw_pr_info KPrintf +#define lw_debug KPrintf +#define lw_notice KPrintf #endif /* __LWIPOPTS_H__ */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c index ad8b13af3..5088c7f37 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c @@ -513,16 +513,16 @@ void lwip_config_net(char *ip, char *mask, char *gw) if(chk_lwip_bit(LWIP_PRINT_FLAG)) { - lw_pr_info("\r\n************************************************\r\n"); - lw_pr_info(" Network Configuration\r\n"); - lw_pr_info("************************************************\r\n"); - lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], + lw_notice("\r\n************************************************\r\n"); + lw_notice(" Network Configuration\r\n"); + lw_notice("************************************************\r\n"); + lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]); - lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], + lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]); - lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], + lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]); - lw_pr_info("************************************************\r\n"); + lw_notice("************************************************\r\n"); } lwip_config_input(&gnetif); } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c index 87e79fd8e..a9e662c09 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c @@ -81,18 +81,18 @@ void LwipShowIPTask(int argc, char *argv[]) { char mac_addr[] = configMAC_ADDR; - lw_pr_info("\r\n************************************************\r\n"); - lw_pr_info(" Network Configuration\r\n"); - lw_pr_info("************************************************\r\n"); - lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_ipaddr)[0], ((u8_t *)&lwip_ipaddr)[1], + lw_notice("\r\n************************************************\r\n"); + lw_notice(" Network Configuration\r\n"); + lw_notice("************************************************\r\n"); + lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_ipaddr)[0], ((u8_t *)&lwip_ipaddr)[1], ((u8_t *)&lwip_ipaddr)[2], ((u8_t *)&lwip_ipaddr)[3]); - lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_netmask)[0], ((u8_t *)&lwip_netmask)[1], + lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_netmask)[0], ((u8_t *)&lwip_netmask)[1], ((u8_t *)&lwip_netmask)[2], ((u8_t *)&lwip_netmask)[3]); - lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1], + lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1], ((u8_t *)&lwip_gwaddr)[2], ((u8_t *)&lwip_gwaddr)[3]); - lw_pr_info(" MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr[0], mac_addr[1], mac_addr[2], + lw_notice(" MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); - lw_pr_info("************************************************\r\n"); + lw_notice("************************************************\r\n"); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c index cfeff2499..87443523e 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c @@ -61,54 +61,54 @@ int LwipPrintDHCP(struct netif *netif) { dhcp_last_state = dhcp->state; - lw_pr_info(" DHCP state : "); + lw_notice(" DHCP state : "); switch (dhcp_last_state) { case DHCP_STATE_OFF: - lw_pr_info("OFF"); + lw_notice("OFF"); break; case DHCP_STATE_REQUESTING: - lw_pr_info("REQUESTING"); + lw_notice("REQUESTING"); break; case DHCP_STATE_INIT: - lw_pr_info("INIT"); + lw_notice("INIT"); break; case DHCP_STATE_REBOOTING: - lw_pr_info("REBOOTING"); + lw_notice("REBOOTING"); break; case DHCP_STATE_REBINDING: - lw_pr_info("REBINDING"); + lw_notice("REBINDING"); break; case DHCP_STATE_RENEWING: - lw_pr_info("RENEWING"); + lw_notice("RENEWING"); break; case DHCP_STATE_SELECTING: - lw_pr_info("SELECTING"); + lw_notice("SELECTING"); break; case DHCP_STATE_INFORMING: - lw_pr_info("INFORMING"); + lw_notice("INFORMING"); break; case DHCP_STATE_CHECKING: - lw_pr_info("CHECKING"); + lw_notice("CHECKING"); break; case DHCP_STATE_BOUND: - lw_pr_info("BOUND"); + lw_notice("BOUND"); break; case DHCP_STATE_BACKING_OFF: - lw_pr_info("BACKING_OFF"); + lw_notice("BACKING_OFF"); break; default: - lw_pr_info("%u", dhcp_last_state); + lw_notice("%u", dhcp_last_state); assert(0); break; } - lw_pr_info("\r\n"); + lw_notice("\r\n"); if (dhcp_last_state == DHCP_STATE_BOUND) { - lw_pr_info("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); - lw_pr_info(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); - lw_pr_info(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); + lw_notice("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); + lw_notice(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); + lw_notice(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); return 1; } } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c index f99e8b380..4eb01d0ba 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c @@ -60,7 +60,7 @@ void LwipPingTest(int argc, char *argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &lwip_gwaddr[0], &lwip_gwaddr[1], &lwip_gwaddr[2], &lwip_gwaddr[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return; } } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c index 98bf62cb5..387899abc 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c @@ -27,52 +27,61 @@ #define MSG_SIZE 128 +typedef struct LwipTcpSocketStruct +{ + char ip[6]; + uint16_t port; + char *buf; // test buffer +}LwipTcpSocketParamType; + // this is for test in shell, in fact, shell restrict the length of input string, which is less then 128 char tcp_send_msg[MSG_SIZE] = {0}; char tcp_target[] = {192, 168, 250, 252}; +uint16_t tcp_port = LWIP_TARGET_PORT; /******************************************************************************/ static void LwipTcpSendTask(void *arg) { - lw_print("LwipTcpSendTask start.\n"); + lw_notice("LwipTcpSendTask start.\n"); int fd = -1; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { - lw_print("Socket error\n"); + lw_notice("Socket error\n"); return; } + LwipTcpSocketParamType *param = (LwipTcpSocketParamType *)arg; + struct sockaddr_in tcp_sock; tcp_sock.sin_family = AF_INET; - tcp_sock.sin_port = htons(LWIP_TARGET_PORT); - tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(tcp_target[0], tcp_target[1], tcp_target[2], tcp_target[3])); + tcp_sock.sin_port = htons(param->port); + tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(param->ip[0], param->ip[1], param->ip[2], param->ip[3])); memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) { - lw_print("Unable to connect\n"); - goto __exit; + lw_notice("Unable to connect\n"); + closesocket(fd); + return; } - lw_print("tcp connect success, start to send.\n"); - lw_print("\n\nTarget Port:%d\n\n", tcp_sock.sin_port); + lw_notice("tcp connect success, start to send.\n"); + lw_notice("\n\nTarget Port:%d\n\n", tcp_sock.sin_port); sendto(fd, tcp_send_msg, strlen(tcp_send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); - lw_print("Send tcp msg: %s ", tcp_send_msg); - -__exit: - if (fd >= 0) - closesocket(fd); + lw_notice("Send tcp msg: %s ", tcp_send_msg); + closesocket(fd); return; } void LwipTcpSendTest(int argc, char *argv[]) { + LwipTcpSocketParamType param; memset(tcp_send_msg, 0, MSG_SIZE); if(argc >= 2) { @@ -86,11 +95,20 @@ void LwipTcpSendTest(int argc, char *argv[]) if(argc >= 3) { - sscanf(argv[2], "%d.%d.%d.%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3]); + if(sscanf(argv[2], "%d.%d.%d.%d:%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3], &tcp_port) == EOK) + { + sscanf(argv[2], "%d.%d.%d.%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3]); + } } + lw_notice("get ipaddr %d.%d.%d.%d:%d\n", tcp_target[0], tcp_target[1], tcp_target[2], tcp_target[3], tcp_port); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_target); - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); - sys_thread_new("tcp send", LwipTcpSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); + memcpy(param.ip, tcp_target, 4); + param.port = tcp_port; + param.buf = malloc(MSG_SIZE); + memcpy(param.buf, tcp_send_msg, MSG_SIZE); + + sys_thread_new("tcp send", LwipTcpSendTask, ¶m, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c index 9f459031a..97d06b119 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c @@ -30,7 +30,8 @@ #define PBUF_SIZE 27 static struct udp_pcb *udpecho_raw_pcb; -char udp_target[] = {192, 168, 250, 252}; +char udp_demo_ip[] = {192, 168, 250, 252}; +uint16_t udp_demo_port = LWIP_TARGET_PORT; char hello_str[] = {"hello world\r\n"}; char udp_send_msg[] = "\n\nThis one is UDP pkg. Congratulations on you.\n\n"; @@ -52,28 +53,23 @@ static void LwipUDPSendTask(void *arg) struct sockaddr_in udp_sock; udp_sock.sin_family = AF_INET; - udp_sock.sin_port = htons(LWIP_TARGET_PORT); - udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_target[0],udp_target[1],udp_target[2],udp_target[3])); + udp_sock.sin_port = htons(udp_demo_port); + udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3])); memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero)); if (connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) { lw_print("Unable to connect\n"); - goto __exit; + closesocket(socket_fd); + return; } lw_print("UDP connect success, start to send.\n"); lw_print("\n\nTarget Port:%d\n\n", udp_sock.sin_port); sendto(socket_fd, udp_send_msg, strlen(udp_send_msg), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); - lw_pr_info("Send UDP msg: %s ", udp_send_msg); - -__exit: - if (socket_fd >= 0) - { - closesocket(socket_fd); - } - + lw_notice("Send UDP msg: %s ", udp_send_msg); + closesocket(socket_fd); return; } @@ -86,7 +82,7 @@ void *LwipUdpSendTest(int argc, char *argv[]) if(argc == 1) { - lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_target[0], udp_target[1], udp_target[2], udp_target[3]); + lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]); strncpy(udp_send_msg, hello_str, strlen(hello_str)); } else @@ -95,12 +91,12 @@ void *LwipUdpSendTest(int argc, char *argv[]) strncat(udp_send_msg, "\r\n", 2); if(argc == 3) { - sscanf(argv[2], "%d.%d.%d.%d", &udp_target[0], &udp_target[1], &udp_target[2], &udp_target[3]); + sscanf(argv[2], "%d.%d.%d.%d", &udp_demo_ip[0], &udp_demo_ip[1], &udp_demo_ip[2], &udp_demo_ip[3]); } } - lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_target[0], udp_target[1], udp_target[2], udp_target[3]); + lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]); - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); + lwip_config_net(lwip_ipaddr, lwip_netmask, lwip_gwaddr); sys_thread_new("udp socket send", LwipUDPSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } @@ -121,11 +117,11 @@ static void LwipUdpRecvTask(void *arg, struct udp_pcb *upcb, struct pbuf *p, return; } udp_len = p->tot_len; - lw_pr_info("Receive data :%dB\r\n", udp_len); + lw_notice("Receive data :%dB\r\n", udp_len); if(udp_len <= 80) { - lw_pr_info("%.*s\r\n", udp_len, (char *)(p->payload)); + lw_notice("%.*s\r\n", udp_len, (char *)(p->payload)); } udp_buf = pbuf_alloc(PBUF_TRANSPORT, PBUF_SIZE, PBUF_RAM); diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c index 1a66bd272..15c2f6c1e 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c @@ -492,7 +492,7 @@ int get_url_ip(char* url) /* convert URL to IP */ if (lwip_getaddrinfo(url, NULL, &hint, &res) != 0) { - lw_pr_info("ping: unknown host %s\n", url); + lw_notice("ping: unknown host %s\n", url); return -1; } memcpy(&h, &res->ai_addr, sizeof(struct sockaddr_in *)); @@ -500,13 +500,13 @@ int get_url_ip(char* url) lwip_freeaddrinfo(res); if (inet_aton(inet_ntoa(ina), &target_addr) == 0) { - lw_pr_info("ping: unknown host %s\n", url); + lw_notice("ping: unknown host %s\n", url); return -2; } /* new a socket */ if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0) { - lw_pr_info("ping: create socket failed\n"); + lw_notice("ping: create socket failed\n"); return -3; } @@ -521,12 +521,12 @@ int get_url_ip(char* url) #endif /* LWIP_DEBUG */ if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0) { - lw_pr_info("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt, + lw_notice("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt, ttl, sys_now() - ping_time); } else { - lw_pr_info("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt); + lw_notice("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt); } } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c index 026207891..d924f3285 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c @@ -159,9 +159,9 @@ tcpecho_raw_ack(struct tcp_pcb *tpcb, struct tcpecho_raw_state* es){ if((recv_len != TCP_MSS) || (recv_buf[recv_len - 1] == TCP_EOF_CH)) { if(g_buf_size < MAX_TCP_SHOW_SIZE){ - lw_pr_info("Received: %s\n", g_buf); + lw_notice("Received: %s\n", g_buf); }else{ - lw_pr_info("Received a string of length %d\n", g_buf_size); + lw_notice("Received a string of length %d\n", g_buf_size); } tcpecho_raw_ack_size(tpcb, g_buf_size); From 4843ff9e61bb3971a3bf241e207f1ced98244386 Mon Sep 17 00:00:00 2001 From: wlyu Date: Thu, 17 Mar 2022 15:33:37 +0800 Subject: [PATCH 3/6] support control json file --- .../socket_demo/lwip_tcp_socket_demo.c | 24 +- .../socket_demo/lwip_udp_socket_demo.c | 6 +- .../control_app/opcua_demo/opcua_demo.c | 38 +- .../control/plc/interoperability/Kconfig | 6 +- .../control/plc/interoperability/Makefile | 4 + .../plc/interoperability/opcua/open62541.c | 6 +- .../plc/interoperability/opcua/ua_api.c | 7 +- .../plc/interoperability/opcua/ua_api.h | 3 +- .../plc/interoperability/opcua/ua_client.c | 42 +- .../plc/interoperability/opcua/ua_test.c | 6 +- .../plc/interoperability/socket/Kconfig | 11 + .../plc/interoperability/socket/Makefile | 4 + .../plc/interoperability/socket/br_socket.c | 1867 +++++++++++++++++ .../plc/interoperability/socket/plc_socket.c | 329 +++ .../plc/interoperability/socket/plc_socket.h | 67 + .../Framework/control/plc/shared/plc_device.h | 2 +- .../Framework/control/shared/Makefile | 4 + .../Framework/control/shared/control_file.c | 129 ++ .../Framework/control/shared/control_file.h | 35 + APP_Framework/lib/Kconfig | 4 +- APP_Framework/lib/Makefile | 3 + APP_Framework/lib/cJSON/Makefile | 3 + Ubiquitous/XiZi/board/ok1052-c/board.c | 17 +- .../board/ok1052-c/third_party_driver/Kconfig | 6 +- .../ok1052-c/third_party_driver/spi/Makefile | 6 +- Ubiquitous/XiZi/kernel/thread/msgqueue.c | 25 +- Ubiquitous/XiZi/path_kernel.mk | 1 + .../resources/ethernet/LwIP/api/api_lib.c | 5 +- .../resources/ethernet/LwIP/api/sockets.c | 20 + .../resources/ethernet/LwIP/arch/lwipopts.h | 22 +- .../resources/ethernet/LwIP/arch/sys_arch.c | 14 +- .../resources/ethernet/LwIP/core/tcp_out.c | 6 +- .../ethernet/cmd_lwip/lwip_config_demo.c | 16 +- .../ethernet/cmd_lwip/lwip_dhcp_demo.c | 34 +- .../ethernet/cmd_lwip/lwip_ping_demo.c | 2 +- .../ethernet/cmd_lwip/lwip_tcp_demo.c | 50 +- .../ethernet/cmd_lwip/lwip_udp_demo.c | 32 +- .../XiZi/resources/ethernet/cmd_lwip/ping.c | 10 +- .../resources/ethernet/cmd_lwip/tcpecho_raw.c | 4 +- Ubiquitous/XiZi/resources/include/flash_spi.h | 2 + .../XiZi/tool/shell/letter-shell/shell.c | 299 +-- .../XiZi/tool/shell/letter-shell/shell_port.c | 32 +- 42 files changed, 2857 insertions(+), 346 deletions(-) create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/Kconfig create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/Makefile create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h create mode 100755 APP_Framework/Framework/control/shared/control_file.c create mode 100755 APP_Framework/Framework/control/shared/control_file.h create mode 100755 APP_Framework/lib/cJSON/Makefile diff --git a/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c b/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c index d30248442..a09866fa9 100755 --- a/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c +++ b/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c @@ -67,7 +67,7 @@ static void TCPSocketRecvTask(void *arg) } lw_print("tcp bind success, start to receive.\n"); - lw_pr_info("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); + lw_notice("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); // setup socket fd as listening mode if (listen(fd, 5) != 0 ) @@ -78,7 +78,7 @@ static void TCPSocketRecvTask(void *arg) // accept client connection clientfd = accept(fd, (struct sockaddr *)&tcp_addr, (socklen_t*)&addr_len); - lw_pr_info("client %s connected\n", inet_ntoa(tcp_addr.sin_addr)); + lw_notice("client %s connected\n", inet_ntoa(tcp_addr.sin_addr)); while(1) { @@ -86,8 +86,8 @@ static void TCPSocketRecvTask(void *arg) recv_len = recvfrom(clientfd, recv_buf, TCP_DEMO_BUF_SIZE, 0, (struct sockaddr *)&tcp_addr, &addr_len); if(recv_len > 0) { - lw_pr_info("Receive from : %s\n", inet_ntoa(tcp_addr.sin_addr)); - lw_pr_info("Receive data : %d - %s\n\n", recv_len, recv_buf); + lw_notice("Receive from : %s\n", inet_ntoa(tcp_addr.sin_addr)); + lw_notice("Receive data : %d - %s\n\n", recv_len, recv_buf); } sendto(clientfd, recv_buf, recv_len, 0, (struct sockaddr*)&tcp_addr, addr_len); } @@ -113,7 +113,7 @@ void TCPSocketRecvTest(int argc, char *argv[]) sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); } - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip); sys_thread_new("TCPSocketRecvTask", TCPSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } @@ -133,7 +133,7 @@ static void TCPSocketSendTask(void *arg) if (fd < 0) { lw_print("Socket error\n"); - goto __exit; + return; } struct sockaddr_in tcp_sock; @@ -145,25 +145,23 @@ static void TCPSocketSendTask(void *arg) if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) { lw_print("Unable to connect\n"); - goto __exit; + closesocket(fd); + return; } lw_print("tcp connect success, start to send.\n"); - lw_pr_info("\n\nTarget Port:%d\n\n", LWIP_TARGET_PORT); + lw_notice("\n\nTarget Port:%d\n\n", LWIP_TARGET_PORT); while (cnt --) { lw_print("Lwip client is running.\n"); snprintf(send_msg, sizeof(send_msg), "TCP test package times %d\r\n", cnt); sendto(fd, send_msg, strlen(send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); - lw_pr_info("Send tcp msg: %s ", send_msg); + lw_notice("Send tcp msg: %s ", send_msg); MdelayKTask(1000); } -__exit: - if (fd >= 0) - closesocket(fd); - + closesocket(fd); return; } diff --git a/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c b/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c index 4dd23b9e2..24a1a374f 100755 --- a/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c +++ b/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c @@ -78,8 +78,8 @@ static void UdpSocketRecvTask(void *arg) { memset(recv_buf, 0, UDP_BUF_SIZE); recv_len = recvfrom(socket_fd, recv_buf, UDP_BUF_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len); - lw_pr_info("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); - lw_pr_info("Receive data : %s\n\n", recv_buf); + lw_notice("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); + lw_notice("Receive data : %s\n\n", recv_buf); sendto(socket_fd, recv_buf, recv_len, 0, (struct sockaddr*)&server_addr, addr_len); } @@ -151,7 +151,7 @@ static void UdpSocketSendTask(void *arg) { snprintf(send_str, sizeof(send_str), "UDP test package times %d\r\n", cnt); sendto(socket_fd, send_str, strlen(send_str), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); - lw_pr_info("Send UDP msg: %s ", send_str); + lw_notice("Send UDP msg: %s ", send_str); MdelayKTask(1000); } diff --git a/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c b/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c index c8a0e8d54..e1edcf29a 100755 --- a/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c +++ b/APP_Framework/Applications/control_app/opcua_demo/opcua_demo.c @@ -11,7 +11,7 @@ */ /** - * @file ua_demo.c + * @file opcua_demo.c * @brief Demo for OpcUa function * @version 1.0 * @author AIIT XUOS Lab @@ -29,7 +29,6 @@ * Definitions ******************************************************************************/ -#define TCP_LOCAL_PORT 4840 #define UA_URL_SIZE 100 #define UA_STACK_SIZE 4096 #define UA_TASK_PRIO 15 @@ -66,18 +65,17 @@ static void UaConnectTestTask(void* arg) UA_ClientConfig_setDefault(config); snprintf(ua_uri, sizeof(ua_uri), "opc.tcp://%d.%d.%d.%d:4840", test_ua_ip[0], test_ua_ip[1], test_ua_ip[2], test_ua_ip[3]); - ua_pr_info("ua uri: %d %s\n", strlen(ua_uri), ua_uri); + ua_notice("ua uri: %d %s\n", strlen(ua_uri), ua_uri); retval = UA_Client_connect(client,ua_uri); if(retval != UA_STATUSCODE_GOOD) { - ua_pr_info("ua: [%s] connected failed %x\n", __func__, retval); + ua_notice("ua: [%s] connected failed %x\n", __func__, retval); UA_Client_delete(client); return; } - ua_pr_info("ua: [%s] connected ok!\n", __func__); - UA_Client_disconnect(client); + ua_notice("ua: [%s] connected ok!\n", __func__); UA_Client_delete(client); } @@ -92,12 +90,13 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | void UaBrowserObjectsTestTask(void* param) { + static int test_cnt = 0; UA_Client* client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start %d ...\n", __func__, test_cnt++); if(client == NULL) { - ua_print("ua: [%s] tcp client null\n", __func__); + ua_error("ua: [%s] tcp client NULL\n", __func__); return; } @@ -107,18 +106,17 @@ void UaBrowserObjectsTestTask(void* param) if(retval != UA_STATUSCODE_GOOD) { - ua_print("ua: [%s] connect failed %#x\n", __func__, retval); + ua_error("ua: [%s] connect failed %#x\n", __func__, retval); UA_Client_delete(client); return; } - ua_print("ua: [%s] connect ok!\n", __func__); - ua_pr_info("--- start read time ---\n", __func__); + ua_notice("--- start read time ---\n", __func__); ua_read_time(client); - ua_pr_info("--- get server info ---\n", __func__); + ua_notice("--- get server info ---\n", __func__); ua_test_browser_objects(client); + /* Clean up */ - UA_Client_disconnect(client); UA_Client_delete(client); /* Disconnects the client internally */ } @@ -130,7 +128,7 @@ void* UaBrowserObjectsTest(int argc, char* argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return NULL; } } @@ -147,7 +145,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | void UaGetInfoTestTask(void* param) { UA_Client* client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start ...\n", __func__); if(client == NULL) { @@ -167,7 +165,7 @@ void UaGetInfoTestTask(void* param) } ua_print("ua: [%s] connect ok!\n", __func__); - ua_pr_info("--- interactive server ---\n", __func__); + ua_notice("--- interactive server ---\n", __func__); ua_test_interact_server(client); /* Clean up */ UA_Client_disconnect(client); @@ -182,7 +180,7 @@ void* UaGetInfoTest(int argc, char* argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return NULL; } } @@ -199,7 +197,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | void UaAddNodesTask(void* param) { UA_Client* client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start ...\n", __func__); if(client == NULL) { @@ -219,7 +217,7 @@ void UaAddNodesTask(void* param) } ua_print("ua: [%s] connect ok!\n", __func__); - ua_pr_info("--- add nodes ---\n", __func__); + ua_notice("--- add nodes ---\n", __func__); ua_add_nodes(client); /* Clean up */ UA_Client_disconnect(client); @@ -234,7 +232,7 @@ void* UaAddNodesTest(int argc, char* argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &test_ua_ip[0], &test_ua_ip[1], &test_ua_ip[2], &test_ua_ip[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return NULL; } } diff --git a/APP_Framework/Framework/control/plc/interoperability/Kconfig b/APP_Framework/Framework/control/plc/interoperability/Kconfig index 66ae5f182..6a7cb0324 100755 --- a/APP_Framework/Framework/control/plc/interoperability/Kconfig +++ b/APP_Framework/Framework/control/plc/interoperability/Kconfig @@ -2,5 +2,9 @@ menuconfig USING_CONTROL_PLC_OPCUA bool "PLC support OPCUA" default y - depends on RESOURCES_LWIP + depends on RESOURCES_LWIP +menuconfig USING_CONTROL_PLC_SOCKET + bool "PLC support SOCKET" + default y + depends on RESOURCES_LWIP diff --git a/APP_Framework/Framework/control/plc/interoperability/Makefile b/APP_Framework/Framework/control/plc/interoperability/Makefile index 7f542f711..d329b91fb 100755 --- a/APP_Framework/Framework/control/plc/interoperability/Makefile +++ b/APP_Framework/Framework/control/plc/interoperability/Makefile @@ -6,6 +6,10 @@ ifeq ($(CONFIG_USING_CONTROL_PLC_OPCUA), y) SRC_DIR += opcua endif +ifeq ($(CONFIG_USING_CONTROL_PLC_SOCKET), y) + SRC_DIR += socket +endif + endif SRC_FILES += interoperability.c diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c b/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c index 3da01d2b7..fc525aa8d 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/open62541.c @@ -68231,11 +68231,11 @@ UA_Log_Stdout_log(void *context, UA_LogLevel level, UA_LogCategory category, // (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]); // vprintf(msg, args); - KPrintf("%s/%s" ANSI_COLOR_RESET "\t", + ua_print("%s/%s" ANSI_COLOR_RESET "\t", logLevelNames[level], logCategoryNames[category]); vsnprintf(str, sizeof(str) - 1, msg, args); - KPrintf(msg, str); - KPrintf("\n"); + ua_print(msg, str); + ua_print("\n"); // printf("\n"); fflush(stdout); diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c index e2e5fdb3e..4512368be 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.c @@ -28,7 +28,7 @@ int ua_open(void *dev) param->client = UA_Client_new(); - ua_pr_info("ua: [%s] start ...\n", __func__); + ua_notice("ua: [%s] start ...\n", __func__); if (param->client == NULL) { @@ -39,11 +39,11 @@ int ua_open(void *dev) UA_ClientConfig *config = UA_Client_getConfig(param->client); UA_ClientConfig_setDefault(config); - ua_pr_info("ua: [%s] %d %s\n", __func__, strlen(param->ua_remote_ip), param->ua_remote_ip); + ua_notice("ua: [%s] %d %s\n", __func__, strlen(param->ua_remote_ip), param->ua_remote_ip); UA_StatusCode retval = UA_Client_connect(param->client, param->ua_remote_ip); if(retval != UA_STATUSCODE_GOOD) { - ua_pr_info("ua: [%s] deleted ret %x!\n", __func__, retval); + ua_notice("ua: [%s] deleted ret %x!\n", __func__, retval); return (int)retval; } return EOK; @@ -52,7 +52,6 @@ int ua_open(void *dev) void ua_close(void *dev) { UaParamType *param = (UaParamType *)dev; - UA_Client_disconnect(param->client); UA_Client_delete(param->client); /* Disconnects the client internally */ } diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h index 903d9c6aa..7da7a4faa 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_api.h @@ -43,8 +43,9 @@ typedef struct UaParam #define ua_print //KPrintf #define ua_trace() //KPrintf("ua: [%s] line %d checked!\n", __func__, __LINE__) -#define ua_pr_info KPrintf +#define ua_notice KPrintf #define ua_debug //KPrintf +#define ua_error KPrintf extern const char *opc_server_url; extern char test_ua_ip[]; diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c index 65a4ecb43..749025f75 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_client.c @@ -42,7 +42,7 @@ static UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId } UA_NodeId* parent = (UA_NodeId*)handle; - ua_pr_info("%d, %d --- %d ---> NodeId %d, %d\n", + ua_notice("%d, %d --- %d ---> NodeId %d, %d\n", parent->namespaceIndex, parent->identifier.numeric, referenceTypeId.identifier.numeric, childId.namespaceIndex, childId.identifier.numeric); @@ -81,38 +81,38 @@ void ua_print_value(UA_Variant* val) if(val->type == &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]) { UA_LocalizedText* ptr = (UA_LocalizedText*)val->data; - ua_pr_info("%.*s (Text)\n", ptr->text.length, ptr->text.data); + ua_notice("%.*s (Text)\n", ptr->text.length, ptr->text.data); } else if(val->type == &UA_TYPES[UA_TYPES_UINT32]) { UA_UInt32* ptr = (UA_UInt32*)val->data; - ua_pr_info("%d (UInt32)\n", *ptr); + ua_notice("%d (UInt32)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_BOOLEAN]) { UA_Boolean* ptr = (UA_Boolean*)val->data; - ua_pr_info("%i (BOOL)\n", *ptr); + ua_notice("%i (BOOL)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_INT32]) { UA_Int32* ptr = (UA_Int32*)val->data; - ua_pr_info("%d (Int32)\n", *ptr); + ua_notice("%d (Int32)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_INT16]) { UA_Int16* ptr = (UA_Int16*)val->data; - ua_pr_info("%d (Int16)\n", *ptr); + ua_notice("%d (Int16)\n", *ptr); } else if(val->type == &UA_TYPES[UA_TYPES_STRING]) { UA_String* ptr = (UA_String*)val->data; - ua_pr_info("%*.s (String)\n", ptr->length, ptr->data); + ua_notice("%*.s (String)\n", ptr->length, ptr->data); } else if(val->type == &UA_TYPES[UA_TYPES_DATETIME]) { UA_DateTime* ptr = (UA_DateTime*)val->data; UA_DateTimeStruct dts = UA_DateTime_toStruct(*ptr); - ua_pr_info("%d-%d-%d %d:%d:%d.%03d (Time)\n", + ua_notice("%d-%d-%d %d:%d:%d.%03d (Time)\n", dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec); } } @@ -144,14 +144,14 @@ void ua_print_nodeid(UA_NodeId *node_id) switch(node_id->identifierType) { case UA_NODEIDTYPE_NUMERIC: - ua_pr_info(" NodeID n%d,%d ", node_id->namespaceIndex, node_id->identifier.numeric); + ua_notice(" NodeID n%d,%d ", node_id->namespaceIndex, node_id->identifier.numeric); break; case UA_NODEIDTYPE_STRING: - ua_pr_info(" NodeID n%d,%.*s ", node_id->namespaceIndex, node_id->identifier.string.length, + ua_notice(" NodeID n%d,%.*s ", node_id->namespaceIndex, node_id->identifier.string.length, node_id->identifier.string.data); break; case UA_NODEIDTYPE_BYTESTRING: - ua_pr_info(" NodeID n%d,%s ", node_id->namespaceIndex, node_id->identifier.byteString.data); + ua_notice(" NodeID n%d,%s ", node_id->namespaceIndex, node_id->identifier.byteString.data); break; default: break; @@ -160,7 +160,7 @@ void ua_print_nodeid(UA_NodeId *node_id) void ua_print_object(UA_BrowseResponse* res) { - ua_pr_info("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME"); + ua_notice("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME"); for(size_t i = 0; i < res->resultsSize; ++i) { @@ -170,14 +170,14 @@ void ua_print_object(UA_BrowseResponse* res) if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC) { - ua_pr_info("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, + ua_notice("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length, ref->browseName.name.data, (int)ref->displayName.text.length, ref->displayName.text.data); } else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING) { - ua_pr_info("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, + ua_notice("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex, (int)ref->nodeId.nodeId.identifier.string.length, ref->nodeId.nodeId.identifier.string.data, (int)ref->browseName.name.length, ref->browseName.name.data, @@ -188,7 +188,7 @@ void ua_print_object(UA_BrowseResponse* res) } } - ua_pr_info("\n"); + ua_notice("\n"); } UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValueId* array) @@ -203,7 +203,7 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu || (response.resultsSize != array_size)) { UA_ReadResponse_clear(&response); - ua_pr_info("ua: [%s] read failed 0x%x\n", __func__, + ua_notice("ua: [%s] read failed 0x%x\n", __func__, response.responseHeader.serviceResult); return UA_STATUSCODE_BADUNEXPECTEDERROR; } @@ -215,11 +215,11 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu if((response.results[i].status == UA_STATUSCODE_GOOD) && (response.results[i].hasValue)) { - ua_pr_info("node %s: ", ua_get_nodeid_str(&array[i].nodeId)); + ua_notice("node %s: ", ua_get_nodeid_str(&array[i].nodeId)); ua_print_value(&response.results[i].value); } } - ua_pr_info("\n"); + ua_notice("\n"); free(arr_ret); UA_ReadResponse_clear(&response); @@ -229,7 +229,7 @@ UA_StatusCode ua_read_array_value(UA_Client* client, int array_size, UA_ReadValu void ua_browser_id(UA_Client* client, UA_NodeId id) { /* Browse some objects */ - ua_pr_info("Browsing nodes in objects folder:\n"); + ua_notice("Browsing nodes in objects folder:\n"); UA_BrowseRequest bReq; UA_BrowseRequest_init(&bReq); bReq.requestedMaxReferencesPerNode = 0; @@ -327,7 +327,7 @@ void ua_write_nodeid_value(UA_Client* client, UA_NodeId id, char* value) if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD) { - ua_pr_info("write new value is: %s\n", value); + ua_notice("write new value is: %s\n", value); } UA_WriteRequest_clear(&wReq); @@ -489,7 +489,7 @@ void ua_read_time(UA_Client* client) { UA_DateTime raw_date = *(UA_DateTime*) value.data; UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date); - ua_pr_info("date is: %d-%d-%d %d:%d:%d.%03d\n", + ua_notice("date is: %d-%d-%d %d:%d:%d.%03d\n", dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec); } diff --git a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c index 329118bfc..d11b86896 100755 --- a/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c +++ b/APP_Framework/Framework/control/plc/interoperability/opcua/ua_test.c @@ -53,7 +53,7 @@ void ua_test_browser_objects(UA_Client *client) ua_browser_id(client, UA_TEST_BROWSER_NODEID); ua_browser_id(client, UA_TEST_BROWSER_NODEID1); test_id = UA_TEST_BROWSER_NODEID1; - ua_pr_info("Show values in %s:\n", ua_get_nodeid_str(&test_id)); + ua_notice("Show values in %s:\n", ua_get_nodeid_str(&test_id)); ua_test_read_array(client); return; } @@ -64,11 +64,11 @@ void ua_test_write_attr(UA_Client *client) char val_str[UA_NODE_LEN]; UA_NodeId id = UA_TEST_WRITE_NODEID; - ua_pr_info("--- Test write %s ---\n", ua_get_nodeid_str(&id)); + ua_notice("--- Test write %s ---\n", ua_get_nodeid_str(&id)); ua_read_nodeid_value(client, id, &value); ua_write_nodeid_value(client, id, itoa(value + 1, val_str, 10)); ua_read_nodeid_value(client, id, &value); - ua_pr_info("\n"); + ua_notice("\n"); } int ua_test_interact_server(UA_Client *client) diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/Kconfig b/APP_Framework/Framework/control/plc/interoperability/socket/Kconfig new file mode 100755 index 000000000..d8325aa40 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/Kconfig @@ -0,0 +1,11 @@ + +menuconfig USING_CONTROL_PLC_OPCUA + bool "PLC support OPCUA" + default y + depends on RESOURCES_LWIP + +menuconfig USING_CONTROL_PLC_SOCKET + bool "PLC support SOCKET" + default y + depends on RESOURCES_LWIP + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/Makefile b/APP_Framework/Framework/control/plc/interoperability/socket/Makefile new file mode 100755 index 000000000..2c3e00b48 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/Makefile @@ -0,0 +1,4 @@ +SRC_FILES := plc_socket.c + +include $(KERNEL_ROOT)/compiler.mk + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c new file mode 100755 index 000000000..a655a0a67 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c @@ -0,0 +1,1867 @@ +#include +#include +#include "plc_socket.h" + +#define xs_kprintf KPrintf +#define xs_device_t uint32_t + + +static unsigned char data_head = 0x5A; +static char device_s14[] = "S14"; +static char device_s15[] = "S15"; +static char device_s16[] = "S16"; +static char device_s17[] = "S17"; +static char device_s18[] = "S18"; +static char data_end[] = "#"; +unsigned char redis_data[1024]; + +// 创建一个信号量,用于接收消息的同步 +static sem_t Ch_Sem = NULL; +static sem_t Rx_Sem = NULL; + +extern xs_device_t ec200t; + +//for SIEMENS TCP read data cmd +const unsigned char handshake_first[] = +{ + 0x3, 0x00, 0x00, 0x16, 0x11, 0xe0, 0x00, 0x00, 0x02, + 0xc8,0x00,0xc1,0x02,0x02,0x01,0xc2,0x02,0x02,0x01,0xc0,0x01,0x0a +}; + +const unsigned char handshake_second[] = +{ + 0x3,0x00,0x00,0x19,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x00,0x0d,0x00,0x08,0x00,0x00,0xf0,0x00,0x00,0x01,0x00,0x01,0x00,0xf0 +}; + +const unsigned char siemens_read_data[] = +{ + 0x3,0x00,0x00, 0x1f,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x33,0x01,0x00,0x0e,0x00,0x00,0x04,0x01,0x12,0x0a,0x10,0x02,0x00,0xD2,0x00,0x34,0x84,0x00,0x00,0x00 +}; + +//for OML UDP read data cmd +const unsigned char UDP_read_data[] = +{ + 0x80,0x00,0x02,0x00,0x03,0x00,0x00,0x7E,0x00,0x00,0x01,0x01,0x82,0x0F,0xA0,0x00,0x00,0x20 +}; + +//for SIEMENS 1200 read data cmd +const unsigned char handshake_1200_first[] = +{ + 0x03, 0x00, 0x00, 0x16, 0x11, 0xE0, 0x00, 0x00, 0x02, 0xC8, 0x00, 0xC1, 0x02, 0x02, 0x01, 0xC2, 0x02, 0x02, 0x01, 0xC0, 0x01, 0x0A +}; + +const unsigned char handshake_1200_second[] = +{ + 0x03, 0x00, 0x00, 0x19, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x08, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xF0 +}; + +const unsigned char siemens_1200_read_data[] = +{ + 0x03, 0x00, 0x00, 0x1F, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, 0xD2, 0x00, 0x34, 0x84, 0x00, 0x00, 0x00 +}; + +#define PUT_ULONG_BE(n,b,i) \ +{ \ + (b)[(i) ] = (uint8_t) ( (n) >> 24 ); \ + (b)[(i) + 1] = (uint8_t) ( (n) >> 16 ); \ + (b)[(i) + 2] = (uint8_t) ( (n) >> 8 ); \ + (b)[(i) + 3] = (uint8_t) ( (n) ); \ +} + +#define GET_ULONG_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} + +#define XS_SERIAL_RB_BUFSZ 128 + +char rx_buffer_cmp[256 + 1]; +char msg_pool[256]; +char rx_buffer[XS_SERIAL_RB_BUFSZ + 1] = {0}; +#define WIFI_RESET 73 + +#define LEN_PARA_BUF 128 +uint8_t server_addr_wifi[LEN_PARA_BUF] = "192.168.23.181"; //??????? +uint8_t server_port_wifi[LEN_PARA_BUF] = "9999"; //?????? + +uint8_t WIFI_ssid[LEN_PARA_BUF] = "xiaoshanos"; //WIFI? +uint8_t WIFI_pwd[LEN_PARA_BUF] = "12345678"; //WIFI???? + +#if 0 +/* ?????? */ +xs_device_t hfa21; +/* ??????? */ +struct xs_MessageQueue* rx3_mq; +/* ???????? */ + +void hfa21_sta_config(void) +{ + xs_kprintf("hfa21_sta_config start\r\n"); + uint8_t i,step; + uint8_t cmd[LEN_PARA_BUF]; + step = 1; + strcpy(cmd, "+++"); + //send + xs_DeviceWrite(hfa21, 0, cmd, 3); + xs_kprintf("cmd.%d=%s\r\n",step,cmd); + step = 2; + memset(cmd,0,sizeof(cmd)); + xs_MdelayKTask(100); + strcpy(cmd,"a"); + //send + xs_DeviceWrite(hfa21, 0, cmd, 1); + xs_kprintf("cmd.%d=%s\r\n",step,cmd); + step = 3; + memset(cmd,0,sizeof(cmd)); + xs_MdelayKTask(2500); + strcpy(cmd, "AT+FCLR\r\n"); + + //send + for(i=0; i 1000) + { + xs_kprintf("data length too long\n "); + return; + } + + xs_DeviceWrite(hfa21, 0, buf, len); + return ; +} + +void msg_send_once(void) +{ + uint8_t msg[1024] = { 0}; + uint32_t i = 0; + xs_kprintf("ap test, send msg to server : "); + memset(msg,0x37,1024); + xs_memcpy(msg,"arm:dev7,data:",14); + msg[1023] = '\n'; + xs_DeviceWrite(hfa21,0, msg, 1024); + // xs_MdelayKTask(1000); + return ; +} +MSH_CMD_EXPORT(msg_send_once, asd); + +void msg_send_nointerval(void) +{ + uint8_t msg[1024] = { 0}; + uint32_t i = 1; + uint32_t index = 0; + uint8_t seq[10] = { 0}; + uint8_t* prefix = "{board:stm32f407-st-discovery,arch:arm,device:7,seq:"; + xs_kprintf("ap test, send msg to server : "); + + for(;;) + { + index = 0; + memset(msg,0x37,1024); + memset(seq,0,10); + msg[1021] = '}'; + msg[1022] = '\n'; + msg[1023] = 0; + xs_memcpy(msg,prefix,strlen(prefix)); + index = index + strlen(prefix); + PUT_ULONG_BE(i, msg, index) + index = index + 4; + xs_memcpy(msg+index,",data:",6); + xs_DeviceWrite(hfa21,0, msg, 1024); + ++ i; + } + + return ; +} +MSH_CMD_EXPORT(msg_send_nointerval, asd); + +void msg_send_interval(void) +{ + uint8_t msg[1024] = { 0}; + uint32_t i = 1; + uint32_t index = 0; + uint8_t seq[4] = { 0}; + uint8_t* prefix = "{board:stm32f407-st-discovery,arch:arm,device:7,seq:"; + xs_kprintf("ap test, send msg to server : "); + + for(;;) + { + index = 0; + memset(msg,0x37,1024); + memset(seq,0,10); + msg[1021] = '}'; + msg[1022] = '\n'; + msg[1023] = 0; + xs_memcpy(msg,prefix,strlen(prefix)); + index = index + strlen(prefix); + PUT_ULONG_BE(i, msg, index) + index = index + 4; + xs_memcpy(msg+index,",data:",6); + xs_DeviceWrite(hfa21,0, msg, 1024); + xs_MdelayKTask(1000); + ++ i; + } + + return ; +} +MSH_CMD_EXPORT(msg_send_interval, asd); + +struct xs_Ringbuffer* ringbuffer; + +uint8_t stack[256] = {0}; +xs_uint16 data_index = 0 ; +uint8_t start = 0xaa; +uint8_t end = 0xbb; + +uint8_t lora_buffer[8][256] = {0}; + +static void read_ringbuffer_thread_entry(void* parameter) +{ + uint8_t ch = 0; + xs_uint16 index = 0 ; + uint8_t devicenumber; + + while(1) + { + if(1 == xs_GetRingBufferchar(ringbuffer,&ch)) + { + if(data_index < 256) + { + stack[data_index++] = ch; + + if(data_index > 2) + { + if(stack[data_index-1] == start && stack[data_index-2] == start) + { + data_index = 0; + stack[data_index++] == start; + stack[data_index++] == start; + } + else if(stack[data_index-1] == end && stack[data_index-2] == end) + { + //end + devicenumber = stack[3] - 0x30; + + if(devicenumber > 0 && devicenumber < 8) + { + memset(lora_buffer[devicenumber-1],0,256); + memcpy(lora_buffer[devicenumber-1], &stack[2],data_index - 4); + // xs_kprintf("lora data: %s\n",lora_buffer[devicenumber-1]); + } + + data_index = 0; + } + } + } + else + { + data_index = 0; + } + } + else + { + xs_MdelayKTask(20); + } + } +} +#endif + +#if 0 +/***********************************************************************/ +//欧姆龙PLC IP 192.168.250.3 port 9600 + +static xs_err_t oml_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(Ch_Sem); + return XS_EOK; +} + +static void oml_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(Ch_Sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + rx_length = xs_DeviceRead(hfa21, 0, redis_data + 1 + sizeof(device_s14) + total_rx_length, 78); + xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 1 + sizeof(device_s14) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((78 == total_rx_length) && (0xC0 == redis_data[1 + sizeof(device_s14)]) + && (0x00 == redis_data[1 + sizeof(device_s14) + 1]) + && (0x02 == redis_data[1 + sizeof(device_s14) + 2]) + && (0x00 == redis_data[1 + sizeof(device_s14) + 3])) + { + /******format redis data******/ + memcpy(redis_data, &data_head, 1); + memcpy(redis_data + 1, device_s14, sizeof(device_s14)); + memcpy(redis_data + 1 + sizeof(device_s14) + total_rx_length, data_end, sizeof(data_end)); + length = 1 + sizeof(device_s14) + total_rx_length + sizeof(data_end); + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(Rx_Sem); + } + } + } +} + +int OML_UDP(void) +{ + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + hfa21 = xs_DeviceFind("uart3"); + + if(!hfa21) + { + xs_kprintf("find dev.hfa21 failed!\r\n"); + return XS_ERROR; + } + + Ch_Sem = xs_KCreateSemaphore("Ch_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Ch_Sem == NULL) + { + xs_kprintf("create Ch_sem failed .\n"); + return XS_ERROR; + } + + Rx_Sem = xs_KCreateSemaphore("Rx_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Rx_Sem == NULL) + { + xs_kprintf("create Rx_sem failed .\n"); + return XS_ERROR; + } + + //hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(hfa21,XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(hfa21, oml_uart_input); + xs_kprintf("hfa21 init success!\r\n"); + TaskDescriptorPointer thread_oml_plc = xs_KTaskCreate("oml_hfa21", oml_plc_thread, NULL, 1024, 25); + + if(thread_oml_plc != NULL) + { + xs_StartupKTask(thread_oml_plc); + } + else + { + return XS_ERROR; + } + + xs_MdelayKTask(10000); + xs_kprintf("The UDP send_receive function is running......\n"); + + while(1) + { +// CH438UARTSend(6, UDP_read_data, sizeof(UDP_read_data)); //UDP_read_data + xs_DeviceWrite(hfa21, 0, UDP_read_data, sizeof(UDP_read_data)); + xs_kprintf("hfa21 write cmd\n"); + xs_KSemaphoreObtain(Rx_Sem, XS_WAITING_FOREVER); + xs_MdelayKTask(1000); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(OML_UDP, oml); + +/*********************************************************************************************/ +// IP 192.168.250.50 port 102 tcp + +//工控机的测试代码,数据帧头FF,帧尾FE,数据帧长度不固?static struct xs_MessageQueue *ipc_mq; +xs_device_t ipc_hfa21; + +static xs_err_t ipc_uart_input(xs_device_t dev, xs_size_t size) +{ + struct rx_msg msg; + xs_err_t result; + msg.dev = dev; + msg.size = size; + result = xs_KMsgQueueSend(ipc_mq, &msg, sizeof(msg)); + + if(result == -XS_EFULL) + { + xs_kprintf("ipc_mq message queue full!\r\n"); + } + + xs_KSemaphoreAbandon(Ch_Sem); + return result; +} + +static void ipc_plc_thread(void* parameter) +{ + struct rx_msg msg; + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(Ch_Sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + xs_memset(&msg, 0, sizeof(msg)); + ret = xs_KMsgQueueRecv(ipc_mq, &msg, sizeof(msg), XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + rx_length = xs_DeviceRead(ipc_hfa21, 0, redis_data + 2 + sizeof(device_s15) + total_rx_length, msg.size); + xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s15) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((0x46 == redis_data[2 + sizeof(device_s15)]) && (0x46 == redis_data[2 + sizeof(device_s15) + 1]) && + (0x45 == redis_data[2 + sizeof(device_s15) + total_rx_length - 1]) && (0x46 == redis_data[2 + sizeof(device_s15) + total_rx_length - 2])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_IPC_FLAG; + memcpy(redis_data + 2, device_s15, sizeof(device_s15)); + length = 2 + sizeof(device_s15) + total_rx_length; + /******end******/ + // xs_kprintf("redis data : \n"); + // for(i = 0; i < length; ++i) + // xs_kprintf("0x%x ", redis_data[i]); + // xs_kprintf("\n"); + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(Rx_Sem); + } + } + } + } +} + +int BRL_IPC(void) +{ + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + ipc_hfa21 = xs_DeviceFind("uart3"); + + if(!ipc_hfa21) + { + xs_kprintf("find ipc_hfa21 failed!\r\n"); + return XS_ERROR; + } + + Ch_Sem = xs_KCreateSemaphore("Ch_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Ch_Sem == NULL) + { + xs_kprintf("BRL_IPC create sem failed .\n"); + return XS_ERROR; + } + + Rx_Sem = xs_KCreateSemaphore("Rx_Sem",0,XS_LINKLIST_FLAG_FIFO); + + if(Rx_Sem == NULL) + { + xs_kprintf("BRL_IPC create Rx_sem failed .\n"); + return XS_ERROR; + } + + ipc_mq = xs_KCreateMsgQueue("ipc_mq", + sizeof(struct rx_msg), + sizeof(msg_pool), + XS_LINKLIST_FLAG_FIFO); + + if(ipc_mq == NULL) + { + xs_kprintf("create ipc_mq mutex failed.\n"); + return -1; + } + + //ipc_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(ipc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(ipc_hfa21,XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(ipc_hfa21, ipc_uart_input); + xs_kprintf("ipc_hfa21 init success!\r\n"); + TaskDescriptorPointer thread_ipc_plc = xs_KTaskCreate("ipc_hfa21", ipc_plc_thread, NULL, 1024, 25); + + if(thread_ipc_plc != NULL) + { + xs_StartupKTask(thread_ipc_plc); + } + else + { + return XS_ERROR; + } + + xs_kprintf("start to receive data...\n"); + + while(1) + { + xs_MdelayKTask(100); + xs_KSemaphoreObtain(Rx_Sem, XS_WAITING_FOREVER); + xs_kprintf("\n"); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(BRL_IPC, IPC server); + +/*********************************************************************************************/ +// IP 192.168.250.150 port 9898 tcp + +//金凤工控机的测试代码,数据帧头FF,帧尾EF +xs_device_t jf_ipc_hfa21; +static sem_t jf_input_sem = NULL; +static sem_t jf_ec200t_sem = NULL; + +static xs_err_t jf_ipc_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(jf_input_sem); + return XS_EOK; +} + +static void jf_ipc_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(jf_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + rx_length = xs_DeviceRead(jf_ipc_hfa21, 0, redis_data + 2 + sizeof(device_s16) + total_rx_length, 512); + xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s16) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if(((((unsigned int)redis_data[2 + sizeof(device_s16) + 2] & 0x000000FF) << 8) | ((unsigned int)redis_data[2 + sizeof(device_s16) + 3] & 0x000000FF) == total_rx_length) && + (0xFF == redis_data[2 + sizeof(device_s16)]) && (0x20 == redis_data[2 + sizeof(device_s16) + 1])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_JF_IPC_FLAG; + memcpy(redis_data + 2, device_s16, sizeof(device_s16)); + length = 2 + sizeof(device_s16) + total_rx_length; + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(jf_ec200t_sem); + } + } + } +} + +int JF_IPC(void) +{ + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + jf_ipc_hfa21 = xs_DeviceFind("uart3"); + + if(!jf_ipc_hfa21) + { + xs_kprintf("find jf_ipc_hfa21 failed!\r\n"); + return XS_ERROR; + } + + jf_ec200t_sem = xs_KCreateSemaphore("jf_ec200t_sem",0,XS_LINKLIST_FLAG_FIFO); + + if(jf_ec200t_sem == NULL) + { + xs_kprintf("JF_IPC create jf_ec200t_sem failed .\n"); + return XS_ERROR; + } + + jf_input_sem = xs_KCreateSemaphore("jf_input_sem",0,XS_LINKLIST_FLAG_FIFO); + + if(jf_input_sem == NULL) + { + xs_kprintf("JF_IPC create jf_input_sem failed .\n"); + return XS_ERROR; + } + + //jf_ipc_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(jf_ipc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(jf_ipc_hfa21,XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(jf_ipc_hfa21, jf_ipc_uart_input); + xs_kprintf("jf_ipc_hfa21 init success!\r\n"); + TaskDescriptorPointer thread_jf_ipc_plc = xs_KTaskCreate("jf_ipc_hfa21", jf_ipc_plc_thread, NULL, 1024, 25); + + if(thread_jf_ipc_plc != NULL) + { + xs_StartupKTask(thread_jf_ipc_plc); + } + else + { + return XS_ERROR; + } + + xs_kprintf("start to receive data...\n"); + + while(1) + { + xs_MdelayKTask(100); + xs_KSemaphoreObtain(jf_ec200t_sem, XS_WAITING_FOREVER); + xs_kprintf("JF send data to server done\n"); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(JF_IPC, JF IPC client); + +/*********************************************************************************************/ +//西门子PLC IP 192.168.250.9 port 102 + +static xs_device_t siemens_hfa21; +static sem_t siemens_input_sem = NULL; +static sem_t siemens_ec200t_sem = NULL; + +static xs_err_t siemens_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(siemens_input_sem); + return XS_EOK; +} + +static void siemens_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + static char shakehand_cnt = 0; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(siemens_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + //rx_length = xs_DeviceRead(siemens_hfa21, 0, redis_data, 234); + // xs_kprintf("siemens dst data length %d\n", rx_length); + // for(i = 0; i < rx_length; ++i) + // xs_kprintf("0x%x ", redis_data[i]); + // xs_kprintf("\n"); + if(shakehand_cnt < 2) + { + //ignore first two siemens input sem + xs_DeviceRead(siemens_hfa21, 0, redis_data + 2 + sizeof(device_s17), 87); + shakehand_cnt++; + continue; + } + + rx_length = xs_DeviceRead(siemens_hfa21, 0, redis_data + 2 + sizeof(device_s17) + total_rx_length, 87); + xs_kprintf("siemens dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s17) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((87 == total_rx_length) && (0x03 == redis_data[2 + sizeof(device_s17)]) + && (0x00 == redis_data[2 + sizeof(device_s17) + 1]) + && (0x00 == redis_data[2 + sizeof(device_s17) + 2]) + && (0x57 == redis_data[2 + sizeof(device_s17) + 3])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_SIEMENS_FLAG; + memcpy(redis_data + 2, device_s17, sizeof(device_s17)); + length = 2 + sizeof(device_s17) + total_rx_length; + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(siemens_ec200t_sem); + } + } + } +} + +int SIEMENS_TCP(void) +{ + xs_err_t result; + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + siemens_hfa21 = xs_DeviceFind("uart3"); + + if(!siemens_hfa21) + { + xs_kprintf("find siemens_hfa21 failed!\r\n"); + return XS_ERROR; + } + + siemens_input_sem = xs_KCreateSemaphore("siemens_input_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_input_sem == NULL) + { + xs_kprintf("siemens_hfa21 create siemens_input_sem failed.\n"); + return XS_ERROR; + } + + siemens_ec200t_sem = xs_KCreateSemaphore("siemens_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_ec200t_sem == NULL) + { + xs_kprintf("siemens_hfa21 create siemens_ec200t_sem failed.\n"); + return XS_ERROR; + } + + //siemens_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(siemens_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(siemens_hfa21, XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(siemens_hfa21, siemens_uart_input); + TaskDescriptorPointer thread_siemens_plc = xs_KTaskCreate("siemens_hfa21", siemens_plc_thread, NULL, 1024, 25); + + if(thread_siemens_plc != NULL) + { + xs_StartupKTask(thread_siemens_plc); + } + else + { + return XS_ERROR; + } + + //step1 : send handshake_first cmd, waiting for response sem + xs_kprintf("siemens_hfa21 start send handshake_first!\r\n"); + //CH438UARTSend(6, handshake_first, sizeof(handshake_first)); + xs_DeviceWrite(siemens_hfa21, 0, handshake_first, sizeof(handshake_first)); + xs_MdelayKTask(3000); + xs_DeviceWrite(siemens_hfa21, 0, handshake_first, sizeof(handshake_first)); + xs_MdelayKTask(500); + //step2 : send handshake_second cmd, waiting for response sem + xs_kprintf("siemens_hfa21 start send handshake_second!\r\n"); + //CH438UARTSend(6, handshake_second, sizeof(handshake_second)); + xs_DeviceWrite(siemens_hfa21, 0, handshake_second, sizeof(handshake_second)); + xs_kprintf("siemens_hfa21 init success!\r\n"); + xs_MdelayKTask(500); + + while(1) + { + //CH438UARTSend(6, siemens_read_data, sizeof(siemens_read_data)); //read_data + xs_DeviceWrite(siemens_hfa21, 0, siemens_read_data, sizeof(siemens_read_data)); + xs_kprintf("siemens hfa21 write cmd\n"); + xs_KSemaphoreObtain(siemens_ec200t_sem, XS_WAITING_FOREVER); + xs_MdelayKTask(1000); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(SIEMENS_TCP, Siemens TCP PLC); + +/*********************************************************************************************/ +//西门?1200 PLC IP 192.168.250.107 port 102 + +static xs_device_t siemens_1200_hfa21; +static sem_t siemens_1200_input_sem = NULL; +static sem_t siemens_1200_ec200t_sem = NULL; + +static xs_err_t siemens_1200_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(siemens_1200_input_sem); + return XS_EOK; +} + +static void siemens_1200_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + static char shakehand_cnt = 0; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(siemens_1200_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + if(shakehand_cnt < 2) + { + //ignore first two siemens input sem + xs_DeviceRead(siemens_1200_hfa21, 0, redis_data + 2 + sizeof(device_s18), 235); + shakehand_cnt++; + continue; + } + + rx_length = xs_DeviceRead(siemens_1200_hfa21, 0, redis_data + 2 + sizeof(device_s18) + total_rx_length, 235); + xs_kprintf("siemens 1200 dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length; ++i) + { + xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s18) + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if((235 == total_rx_length) && (0x03 == redis_data[2 + sizeof(device_s18)]) + && (0x00 == redis_data[2 + sizeof(device_s18) + 1]) + && (0x00 == redis_data[2 + sizeof(device_s18) + 2]) + && (0xEB == redis_data[2 + sizeof(device_s18) + 3])) + { + /******format redis data******/ + redis_data[0] = data_head; + redis_data[1] = PLC_SIEMENS_1200_FLAG; + memcpy(redis_data + 2, device_s18, sizeof(device_s18)); + length = 2 + sizeof(device_s18) + total_rx_length; + /******end******/ + xs_DeviceWrite(ec200t, 0, redis_data, length); + total_rx_length = 0; + memset(redis_data, 0, sizeof(redis_data)); + xs_KSemaphoreAbandon(siemens_1200_ec200t_sem); + } + } + } +} + +int SIEMENS_1200(void) +{ + xs_err_t result; + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + siemens_1200_hfa21 = xs_DeviceFind("uart3"); + + if(!siemens_1200_hfa21) + { + xs_kprintf("find siemens_1200_hfa21 failed!\r\n"); + return XS_ERROR; + } + + siemens_1200_input_sem = xs_KCreateSemaphore("siemens_1200_input_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_1200_input_sem == NULL) + { + xs_kprintf("siemens_1200_hfa21 create siemens_1200_input_sem failed.\n"); + return XS_ERROR; + } + + siemens_1200_ec200t_sem = xs_KCreateSemaphore("siemens_1200_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(siemens_1200_ec200t_sem == NULL) + { + xs_kprintf("siemens_1200_hfa21 create siemens_1200_ec200t_sem failed.\n"); + return XS_ERROR; + } + + //siemens_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = XS_SERIAL_RB_BUFSZ; + config3.parity = PARITY_NONE; + xs_DeviceControl(siemens_1200_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(siemens_1200_hfa21, XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(siemens_1200_hfa21, siemens_1200_uart_input); + TaskDescriptorPointer thread_siemens_1200_plc = xs_KTaskCreate("siemens_1200_hfa21", siemens_1200_plc_thread, NULL, 1024, 25); + + if(thread_siemens_1200_plc != NULL) + { + xs_StartupKTask(thread_siemens_1200_plc); + } + else + { + return XS_ERROR; + } + + //step1 : send handshake_1200_first cmd, waiting for response sem + xs_kprintf("siemens_1200_hfa21 start send handshake_1200_first!\r\n"); + //CH438UARTSend(6, handshake_1200_first, sizeof(handshake_1200_first)); + xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_first, sizeof(handshake_1200_first)); + xs_MdelayKTask(3000); + xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_first, sizeof(handshake_1200_first)); + xs_MdelayKTask(500); + //step2 : send handshake_1200_second cmd, waiting for response sem + xs_kprintf("siemens_1200_hfa21 start send handshake_1200_second!\r\n"); + //CH438UARTSend(6, handshake_1200_second, sizeof(handshake_1200_second)); + xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_second, sizeof(handshake_1200_second)); + xs_kprintf("siemens_1200_hfa21 init success!\r\n"); + xs_MdelayKTask(500); + + while(1) + { + //CH438UARTSend(6, siemens_1200_read_data, sizeof(siemens_1200_read_data)); //read_data + xs_DeviceWrite(siemens_1200_hfa21, 0, siemens_1200_read_data, sizeof(siemens_1200_read_data)); + xs_kprintf("siemens 1200 hfa21 write cmd\n"); + xs_KSemaphoreObtain(siemens_1200_ec200t_sem, XS_WAITING_FOREVER); + xs_MdelayKTask(1000); + } + + return XS_EOK; +} +MSH_CMD_EXPORT(SIEMENS_1200, Siemens 1200 PLC); +#endif + +/*********************************************************************************************/ +//贝加莱PLC IP 192.168.250.4 port 12000 +static unsigned char brl_redis_data[2048]; +static xs_device_t brl_plc_hfa21; +static sem_t brl_plc_input_sem = NULL; +static sem_t brl_plc_ec200t_sem = NULL; + +static xs_err_t brl_plc_uart_input(xs_device_t dev, xs_size_t size) +{ + xs_KSemaphoreAbandon(brl_plc_input_sem); + return XS_EOK; +} + +static void brl_plc_thread(void* parameter) +{ + xs_err_t ret; + uint32_t rx_length, total_rx_length = 0; + uint8_t i; + unsigned int length = 0; + + while(1) + { + ret = xs_KSemaphoreObtain(brl_plc_input_sem, XS_WAITING_FOREVER); + + if(XS_EOK == ret) + { + xs_kprintf("before total %d\n", total_rx_length); + rx_length = xs_DeviceRead(brl_plc_hfa21, 0, brl_redis_data + 2 + total_rx_length, 1640); + xs_kprintf("brl dst data length %d total length %d\n", rx_length, total_rx_length); + + for(i = 0; i < rx_length / 10; i ++) + { + xs_kprintf("0x%x ", brl_redis_data[i + 2 + total_rx_length]); + } + + xs_kprintf("\n"); + total_rx_length += rx_length; + + if(total_rx_length > 1640) + { + xs_kprintf("ERROR : rx_buffer is full total_rx_length %d\n", total_rx_length); + total_rx_length = 0; + memset(brl_redis_data, 0, sizeof(brl_redis_data)); + xs_KSemaphoreAbandon(brl_plc_ec200t_sem); + continue; + } + + if((1640 == total_rx_length) && (0x53 == brl_redis_data[2])) + { + /******format redis data******/ + brl_redis_data[0] = data_head; + brl_redis_data[1] = PLC_BRL_FLAG; + length = 2 + total_rx_length; + + /******end******/ + for(i = 0; i < 10; i ++) + { + xs_kprintf("0x%x ", brl_redis_data[i + 1478]); + } + + xs_kprintf("\n"); + xs_DeviceWrite(ec200t, 0, brl_redis_data, length); + total_rx_length = 0; + memset(brl_redis_data, 0, sizeof(brl_redis_data)); + xs_KSemaphoreAbandon(brl_plc_ec200t_sem); + } + } + } +} + +int BRL_PLC(void) +{ + xs_err_t result; + const unsigned char brl_reply_data[] = {0x1, 0x1, 0x1}; + struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; + brl_plc_hfa21 = xs_DeviceFind("uart3"); + + if(!brl_plc_hfa21) + { + xs_kprintf("find brl_plc_hfa21 failed!\r\n"); + return XS_ERROR; + } + + brl_plc_input_sem = xs_KCreateSemaphore("brl_plc_input_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(brl_plc_input_sem == NULL) + { + xs_kprintf("brl_plc_hfa21 create brl_plc_input_sem failed.\n"); + return XS_ERROR; + } + + brl_plc_ec200t_sem = xs_KCreateSemaphore("brl_plc_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); + + if(brl_plc_ec200t_sem == NULL) + { + xs_kprintf("brl_plc_hfa21 create brl_plc_ec200t_sem failed.\n"); + return XS_ERROR; + } + + //brl_hfa21 + config3.BaudRate = BAUD_RATE_460800; + config3.DataBits = DATA_BITS_8; + config3.StopBits = STOP_BITS_1; + config3.bufsz = 2048; + config3.parity = PARITY_NONE; + xs_DeviceControl(brl_plc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); + xs_DeviceOpen(brl_plc_hfa21, XS_DEVICE_FLAG_DMA_RX); + xs_DeviceSetRxIndicate(brl_plc_hfa21, brl_plc_uart_input); + TaskDescriptorPointer thread_brl_plc = xs_KTaskCreate("brl_plc_hfa21", brl_plc_thread, NULL, 1024, 25); + + if(thread_brl_plc != NULL) + { + xs_StartupKTask(thread_brl_plc); + } + else + { + return XS_ERROR; + } + + xs_kprintf("brl_plc_hfa21 init success!\r\n"); + xs_MdelayKTask(500); + + while(1) + { + //CH438UARTSend(6, brl_reply_data, sizeof(brl_reply_data)); + xs_kprintf("brl_plc hfa21 write cmd\n"); //read_data + xs_DeviceWrite(brl_plc_hfa21, 0, brl_reply_data, sizeof(brl_reply_data)); + xs_KSemaphoreObtain(brl_plc_ec200t_sem, XS_WAITING_FOREVER); + } + + return XS_EOK; +} + +MSH_CMD_EXPORT(BRL_PLC, Brl PLC); + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c new file mode 100755 index 000000000..1b8204c04 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2022 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * @file plc_socket.c + * @brief Demo for PLC socket communication function + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022.03.16 + */ + +#include "transform.h" +#include "plc_socket.h" +#include "sys_arch.h" +#include "lwip/sockets.h" +#include "control_file.h" + +#define PLC_SOCK_CMD_NUM 10 + +// for saving PLC command +int plc_cmd_index = 0; + +//siemens test +PlcBinCmdType TestPlcCmd[PLC_SOCK_CMD_NUM] = +{ +#ifdef SUPPORT_PLC_SIEMENS + // handshake1 repeat 1 + { + 0, 3000, 22, + { + 0x03, 0x00, 0x00, 0x16, 0x11, 0xE0, 0x00, 0x00, + 0x02, 0xC8, 0x00, 0xC1, 0x02, 0x02, 0x01, 0xC2, + 0x02, 0x02, 0x01, 0xC0, 0x01, 0x0A + } + }, + // handshake2 + { + 1, 500, 25, + { + 0x03, 0x00, 0x00, 0x19, 0x02, 0xF0, 0x80, 0x32, + 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x08, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0xF0 + } + }, + // read command + { + 2, 1000, 31, + { + 0x03, 0x00, 0x00, 0x1F, 0x02, 0xF0, 0x80, 0x32, + 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x0E, 0x00, + 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, + 0xD2, 0x00, 0x34, 0x84, 0x00, 0x00, 0x00 + } + } + // oml plc +#else// SUPPORT_PLC_OML + { + 0, 1000, 18, + { + 0x80, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x01, 0x01, 0x82, 0x0F, 0xA0, 0x00, + 0x00, 0x20 + } + } +#endif +}; + +//Test information +//SIEMENS ip: 192.168.250.9 port: 102 +//S7-200 ip: 192.168.250.8 port: 102 +//S7-1200 ip: 192.168.250.6 port: 102 +//OML ip: 192.168.250.3 port: 9600 + +PlcSocketParamType plc_socket_demo_data = { + .ip = {192, 168, 250, 3}, + .port = 9600, + .device_type = PLC_DEV_TYPE_OML, + .socket_type = SOCK_STREAM, //SOCK_DGRAM, //udp + .step = 0, + .cmd_num = 3, + .buf_size = PLC_TEST_SIZE, + .buf = NULL, +}; + +#define OML_HEADER_LEN 78 +#define CHECK_OML_HEADER(_s) ((0xC0 == *(_s)) && (0x00 == *(_s + 1)) && (0x02 == *(_s + 2)) && (0x00 == *(_s + 3))) + +/******************************************************************************/ + +static void *PlcSocketStart(void *arg) +{ + int fd = -1; + int recv_len; + int step = 0; + char *recv_buf; + struct sockaddr_in sock_addr; + socklen_t addr_len = sizeof(struct sockaddr_in); + PlcSocketParamType *param = (PlcSocketParamType *)&plc_socket_demo_data; + + plc_print("start %d.%d.%d.%d:%d dev %d sock %d\n", + param->ip[0], + param->ip[1], + param->ip[2], + param->ip[3], + param->port, + param->device_type, + param->socket_type); + + //malloc memory + recv_buf = (char *)malloc(param->buf_size); + if (recv_buf == NULL) + { + plc_error("No memory\n"); + return NULL; + } + + fd = socket(AF_INET, param->socket_type, 0); + if (fd < 0) + { + plc_error("Socket error %d\n", param->socket_type); + free(recv_buf); + return NULL; + } + + plc_print("start %d.%d.%d.%d:%d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3], param->port); + + sock_addr.sin_family = AF_INET; + sock_addr.sin_port = htons(param->port); + sock_addr.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(param->ip[0], param->ip[1], param->ip[2], param->ip[3])); + memset(&(sock_addr.sin_zero), 0, sizeof(sock_addr.sin_zero)); + + if (connect(fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)) < 0) + { + plc_error("Unable to connect\n"); + closesocket(fd); + free(recv_buf); + return NULL; + } + + lw_notice("client %s connected\n", inet_ntoa(sock_addr.sin_addr)); + + while(step < param->cmd_num) + { + sendto(fd, TestPlcCmd[step].cmd, TestPlcCmd[step].cmd_len, 0, (struct sockaddr*)&sock_addr, addr_len); + lw_notice("Send Cmd: %d - ", TestPlcCmd[step].cmd_len); + for(int i = 0; i < TestPlcCmd[step].cmd_len; i++) + { + lw_notice(" %#x", TestPlcCmd[step].cmd[i]); + } + lw_notice("\n"); + MdelayKTask(TestPlcCmd[step].delay_ms); + + memset(recv_buf, 0, param->buf_size); + while(1) + { + recv_len = recvfrom(fd, recv_buf, param->buf_size, 0, (struct sockaddr *)&sock_addr, &addr_len); + if(recv_len > 0) + { + if(param->device_type == PLC_DEV_TYPE_OML) + { + if((recv_len == OML_HEADER_LEN) && (CHECK_OML_HEADER(recv_buf))) + { + lw_notice("This is Oml package!!!\n"); + } + } + lw_notice("Receive from : %s\n", inet_ntoa(sock_addr.sin_addr)); + lw_notice("Receive data : %d -", recv_len); + for(int i = 0; i < recv_len; i++) + { + lw_notice(" %#x", recv_buf[i]); + } + lw_notice("\n"); + break; + } + } + step ++; + } + + closesocket(fd); + free(recv_buf); + return NULL; +} + +void PlcGetParamCmd(char *cmd) +{ + const char s[2] = ","; + char *token; + uint16_t cmd_index = 0; + char bin_cmd[PLC_BIN_CMD_LEN] = {0}; + token = strtok(cmd, s); + while(token != NULL) + { + sscanf(token, "%x", &bin_cmd[cmd_index]); + plc_print("%d - %s %d\n", cmd_index, token, bin_cmd[cmd_index]); + token = strtok(NULL, s); + cmd_index ++; + } + TestPlcCmd[plc_cmd_index].cmd_len = cmd_index; + memcpy(TestPlcCmd[plc_cmd_index].cmd, bin_cmd, cmd_index); + plc_print("get %d cmd len %d\n", plc_cmd_index, TestPlcCmd[plc_cmd_index].cmd_len); + plc_cmd_index ++; + plc_socket_demo_data.cmd_num = plc_cmd_index; +} + +void PlcShowUsage(void) +{ + plc_notice("------------------------------------\n"); + plc_notice("PlcSocket [ip].[ip].[ip].[ip]:[port]\n"); + plc_notice("PlcSocket support other param:\n"); + plc_notice("plc=[] 0: OML 1:SIEMENS\n"); + plc_notice("tcp=[] 0: udp 1:tcp\n"); + plc_notice("ip=[ip.ip.ip.ip]\n"); + plc_notice("port=port\n"); + plc_notice("------------------------------------\n"); +} + +void PlcCheckParam(int argc, char *argv[]) +{ + int i; + PlcSocketParamType *param = &plc_socket_demo_data; + plc_cmd_index = 0; + + for(i = 0; i < argc; i++) + { + char *str = argv[i]; + int is_tcp = 0; + char cmd_str[PLC_BIN_CMD_LEN] = {0}; + + plc_print("check %d %s\n", i, str); + + if(sscanf(str, "ip=%d.%d.%d.%d", + ¶m->ip[0], + ¶m->ip[1], + ¶m->ip[2], + ¶m->ip[3]) == 4) + { + plc_print("find ip %d %d %d %d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3]); + continue; + } + + if(sscanf(str, "port=%d", ¶m->port) == 1) + { + plc_print("find port %d\n", param->port); + continue; + } + + if(sscanf(str, "tcp=%d", &is_tcp) == 1) + { + plc_print("find tcp %d\n", is_tcp); + param->socket_type = is_tcp ? SOCK_STREAM:SOCK_DGRAM; + continue; + } + + if(sscanf(str, "plc=%d", ¶m->device_type) == 1) + { + plc_print("find device %d\n", param->device_type); + continue; + } + + if(sscanf(str, "cmd=%s", cmd_str) == 1) + { + plc_print("find cmd %s\n", cmd_str); + PlcGetParamCmd(cmd_str); + continue; + } + } + + if(argc >= 2) + { + if(sscanf(argv[1], "%d.%d.%d.%d:%d", + ¶m->ip[0], + ¶m->ip[1], + ¶m->ip[2], + ¶m->ip[3], + ¶m->port) != EOF) + { + return; + } + + if(sscanf(argv[1], "%d.%d.%d.%d", + ¶m->ip[0], + ¶m->ip[1], + ¶m->ip[2], + ¶m->ip[3]) != EOF) + { + return; + } + } + else + { + PlcShowUsage(); + } +} + +void PlcGetParamFromFile(char *file) +{ + +} + +void PlcSocketTask(int argc, char *argv[]) +{ + int result = 0; + pthread_t th_id; + + pthread_attr_t attr; + attr.schedparam.sched_priority = LWIP_DEMO_TASK_PRIO; + attr.stacksize = LWIP_TASK_STACK_SIZE; + PlcSocketParamType *param = &plc_socket_demo_data; + + PlcCheckParam(argc, argv); + + lwip_config_net(lwip_ipaddr, lwip_netmask, param->ip); + PrivTaskCreate(&th_id, &attr, PlcSocketStart, param); +} + + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), + PlcSocket, PlcSocketTask, Test PLC Socket); + diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h new file mode 100755 index 000000000..363877083 --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * @file plc_socket.h + * @brief Demo for PLC socket communication function + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022.03.16 + */ + +#ifndef __PLC_SOCKET_H_ +#define __PLC_SOCKET_H_ + +#define PLC_BIN_CMD_LEN 512 + +typedef struct +{ + uint8_t step; + uint16_t delay_ms; + uint8_t cmd_len; + uint8_t cmd[PLC_BIN_CMD_LEN]; +}PlcBinCmdType; + +enum PlcDeviceType { + PLC_DEV_TYPE_OML = 0, + PLC_DEV_TYPE_IPC, + PLC_DEV_TYPE_BRL, + PLC_DEV_TYPE_SIEMENS, + PLC_DEV_TYPE_SIEMENS_1200, + PLC_DEV_TYPE_JF_IPC, + PLC_DEV_TYPE_HG, + /* ...... */ + PLC_DEV_TYPE_END, +}; + +#define PLC_IP_SIZE 16 +#define PLC_DEV_SIZE 32 +#define PLC_TEST_SIZE 65536 + +typedef struct PlcSocketParamStruct{ + char ip[PLC_IP_SIZE]; + uint32_t port; + uint32_t device_type; //PlcDeviceType + uint32_t socket_type; //UDP or TCP + char device[PLC_DEV_SIZE]; + uint32_t step; // communication step + uint32_t cmd_num; // command number + uint32_t buf_size; + uint8_t *buf; +}PlcSocketParamType; + +//debug command +#define plc_print //KPrintf +#define plc_error KPrintf +#define plc_notice KPrintf + +#endif diff --git a/APP_Framework/Framework/control/plc/shared/plc_device.h b/APP_Framework/Framework/control/plc/shared/plc_device.h index 6744a1474..b8c57d490 100755 --- a/APP_Framework/Framework/control/plc/shared/plc_device.h +++ b/APP_Framework/Framework/control/plc/shared/plc_device.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2021 AIIT XUOS Lab +* Copyright (c) 2022 AIIT XUOS Lab * XiUOS is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: diff --git a/APP_Framework/Framework/control/shared/Makefile b/APP_Framework/Framework/control/shared/Makefile index 4890d7675..633191b89 100755 --- a/APP_Framework/Framework/control/shared/Makefile +++ b/APP_Framework/Framework/control/shared/Makefile @@ -1,4 +1,8 @@ SRC_FILES := control.c +ifeq ($(CONFIG_MOUNT_SDCARD),y) + SRC_FILES += control_file.c +endif + include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/control/shared/control_file.c b/APP_Framework/Framework/control/shared/control_file.c new file mode 100755 index 000000000..920f89296 --- /dev/null +++ b/APP_Framework/Framework/control/shared/control_file.c @@ -0,0 +1,129 @@ +/* +* Copyright (c) 2022 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file control_file.c + * @brief control relative file operation + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022-03-17 + */ + +#include +#include "cJSON.h" +#include "transform.h" +#include "control_file.h" + +#define CTL_FILE_NAME "/plc/control_cmd.txt" + +#define TEST_PLC_CMD_TXT \ + "cmd=03,00,00,16,11,E0,00,00,02,C8,00,C1,02,02,01,C2,02,02,01,C0,01,0A\r\n\r\n" \ + "cmd=03,00,00,19,02,F0,80,32,01,00,00,00,0D,00,08,00,00,F0,00,00,01,00,01,00,F0\r\n\r\n" \ + "cmd=03,00,00,1F,02,F0,80,32,01,00,00,33,01,00,0E,00,00,04,01,12,0A,10,02,00,D2,00,34,84,00,00,00\r\n\r\n" \ + "port=102\r\n" \ + "ip=192.168.250.6\r\n" + + +#define TEST_PLC_JSON_TXT \ +"{ \r\n"\ +" \"S1200\": [ \r\n"\ +" { \"ip\": \"192.168.250.6\"}, \r\n"\ +" { \"port\": 102}, \r\n"\ +" { \"cmd\": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10]}\r\n"\ +" ] \r\n"\ +"}" +//" { \"cmd\": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240]},\r\n" \ +//" { \"cmd\": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]}\r\n" \ + + +FILE *CtlFileInit(void) +{ + FILE *fd = NULL; + + fd = fopen(CTL_FILE_NAME, "a+"); + if(fd == NULL) + { + ctl_error("open file %s failed\n", CTL_FILE_NAME); + } + + return fd; +} + +void CtlFileClose(FILE *fd) +{ + fclose(fd); +} + +void CtlFileRead(FILE *fd, int size, char *buf) +{ + fread(buf, size, 1, fd); + ctl_print("read file %d: %s\n", size, buf); +} + +void CtlFileWrite(FILE *fd, int size, char *buf) +{ + size_t write_size = 0; + write_size = fwrite(buf, strlen(buf) + 1, 1, fd); + ctl_print("write size %d: %s\n", size, buf); +} + +void CtlFileTest(void) +{ + FILE *fd = CtlFileInit(); + char *file_buf = TEST_PLC_JSON_TXT; + CtlFileWrite(fd, strlen(file_buf), file_buf); + CtlFileRead(fd, CTL_FILE_SIZE, file_buf); + CtlFileClose(fd); +} + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), + CtlTestFile, CtlFileTest, Test control file); + +#ifdef LIB_USING_CJSON + +void CtlParseJsonData(char *buf) +{ + cJSON *file_dat = NULL; + cJSON *ip_dat = NULL; + cJSON *port_dat = NULL; + cJSON *cmd_dat = NULL; + + file_dat = cJSON_Parse(buf); + if(file_dat == NULL) + { + ctl_error("ctrl parse failed\n"); + return; + } + + ip_dat = cJSON_GetObjectItem(file_dat, "ip"); + port_dat = cJSON_GetObjectItem(file_dat, "port"); + cmd_dat = cJSON_GetObjectItem(file_dat, "cmd"); + + ctl_print("ip : %s\n", ip_dat->string); + ctl_print("port: %d\n", port_dat->valueint); + ctl_print("cmd : %s\n", cmd_dat->valueint); +} + +void CtlParseFileTest(void) +{ + char file_buf[CTL_FILE_SIZE] = {0}; + FILE *fd = CtlFileInit(); + CtlFileRead(fd, CTL_FILE_SIZE, file_buf); + CtlFileClose(fd); + CtlParseJsonData(file_buf); +} + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), + CtlParseFile, CtlParseFileTest, Parse control file); + +#endif + diff --git a/APP_Framework/Framework/control/shared/control_file.h b/APP_Framework/Framework/control/shared/control_file.h new file mode 100755 index 000000000..6c933594c --- /dev/null +++ b/APP_Framework/Framework/control/shared/control_file.h @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2022 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file control_file.h + * @brief control relative API + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022-03-17 + */ + +#ifndef __CONTROL_FILE_H_ +#define __CONTROL_FILE_H_ + +#define CTL_FILE_SIZE 1024 + +#define ctl_print KPrintf +#define ctl_error KPrintf + +FILE *CtlFileInit(void); +void CtlFileClose(FILE *fd); +void CtlFileRead(FILE *fd, int size, char *buf); +void CtlFileWrite(FILE *fd, int size, char *buf); + +#endif + diff --git a/APP_Framework/lib/Kconfig b/APP_Framework/lib/Kconfig index b3497fca5..8fefd677d 100755 --- a/APP_Framework/lib/Kconfig +++ b/APP_Framework/lib/Kconfig @@ -5,12 +5,12 @@ menu "lib" config APP_SELECT_NEWLIB bool "app select newlib" - + config APP_SELECT_OTHER_LIB bool "app select other lib" endchoice source "$APP_DIR/lib/cJSON/Kconfig" - source "$APP_DIR/lib/queue/Kconfig" + source "$APP_DIR/lib/queue/Kconfig" source "$APP_DIR/lib/lvgl/Kconfig" source "$APP_DIR/lib/embedded_database/Kconfig" endmenu diff --git a/APP_Framework/lib/Makefile b/APP_Framework/lib/Makefile index 3e8e31a84..24a27d0fa 100644 --- a/APP_Framework/lib/Makefile +++ b/APP_Framework/lib/Makefile @@ -10,5 +10,8 @@ ifeq ($(CONFIG_LIB_LV),y) SRC_DIR += lvgl endif +ifeq ($(CONFIG_LIB_USING_CJSON),y) + SRC_DIR += cJSON +endif include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/lib/cJSON/Makefile b/APP_Framework/lib/cJSON/Makefile new file mode 100755 index 000000000..79f1fc37d --- /dev/null +++ b/APP_Framework/lib/cJSON/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := cJSON.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi/board/ok1052-c/board.c b/Ubiquitous/XiZi/board/ok1052-c/board.c index 55786560d..020ec347e 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/board.c +++ b/Ubiquitous/XiZi/board/ok1052-c/board.c @@ -17,10 +17,10 @@ File name: board.c Description: support imxrt1052-board init function Others: take SDK_2.6.1_MIMXRT1052xxxxB for references -History: +History: 1. Date: 2022-01-25 Author: AIIT XUOS Lab -Modification: +Modification: 1. support imxrt1052-board MPU、clock、memory init 2. support imxrt1052-board uart、semc、sdio driver init 3. support imxrt1052-board I2C, SPI, ADC, RTC driver init @@ -66,11 +66,24 @@ int MountSDCard(void) #include "fsl_gpio.h" #include "fsl_lpuart.h" +#ifdef BSP_USING_LWIP #include +#endif +#ifdef BSP_USING_LPUART #include +#endif + +#ifdef BSP_USING_ADC #include +#endif + +#ifdef BSP_USING_SPI #include +#endif + +#ifdef BSP_USING_RTC #include +#endif #define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority 4 bits for subpriority */ diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig index ed032333a..0ec9c3aa4 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/Kconfig @@ -22,7 +22,7 @@ menuconfig BSP_USING_GPIO menuconfig BSP_USING_I2C bool "Using I2C device" - default y + default n select RESOURCES_I2C if BSP_USING_I2C @@ -31,7 +31,7 @@ menuconfig BSP_USING_I2C menuconfig BSP_USING_ADC bool "Using ADC device" - default y + default n select RESOURCES_ADC if BSP_USING_ADC @@ -40,7 +40,7 @@ menuconfig BSP_USING_ADC menuconfig BSP_USING_SPI bool "Using SPI device" - default y + default n select RESOURCES_SPI if BSP_USING_SPI diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile index 7eaf163ae..8765fdab1 100755 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/spi/Makefile @@ -1,3 +1,7 @@ -SRC_FILES := fsl_lpspi.c connect_spi.c connect_flash_spi.c +SRC_FILES := fsl_lpspi.c connect_spi.c + +ifeq ($(CONFIG_RESOURCES_SPI_SFUD),y) + SRC_FILES += connect_flash_spi.c +endif include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi/kernel/thread/msgqueue.c b/Ubiquitous/XiZi/kernel/thread/msgqueue.c index 3c690011a..6a253dd8f 100644 --- a/Ubiquitous/XiZi/kernel/thread/msgqueue.c +++ b/Ubiquitous/XiZi/kernel/thread/msgqueue.c @@ -38,13 +38,13 @@ static struct MsgQueue *GetMsgQueueById(int32 id) if (id < 0 ) return NONE; - + lock = CriticalAreaLock(); idnode = IdGetObj(&k_mq_id_manager, id); if (idnode == NONE){ CriticalAreaUnLock(lock); return NONE; - } + } mq = CONTAINER_OF(idnode, struct MsgQueue, id); CriticalAreaUnLock(lock); return mq; @@ -61,7 +61,7 @@ static x_err_t _InitMsgQueue( struct MsgQueue *mq ,x_size_t msg_size, mq->num_msgs = 0; mq->each_len = ALIGN_MEN_UP(msg_size, MEM_ALIGN_SIZE); mq->index = 0; - + InitDoubleLinkList(&mq->send_pend_list); InitDoubleLinkList(&(mq->recv_pend_list)); @@ -102,9 +102,9 @@ static x_err_t _MsgQueueSend(struct MsgQueue *mq, CriticalAreaUnLock(lock); return -EFULL; } - + while(mq->num_msgs >= mq->max_msgs ) { - + task->exstatus = EOK; if (timeout == 0) { CriticalAreaUnLock(lock); @@ -171,7 +171,7 @@ static x_err_t _MsgQueueUrgentSend(struct MsgQueue *mq, const void *buffer, x_si mq->index --; if (mq->index < 0) mq->index += mq->max_msgs; - + msg = mq->msg_buf + ( ( mq->index + mq->num_msgs ) % mq->max_msgs ) * mq->each_len ; memcpy(msg , buffer, size); mq->num_msgs ++; @@ -297,6 +297,7 @@ static x_err_t _DeleteMsgQueue(struct MsgQueue *mq) KERNEL_FREE(mq->msg_buf); lock = CriticalAreaLock(); + IdRemoveObj(&k_mq_id_manager, mq->id.id); DoubleLinkListRmNode(&(mq->link)); CriticalAreaUnLock(lock); KERNEL_FREE(mq); @@ -381,7 +382,7 @@ x_err_t KMsgQueueReinit(int32 id) * @param buffer message info * @param size the size of buffer * @param timeout time needed waiting - * + * * @return EOK on success;EINVALED on failure * */ @@ -406,7 +407,7 @@ x_err_t KMsgQueueRecv(int32 id, * a dynamic messagequeue will be deleted from the manage list * * @param id the message id - * + * * @return EOK on success;EINVALED on failure * */ @@ -429,7 +430,7 @@ x_err_t KDeleteMsgQueue(int32 id) * @param id the message id * @param buffer message info * @param size the size of buffer - * + * * @return EOK on success;EINVALED on failure * */ @@ -453,7 +454,7 @@ x_err_t KMsgQueueUrgentSend(int32 id, const void *buffer, x_size_t size) * @param id the message id * @param buffer message info * @param size the size of buffer - * + * * @return EOK on success;EINVALED on failure * */ @@ -477,7 +478,7 @@ x_err_t KMsgQueueSend(int32 id, const void *buffer, x_size_t size) * @param buffer message info * @param size the size of buffer * @param timeout waiting time - * + * * @return EOK on success;EINVALED on failure * */ @@ -493,4 +494,4 @@ x_err_t KMsgQueueSendwait(int32 id, const void *buffer, x_size_t size,int32 tim return mq->Done->send(mq,buffer,size,timeout); else return -EINVALED; -} \ No newline at end of file +} diff --git a/Ubiquitous/XiZi/path_kernel.mk b/Ubiquitous/XiZi/path_kernel.mk index 724f31011..705f0e685 100755 --- a/Ubiquitous/XiZi/path_kernel.mk +++ b/Ubiquitous/XiZi/path_kernel.mk @@ -291,6 +291,7 @@ endif ifeq ($(CONFIG_SUPPORT_CONTROL_FRAMEWORK), y) KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control # +KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/shared # KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/plc/interoperability/opcua # KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/control/plc/shared # KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/lib/cJSON diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c index a2c136f0b..88d24dc6e 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c @@ -232,7 +232,7 @@ netconn_prepare_delete(struct netconn *conn) err_t netconn_delete(struct netconn *conn) { - err_t err; + err_t err = ERR_OK; /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */ if (conn == NULL) { @@ -245,8 +245,9 @@ netconn_delete(struct netconn *conn) err = ERR_OK; } else #endif /* LWIP_NETCONN_FULLDUPLEX */ +//tst by wly { -// err = netconn_prepare_delete(conn); + err = netconn_prepare_delete(conn); } if (err == ERR_OK) { netconn_free(conn); diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c index 2660f73e5..1e8031672 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c @@ -497,6 +497,18 @@ get_socket(int fd) return sock; } +void pr_socket_buf(void) +{ + int i; + lw_debug("socket:\n"); + for (i = 0; i < NUM_SOCKETS; ++i) { +// if (!sockets[i].conn) + lw_debug("%d: conn %p rcv %d send %d wait %d\n", i, sockets[i].conn, sockets[i].rcvevent, sockets[i].sendevent, + sockets[i].select_waiting); + } +} + + /** * Allocate a new socket for a given netconn. * @@ -588,6 +600,7 @@ free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_last } if (conn != NULL) { /* netconn_prepare_delete() has already been called, here we only free the conn */ + lw_debug("lw: [%s] tcp %d socket %d accept %d recv %d\n", __func__, is_tcp, conn->socket, conn->acceptmbox, conn->recvmbox); netconn_delete(conn); } } @@ -660,6 +673,8 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) newsock = alloc_socket(newconn, 1); if (newsock == -1) { + lw_debug("lw: [%s] recv %d\n", __func__, newconn->recvmbox); + pr_socket_buf(); netconn_delete(newconn); sock_set_errno(sock, ENFILE); done_socket(sock); @@ -696,6 +711,8 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) err = netconn_peer(newconn, &naddr, &port); if (err != ERR_OK) { LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err)); + lw_debug("lw: [%s] recv %x\n", __func__, newconn->recvmbox); + netconn_delete(newconn); free_socket(nsock, 1); sock_set_errno(sock, err_to_errno(err)); @@ -1739,6 +1756,8 @@ lwip_socket(int domain, int type, int protocol) i = alloc_socket(conn, 0); if (i == -1) { + lw_debug("lw: [%s] recv %d delete no socket\n", __func__, conn->recvmbox); + pr_socket_buf(); netconn_delete(conn); set_errno(ENFILE); return -1; @@ -1747,6 +1766,7 @@ lwip_socket(int domain, int type, int protocol) done_socket(&sockets[i - LWIP_SOCKET_OFFSET]); LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); set_errno(0); + lw_debug("lw: [%s] new socket %d %p\n", __func__, i, conn); return i; } diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h index ff32bc38b..a8f4b5be8 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h @@ -74,7 +74,7 @@ a lot of data that needs to be copied, this should be set high. */ #define MEMP_NUM_TCP_PCB_LISTEN 2 /* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. */ -#define MEMP_NUM_TCP_SEG 120 +#define MEMP_NUM_TCP_SEG 20 /* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. */ #define MEMP_NUM_SYS_TIMEOUT 6 @@ -212,26 +212,19 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums --------------------------------- */ -#define DEFAULT_RAW_RECVMBOX_SIZE 10 -#define DEFAULT_UDP_RECVMBOX_SIZE 10 -#define DEFAULT_TCP_RECVMBOX_SIZE 10 -#define DEFAULT_ACCEPTMBOX_SIZE 10 +#define DEFAULT_RAW_RECVMBOX_SIZE 8 +#define DEFAULT_UDP_RECVMBOX_SIZE 8 +#define DEFAULT_TCP_RECVMBOX_SIZE 8 +#define DEFAULT_ACCEPTMBOX_SIZE 8 #define DEFAULT_THREAD_PRIO 20 #define DEFAULT_THREAD_STACKSIZE 1024 #define TCPIP_THREAD_NAME "tcp" #define TCPIP_THREAD_STACKSIZE 8192 -#define TCPIP_MBOX_SIZE 10 +#define TCPIP_MBOX_SIZE 8 #define TCPIP_THREAD_PRIO 15 -//#define IPERF_SERVER_THREAD_NAME "iperf_server" -//#define IPERF_SERVER_THREAD_STACKSIZE 1024 -//#define IPERF_SERVER_THREAD_PRIO 0 - -//#define BLOCK_TIME 250 -//#define BLOCK_TIME_WAITING_FOR_INPUT ( ( portTickType ) 100 ) - /* ---------------------------------------- ---------- Lwip Debug options ---------- @@ -259,7 +252,8 @@ typedef unsigned int nfds_t; #define lw_print //KPrintf #define lw_trace() //KPrintf("lw: [%s][%d] passed!\n", __func__, __LINE__) #define lw_error() //KPrintf("lw: [%s][%d] failed!\n", __func__, __LINE__) -#define lw_pr_info KPrintf +#define lw_debug KPrintf +#define lw_notice KPrintf #endif /* __LWIPOPTS_H__ */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c index ad8b13af3..5088c7f37 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/sys_arch.c @@ -513,16 +513,16 @@ void lwip_config_net(char *ip, char *mask, char *gw) if(chk_lwip_bit(LWIP_PRINT_FLAG)) { - lw_pr_info("\r\n************************************************\r\n"); - lw_pr_info(" Network Configuration\r\n"); - lw_pr_info("************************************************\r\n"); - lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], + lw_notice("\r\n************************************************\r\n"); + lw_notice(" Network Configuration\r\n"); + lw_notice("************************************************\r\n"); + lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]); - lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], + lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]); - lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], + lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]); - lw_pr_info("************************************************\r\n"); + lw_notice("************************************************\r\n"); } lwip_config_input(&gnetif); } diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c index 724df1097..3fb89e245 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c @@ -355,7 +355,7 @@ tcp_write_checks(struct tcp_pcb *pcb, u16_t len) * it can send them more efficiently by combining them together). * To prompt the system to send data now, call tcp_output() after * calling tcp_write(). - * + * * This function enqueues the data pointed to by the argument dataptr. The length of * the data is passed as the len parameter. The apiflags can be one or more of: * - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated @@ -1386,13 +1386,17 @@ tcp_output(struct tcp_pcb *pcb) /* In the case of fast retransmit, the packet should not go to the tail * of the unacked queue, but rather somewhere before it. We need to check for * this case. -STJ Jul 27, 2004 */ + lw_debug("check %s seg %p useg %p\n", __func__, seg, useg); if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) { /* add segment to before tail of unacked list, keeping the list sorted */ struct tcp_seg **cur_seg = &(pcb->unacked); + lw_debug("check %s ", __func__); while (*cur_seg && TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { + lw_debug("%p -> ", *cur_seg); cur_seg = &((*cur_seg)->next ); } + lw_debug("\n"); seg->next = (*cur_seg); (*cur_seg) = seg; } else { diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c index 87e79fd8e..a9e662c09 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c @@ -81,18 +81,18 @@ void LwipShowIPTask(int argc, char *argv[]) { char mac_addr[] = configMAC_ADDR; - lw_pr_info("\r\n************************************************\r\n"); - lw_pr_info(" Network Configuration\r\n"); - lw_pr_info("************************************************\r\n"); - lw_pr_info(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_ipaddr)[0], ((u8_t *)&lwip_ipaddr)[1], + lw_notice("\r\n************************************************\r\n"); + lw_notice(" Network Configuration\r\n"); + lw_notice("************************************************\r\n"); + lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_ipaddr)[0], ((u8_t *)&lwip_ipaddr)[1], ((u8_t *)&lwip_ipaddr)[2], ((u8_t *)&lwip_ipaddr)[3]); - lw_pr_info(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_netmask)[0], ((u8_t *)&lwip_netmask)[1], + lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_netmask)[0], ((u8_t *)&lwip_netmask)[1], ((u8_t *)&lwip_netmask)[2], ((u8_t *)&lwip_netmask)[3]); - lw_pr_info(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1], + lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_gwaddr)[1], ((u8_t *)&lwip_gwaddr)[2], ((u8_t *)&lwip_gwaddr)[3]); - lw_pr_info(" MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr[0], mac_addr[1], mac_addr[2], + lw_notice(" MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); - lw_pr_info("************************************************\r\n"); + lw_notice("************************************************\r\n"); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c index cfeff2499..87443523e 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_dhcp_demo.c @@ -61,54 +61,54 @@ int LwipPrintDHCP(struct netif *netif) { dhcp_last_state = dhcp->state; - lw_pr_info(" DHCP state : "); + lw_notice(" DHCP state : "); switch (dhcp_last_state) { case DHCP_STATE_OFF: - lw_pr_info("OFF"); + lw_notice("OFF"); break; case DHCP_STATE_REQUESTING: - lw_pr_info("REQUESTING"); + lw_notice("REQUESTING"); break; case DHCP_STATE_INIT: - lw_pr_info("INIT"); + lw_notice("INIT"); break; case DHCP_STATE_REBOOTING: - lw_pr_info("REBOOTING"); + lw_notice("REBOOTING"); break; case DHCP_STATE_REBINDING: - lw_pr_info("REBINDING"); + lw_notice("REBINDING"); break; case DHCP_STATE_RENEWING: - lw_pr_info("RENEWING"); + lw_notice("RENEWING"); break; case DHCP_STATE_SELECTING: - lw_pr_info("SELECTING"); + lw_notice("SELECTING"); break; case DHCP_STATE_INFORMING: - lw_pr_info("INFORMING"); + lw_notice("INFORMING"); break; case DHCP_STATE_CHECKING: - lw_pr_info("CHECKING"); + lw_notice("CHECKING"); break; case DHCP_STATE_BOUND: - lw_pr_info("BOUND"); + lw_notice("BOUND"); break; case DHCP_STATE_BACKING_OFF: - lw_pr_info("BACKING_OFF"); + lw_notice("BACKING_OFF"); break; default: - lw_pr_info("%u", dhcp_last_state); + lw_notice("%u", dhcp_last_state); assert(0); break; } - lw_pr_info("\r\n"); + lw_notice("\r\n"); if (dhcp_last_state == DHCP_STATE_BOUND) { - lw_pr_info("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); - lw_pr_info(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); - lw_pr_info(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); + lw_notice("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); + lw_notice(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); + lw_notice(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); return 1; } } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c index f99e8b380..4eb01d0ba 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_ping_demo.c @@ -60,7 +60,7 @@ void LwipPingTest(int argc, char *argv[]) { if(sscanf(argv[1], "%d.%d.%d.%d", &lwip_gwaddr[0], &lwip_gwaddr[1], &lwip_gwaddr[2], &lwip_gwaddr[3]) == EOF) { - lw_pr_info("input wrong ip\n"); + lw_notice("input wrong ip\n"); return; } } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c index 98bf62cb5..387899abc 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c @@ -27,52 +27,61 @@ #define MSG_SIZE 128 +typedef struct LwipTcpSocketStruct +{ + char ip[6]; + uint16_t port; + char *buf; // test buffer +}LwipTcpSocketParamType; + // this is for test in shell, in fact, shell restrict the length of input string, which is less then 128 char tcp_send_msg[MSG_SIZE] = {0}; char tcp_target[] = {192, 168, 250, 252}; +uint16_t tcp_port = LWIP_TARGET_PORT; /******************************************************************************/ static void LwipTcpSendTask(void *arg) { - lw_print("LwipTcpSendTask start.\n"); + lw_notice("LwipTcpSendTask start.\n"); int fd = -1; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { - lw_print("Socket error\n"); + lw_notice("Socket error\n"); return; } + LwipTcpSocketParamType *param = (LwipTcpSocketParamType *)arg; + struct sockaddr_in tcp_sock; tcp_sock.sin_family = AF_INET; - tcp_sock.sin_port = htons(LWIP_TARGET_PORT); - tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(tcp_target[0], tcp_target[1], tcp_target[2], tcp_target[3])); + tcp_sock.sin_port = htons(param->port); + tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(param->ip[0], param->ip[1], param->ip[2], param->ip[3])); memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) { - lw_print("Unable to connect\n"); - goto __exit; + lw_notice("Unable to connect\n"); + closesocket(fd); + return; } - lw_print("tcp connect success, start to send.\n"); - lw_print("\n\nTarget Port:%d\n\n", tcp_sock.sin_port); + lw_notice("tcp connect success, start to send.\n"); + lw_notice("\n\nTarget Port:%d\n\n", tcp_sock.sin_port); sendto(fd, tcp_send_msg, strlen(tcp_send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); - lw_print("Send tcp msg: %s ", tcp_send_msg); - -__exit: - if (fd >= 0) - closesocket(fd); + lw_notice("Send tcp msg: %s ", tcp_send_msg); + closesocket(fd); return; } void LwipTcpSendTest(int argc, char *argv[]) { + LwipTcpSocketParamType param; memset(tcp_send_msg, 0, MSG_SIZE); if(argc >= 2) { @@ -86,11 +95,20 @@ void LwipTcpSendTest(int argc, char *argv[]) if(argc >= 3) { - sscanf(argv[2], "%d.%d.%d.%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3]); + if(sscanf(argv[2], "%d.%d.%d.%d:%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3], &tcp_port) == EOK) + { + sscanf(argv[2], "%d.%d.%d.%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3]); + } } + lw_notice("get ipaddr %d.%d.%d.%d:%d\n", tcp_target[0], tcp_target[1], tcp_target[2], tcp_target[3], tcp_port); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_target); - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); - sys_thread_new("tcp send", LwipTcpSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); + memcpy(param.ip, tcp_target, 4); + param.port = tcp_port; + param.buf = malloc(MSG_SIZE); + memcpy(param.buf, tcp_send_msg, MSG_SIZE); + + sys_thread_new("tcp send", LwipTcpSendTask, ¶m, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c index 9f459031a..97d06b119 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c @@ -30,7 +30,8 @@ #define PBUF_SIZE 27 static struct udp_pcb *udpecho_raw_pcb; -char udp_target[] = {192, 168, 250, 252}; +char udp_demo_ip[] = {192, 168, 250, 252}; +uint16_t udp_demo_port = LWIP_TARGET_PORT; char hello_str[] = {"hello world\r\n"}; char udp_send_msg[] = "\n\nThis one is UDP pkg. Congratulations on you.\n\n"; @@ -52,28 +53,23 @@ static void LwipUDPSendTask(void *arg) struct sockaddr_in udp_sock; udp_sock.sin_family = AF_INET; - udp_sock.sin_port = htons(LWIP_TARGET_PORT); - udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_target[0],udp_target[1],udp_target[2],udp_target[3])); + udp_sock.sin_port = htons(udp_demo_port); + udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3])); memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero)); if (connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) { lw_print("Unable to connect\n"); - goto __exit; + closesocket(socket_fd); + return; } lw_print("UDP connect success, start to send.\n"); lw_print("\n\nTarget Port:%d\n\n", udp_sock.sin_port); sendto(socket_fd, udp_send_msg, strlen(udp_send_msg), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); - lw_pr_info("Send UDP msg: %s ", udp_send_msg); - -__exit: - if (socket_fd >= 0) - { - closesocket(socket_fd); - } - + lw_notice("Send UDP msg: %s ", udp_send_msg); + closesocket(socket_fd); return; } @@ -86,7 +82,7 @@ void *LwipUdpSendTest(int argc, char *argv[]) if(argc == 1) { - lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_target[0], udp_target[1], udp_target[2], udp_target[3]); + lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]); strncpy(udp_send_msg, hello_str, strlen(hello_str)); } else @@ -95,12 +91,12 @@ void *LwipUdpSendTest(int argc, char *argv[]) strncat(udp_send_msg, "\r\n", 2); if(argc == 3) { - sscanf(argv[2], "%d.%d.%d.%d", &udp_target[0], &udp_target[1], &udp_target[2], &udp_target[3]); + sscanf(argv[2], "%d.%d.%d.%d", &udp_demo_ip[0], &udp_demo_ip[1], &udp_demo_ip[2], &udp_demo_ip[3]); } } - lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_target[0], udp_target[1], udp_target[2], udp_target[3]); + lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]); - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); + lwip_config_net(lwip_ipaddr, lwip_netmask, lwip_gwaddr); sys_thread_new("udp socket send", LwipUDPSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } @@ -121,11 +117,11 @@ static void LwipUdpRecvTask(void *arg, struct udp_pcb *upcb, struct pbuf *p, return; } udp_len = p->tot_len; - lw_pr_info("Receive data :%dB\r\n", udp_len); + lw_notice("Receive data :%dB\r\n", udp_len); if(udp_len <= 80) { - lw_pr_info("%.*s\r\n", udp_len, (char *)(p->payload)); + lw_notice("%.*s\r\n", udp_len, (char *)(p->payload)); } udp_buf = pbuf_alloc(PBUF_TRANSPORT, PBUF_SIZE, PBUF_RAM); diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c index 1a66bd272..15c2f6c1e 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/ping.c @@ -492,7 +492,7 @@ int get_url_ip(char* url) /* convert URL to IP */ if (lwip_getaddrinfo(url, NULL, &hint, &res) != 0) { - lw_pr_info("ping: unknown host %s\n", url); + lw_notice("ping: unknown host %s\n", url); return -1; } memcpy(&h, &res->ai_addr, sizeof(struct sockaddr_in *)); @@ -500,13 +500,13 @@ int get_url_ip(char* url) lwip_freeaddrinfo(res); if (inet_aton(inet_ntoa(ina), &target_addr) == 0) { - lw_pr_info("ping: unknown host %s\n", url); + lw_notice("ping: unknown host %s\n", url); return -2; } /* new a socket */ if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0) { - lw_pr_info("ping: create socket failed\n"); + lw_notice("ping: create socket failed\n"); return -3; } @@ -521,12 +521,12 @@ int get_url_ip(char* url) #endif /* LWIP_DEBUG */ if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0) { - lw_pr_info("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt, + lw_notice("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt, ttl, sys_now() - ping_time); } else { - lw_pr_info("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt); + lw_notice("From %s icmp_seq=%d timeout\n", inet_ntoa(ina), cnt); } } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c index 026207891..d924f3285 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/tcpecho_raw.c @@ -159,9 +159,9 @@ tcpecho_raw_ack(struct tcp_pcb *tpcb, struct tcpecho_raw_state* es){ if((recv_len != TCP_MSS) || (recv_buf[recv_len - 1] == TCP_EOF_CH)) { if(g_buf_size < MAX_TCP_SHOW_SIZE){ - lw_pr_info("Received: %s\n", g_buf); + lw_notice("Received: %s\n", g_buf); }else{ - lw_pr_info("Received a string of length %d\n", g_buf_size); + lw_notice("Received a string of length %d\n", g_buf_size); } tcpecho_raw_ack_size(tpcb, g_buf_size); diff --git a/Ubiquitous/XiZi/resources/include/flash_spi.h b/Ubiquitous/XiZi/resources/include/flash_spi.h index f41d40d25..1f6aa4913 100644 --- a/Ubiquitous/XiZi/resources/include/flash_spi.h +++ b/Ubiquitous/XiZi/resources/include/flash_spi.h @@ -21,7 +21,9 @@ #ifndef FLASH_SPI_H #define FLASH_SPI_H +#ifdef RESOURCES_SPI_SFUD #include +#endif #ifdef __cplusplus extern "C" { diff --git a/Ubiquitous/XiZi/tool/shell/letter-shell/shell.c b/Ubiquitous/XiZi/tool/shell/letter-shell/shell.c index e1224a867..7cab44a65 100644 --- a/Ubiquitous/XiZi/tool/shell/letter-shell/shell.c +++ b/Ubiquitous/XiZi/tool/shell/letter-shell/shell.c @@ -3,12 +3,12 @@ * @author Letter (NevermindZZT@gmail.com) * @version 3.0.0 * @date 2019-12-30 - * + * * @copyright (c) 2020 Letter - * + * */ /*change log: - Change Chinese comment to English comment + Change Chinese comment to English comment */ #include "shell.h" @@ -38,14 +38,14 @@ const ShellCommand shellUserDefault SECTION("shellCommand") = }; - + #if defined(__GNUC__) extern const unsigned long _shell_command_start; extern const unsigned long _shell_command_end; #endif /** - * @brief shell Constant text index + * @brief shell Constant text index */ enum { @@ -87,45 +87,45 @@ static const char *shellText[] = "Build: "__DATE__" "__TIME__"\r\n" "Version: "SHELL_VERSION"\r\n" "Copyright: (c) 2020 Letter\r\n", - [SHELL_TEXT_CMD_TOO_LONG] = + [SHELL_TEXT_CMD_TOO_LONG] = "\r\nWarning: Command is too long\r\n", - [SHELL_TEXT_CMD_LIST] = + [SHELL_TEXT_CMD_LIST] = "\r\nCommand List:\r\n", - [SHELL_TEXT_VAR_LIST] = + [SHELL_TEXT_VAR_LIST] = "\r\nVar List:\r\n", - [SHELL_TEXT_USER_LIST] = + [SHELL_TEXT_USER_LIST] = "\r\nUser List:\r\n", [SHELL_TEXT_KEY_LIST] = "\r\nKey List:\r\n", - [SHELL_TEXT_CMD_NOT_FOUND] = + [SHELL_TEXT_CMD_NOT_FOUND] = "Command not Found\r\n", - [SHELL_TEXT_POINT_CANNOT_MODIFY] = + [SHELL_TEXT_POINT_CANNOT_MODIFY] = "can't set pointer\r\n", - [SHELL_TEXT_VAR_READ_ONLY_CANNOT_MODIFY] = + [SHELL_TEXT_VAR_READ_ONLY_CANNOT_MODIFY] = "can't set read only var\r\n", [SHELL_TEXT_NOT_VAR] = " is not a var\r\n", - [SHELL_TEXT_VAR_NOT_FOUND] = + [SHELL_TEXT_VAR_NOT_FOUND] = "Var not Fount\r\n", [SHELL_TEXT_HELP_HEADER] = "command help of ", - [SHELL_TEXT_PASSWORD_HINT] = + [SHELL_TEXT_PASSWORD_HINT] = "\r\nPlease input password:", - [SHELL_TEXT_PASSWORD_ERROR] = + [SHELL_TEXT_PASSWORD_ERROR] = "\r\npassword error\r\n", - [SHELL_TEXT_CLEAR_CONSOLE] = + [SHELL_TEXT_CLEAR_CONSOLE] = "\033[2J\033[1H", - [SHELL_TEXT_CLEAR_LINE] = + [SHELL_TEXT_CLEAR_LINE] = "\033[2K\r", - [SHELL_TEXT_TYPE_CMD] = + [SHELL_TEXT_TYPE_CMD] = "CMD ", - [SHELL_TEXT_TYPE_VAR] = + [SHELL_TEXT_TYPE_VAR] = "VAR ", - [SHELL_TEXT_TYPE_USER] = + [SHELL_TEXT_TYPE_USER] = "USER", - [SHELL_TEXT_TYPE_KEY] = + [SHELL_TEXT_TYPE_KEY] = "KEY ", - [SHELL_TEXT_TYPE_NONE] = + [SHELL_TEXT_TYPE_NONE] = "NONE", }; @@ -147,8 +147,8 @@ ShellCommand* shellSeekCommand(Shell *shell, unsigned short compareLength); /** - * @brief shell initialization - * + * @brief shell initialization + * * @param shell shell * @param buffer buffer,used to record history * @param size the size of buffer @@ -195,7 +195,7 @@ void shellInit(Shell *shell, char *buffer, unsigned short size) /** * @brief Add shell - * + * * @param shell shell */ static void shellAdd(Shell *shell) @@ -212,9 +212,9 @@ static void shellAdd(Shell *shell) /** - * @brief Get the current active shell - * - * @return Shell* Currently active shell object + * @brief Get the current active shell + * + * @return Shell* Currently active shell object */ Shell* shellGetCurrent(void) { @@ -230,10 +230,10 @@ Shell* shellGetCurrent(void) /** - * @brief Shell write characters - * + * @brief Shell write characters + * * @param shell shell - * @param data Character data + * @param data Character data */ static void shellWriteByte(Shell *shell, const char data) { @@ -242,11 +242,11 @@ static void shellWriteByte(Shell *shell, const char data) /** - * @brief shell Write string - * + * @brief shell Write string + * * @param shell shell - * @param string String data - * + * @param string String data + * * @return unsigned short Number of characters written (include '\n') */ unsigned short shellWriteString(Shell *shell, const char *string) @@ -263,12 +263,12 @@ unsigned short shellWriteString(Shell *shell, const char *string) /** - * @brief Shell write command description string - * - * @param shell shell - * @param string String data - * - * @return unsigned short Number of characters written + * @brief Shell write command description string + * + * @param shell shell + * @param string String data + * + * @return unsigned short Number of characters written */ static unsigned short shellWriteCommandDesc(Shell *shell, const char *string) { @@ -296,10 +296,10 @@ extern char working_dir[]; #endif /** * @brief Shell write new command line - * + * * @param shell shell - * @param newline Bool ,Whether to write a line - * + * @param newline Bool ,Whether to write a line + * */ static void shellWriteCommandLine(Shell *shell, unsigned char newline) { @@ -326,19 +326,19 @@ static void shellWriteCommandLine(Shell *shell, unsigned char newline) /** - * @brief shell Check command permissions - * + * @brief shell Check command permissions + * * @param shell shell * @param command ShellCommand - * - * @return signed char 0 The current user has the command authority - * @return signec char -1 The current user does not have the command authority + * + * @return signed char 0 The current user has the command authority + * @return signec char -1 The current user does not have the command authority */ signed char shellCheckPermission(Shell *shell, ShellCommand *command) { return ((!command->attr.attrs.permission || command->attr.attrs.type == SHELL_TYPE_USER - || (command->attr.attrs.permission + || (command->attr.attrs.permission & shell->info.user->attr.attrs.permission)) && (shell->status.isChecked || command->attr.attrs.enableUnchecked)) @@ -347,12 +347,12 @@ signed char shellCheckPermission(Shell *shell, ShellCommand *command) /** - * @brief int to hexadecimal string - * + * @brief int to hexadecimal string + * * @param value int value * @param buffer hexadecimal result - * - * @return signed char, data length after conversion + * + * @return signed char, data length after conversion */ signed char shellToHex(unsigned int value, char *buffer) { @@ -370,12 +370,12 @@ signed char shellToHex(unsigned int value, char *buffer) /** -* @brief int to decimal string - * +* @brief int to decimal string + * * @param value int value * @param buffer decimal result - * - * @return signed char, data length after conversion + * + * @return signed char, data length after conversion */ signed char shellToDec(int value, char *buffer) { @@ -403,11 +403,11 @@ signed char shellToDec(int value, char *buffer) /** - * @brief shell string copy - * - * @param dest destination string - * @param src Source string - * @return Unsigned short ,String length + * @brief shell string copy + * + * @param dest destination string + * @param src Source string + * @return Unsigned short ,String length */ static unsigned short shellStringCopy(char *dest, char* src) { @@ -423,11 +423,11 @@ static unsigned short shellStringCopy(char *dest, char* src) /** - * @brief Shell string comparison - * - * @param dest destination string - * @param src Source string - * @return unsigned short, Match length + * @brief Shell string comparison + * + * @param dest destination string + * @param src Source string + * @return unsigned short, Match length */ static unsigned short shellStringCompare(char* dest, char *src) { @@ -448,10 +448,10 @@ static unsigned short shellStringCompare(char* dest, char *src) /** - * @brief shell get command name - * + * @brief shell get command name + * * @param command command - * @return const char* ,Command name + * @return const char* ,Command name */ static const char* shellGetCommandName(ShellCommand *command) { @@ -482,7 +482,7 @@ static const char* shellGetCommandName(ShellCommand *command) /** * @brief shell get command description - * + * * @param command command * @return const char* ,Command description */ @@ -508,7 +508,7 @@ static const char* shellGetCommandDesc(ShellCommand *command) /** * @brief shell list items - * + * * @param shell shell ojbect * @param item ShellCommand item(func,user,key,variable...) */ @@ -555,8 +555,8 @@ void shellListItem(Shell *shell, ShellCommand *item) /** - * @brief shell lists all function commands - * + * @brief shell lists all function commands + * * @param shell shell */ void shellListCommand(Shell *shell) @@ -576,7 +576,7 @@ void shellListCommand(Shell *shell) /** * @brief shell list all variable - * + * * @param shell shell */ void shellListVar(Shell *shell) @@ -597,8 +597,8 @@ void shellListVar(Shell *shell) /** * @brief shell list all users - * - * @param shell shell + * + * @param shell shell */ void shellListUser(Shell *shell) { @@ -618,8 +618,8 @@ void shellListUser(Shell *shell) /** * @brief shell list all keys - * - * @param shell shell + * + * @param shell shell */ void shellListKey(Shell *shell) { @@ -638,8 +638,8 @@ void shellListKey(Shell *shell) /** - * @brief shell delete command line data - * + * @brief shell delete command line data + * * @param shell shell * @param length length of delete data */ @@ -654,7 +654,7 @@ void shellDeleteCommandLine(Shell *shell, unsigned char length) /** * @brief shell clear command line data - * + * * @param shell shell */ void shellClearCommandLine(Shell *shell) @@ -668,8 +668,8 @@ void shellClearCommandLine(Shell *shell) /** - * @brief shell Insert a character at the cursor position - * + * @brief shell Insert a character at the cursor position + * * @param shell shell * @param data charactoer */ @@ -696,7 +696,7 @@ void shellInsertByte(Shell *shell, char data) { for (short i = shell->parser.length - shell->parser.cursor; i > 0; i--) { - shell->parser.buffer[shell->parser.cursor + i] = + shell->parser.buffer[shell->parser.cursor + i] = shell->parser.buffer[shell->parser.cursor + i - 1]; } shell->parser.buffer[shell->parser.cursor++] = data; @@ -715,10 +715,10 @@ void shellInsertByte(Shell *shell, char data) /** * @brief shell delete character - * + * * @param shell shell * @param direction delete a character: - * {@code 1} Delete the character before the cursor + * {@code 1} Delete the character before the cursor * {@code -1}Delete the character after the cursor */ void shellDeleteByte(Shell *shell, signed char direction) @@ -741,7 +741,7 @@ void shellDeleteByte(Shell *shell, signed char direction) { for (short i = offset; i < shell->parser.length - shell->parser.cursor; i++) { - shell->parser.buffer[shell->parser.cursor + i - 1] = + shell->parser.buffer[shell->parser.cursor + i - 1] = shell->parser.buffer[shell->parser.cursor + i]; } shell->parser.length--; @@ -765,8 +765,8 @@ void shellDeleteByte(Shell *shell, signed char direction) /** - * @brief shell Parsing parameters - * + * @brief shell Parsing parameters + * * @param shell shell */ static void shellParserParam(Shell *shell) @@ -815,8 +815,8 @@ static void shellParserParam(Shell *shell) /** - * @brief shell Remove the double quotes at the beginning and end of string parameters - * + * @brief shell Remove the double quotes at the beginning and end of string parameters + * * @param shell shell */ static void shellRemoveParamQuotes(Shell *shell) @@ -839,13 +839,13 @@ static void shellRemoveParamQuotes(Shell *shell) /** - * @brief shell seeking command - * + * @brief shell seeking command + * * @param shell shell * @param cmd command - * @param base command table base address - * @param compareLength Match string length - * @return ShellCommand* :find command + * @param base command table base address + * @param compareLength Match string length + * @return ShellCommand* :find command */ ShellCommand* shellSeekCommand(Shell *shell, const char *cmd, @@ -883,8 +883,8 @@ ShellCommand* shellSeekCommand(Shell *shell, /** - * @brief shell Get variable value - * + * @brief shell Get variable value + * * @param shell shell * @param command command * @return int value @@ -921,7 +921,7 @@ int shellGetVarValue(Shell *shell, ShellCommand *command) /** * @brief shell set variable value - * + * * @param shell shell * @param command command * @param value value @@ -976,7 +976,7 @@ int shellSetVarValue(Shell *shell, ShellCommand *command, int value) /** * @brief shell print variable value - * + * * @param shell shell * @param command command * @return int value @@ -985,7 +985,7 @@ static int shellShowVar(Shell *shell, ShellCommand *command) { char buffer[12] = "00000000000"; int value = shellGetVarValue(shell, command); - + shellWriteString(shell, command->data.var.name); shellWriteString(shell, " = "); @@ -1019,7 +1019,7 @@ static int shellShowVar(Shell *shell, ShellCommand *command) /** * @brief shell set variable value - * + * * @param name value name * @param value value * @return int value @@ -1056,10 +1056,10 @@ setVar, shellSetVar, set var); /** * @brief shell run command - * + * * @param shell shell * @param command command - * + * * @return unsigned int command return value */ unsigned int shellRunCommand(Shell *shell, ShellCommand *command) @@ -1104,7 +1104,7 @@ unsigned int shellRunCommand(Shell *shell, ShellCommand *command) /** * @brief shell check password - * + * * @param shell shell */ static void shellCheckPassword(Shell *shell) @@ -1124,20 +1124,20 @@ static void shellCheckPassword(Shell *shell) /** - * @brief shell set user - * + * @brief shell set user + * * @param shell shell * @param user user */ static void shellSetUser(Shell *shell, const ShellCommand *user) { shell->info.user = user; - shell->status.isChecked = + shell->status.isChecked = ((user->data.user.password && strlen(user->data.user.password) != 0) && (shell->parser.paramCount < 2 || strcmp(user->data.user.password, shell->parser.param[1]) != 0)) ? 0 : 1; - + if (shell->status.isChecked) { shellWriteString(shell, shellText[SHELL_TEXT_INFO]); @@ -1147,7 +1147,7 @@ static void shellSetUser(Shell *shell, const ShellCommand *user) /** * @brief shell write return value - * + * * @param shell shell * @param value value */ @@ -1169,14 +1169,14 @@ static void shellWriteReturnValue(Shell *shell, int value) /** * @brief shell add history - * + * * @param shell shell */ static void shellHistoryAdd(Shell *shell) { shell->history.offset = 0; if (shell->history.number > 0 - && strcmp(shell->history.item[(shell->history.record == 0 ? + && strcmp(shell->history.item[(shell->history.record == 0 ? SHELL_HISTORY_MAX_NUMBER : shell->history.record) - 1], shell->parser.buffer) == 0) { @@ -1200,7 +1200,7 @@ static void shellHistoryAdd(Shell *shell) /** * @brief shell history find - * + * * @param shell shell * @param dir directory:{@code <0}UP, {@code >0}Down */ @@ -1208,7 +1208,7 @@ static void shellHistory(Shell *shell, signed char dir) { if (dir > 0) { - if (shell->history.offset-- <= + if (shell->history.offset-- <= -((shell->history.number > shell->history.record) ? shell->history.number : shell->history.record)) { @@ -1244,14 +1244,14 @@ static void shellHistory(Shell *shell, signed char dir) shell->parser.cursor = shell->parser.length; shellWriteString(shell, shell->parser.buffer); } - + } /** * @brief shell normalinput - * - * @param shell shell + * + * @param shell shell * @param data input character */ void shellNormalInput(Shell *shell, char data) @@ -1263,12 +1263,12 @@ void shellNormalInput(Shell *shell, char data) /** * @brief shell run command - * + * * @param shell shell */ void shellExec(Shell *shell) { - + if (shell->parser.length == 0) { return; @@ -1308,8 +1308,8 @@ void shellExec(Shell *shell) /** - * @brief shell Previous history - * + * @brief shell Previous history + * * @param shell shell */ void shellUp(Shell *shell) @@ -1321,7 +1321,7 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0), 0x1B5B4100, shellUp, up); /** * @brief shell Next - * + * * @param shell shell */ void shellDown(Shell *shell) @@ -1333,7 +1333,7 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0), 0x1B5B4200, shellDown, down); /** * @brief shell input right key - * + * * @param shell shell */ void shellRight(Shell *shell) @@ -1349,7 +1349,7 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, /** * @brief shell input left key - * + * * @param shell shell */ void shellLeft(Shell *shell) @@ -1366,7 +1366,7 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, /** * @brief shell Tab key function - * + * * @param shell shell */ void shellTab(Shell *shell) @@ -1399,7 +1399,7 @@ void shellTab(Shell *shell) shellWriteString(shell, "\r\n"); } shellListItem(shell, &base[lastMatchIndex]); - length = + length = shellStringCompare((char *)shellGetCommandName(&base[lastMatchIndex]), (char *)shellGetCommandName(&base[i])); maxMatch = (maxMatch > length) ? length : maxMatch; @@ -1418,7 +1418,7 @@ void shellTab(Shell *shell) } if (matchNum != 0) { - shell->parser.length = + shell->parser.length = shellStringCopy(shell->parser.buffer, (char *)shellGetCommandName(&base[lastMatchIndex])); } @@ -1460,8 +1460,8 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0), 0x09000000, shellTab, tab); /** - * @brief shell backspace - * + * @brief shell backspace + * * @param shell shell */ void shellBackspace(Shell *shell) @@ -1476,7 +1476,7 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, /** * @brief shell delet - * + * * @param shell shell */ void shellDelete(Shell *shell) @@ -1489,7 +1489,7 @@ SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, /** * @brief shell Enter key - * + * * @param shell shell */ void shellEnter(Shell *shell) @@ -1497,24 +1497,24 @@ void shellEnter(Shell *shell) shellExec(shell); shellWriteCommandLine(shell, 1); } -#ifdef SHELL_ENTER_LF +#ifdef SHELL_ENTER_LF SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, 0x0A000000, shellEnter, enter); #endif -#ifdef SHELL_ENTER_CR +#ifdef SHELL_ENTER_CR SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, 0x0D000000, shellEnter, enter); #endif -#ifdef SHELL_ENTER_CRLF +#ifdef SHELL_ENTER_CRLF SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0)|SHELL_CMD_ENABLE_UNCHECKED, 0x0D0A0000, shellEnter, enter); #endif /** * @brief shell help - * - * @param argc Number of parameters - * @param argv parameter + * + * @param argc Number of parameters + * @param argv parameter */ void shellHelp(int argc, char *argv[]) { @@ -1542,15 +1542,15 @@ SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_DISABLE_RE Help, shellHelp, show command info\r\nhelp [cmd]); /** - * @brief shell Input processing - * + * @brief shell Input processing + * * @param shell shell * @param data input data */ void shellHandler(Shell *shell, char data) { CHECK(data); - + #if SHELL_LOCK_TIMEOUT > 0 if (shell->info.user->data.user.password @@ -1597,7 +1597,7 @@ void shellHandler(Shell *shell, char data) { shell->parser.keyValue |= data << keyByteOffset; data = 0x00; - if (keyByteOffset == 0 + if (keyByteOffset == 0 || (base[i].data.key.value & (0xFF << (keyByteOffset - 8))) == 0x00000000) { @@ -1630,9 +1630,9 @@ void shellHandler(Shell *shell, char data) /** * @brief shell task - * + * * @param param parameter(shell) - * + * */ void shellTask(void *param) { @@ -1652,12 +1652,13 @@ void shellTask(void *param) shellHandler(shell, data[i]); } } + KPrintf(""); } } /** - * @brief Output user list (shell call) + * @brief Output user list (shell call) */ void shellUsers(void) { @@ -1675,7 +1676,7 @@ users, shellUsers, list all user); /** - * @brief Output variable list (shell call) + * @brief Output variable list (shell call) */ void shellVars(void) { @@ -1692,7 +1693,7 @@ vars, shellVars, list all var); #endif /** - * @brief Output key list (shell call) + * @brief Output key list (shell call) */ void shellKeys(void) { @@ -1708,7 +1709,7 @@ SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RE keys, shellKeys, list all key); #endif /** - * @brief Clear the console (shell call) + * @brief Clear the console (shell call) */ void shellClear(void) { diff --git a/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c b/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c index 661cfb604..5d8d21a65 100644 --- a/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c +++ b/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c @@ -1,12 +1,12 @@ /** * @file shell_port.c * @author Letter (NevermindZZT@gmail.com) - * @brief + * @brief * @version 0.1 * @date 2019-02-22 - * + * * @copyright (c) 2019 Letter - * + * */ #include "xizi.h" @@ -26,11 +26,11 @@ char *shellBuffer; ShellFs shellFs; char *shellPathBuffer; -HardwareDevType console; +HardwareDevType console; /** - * @brief Shell write - * + * @brief Shell write + * * @param data write data */ void userShellWrite(char data) @@ -40,7 +40,7 @@ void userShellWrite(char data) /** * @brief shell read - * + * * @param data read data * @return char read status */ @@ -62,7 +62,7 @@ signed char userShellRead(char *data) #ifdef SHELL_ENABLE_FILESYSTEM /** * @brief list file - * + * * @param path path * @param buffer result buffer * @param maxLen the maximum buffer size @@ -86,14 +86,14 @@ size_t userShellListDir(char *path, char *buffer, size_t maxLen) #endif /** - * @brief Initialize the shell - * + * @brief Initialize the shell + * */ int userShellInit(void) { shellBuffer = x_malloc(512*sizeof(char)); - - + + #ifdef SHELL_ENABLE_FILESYSTEM shellPathBuffer = x_malloc(512*sizeof(char)); shellPathBuffer[0] = '/'; @@ -102,7 +102,7 @@ int userShellInit(void) shellFs.listdir = userShellListDir; shellFsInit(&shellFs, shellPathBuffer, 512); shellSetPath(&shell, shellPathBuffer); -#endif +#endif shell.write = userShellWrite; shell.read = userShellRead; @@ -114,13 +114,13 @@ int userShellInit(void) serial_dev_param->serial_set_mode = 0; serial_dev_param->serial_stream_mode = SIGN_OPER_STREAM; BusDevOpen(console); - - shellInit(&shell, shellBuffer, 512); + + shellInit(&shell, shellBuffer, 4096); int32 tid; tid = KTaskCreate("letter-shell", shellTask, &shell, SHELL_TASK_STACK_SIZE, SHELL_TASK_PRIORITY); - + StartupKTask(tid); return 0; } From be61178e4410325eb266205749904593f34e3395 Mon Sep 17 00:00:00 2001 From: wlyu Date: Thu, 17 Mar 2022 18:30:26 +0800 Subject: [PATCH 4/6] support json file parse for plc socket demo --- .../plc/interoperability/socket/plc_socket.c | 53 +++++++-- .../plc/interoperability/socket/plc_socket.h | 2 +- .../Framework/control/shared/control_file.c | 102 +++++++++++++----- .../Framework/control/shared/control_file.h | 23 +++- 4 files changed, 142 insertions(+), 38 deletions(-) diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c index 1b8204c04..a69d5dc9d 100755 --- a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c @@ -224,6 +224,46 @@ void PlcShowUsage(void) plc_notice("------------------------------------\n"); } +void PlcGetParamFromFile(void) +{ + PlcSocketParamType *param = &plc_socket_demo_data; + + //for PLC socket parameter file + char file_buf[CTL_FILE_SIZE] = {0}; + FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME); + + if(fd == NULL) + return; + + memset(file_buf, 0, CTL_FILE_SIZE); + + CtlFileRead(fd, CTL_FILE_SIZE, file_buf); + CtlFileClose(fd); + CtlParseJsonData(file_buf); + + memcpy(param->ip, ctl_file_param.ip, 4); + param->port = ctl_file_param.port; + param->cmd_num = ctl_file_param.cmd_num; + + for(int i = 0; i < param->cmd_num; i++) + { + TestPlcCmd[i].cmd_len = ctl_file_param.cmd_len[i]; + memcpy(TestPlcCmd[i].cmd, ctl_file_param.cmd[i], TestPlcCmd[i].cmd_len); + } + + plc_print("ip: %d.%d.%d.%d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3]); + plc_print("port: %d", param->port); + plc_print("cmd number: %d\n", param->cmd_num); + + for(int i = 0; i < param->cmd_num; i++) + { + plc_print("cmd %d len %d: ", i, TestPlcCmd[i].cmd_len); + for(int j = 0; j < TestPlcCmd[i].cmd_len; j++) + plc_print("%x ", TestPlcCmd[i].cmd[j]); + plc_print("\n"); + } +} + void PlcCheckParam(int argc, char *argv[]) { int i; @@ -238,6 +278,13 @@ void PlcCheckParam(int argc, char *argv[]) plc_print("check %d %s\n", i, str); + if(strcmp(str, "file") == 0) + { + plc_notice("get parameter file %s\n", PLC_SOCK_FILE_NAME); + PlcGetParamFromFile(); + return; + } + if(sscanf(str, "ip=%d.%d.%d.%d", ¶m->ip[0], ¶m->ip[1], @@ -302,11 +349,6 @@ void PlcCheckParam(int argc, char *argv[]) } } -void PlcGetParamFromFile(char *file) -{ - -} - void PlcSocketTask(int argc, char *argv[]) { int result = 0; @@ -323,7 +365,6 @@ void PlcSocketTask(int argc, char *argv[]) PrivTaskCreate(&th_id, &attr, PlcSocketStart, param); } - SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), PlcSocket, PlcSocketTask, Test PLC Socket); diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h index 363877083..fbccd9b64 100755 --- a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h @@ -60,7 +60,7 @@ typedef struct PlcSocketParamStruct{ }PlcSocketParamType; //debug command -#define plc_print //KPrintf +#define plc_print KPrintf #define plc_error KPrintf #define plc_notice KPrintf diff --git a/APP_Framework/Framework/control/shared/control_file.c b/APP_Framework/Framework/control/shared/control_file.c index 920f89296..d906beca8 100755 --- a/APP_Framework/Framework/control/shared/control_file.c +++ b/APP_Framework/Framework/control/shared/control_file.c @@ -23,36 +23,35 @@ #include "transform.h" #include "control_file.h" -#define CTL_FILE_NAME "/plc/control_cmd.txt" - -#define TEST_PLC_CMD_TXT \ - "cmd=03,00,00,16,11,E0,00,00,02,C8,00,C1,02,02,01,C2,02,02,01,C0,01,0A\r\n\r\n" \ - "cmd=03,00,00,19,02,F0,80,32,01,00,00,00,0D,00,08,00,00,F0,00,00,01,00,01,00,F0\r\n\r\n" \ - "cmd=03,00,00,1F,02,F0,80,32,01,00,00,33,01,00,0E,00,00,04,01,12,0A,10,02,00,D2,00,34,84,00,00,00\r\n\r\n" \ - "port=102\r\n" \ - "ip=192.168.250.6\r\n" - +//json file parameter for PLC socket communication as below: +//{ +// "ip": "192.168.250.6", +// "port": 102, +// "cmd": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10], +// "cmd1": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240], \r\n" \ +// "cmd2": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]\r\n" \ +//}" #define TEST_PLC_JSON_TXT \ "{ \r\n"\ -" \"S1200\": [ \r\n"\ -" { \"ip\": \"192.168.250.6\"}, \r\n"\ -" { \"port\": 102}, \r\n"\ -" { \"cmd\": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10]}\r\n"\ -" ] \r\n"\ +" \"ip\": \"192.168.250.6\", \r\n"\ +" \"port\": 102, \r\n"\ +" \"cmd\": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10], \r\n"\ +" \"cmd1\": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240], \r\n" \ +" \"cmd2\": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]\r\n" \ "}" -//" { \"cmd\": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240]},\r\n" \ -//" { \"cmd\": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]}\r\n" \ -FILE *CtlFileInit(void) +CtlPlcSockParamType ctl_file_param; + +FILE *CtlFileInit(char *file) { FILE *fd = NULL; - fd = fopen(CTL_FILE_NAME, "a+"); + fd = fopen(file, "a+"); if(fd == NULL) { - ctl_error("open file %s failed\n", CTL_FILE_NAME); + ctl_error("open file %s failed\n", file); } return fd; @@ -65,8 +64,9 @@ void CtlFileClose(FILE *fd) void CtlFileRead(FILE *fd, int size, char *buf) { + fseek(fd, 0, SEEK_SET); fread(buf, size, 1, fd); - ctl_print("read file %d: %s\n", size, buf); + ctl_print("read file %d: %.100s\n", size, buf); } void CtlFileWrite(FILE *fd, int size, char *buf) @@ -76,26 +76,52 @@ void CtlFileWrite(FILE *fd, int size, char *buf) ctl_print("write size %d: %s\n", size, buf); } -void CtlFileTest(void) +void CtlCreateFileTest(void) { - FILE *fd = CtlFileInit(); + FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME); + if(fd == NULL) + return; char *file_buf = TEST_PLC_JSON_TXT; CtlFileWrite(fd, strlen(file_buf), file_buf); - CtlFileRead(fd, CTL_FILE_SIZE, file_buf); CtlFileClose(fd); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), - CtlTestFile, CtlFileTest, Test control file); + CtlCreateFile, CtlCreateFileTest, Test control file); #ifdef LIB_USING_CJSON +void CtlParseJsonArray(cJSON *dat, int *cmd_len, char *cmd) +{ + int len, i; + if(cJSON_IsArray(dat)) + { + len = cJSON_GetArraySize(dat); + ctl_print("json cmd %d\n", len); + + for(i = 0; i < len; i++) + { + cJSON *cmd_val = cJSON_GetArrayItem(dat, i); + if(NULL == cmd_val) + continue; + ctl_print("0x%x ", cmd_val->valueint); + cmd[i] = cmd_val->valueint; + } + *cmd_len = len; + ctl_print("\n"); + } +} + void CtlParseJsonData(char *buf) { cJSON *file_dat = NULL; cJSON *ip_dat = NULL; cJSON *port_dat = NULL; cJSON *cmd_dat = NULL; + int cmd_num = 0; + int cmd_index = 1; + char cmd_str[10] = {0}; + CtlPlcSockParamType *file_param = &ctl_file_param; file_dat = cJSON_Parse(buf); if(file_dat == NULL) @@ -106,17 +132,35 @@ void CtlParseJsonData(char *buf) ip_dat = cJSON_GetObjectItem(file_dat, "ip"); port_dat = cJSON_GetObjectItem(file_dat, "port"); - cmd_dat = cJSON_GetObjectItem(file_dat, "cmd"); - ctl_print("ip : %s\n", ip_dat->string); - ctl_print("port: %d\n", port_dat->valueint); - ctl_print("cmd : %s\n", cmd_dat->valueint); + ctl_print(" ip : %s\n", ip_dat->valuestring); + sscanf(ip_dat->valuestring, "%d.%d.%d.%d", &file_param->ip[0], + &file_param->ip[1], + &file_param->ip[2], + &file_param->ip[3]); + + ctl_print(" port: %s %d\n", ip_dat->string, port_dat->valueint); + file_param->port = port_dat->valueint; + + strcpy(cmd_str, "cmd"); + while(cmd_dat = cJSON_GetObjectItem(file_dat, cmd_str)) + { + CtlParseJsonArray(cmd_dat, &file_param->cmd_len[cmd_index - 1], file_param->cmd[cmd_index - 1]); + snprintf(cmd_str, sizeof(cmd_str), "cmd%d", cmd_index++); + } + file_param->cmd_num = cmd_index - 1; + + cJSON_Delete(file_dat); } void CtlParseFileTest(void) { + //for PLC socket parameter file char file_buf[CTL_FILE_SIZE] = {0}; - FILE *fd = CtlFileInit(); + FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME); + if(fd == NULL) + return; + memset(file_buf, 0, CTL_FILE_SIZE); CtlFileRead(fd, CTL_FILE_SIZE, file_buf); CtlFileClose(fd); CtlParseJsonData(file_buf); diff --git a/APP_Framework/Framework/control/shared/control_file.h b/APP_Framework/Framework/control/shared/control_file.h index 6c933594c..dcafee179 100755 --- a/APP_Framework/Framework/control/shared/control_file.h +++ b/APP_Framework/Framework/control/shared/control_file.h @@ -21,15 +21,34 @@ #ifndef __CONTROL_FILE_H_ #define __CONTROL_FILE_H_ -#define CTL_FILE_SIZE 1024 +#define CTL_FILE_SIZE 1000 +#define CTL_CMD_NUM 10 // max command number +#define CTL_CMD_LEN 100 +#define CTL_IP_LEN 32 + +#define PLC_SOCK_FILE_NAME "/plc/socket_param.json" #define ctl_print KPrintf #define ctl_error KPrintf -FILE *CtlFileInit(void); +typedef struct CtlPlcSockParamStruct +{ + char ip[CTL_IP_LEN]; + int port; + int cmd_num; //command number + int cmd_len[CTL_CMD_NUM]; // command length + char cmd[CTL_CMD_NUM][CTL_CMD_LEN]; +}CtlPlcSockParamType; + +extern CtlPlcSockParamType ctl_file_param; + +FILE *CtlFileInit(char *file); void CtlFileClose(FILE *fd); void CtlFileRead(FILE *fd, int size, char *buf); void CtlFileWrite(FILE *fd, int size, char *buf); +#ifdef LIB_USING_CJSON +void CtlParseJsonData(char *buf); +#endif #endif From f74d1dafd782e803ef38ba11fc2ce34acee14a88 Mon Sep 17 00:00:00 2001 From: wlyu Date: Mon, 21 Mar 2022 16:47:32 +0800 Subject: [PATCH 5/6] optimize the codes with lwip and opcua --- .../socket_demo/lwip_tcp_socket_demo.c | 73 +- .../socket_demo/lwip_udp_socket_demo.c | 140 +- .../control_app/opcua_demo/README.md | 16 + .../control_app/plc_demo/README.md | 48 + .../control_app/plc_demo/plc_control_demo.c | 4 - .../plc/interoperability/socket/README.md | 18 + .../plc/interoperability/socket/br_socket.c | 1867 ----------------- .../plc/interoperability/socket/plc_socket.c | 188 +- .../plc/interoperability/socket/plc_socket.h | 21 +- .../Framework/control/shared/control_file.c | 62 +- .../Framework/control/shared/control_file.h | 15 +- Ubiquitous/XiZi/board/ok1052-c/board.c | 8 + .../third_party_driver/i2c/connect_i2c.c | 2 +- .../i2c/connect_i2c_eeprom.c | 1 - .../third_party_driver/include/connect_i2c.h | 2 +- .../resources/ethernet/LwIP/api/api_lib.c | 1 - .../resources/ethernet/LwIP/api/sockets.c | 20 - .../resources/ethernet/LwIP/arch/lwipopts.h | 5 +- .../resources/ethernet/LwIP/core/tcp_out.c | 6 +- .../ethernet/cmd_lwip/lwip_config_demo.c | 34 +- .../resources/ethernet/cmd_lwip/lwip_demo.h | 30 + .../ethernet/cmd_lwip/lwip_tcp_demo.c | 65 +- .../ethernet/cmd_lwip/lwip_udp_demo.c | 49 +- Ubiquitous/XiZi/resources/include/flash_spi.h | 2 - .../XiZi/tool/shell/letter-shell/shell_port.c | 32 +- 25 files changed, 452 insertions(+), 2257 deletions(-) create mode 100755 APP_Framework/Applications/control_app/opcua_demo/README.md create mode 100755 APP_Framework/Applications/control_app/plc_demo/README.md create mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/README.md delete mode 100755 APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c diff --git a/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c b/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c index a09866fa9..18fcc9e8c 100755 --- a/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c +++ b/APP_Framework/Applications/connection_app/socket_demo/lwip_tcp_socket_demo.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2020 AIIT XUOS Lab +* Copyright (c) 2022 AIIT XUOS Lab * XiUOS is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -11,16 +11,14 @@ */ /** -* @file tcp_echo_socket_demo.c -* @brief One UDP demo based on LwIP +* @file lwip_tcp_socket_demo.c +* @brief TCP socket demo based on LwIP * @version 1.0 * @author AIIT XUOS Lab -* @date 2021-05-29 +* @date 2022-03-21 */ #include -#include -#include "board.h" #include "sys_arch.h" #include #include "lwip/sys.h" @@ -28,6 +26,7 @@ #define TCP_DEMO_BUF_SIZE 65535 char tcp_socket_ip[] = {192, 168, 250, 252}; +u16_t tcp_socket_port = LWIP_TARGET_PORT; /******************************************************************************/ @@ -44,36 +43,41 @@ static void TCPSocketRecvTask(void *arg) recv_buf = (char *)malloc(TCP_DEMO_BUF_SIZE); if (recv_buf == NULL) { - lw_print("No memory\n"); - goto __exit; + lw_error("No memory\n"); + continue; } fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { - lw_print("Socket error\n"); - goto __exit; + lw_error("Socket error\n"); + free(recv_buf); + continue; } tcp_addr.sin_family = AF_INET; tcp_addr.sin_addr.s_addr = INADDR_ANY; - tcp_addr.sin_port = htons(LWIP_LOCAL_PORT); + tcp_addr.sin_port = htons(tcp_socket_port); memset(&(tcp_addr.sin_zero), 0, sizeof(tcp_addr.sin_zero)); if (bind(fd, (struct sockaddr *)&tcp_addr, sizeof(struct sockaddr)) == -1) { - lw_print("Unable to bind\n"); - goto __exit; + lw_error("Unable to bind\n"); + closesocket(fd); + free(recv_buf); + continue; } lw_print("tcp bind success, start to receive.\n"); - lw_notice("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); + lw_notice("\n\nLocal Port:%d\n\n", tcp_socket_port); // setup socket fd as listening mode if (listen(fd, 5) != 0 ) { - lw_print("Unable to listen\n"); - goto __exit; + lw_error("Unable to listen\n"); + closesocket(fd); + free(recv_buf); + continue; } // accept client connection @@ -91,26 +95,23 @@ static void TCPSocketRecvTask(void *arg) } sendto(clientfd, recv_buf, recv_len, 0, (struct sockaddr*)&tcp_addr, addr_len); } - - __exit: - if (fd >= 0) - closesocket(fd); - - if (recv_buf) - free(recv_buf); } + + closesocket(fd); + free(recv_buf); } void TCPSocketRecvTest(int argc, char *argv[]) { int result = 0; - pthread_t th_id; - pthread_attr_t attr; - if(argc == 2) + if(argc >= 2) { - lw_print("lw: [%s] gw %s\n", __func__, argv[1]); - sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); + lw_print("lw: [%s] target ip %s\n", __func__, argv[1]); + if(sscanf(argv[1], "%d.%d.%d.%d:%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3], &tcp_socket_port) == EOK) + { + sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); + } } lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip); @@ -138,7 +139,7 @@ static void TCPSocketSendTask(void *arg) struct sockaddr_in tcp_sock; tcp_sock.sin_family = AF_INET; - tcp_sock.sin_port = htons(LWIP_TARGET_PORT); + tcp_sock.sin_port = htons(tcp_socket_port); tcp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(tcp_socket_ip[0], tcp_socket_ip[1], tcp_socket_ip[2], tcp_socket_ip[3])); memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); @@ -149,8 +150,7 @@ static void TCPSocketSendTask(void *arg) return; } - lw_print("tcp connect success, start to send.\n"); - lw_notice("\n\nTarget Port:%d\n\n", LWIP_TARGET_PORT); + lw_notice("\n\nTarget Port:%d\n\n", tcp_socket_port); while (cnt --) { @@ -168,14 +168,17 @@ static void TCPSocketSendTask(void *arg) void TCPSocketSendTest(int argc, char *argv[]) { - if(argc == 2) + if(argc >= 2) { - lw_print("lw: [%s] gw %s\n", __func__, argv[1]); - sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); + lw_print("lw: [%s] target ip %s\n", __func__, argv[1]); + if(sscanf(argv[1], "%d.%d.%d.%d:%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3], &tcp_socket_port) == EOK) + { + sscanf(argv[1], "%d.%d.%d.%d", &tcp_socket_ip[0], &tcp_socket_ip[1], &tcp_socket_ip[2], &tcp_socket_ip[3]); + } } lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_socket_ip); - sys_thread_new("tcp socket", TCPSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); + sys_thread_new("TCP Socket Send", TCPSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), diff --git a/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c b/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c index 24a1a374f..fcc5be0cd 100755 --- a/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c +++ b/APP_Framework/Applications/connection_app/socket_demo/lwip_udp_socket_demo.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2020 AIIT XUOS Lab +* Copyright (c) 2022 AIIT XUOS Lab * XiUOS is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -12,33 +12,25 @@ /** * @file lwip_udp_socket_demo.c -* @brief One UDP demo based on LwIP +* @brief UDP demo based on LwIP * @version 1.0 * @author AIIT XUOS Lab -* @date 2021-05-29 +* @date 2022-03-21 */ #include -#include -#include "board.h" #include "sys_arch.h" -#include "lwip/udp.h" -#include "lwip/opt.h" -#include -#include "lwip/sys.h" +#include "lwip/sockets.h" #define UDP_BUF_SIZE 65536 -extern char udp_target[]; -static struct udp_pcb *udpecho_raw_pcb; char udp_socket_ip[] = {192, 168, 250, 252}; +u16_t udp_socket_port = LWIP_LOCAL_PORT; -/******************************************************************************/ +/*****************************************************************************/ static void UdpSocketRecvTask(void *arg) { - lw_print("UdpSocketRecvTask start.\n"); - - int socket_fd = -1; + int fd = -1; char *recv_buf; struct sockaddr_in udp_addr, server_addr; int recv_len; @@ -49,134 +41,124 @@ static void UdpSocketRecvTask(void *arg) recv_buf = (char *)malloc(UDP_BUF_SIZE); if(recv_buf == NULL) { - lw_print("No memory\n"); - goto __exit; + lw_error("No memory\n"); + continue; } - socket_fd = socket(AF_INET, SOCK_DGRAM, 0); - if(socket_fd < 0) + fd = socket(AF_INET, SOCK_DGRAM, 0); + if(fd < 0) { - lw_print("Socket error\n"); - goto __exit; + lw_error("Socket error\n"); + free(recv_buf); + continue; } udp_addr.sin_family = AF_INET; udp_addr.sin_addr.s_addr = INADDR_ANY; - udp_addr.sin_port = htons(LWIP_LOCAL_PORT); + udp_addr.sin_port = htons(udp_socket_port); memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero)); - if(bind(socket_fd, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1) + if(bind(fd, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1) { - lw_print("Unable to bind\n"); - goto __exit; + lw_error("Unable to bind\n"); + closesocket(fd); + free(recv_buf); + continue; } - lw_print("UDP bind sucess, start to receive.\n"); - lw_print("\n\nLocal Port:%d\n\n", LWIP_LOCAL_PORT); + lw_notice("UDP bind sucess, start to receive.\n"); + lw_notice("\n\nLocal Port:%d\n\n", udp_socket_port); while(1) { memset(recv_buf, 0, UDP_BUF_SIZE); - recv_len = recvfrom(socket_fd, recv_buf, UDP_BUF_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len); - lw_notice("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); - lw_notice("Receive data : %s\n\n", recv_buf); - sendto(socket_fd, recv_buf, recv_len, 0, (struct sockaddr*)&server_addr, addr_len); + recv_len = recvfrom(fd, recv_buf, UDP_BUF_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len); + if(recv_len > 0) + { + lw_notice("Receive from : %s\n", inet_ntoa(server_addr.sin_addr)); + lw_notice("Receive data : %s\n\n", recv_buf); + } + sendto(fd, recv_buf, recv_len, 0, (struct sockaddr*)&server_addr, addr_len); } - __exit: - if(socket_fd >= 0) - { - closesocket(socket_fd); - } - - if(recv_buf) - { - free(recv_buf); - } + closesocket(fd); + free(recv_buf); } } -void UdpSocketRecvTask(int argc, char *argv[]) +void UdpSocketRecvTest(int argc, char *argv[]) { - int result = 0; - pthread_t th_id; - pthread_attr_t attr; - - if(argc == 2) + if(argc >= 2) { - lw_print("lw: [%s] gw %s\n", __func__, argv[1]); - sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]); + lw_notice("lw: [%s] target ip %s\n", __func__, argv[1]); + if(sscanf(argv[1], "%d.%d.%d.%d:%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3], &udp_socket_port) == EOK) + { + sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]); + } } - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, udp_socket_ip); sys_thread_new("UdpSocketRecvTask", UdpSocketRecvTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), - UDPSocketRecv, UdpSocketRecvTask, UDP recv echo); + UDPSocketRecv, UdpSocketRecvTest, UDP Receive DEMO); static void UdpSocketSendTask(void *arg) { int cnt = LWIP_DEMO_TIMES; char send_str[128]; + int fd = -1; - lw_print("UdpSocketSendTask start.\n"); - - int socket_fd = -1; memset(send_str, 0, sizeof(send_str)); - socket_fd = socket(AF_INET, SOCK_DGRAM, 0); - if(socket_fd < 0) + fd = socket(AF_INET, SOCK_DGRAM, 0); + if(fd < 0) { - lw_print("Socket error\n"); - goto __exit; + lw_error("Socket error\n"); + return; } struct sockaddr_in udp_sock; udp_sock.sin_family = AF_INET; - udp_sock.sin_port = htons(LWIP_TARGET_PORT); - udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_target[0], udp_target[1], udp_target[2], udp_target[3])); + udp_sock.sin_port = htons(udp_socket_port); + udp_sock.sin_addr.s_addr = PP_HTONL(LWIP_MAKEU32(udp_socket_ip[0], udp_socket_ip[1], udp_socket_ip[2], udp_socket_ip[3])); memset(&(udp_sock.sin_zero), 0, sizeof(udp_sock.sin_zero)); - if(connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) + if(connect(fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) { - lw_print("Unable to connect\n"); - goto __exit; + lw_error("Unable to connect\n"); + closesocket(fd); + return; } lw_print("UDP connect success, start to send.\n"); - lw_print("\n\nTarget Port:%d\n\n", udp_sock.sin_port); + lw_notice("\n\nTarget Port:%d\n\n", udp_sock.sin_port); while (cnt --) { snprintf(send_str, sizeof(send_str), "UDP test package times %d\r\n", cnt); - sendto(socket_fd, send_str, strlen(send_str), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); + sendto(fd, send_str, strlen(send_str), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); lw_notice("Send UDP msg: %s ", send_str); MdelayKTask(1000); } -__exit: - if(socket_fd >= 0) - { - closesocket(socket_fd); - } - + closesocket(fd); return; } void UdpSocketSendTest(int argc, char *argv[]) { - int result = 0; - pthread_t th_id; - pthread_attr_t attr; - - if(argc == 2) + if(argc >= 2) { - lw_print("lw: [%s] gw %s\n", __func__, argv[1]); - sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]); + lw_notice("lw: [%s] target ip %s\n", __func__, argv[1]); + if(sscanf(argv[1], "%d.%d.%d.%d:%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3], &udp_socket_port) == EOK) + { + sscanf(argv[1], "%d.%d.%d.%d", &udp_socket_ip[0], &udp_socket_ip[1], &udp_socket_ip[2], &udp_socket_ip[3]); + } } - lwip_config_tcp(lwip_ipaddr, lwip_netmask, lwip_gwaddr); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, udp_socket_ip); sys_thread_new("UdpSocketSendTask", UdpSocketSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } diff --git a/APP_Framework/Applications/control_app/opcua_demo/README.md b/APP_Framework/Applications/control_app/opcua_demo/README.md new file mode 100755 index 000000000..9b809af14 --- /dev/null +++ b/APP_Framework/Applications/control_app/opcua_demo/README.md @@ -0,0 +1,16 @@ +# OPCUA DEMO README + +## 文件说明 + +用于OPCUA 相关测试命令演示,需要开启LWIP和OPCUA协议. + +### 命令行 + +UaConnect [IP] + +用于测试与OPCUA服务器连接,连接成功应显示OK + +UaObject [IP] + +用于显示对应的OPCUA设备的节点信息 + diff --git a/APP_Framework/Applications/control_app/plc_demo/README.md b/APP_Framework/Applications/control_app/plc_demo/README.md new file mode 100755 index 000000000..1d361b998 --- /dev/null +++ b/APP_Framework/Applications/control_app/plc_demo/README.md @@ -0,0 +1,48 @@ +# PLC DEMO README + +## 文件说明 + +用于PLC设备相关测试命令演示,目前支持OPCUA协议对PLC进行远程控制,该命令基于LWIP和OPCUA,需要开启相关开关。 + +多个PLC设备可以组成一个channel,用于一条相关业务线控制。 + +### 命令行 + +ShowChannel + +显示注册到channel上的PLC设备,范例如下: + + ch_type ch_name drv_name dev_name cnt +----------------------------------------------------------------- + PLC_Channel PLC OPCUA PLC Demo 4 1 + PLC Demo 3 2 + PLC Demo 2 3 + PLC Demo 1 4 + PLC Demo 0 5 + +ShowPLC + +用于显示PLC,范例如下: + + device vendor model product id +----------------------------------------------------------------- + PLC Demo 4 B&R X20 X20 CP1381 5 + PLC Demo 3 B&R X20 X20 CP1586 4 + PLC Demo 2 SIEMSNS S7-200 CPU SR60 3 + PLC Demo 1 SIEMENS S7-1200 CPU 1215C 2 + PLC Demo 0 SIEMENS S7-1500 CPU 1512SP-1PN 1 + + PlcRead [NodeID] + + 用于读取PLC节点信息 + + - [NodeID]: 如n4,1, 其中4代表namespace,1代表节点号 + + + PlcWrite + + 用于写入PLC节点数值 + + - [NodeID]: 如n4,1, 其中4代表namespace,1代表节点号 + + - [value]: 为写入数值,目前支持bool类型,和int类型。bool型应为0b(代表false), 1b(代表true) diff --git a/APP_Framework/Applications/control_app/plc_demo/plc_control_demo.c b/APP_Framework/Applications/control_app/plc_demo/plc_control_demo.c index d8f480d59..64cb7d913 100755 --- a/APP_Framework/Applications/control_app/plc_demo/plc_control_demo.c +++ b/APP_Framework/Applications/control_app/plc_demo/plc_control_demo.c @@ -101,8 +101,6 @@ void PlcReadUATask(void* arg) if(EOK != ret) { plc_print("plc: [%s] open failed %#x\n", __func__, ret); -// free(plc_demo_dev.priv_data); -// plc_demo_dev.priv_data = NULL; return; } @@ -163,8 +161,6 @@ void PlcWriteUATask(void* arg) if(EOK != ret) { plc_print("plc: [%s] open failed %#x\n", __func__, ret); -// free(plc_demo_dev.priv_data); -// plc_demo_dev.priv_data = NULL; return; } diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/README.md b/APP_Framework/Framework/control/plc/interoperability/socket/README.md new file mode 100755 index 000000000..798e81e3f --- /dev/null +++ b/APP_Framework/Framework/control/plc/interoperability/socket/README.md @@ -0,0 +1,18 @@ +# PLC SOCKET README + +## 文件说明 + +用于测试PLC socket通信. 通过建立与制定IP的PLC设备的socket连接, 发送命令给PLC设备, 实现相关功能. 实现该功能需要开启LWIP, 同时需要扩大shell的栈大小和内存空间。 + +### 命令行 + +PLCSocket ip=[PLC IP] port=[PLC port] tcp=[1: TCP; 0: UDP] cmd=[相关命令] file=[制定配置文件] + +配置文件支持json格式, 默认文件名为socket_param.json, 放置于plc目录下, 文件内容如下: + +{ + "ip": "192.168.250.6", + "port": 102, + "tcp": 1, + "cmd": [x, x, x] +} \ No newline at end of file diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c deleted file mode 100755 index a655a0a67..000000000 --- a/APP_Framework/Framework/control/plc/interoperability/socket/br_socket.c +++ /dev/null @@ -1,1867 +0,0 @@ -#include -#include -#include "plc_socket.h" - -#define xs_kprintf KPrintf -#define xs_device_t uint32_t - - -static unsigned char data_head = 0x5A; -static char device_s14[] = "S14"; -static char device_s15[] = "S15"; -static char device_s16[] = "S16"; -static char device_s17[] = "S17"; -static char device_s18[] = "S18"; -static char data_end[] = "#"; -unsigned char redis_data[1024]; - -// 创建一个信号量,用于接收消息的同步 -static sem_t Ch_Sem = NULL; -static sem_t Rx_Sem = NULL; - -extern xs_device_t ec200t; - -//for SIEMENS TCP read data cmd -const unsigned char handshake_first[] = -{ - 0x3, 0x00, 0x00, 0x16, 0x11, 0xe0, 0x00, 0x00, 0x02, - 0xc8,0x00,0xc1,0x02,0x02,0x01,0xc2,0x02,0x02,0x01,0xc0,0x01,0x0a -}; - -const unsigned char handshake_second[] = -{ - 0x3,0x00,0x00,0x19,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x00,0x0d,0x00,0x08,0x00,0x00,0xf0,0x00,0x00,0x01,0x00,0x01,0x00,0xf0 -}; - -const unsigned char siemens_read_data[] = -{ - 0x3,0x00,0x00, 0x1f,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x33,0x01,0x00,0x0e,0x00,0x00,0x04,0x01,0x12,0x0a,0x10,0x02,0x00,0xD2,0x00,0x34,0x84,0x00,0x00,0x00 -}; - -//for OML UDP read data cmd -const unsigned char UDP_read_data[] = -{ - 0x80,0x00,0x02,0x00,0x03,0x00,0x00,0x7E,0x00,0x00,0x01,0x01,0x82,0x0F,0xA0,0x00,0x00,0x20 -}; - -//for SIEMENS 1200 read data cmd -const unsigned char handshake_1200_first[] = -{ - 0x03, 0x00, 0x00, 0x16, 0x11, 0xE0, 0x00, 0x00, 0x02, 0xC8, 0x00, 0xC1, 0x02, 0x02, 0x01, 0xC2, 0x02, 0x02, 0x01, 0xC0, 0x01, 0x0A -}; - -const unsigned char handshake_1200_second[] = -{ - 0x03, 0x00, 0x00, 0x19, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x08, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xF0 -}; - -const unsigned char siemens_1200_read_data[] = -{ - 0x03, 0x00, 0x00, 0x1F, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, 0xD2, 0x00, 0x34, 0x84, 0x00, 0x00, 0x00 -}; - -#define PUT_ULONG_BE(n,b,i) \ -{ \ - (b)[(i) ] = (uint8_t) ( (n) >> 24 ); \ - (b)[(i) + 1] = (uint8_t) ( (n) >> 16 ); \ - (b)[(i) + 2] = (uint8_t) ( (n) >> 8 ); \ - (b)[(i) + 3] = (uint8_t) ( (n) ); \ -} - -#define GET_ULONG_BE(n,b,i) \ -{ \ - (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ - | ( (uint32_t) (b)[(i) + 1] << 16 ) \ - | ( (uint32_t) (b)[(i) + 2] << 8 ) \ - | ( (uint32_t) (b)[(i) + 3] ); \ -} - -#define XS_SERIAL_RB_BUFSZ 128 - -char rx_buffer_cmp[256 + 1]; -char msg_pool[256]; -char rx_buffer[XS_SERIAL_RB_BUFSZ + 1] = {0}; -#define WIFI_RESET 73 - -#define LEN_PARA_BUF 128 -uint8_t server_addr_wifi[LEN_PARA_BUF] = "192.168.23.181"; //??????? -uint8_t server_port_wifi[LEN_PARA_BUF] = "9999"; //?????? - -uint8_t WIFI_ssid[LEN_PARA_BUF] = "xiaoshanos"; //WIFI? -uint8_t WIFI_pwd[LEN_PARA_BUF] = "12345678"; //WIFI???? - -#if 0 -/* ?????? */ -xs_device_t hfa21; -/* ??????? */ -struct xs_MessageQueue* rx3_mq; -/* ???????? */ - -void hfa21_sta_config(void) -{ - xs_kprintf("hfa21_sta_config start\r\n"); - uint8_t i,step; - uint8_t cmd[LEN_PARA_BUF]; - step = 1; - strcpy(cmd, "+++"); - //send - xs_DeviceWrite(hfa21, 0, cmd, 3); - xs_kprintf("cmd.%d=%s\r\n",step,cmd); - step = 2; - memset(cmd,0,sizeof(cmd)); - xs_MdelayKTask(100); - strcpy(cmd,"a"); - //send - xs_DeviceWrite(hfa21, 0, cmd, 1); - xs_kprintf("cmd.%d=%s\r\n",step,cmd); - step = 3; - memset(cmd,0,sizeof(cmd)); - xs_MdelayKTask(2500); - strcpy(cmd, "AT+FCLR\r\n"); - - //send - for(i=0; i 1000) - { - xs_kprintf("data length too long\n "); - return; - } - - xs_DeviceWrite(hfa21, 0, buf, len); - return ; -} - -void msg_send_once(void) -{ - uint8_t msg[1024] = { 0}; - uint32_t i = 0; - xs_kprintf("ap test, send msg to server : "); - memset(msg,0x37,1024); - xs_memcpy(msg,"arm:dev7,data:",14); - msg[1023] = '\n'; - xs_DeviceWrite(hfa21,0, msg, 1024); - // xs_MdelayKTask(1000); - return ; -} -MSH_CMD_EXPORT(msg_send_once, asd); - -void msg_send_nointerval(void) -{ - uint8_t msg[1024] = { 0}; - uint32_t i = 1; - uint32_t index = 0; - uint8_t seq[10] = { 0}; - uint8_t* prefix = "{board:stm32f407-st-discovery,arch:arm,device:7,seq:"; - xs_kprintf("ap test, send msg to server : "); - - for(;;) - { - index = 0; - memset(msg,0x37,1024); - memset(seq,0,10); - msg[1021] = '}'; - msg[1022] = '\n'; - msg[1023] = 0; - xs_memcpy(msg,prefix,strlen(prefix)); - index = index + strlen(prefix); - PUT_ULONG_BE(i, msg, index) - index = index + 4; - xs_memcpy(msg+index,",data:",6); - xs_DeviceWrite(hfa21,0, msg, 1024); - ++ i; - } - - return ; -} -MSH_CMD_EXPORT(msg_send_nointerval, asd); - -void msg_send_interval(void) -{ - uint8_t msg[1024] = { 0}; - uint32_t i = 1; - uint32_t index = 0; - uint8_t seq[4] = { 0}; - uint8_t* prefix = "{board:stm32f407-st-discovery,arch:arm,device:7,seq:"; - xs_kprintf("ap test, send msg to server : "); - - for(;;) - { - index = 0; - memset(msg,0x37,1024); - memset(seq,0,10); - msg[1021] = '}'; - msg[1022] = '\n'; - msg[1023] = 0; - xs_memcpy(msg,prefix,strlen(prefix)); - index = index + strlen(prefix); - PUT_ULONG_BE(i, msg, index) - index = index + 4; - xs_memcpy(msg+index,",data:",6); - xs_DeviceWrite(hfa21,0, msg, 1024); - xs_MdelayKTask(1000); - ++ i; - } - - return ; -} -MSH_CMD_EXPORT(msg_send_interval, asd); - -struct xs_Ringbuffer* ringbuffer; - -uint8_t stack[256] = {0}; -xs_uint16 data_index = 0 ; -uint8_t start = 0xaa; -uint8_t end = 0xbb; - -uint8_t lora_buffer[8][256] = {0}; - -static void read_ringbuffer_thread_entry(void* parameter) -{ - uint8_t ch = 0; - xs_uint16 index = 0 ; - uint8_t devicenumber; - - while(1) - { - if(1 == xs_GetRingBufferchar(ringbuffer,&ch)) - { - if(data_index < 256) - { - stack[data_index++] = ch; - - if(data_index > 2) - { - if(stack[data_index-1] == start && stack[data_index-2] == start) - { - data_index = 0; - stack[data_index++] == start; - stack[data_index++] == start; - } - else if(stack[data_index-1] == end && stack[data_index-2] == end) - { - //end - devicenumber = stack[3] - 0x30; - - if(devicenumber > 0 && devicenumber < 8) - { - memset(lora_buffer[devicenumber-1],0,256); - memcpy(lora_buffer[devicenumber-1], &stack[2],data_index - 4); - // xs_kprintf("lora data: %s\n",lora_buffer[devicenumber-1]); - } - - data_index = 0; - } - } - } - else - { - data_index = 0; - } - } - else - { - xs_MdelayKTask(20); - } - } -} -#endif - -#if 0 -/***********************************************************************/ -//欧姆龙PLC IP 192.168.250.3 port 9600 - -static xs_err_t oml_uart_input(xs_device_t dev, xs_size_t size) -{ - xs_KSemaphoreAbandon(Ch_Sem); - return XS_EOK; -} - -static void oml_plc_thread(void* parameter) -{ - xs_err_t ret; - uint32_t rx_length, total_rx_length = 0; - uint8_t i; - unsigned int length = 0; - - while(1) - { - ret = xs_KSemaphoreObtain(Ch_Sem, XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - rx_length = xs_DeviceRead(hfa21, 0, redis_data + 1 + sizeof(device_s14) + total_rx_length, 78); - xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); - - for(i = 0; i < rx_length; ++i) - { - xs_kprintf("0x%x ", redis_data[i + 1 + sizeof(device_s14) + total_rx_length]); - } - - xs_kprintf("\n"); - total_rx_length += rx_length; - - if((78 == total_rx_length) && (0xC0 == redis_data[1 + sizeof(device_s14)]) - && (0x00 == redis_data[1 + sizeof(device_s14) + 1]) - && (0x02 == redis_data[1 + sizeof(device_s14) + 2]) - && (0x00 == redis_data[1 + sizeof(device_s14) + 3])) - { - /******format redis data******/ - memcpy(redis_data, &data_head, 1); - memcpy(redis_data + 1, device_s14, sizeof(device_s14)); - memcpy(redis_data + 1 + sizeof(device_s14) + total_rx_length, data_end, sizeof(data_end)); - length = 1 + sizeof(device_s14) + total_rx_length + sizeof(data_end); - /******end******/ - xs_DeviceWrite(ec200t, 0, redis_data, length); - total_rx_length = 0; - memset(redis_data, 0, sizeof(redis_data)); - xs_KSemaphoreAbandon(Rx_Sem); - } - } - } -} - -int OML_UDP(void) -{ - struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; - hfa21 = xs_DeviceFind("uart3"); - - if(!hfa21) - { - xs_kprintf("find dev.hfa21 failed!\r\n"); - return XS_ERROR; - } - - Ch_Sem = xs_KCreateSemaphore("Ch_Sem",0,XS_LINKLIST_FLAG_FIFO); - - if(Ch_Sem == NULL) - { - xs_kprintf("create Ch_sem failed .\n"); - return XS_ERROR; - } - - Rx_Sem = xs_KCreateSemaphore("Rx_Sem",0,XS_LINKLIST_FLAG_FIFO); - - if(Rx_Sem == NULL) - { - xs_kprintf("create Rx_sem failed .\n"); - return XS_ERROR; - } - - //hfa21 - config3.BaudRate = BAUD_RATE_460800; - config3.DataBits = DATA_BITS_8; - config3.StopBits = STOP_BITS_1; - config3.bufsz = XS_SERIAL_RB_BUFSZ; - config3.parity = PARITY_NONE; - xs_DeviceControl(hfa21, XS_DEVICE_CTRL_CONFIG, &config3); - xs_DeviceOpen(hfa21,XS_DEVICE_FLAG_DMA_RX); - xs_DeviceSetRxIndicate(hfa21, oml_uart_input); - xs_kprintf("hfa21 init success!\r\n"); - TaskDescriptorPointer thread_oml_plc = xs_KTaskCreate("oml_hfa21", oml_plc_thread, NULL, 1024, 25); - - if(thread_oml_plc != NULL) - { - xs_StartupKTask(thread_oml_plc); - } - else - { - return XS_ERROR; - } - - xs_MdelayKTask(10000); - xs_kprintf("The UDP send_receive function is running......\n"); - - while(1) - { -// CH438UARTSend(6, UDP_read_data, sizeof(UDP_read_data)); //UDP_read_data - xs_DeviceWrite(hfa21, 0, UDP_read_data, sizeof(UDP_read_data)); - xs_kprintf("hfa21 write cmd\n"); - xs_KSemaphoreObtain(Rx_Sem, XS_WAITING_FOREVER); - xs_MdelayKTask(1000); - } - - return XS_EOK; -} -MSH_CMD_EXPORT(OML_UDP, oml); - -/*********************************************************************************************/ -// IP 192.168.250.50 port 102 tcp - -//工控机的测试代码,数据帧头FF,帧尾FE,数据帧长度不固?static struct xs_MessageQueue *ipc_mq; -xs_device_t ipc_hfa21; - -static xs_err_t ipc_uart_input(xs_device_t dev, xs_size_t size) -{ - struct rx_msg msg; - xs_err_t result; - msg.dev = dev; - msg.size = size; - result = xs_KMsgQueueSend(ipc_mq, &msg, sizeof(msg)); - - if(result == -XS_EFULL) - { - xs_kprintf("ipc_mq message queue full!\r\n"); - } - - xs_KSemaphoreAbandon(Ch_Sem); - return result; -} - -static void ipc_plc_thread(void* parameter) -{ - struct rx_msg msg; - xs_err_t ret; - uint32_t rx_length, total_rx_length = 0; - uint8_t i; - unsigned int length = 0; - - while(1) - { - ret = xs_KSemaphoreObtain(Ch_Sem, XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - xs_memset(&msg, 0, sizeof(msg)); - ret = xs_KMsgQueueRecv(ipc_mq, &msg, sizeof(msg), XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - rx_length = xs_DeviceRead(ipc_hfa21, 0, redis_data + 2 + sizeof(device_s15) + total_rx_length, msg.size); - xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); - - for(i = 0; i < rx_length; ++i) - { - xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s15) + total_rx_length]); - } - - xs_kprintf("\n"); - total_rx_length += rx_length; - - if((0x46 == redis_data[2 + sizeof(device_s15)]) && (0x46 == redis_data[2 + sizeof(device_s15) + 1]) && - (0x45 == redis_data[2 + sizeof(device_s15) + total_rx_length - 1]) && (0x46 == redis_data[2 + sizeof(device_s15) + total_rx_length - 2])) - { - /******format redis data******/ - redis_data[0] = data_head; - redis_data[1] = PLC_IPC_FLAG; - memcpy(redis_data + 2, device_s15, sizeof(device_s15)); - length = 2 + sizeof(device_s15) + total_rx_length; - /******end******/ - // xs_kprintf("redis data : \n"); - // for(i = 0; i < length; ++i) - // xs_kprintf("0x%x ", redis_data[i]); - // xs_kprintf("\n"); - xs_DeviceWrite(ec200t, 0, redis_data, length); - total_rx_length = 0; - memset(redis_data, 0, sizeof(redis_data)); - xs_KSemaphoreAbandon(Rx_Sem); - } - } - } - } -} - -int BRL_IPC(void) -{ - struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; - ipc_hfa21 = xs_DeviceFind("uart3"); - - if(!ipc_hfa21) - { - xs_kprintf("find ipc_hfa21 failed!\r\n"); - return XS_ERROR; - } - - Ch_Sem = xs_KCreateSemaphore("Ch_Sem",0,XS_LINKLIST_FLAG_FIFO); - - if(Ch_Sem == NULL) - { - xs_kprintf("BRL_IPC create sem failed .\n"); - return XS_ERROR; - } - - Rx_Sem = xs_KCreateSemaphore("Rx_Sem",0,XS_LINKLIST_FLAG_FIFO); - - if(Rx_Sem == NULL) - { - xs_kprintf("BRL_IPC create Rx_sem failed .\n"); - return XS_ERROR; - } - - ipc_mq = xs_KCreateMsgQueue("ipc_mq", - sizeof(struct rx_msg), - sizeof(msg_pool), - XS_LINKLIST_FLAG_FIFO); - - if(ipc_mq == NULL) - { - xs_kprintf("create ipc_mq mutex failed.\n"); - return -1; - } - - //ipc_hfa21 - config3.BaudRate = BAUD_RATE_460800; - config3.DataBits = DATA_BITS_8; - config3.StopBits = STOP_BITS_1; - config3.bufsz = XS_SERIAL_RB_BUFSZ; - config3.parity = PARITY_NONE; - xs_DeviceControl(ipc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); - xs_DeviceOpen(ipc_hfa21,XS_DEVICE_FLAG_DMA_RX); - xs_DeviceSetRxIndicate(ipc_hfa21, ipc_uart_input); - xs_kprintf("ipc_hfa21 init success!\r\n"); - TaskDescriptorPointer thread_ipc_plc = xs_KTaskCreate("ipc_hfa21", ipc_plc_thread, NULL, 1024, 25); - - if(thread_ipc_plc != NULL) - { - xs_StartupKTask(thread_ipc_plc); - } - else - { - return XS_ERROR; - } - - xs_kprintf("start to receive data...\n"); - - while(1) - { - xs_MdelayKTask(100); - xs_KSemaphoreObtain(Rx_Sem, XS_WAITING_FOREVER); - xs_kprintf("\n"); - } - - return XS_EOK; -} -MSH_CMD_EXPORT(BRL_IPC, IPC server); - -/*********************************************************************************************/ -// IP 192.168.250.150 port 9898 tcp - -//金凤工控机的测试代码,数据帧头FF,帧尾EF -xs_device_t jf_ipc_hfa21; -static sem_t jf_input_sem = NULL; -static sem_t jf_ec200t_sem = NULL; - -static xs_err_t jf_ipc_uart_input(xs_device_t dev, xs_size_t size) -{ - xs_KSemaphoreAbandon(jf_input_sem); - return XS_EOK; -} - -static void jf_ipc_plc_thread(void* parameter) -{ - xs_err_t ret; - uint32_t rx_length, total_rx_length = 0; - uint8_t i; - unsigned int length = 0; - - while(1) - { - ret = xs_KSemaphoreObtain(jf_input_sem, XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - rx_length = xs_DeviceRead(jf_ipc_hfa21, 0, redis_data + 2 + sizeof(device_s16) + total_rx_length, 512); - xs_kprintf("dst data length %d total length %d\n", rx_length, total_rx_length); - - for(i = 0; i < rx_length; ++i) - { - xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s16) + total_rx_length]); - } - - xs_kprintf("\n"); - total_rx_length += rx_length; - - if(((((unsigned int)redis_data[2 + sizeof(device_s16) + 2] & 0x000000FF) << 8) | ((unsigned int)redis_data[2 + sizeof(device_s16) + 3] & 0x000000FF) == total_rx_length) && - (0xFF == redis_data[2 + sizeof(device_s16)]) && (0x20 == redis_data[2 + sizeof(device_s16) + 1])) - { - /******format redis data******/ - redis_data[0] = data_head; - redis_data[1] = PLC_JF_IPC_FLAG; - memcpy(redis_data + 2, device_s16, sizeof(device_s16)); - length = 2 + sizeof(device_s16) + total_rx_length; - /******end******/ - xs_DeviceWrite(ec200t, 0, redis_data, length); - total_rx_length = 0; - memset(redis_data, 0, sizeof(redis_data)); - xs_KSemaphoreAbandon(jf_ec200t_sem); - } - } - } -} - -int JF_IPC(void) -{ - struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; - jf_ipc_hfa21 = xs_DeviceFind("uart3"); - - if(!jf_ipc_hfa21) - { - xs_kprintf("find jf_ipc_hfa21 failed!\r\n"); - return XS_ERROR; - } - - jf_ec200t_sem = xs_KCreateSemaphore("jf_ec200t_sem",0,XS_LINKLIST_FLAG_FIFO); - - if(jf_ec200t_sem == NULL) - { - xs_kprintf("JF_IPC create jf_ec200t_sem failed .\n"); - return XS_ERROR; - } - - jf_input_sem = xs_KCreateSemaphore("jf_input_sem",0,XS_LINKLIST_FLAG_FIFO); - - if(jf_input_sem == NULL) - { - xs_kprintf("JF_IPC create jf_input_sem failed .\n"); - return XS_ERROR; - } - - //jf_ipc_hfa21 - config3.BaudRate = BAUD_RATE_460800; - config3.DataBits = DATA_BITS_8; - config3.StopBits = STOP_BITS_1; - config3.bufsz = XS_SERIAL_RB_BUFSZ; - config3.parity = PARITY_NONE; - xs_DeviceControl(jf_ipc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); - xs_DeviceOpen(jf_ipc_hfa21,XS_DEVICE_FLAG_DMA_RX); - xs_DeviceSetRxIndicate(jf_ipc_hfa21, jf_ipc_uart_input); - xs_kprintf("jf_ipc_hfa21 init success!\r\n"); - TaskDescriptorPointer thread_jf_ipc_plc = xs_KTaskCreate("jf_ipc_hfa21", jf_ipc_plc_thread, NULL, 1024, 25); - - if(thread_jf_ipc_plc != NULL) - { - xs_StartupKTask(thread_jf_ipc_plc); - } - else - { - return XS_ERROR; - } - - xs_kprintf("start to receive data...\n"); - - while(1) - { - xs_MdelayKTask(100); - xs_KSemaphoreObtain(jf_ec200t_sem, XS_WAITING_FOREVER); - xs_kprintf("JF send data to server done\n"); - } - - return XS_EOK; -} -MSH_CMD_EXPORT(JF_IPC, JF IPC client); - -/*********************************************************************************************/ -//西门子PLC IP 192.168.250.9 port 102 - -static xs_device_t siemens_hfa21; -static sem_t siemens_input_sem = NULL; -static sem_t siemens_ec200t_sem = NULL; - -static xs_err_t siemens_uart_input(xs_device_t dev, xs_size_t size) -{ - xs_KSemaphoreAbandon(siemens_input_sem); - return XS_EOK; -} - -static void siemens_plc_thread(void* parameter) -{ - xs_err_t ret; - uint32_t rx_length, total_rx_length = 0; - uint8_t i; - static char shakehand_cnt = 0; - unsigned int length = 0; - - while(1) - { - ret = xs_KSemaphoreObtain(siemens_input_sem, XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - //rx_length = xs_DeviceRead(siemens_hfa21, 0, redis_data, 234); - // xs_kprintf("siemens dst data length %d\n", rx_length); - // for(i = 0; i < rx_length; ++i) - // xs_kprintf("0x%x ", redis_data[i]); - // xs_kprintf("\n"); - if(shakehand_cnt < 2) - { - //ignore first two siemens input sem - xs_DeviceRead(siemens_hfa21, 0, redis_data + 2 + sizeof(device_s17), 87); - shakehand_cnt++; - continue; - } - - rx_length = xs_DeviceRead(siemens_hfa21, 0, redis_data + 2 + sizeof(device_s17) + total_rx_length, 87); - xs_kprintf("siemens dst data length %d total length %d\n", rx_length, total_rx_length); - - for(i = 0; i < rx_length; ++i) - { - xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s17) + total_rx_length]); - } - - xs_kprintf("\n"); - total_rx_length += rx_length; - - if((87 == total_rx_length) && (0x03 == redis_data[2 + sizeof(device_s17)]) - && (0x00 == redis_data[2 + sizeof(device_s17) + 1]) - && (0x00 == redis_data[2 + sizeof(device_s17) + 2]) - && (0x57 == redis_data[2 + sizeof(device_s17) + 3])) - { - /******format redis data******/ - redis_data[0] = data_head; - redis_data[1] = PLC_SIEMENS_FLAG; - memcpy(redis_data + 2, device_s17, sizeof(device_s17)); - length = 2 + sizeof(device_s17) + total_rx_length; - /******end******/ - xs_DeviceWrite(ec200t, 0, redis_data, length); - total_rx_length = 0; - memset(redis_data, 0, sizeof(redis_data)); - xs_KSemaphoreAbandon(siemens_ec200t_sem); - } - } - } -} - -int SIEMENS_TCP(void) -{ - xs_err_t result; - struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; - siemens_hfa21 = xs_DeviceFind("uart3"); - - if(!siemens_hfa21) - { - xs_kprintf("find siemens_hfa21 failed!\r\n"); - return XS_ERROR; - } - - siemens_input_sem = xs_KCreateSemaphore("siemens_input_sem", 0, XS_LINKLIST_FLAG_FIFO); - - if(siemens_input_sem == NULL) - { - xs_kprintf("siemens_hfa21 create siemens_input_sem failed.\n"); - return XS_ERROR; - } - - siemens_ec200t_sem = xs_KCreateSemaphore("siemens_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); - - if(siemens_ec200t_sem == NULL) - { - xs_kprintf("siemens_hfa21 create siemens_ec200t_sem failed.\n"); - return XS_ERROR; - } - - //siemens_hfa21 - config3.BaudRate = BAUD_RATE_460800; - config3.DataBits = DATA_BITS_8; - config3.StopBits = STOP_BITS_1; - config3.bufsz = XS_SERIAL_RB_BUFSZ; - config3.parity = PARITY_NONE; - xs_DeviceControl(siemens_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); - xs_DeviceOpen(siemens_hfa21, XS_DEVICE_FLAG_DMA_RX); - xs_DeviceSetRxIndicate(siemens_hfa21, siemens_uart_input); - TaskDescriptorPointer thread_siemens_plc = xs_KTaskCreate("siemens_hfa21", siemens_plc_thread, NULL, 1024, 25); - - if(thread_siemens_plc != NULL) - { - xs_StartupKTask(thread_siemens_plc); - } - else - { - return XS_ERROR; - } - - //step1 : send handshake_first cmd, waiting for response sem - xs_kprintf("siemens_hfa21 start send handshake_first!\r\n"); - //CH438UARTSend(6, handshake_first, sizeof(handshake_first)); - xs_DeviceWrite(siemens_hfa21, 0, handshake_first, sizeof(handshake_first)); - xs_MdelayKTask(3000); - xs_DeviceWrite(siemens_hfa21, 0, handshake_first, sizeof(handshake_first)); - xs_MdelayKTask(500); - //step2 : send handshake_second cmd, waiting for response sem - xs_kprintf("siemens_hfa21 start send handshake_second!\r\n"); - //CH438UARTSend(6, handshake_second, sizeof(handshake_second)); - xs_DeviceWrite(siemens_hfa21, 0, handshake_second, sizeof(handshake_second)); - xs_kprintf("siemens_hfa21 init success!\r\n"); - xs_MdelayKTask(500); - - while(1) - { - //CH438UARTSend(6, siemens_read_data, sizeof(siemens_read_data)); //read_data - xs_DeviceWrite(siemens_hfa21, 0, siemens_read_data, sizeof(siemens_read_data)); - xs_kprintf("siemens hfa21 write cmd\n"); - xs_KSemaphoreObtain(siemens_ec200t_sem, XS_WAITING_FOREVER); - xs_MdelayKTask(1000); - } - - return XS_EOK; -} -MSH_CMD_EXPORT(SIEMENS_TCP, Siemens TCP PLC); - -/*********************************************************************************************/ -//西门?1200 PLC IP 192.168.250.107 port 102 - -static xs_device_t siemens_1200_hfa21; -static sem_t siemens_1200_input_sem = NULL; -static sem_t siemens_1200_ec200t_sem = NULL; - -static xs_err_t siemens_1200_uart_input(xs_device_t dev, xs_size_t size) -{ - xs_KSemaphoreAbandon(siemens_1200_input_sem); - return XS_EOK; -} - -static void siemens_1200_plc_thread(void* parameter) -{ - xs_err_t ret; - uint32_t rx_length, total_rx_length = 0; - uint8_t i; - static char shakehand_cnt = 0; - unsigned int length = 0; - - while(1) - { - ret = xs_KSemaphoreObtain(siemens_1200_input_sem, XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - if(shakehand_cnt < 2) - { - //ignore first two siemens input sem - xs_DeviceRead(siemens_1200_hfa21, 0, redis_data + 2 + sizeof(device_s18), 235); - shakehand_cnt++; - continue; - } - - rx_length = xs_DeviceRead(siemens_1200_hfa21, 0, redis_data + 2 + sizeof(device_s18) + total_rx_length, 235); - xs_kprintf("siemens 1200 dst data length %d total length %d\n", rx_length, total_rx_length); - - for(i = 0; i < rx_length; ++i) - { - xs_kprintf("0x%x ", redis_data[i + 2 + sizeof(device_s18) + total_rx_length]); - } - - xs_kprintf("\n"); - total_rx_length += rx_length; - - if((235 == total_rx_length) && (0x03 == redis_data[2 + sizeof(device_s18)]) - && (0x00 == redis_data[2 + sizeof(device_s18) + 1]) - && (0x00 == redis_data[2 + sizeof(device_s18) + 2]) - && (0xEB == redis_data[2 + sizeof(device_s18) + 3])) - { - /******format redis data******/ - redis_data[0] = data_head; - redis_data[1] = PLC_SIEMENS_1200_FLAG; - memcpy(redis_data + 2, device_s18, sizeof(device_s18)); - length = 2 + sizeof(device_s18) + total_rx_length; - /******end******/ - xs_DeviceWrite(ec200t, 0, redis_data, length); - total_rx_length = 0; - memset(redis_data, 0, sizeof(redis_data)); - xs_KSemaphoreAbandon(siemens_1200_ec200t_sem); - } - } - } -} - -int SIEMENS_1200(void) -{ - xs_err_t result; - struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; - siemens_1200_hfa21 = xs_DeviceFind("uart3"); - - if(!siemens_1200_hfa21) - { - xs_kprintf("find siemens_1200_hfa21 failed!\r\n"); - return XS_ERROR; - } - - siemens_1200_input_sem = xs_KCreateSemaphore("siemens_1200_input_sem", 0, XS_LINKLIST_FLAG_FIFO); - - if(siemens_1200_input_sem == NULL) - { - xs_kprintf("siemens_1200_hfa21 create siemens_1200_input_sem failed.\n"); - return XS_ERROR; - } - - siemens_1200_ec200t_sem = xs_KCreateSemaphore("siemens_1200_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); - - if(siemens_1200_ec200t_sem == NULL) - { - xs_kprintf("siemens_1200_hfa21 create siemens_1200_ec200t_sem failed.\n"); - return XS_ERROR; - } - - //siemens_hfa21 - config3.BaudRate = BAUD_RATE_460800; - config3.DataBits = DATA_BITS_8; - config3.StopBits = STOP_BITS_1; - config3.bufsz = XS_SERIAL_RB_BUFSZ; - config3.parity = PARITY_NONE; - xs_DeviceControl(siemens_1200_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); - xs_DeviceOpen(siemens_1200_hfa21, XS_DEVICE_FLAG_DMA_RX); - xs_DeviceSetRxIndicate(siemens_1200_hfa21, siemens_1200_uart_input); - TaskDescriptorPointer thread_siemens_1200_plc = xs_KTaskCreate("siemens_1200_hfa21", siemens_1200_plc_thread, NULL, 1024, 25); - - if(thread_siemens_1200_plc != NULL) - { - xs_StartupKTask(thread_siemens_1200_plc); - } - else - { - return XS_ERROR; - } - - //step1 : send handshake_1200_first cmd, waiting for response sem - xs_kprintf("siemens_1200_hfa21 start send handshake_1200_first!\r\n"); - //CH438UARTSend(6, handshake_1200_first, sizeof(handshake_1200_first)); - xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_first, sizeof(handshake_1200_first)); - xs_MdelayKTask(3000); - xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_first, sizeof(handshake_1200_first)); - xs_MdelayKTask(500); - //step2 : send handshake_1200_second cmd, waiting for response sem - xs_kprintf("siemens_1200_hfa21 start send handshake_1200_second!\r\n"); - //CH438UARTSend(6, handshake_1200_second, sizeof(handshake_1200_second)); - xs_DeviceWrite(siemens_1200_hfa21, 0, handshake_1200_second, sizeof(handshake_1200_second)); - xs_kprintf("siemens_1200_hfa21 init success!\r\n"); - xs_MdelayKTask(500); - - while(1) - { - //CH438UARTSend(6, siemens_1200_read_data, sizeof(siemens_1200_read_data)); //read_data - xs_DeviceWrite(siemens_1200_hfa21, 0, siemens_1200_read_data, sizeof(siemens_1200_read_data)); - xs_kprintf("siemens 1200 hfa21 write cmd\n"); - xs_KSemaphoreObtain(siemens_1200_ec200t_sem, XS_WAITING_FOREVER); - xs_MdelayKTask(1000); - } - - return XS_EOK; -} -MSH_CMD_EXPORT(SIEMENS_1200, Siemens 1200 PLC); -#endif - -/*********************************************************************************************/ -//贝加莱PLC IP 192.168.250.4 port 12000 -static unsigned char brl_redis_data[2048]; -static xs_device_t brl_plc_hfa21; -static sem_t brl_plc_input_sem = NULL; -static sem_t brl_plc_ec200t_sem = NULL; - -static xs_err_t brl_plc_uart_input(xs_device_t dev, xs_size_t size) -{ - xs_KSemaphoreAbandon(brl_plc_input_sem); - return XS_EOK; -} - -static void brl_plc_thread(void* parameter) -{ - xs_err_t ret; - uint32_t rx_length, total_rx_length = 0; - uint8_t i; - unsigned int length = 0; - - while(1) - { - ret = xs_KSemaphoreObtain(brl_plc_input_sem, XS_WAITING_FOREVER); - - if(XS_EOK == ret) - { - xs_kprintf("before total %d\n", total_rx_length); - rx_length = xs_DeviceRead(brl_plc_hfa21, 0, brl_redis_data + 2 + total_rx_length, 1640); - xs_kprintf("brl dst data length %d total length %d\n", rx_length, total_rx_length); - - for(i = 0; i < rx_length / 10; i ++) - { - xs_kprintf("0x%x ", brl_redis_data[i + 2 + total_rx_length]); - } - - xs_kprintf("\n"); - total_rx_length += rx_length; - - if(total_rx_length > 1640) - { - xs_kprintf("ERROR : rx_buffer is full total_rx_length %d\n", total_rx_length); - total_rx_length = 0; - memset(brl_redis_data, 0, sizeof(brl_redis_data)); - xs_KSemaphoreAbandon(brl_plc_ec200t_sem); - continue; - } - - if((1640 == total_rx_length) && (0x53 == brl_redis_data[2])) - { - /******format redis data******/ - brl_redis_data[0] = data_head; - brl_redis_data[1] = PLC_BRL_FLAG; - length = 2 + total_rx_length; - - /******end******/ - for(i = 0; i < 10; i ++) - { - xs_kprintf("0x%x ", brl_redis_data[i + 1478]); - } - - xs_kprintf("\n"); - xs_DeviceWrite(ec200t, 0, brl_redis_data, length); - total_rx_length = 0; - memset(brl_redis_data, 0, sizeof(brl_redis_data)); - xs_KSemaphoreAbandon(brl_plc_ec200t_sem); - } - } - } -} - -int BRL_PLC(void) -{ - xs_err_t result; - const unsigned char brl_reply_data[] = {0x1, 0x1, 0x1}; - struct SerialConfigure config3 = XS_SERIAL_CONFIG_DEFAULT; - brl_plc_hfa21 = xs_DeviceFind("uart3"); - - if(!brl_plc_hfa21) - { - xs_kprintf("find brl_plc_hfa21 failed!\r\n"); - return XS_ERROR; - } - - brl_plc_input_sem = xs_KCreateSemaphore("brl_plc_input_sem", 0, XS_LINKLIST_FLAG_FIFO); - - if(brl_plc_input_sem == NULL) - { - xs_kprintf("brl_plc_hfa21 create brl_plc_input_sem failed.\n"); - return XS_ERROR; - } - - brl_plc_ec200t_sem = xs_KCreateSemaphore("brl_plc_ec200t_sem", 0, XS_LINKLIST_FLAG_FIFO); - - if(brl_plc_ec200t_sem == NULL) - { - xs_kprintf("brl_plc_hfa21 create brl_plc_ec200t_sem failed.\n"); - return XS_ERROR; - } - - //brl_hfa21 - config3.BaudRate = BAUD_RATE_460800; - config3.DataBits = DATA_BITS_8; - config3.StopBits = STOP_BITS_1; - config3.bufsz = 2048; - config3.parity = PARITY_NONE; - xs_DeviceControl(brl_plc_hfa21, XS_DEVICE_CTRL_CONFIG, &config3); - xs_DeviceOpen(brl_plc_hfa21, XS_DEVICE_FLAG_DMA_RX); - xs_DeviceSetRxIndicate(brl_plc_hfa21, brl_plc_uart_input); - TaskDescriptorPointer thread_brl_plc = xs_KTaskCreate("brl_plc_hfa21", brl_plc_thread, NULL, 1024, 25); - - if(thread_brl_plc != NULL) - { - xs_StartupKTask(thread_brl_plc); - } - else - { - return XS_ERROR; - } - - xs_kprintf("brl_plc_hfa21 init success!\r\n"); - xs_MdelayKTask(500); - - while(1) - { - //CH438UARTSend(6, brl_reply_data, sizeof(brl_reply_data)); - xs_kprintf("brl_plc hfa21 write cmd\n"); //read_data - xs_DeviceWrite(brl_plc_hfa21, 0, brl_reply_data, sizeof(brl_reply_data)); - xs_KSemaphoreObtain(brl_plc_ec200t_sem, XS_WAITING_FOREVER); - } - - return XS_EOK; -} - -MSH_CMD_EXPORT(BRL_PLC, Brl PLC); - diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c index a69d5dc9d..74eba30c9 100755 --- a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.c @@ -24,56 +24,18 @@ #include "lwip/sockets.h" #include "control_file.h" -#define PLC_SOCK_CMD_NUM 10 +// max support plc socket test commands number +#define PLC_SOCK_CMD_NUM CTL_CMD_NUM +#define PLC_SOCK_TIMEOUT 50000 -// for saving PLC command +// for saving PLC command index int plc_cmd_index = 0; +// only for test +#define SUPPORT_PLC_SIEMENS + //siemens test -PlcBinCmdType TestPlcCmd[PLC_SOCK_CMD_NUM] = -{ -#ifdef SUPPORT_PLC_SIEMENS - // handshake1 repeat 1 - { - 0, 3000, 22, - { - 0x03, 0x00, 0x00, 0x16, 0x11, 0xE0, 0x00, 0x00, - 0x02, 0xC8, 0x00, 0xC1, 0x02, 0x02, 0x01, 0xC2, - 0x02, 0x02, 0x01, 0xC0, 0x01, 0x0A - } - }, - // handshake2 - { - 1, 500, 25, - { - 0x03, 0x00, 0x00, 0x19, 0x02, 0xF0, 0x80, 0x32, - 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x08, 0x00, - 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0xF0 - } - }, - // read command - { - 2, 1000, 31, - { - 0x03, 0x00, 0x00, 0x1F, 0x02, 0xF0, 0x80, 0x32, - 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x0E, 0x00, - 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, - 0xD2, 0x00, 0x34, 0x84, 0x00, 0x00, 0x00 - } - } - // oml plc -#else// SUPPORT_PLC_OML - { - 0, 1000, 18, - { - 0x80, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x7E, - 0x00, 0x00, 0x01, 0x01, 0x82, 0x0F, 0xA0, 0x00, - 0x00, 0x20 - } - } -#endif -}; +PlcBinCmdType TestPlcCmd[PLC_SOCK_CMD_NUM] = {0}; //Test information //SIEMENS ip: 192.168.250.9 port: 102 @@ -82,14 +44,21 @@ PlcBinCmdType TestPlcCmd[PLC_SOCK_CMD_NUM] = //OML ip: 192.168.250.3 port: 9600 PlcSocketParamType plc_socket_demo_data = { +#ifdef SUPPORT_PLC_SIEMENS + .ip = {192, 168, 250, 6}, + .port = 102, + .device_type = PLC_DEV_TYPE_SIEMENS, + .socket_type = SOCK_STREAM, + .cmd_num = 3, +#else .ip = {192, 168, 250, 3}, .port = 9600, .device_type = PLC_DEV_TYPE_OML, - .socket_type = SOCK_STREAM, //SOCK_DGRAM, //udp - .step = 0, - .cmd_num = 3, - .buf_size = PLC_TEST_SIZE, - .buf = NULL, + .socket_type = SOCK_DGRAM, + .cmd_num = 1, +#endif + .recv_len = PLC_RECV_BUF_LEN, + .recv_buf = NULL, }; #define OML_HEADER_LEN 78 @@ -97,12 +66,20 @@ PlcSocketParamType plc_socket_demo_data = { /******************************************************************************/ +static void plc_print_array(char *title, int size, uint8_t *cmd) +{ + lw_notice("%s : %d - ", title, size); + for(int i = 0; i < size; i++) + { + lw_notice(" %#x", cmd[i]); + } + lw_notice("\n"); +} + static void *PlcSocketStart(void *arg) { int fd = -1; - int recv_len; - int step = 0; - char *recv_buf; + int timeout, recv_len; struct sockaddr_in sock_addr; socklen_t addr_len = sizeof(struct sockaddr_in); PlcSocketParamType *param = (PlcSocketParamType *)&plc_socket_demo_data; @@ -116,9 +93,11 @@ static void *PlcSocketStart(void *arg) param->device_type, param->socket_type); + param->recv_len = PLC_RECV_BUF_LEN; + //malloc memory - recv_buf = (char *)malloc(param->buf_size); - if (recv_buf == NULL) + param->recv_buf = (char *)malloc(param->recv_len); + if (param->recv_buf == NULL) { plc_error("No memory\n"); return NULL; @@ -128,7 +107,7 @@ static void *PlcSocketStart(void *arg) if (fd < 0) { plc_error("Socket error %d\n", param->socket_type); - free(recv_buf); + free(param->recv_buf); return NULL; } @@ -143,51 +122,42 @@ static void *PlcSocketStart(void *arg) { plc_error("Unable to connect\n"); closesocket(fd); - free(recv_buf); + free(param->recv_buf); return NULL; } lw_notice("client %s connected\n", inet_ntoa(sock_addr.sin_addr)); - while(step < param->cmd_num) + for(int i = 0; i < param->cmd_num; i ++) { - sendto(fd, TestPlcCmd[step].cmd, TestPlcCmd[step].cmd_len, 0, (struct sockaddr*)&sock_addr, addr_len); - lw_notice("Send Cmd: %d - ", TestPlcCmd[step].cmd_len); - for(int i = 0; i < TestPlcCmd[step].cmd_len; i++) - { - lw_notice(" %#x", TestPlcCmd[step].cmd[i]); - } - lw_notice("\n"); - MdelayKTask(TestPlcCmd[step].delay_ms); + PlcBinCmdType *cmd = &TestPlcCmd[i]; + sendto(fd, cmd->cmd, cmd->cmd_len, 0, (struct sockaddr*)&sock_addr, addr_len); + plc_print_array("Send cmd", cmd->cmd_len, cmd->cmd); - memset(recv_buf, 0, param->buf_size); - while(1) + MdelayKTask(cmd->delay_ms); + timeout = PLC_SOCK_TIMEOUT; + memset(param->recv_buf, 0, param->recv_len); + while(timeout --) { - recv_len = recvfrom(fd, recv_buf, param->buf_size, 0, (struct sockaddr *)&sock_addr, &addr_len); + recv_len = recvfrom(fd, param->recv_buf, param->recv_len, 0, (struct sockaddr *)&sock_addr, &addr_len); if(recv_len > 0) { if(param->device_type == PLC_DEV_TYPE_OML) { - if((recv_len == OML_HEADER_LEN) && (CHECK_OML_HEADER(recv_buf))) + if((recv_len == OML_HEADER_LEN) && (CHECK_OML_HEADER(param->recv_buf))) { lw_notice("This is Oml package!!!\n"); } } lw_notice("Receive from : %s\n", inet_ntoa(sock_addr.sin_addr)); - lw_notice("Receive data : %d -", recv_len); - for(int i = 0; i < recv_len; i++) - { - lw_notice(" %#x", recv_buf[i]); - } - lw_notice("\n"); + plc_print_array("Receive data", recv_len, param->recv_buf); break; } } - step ++; } closesocket(fd); - free(recv_buf); + free(param->recv_buf); return NULL; } @@ -221,29 +191,46 @@ void PlcShowUsage(void) plc_notice("tcp=[] 0: udp 1:tcp\n"); plc_notice("ip=[ip.ip.ip.ip]\n"); plc_notice("port=port\n"); + plc_notice("file: use %s\n", PLC_SOCK_FILE_NAME); plc_notice("------------------------------------\n"); } -void PlcGetParamFromFile(void) +#if defined(MOUNT_SDCARD) && defined(LIB_USING_CJSON) +void PlcGetParamFromFile(char *file_name) { PlcSocketParamType *param = &plc_socket_demo_data; - //for PLC socket parameter file - char file_buf[CTL_FILE_SIZE] = {0}; - FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME); - - if(fd == NULL) + char *file_buf = malloc(CTL_FILE_LEN); + if(file_buf == NULL) + { + plc_error("No enough buffer %d\n", CTL_FILE_LEN); return; + } + memset(file_buf, 0, CTL_FILE_LEN); - memset(file_buf, 0, CTL_FILE_SIZE); - - CtlFileRead(fd, CTL_FILE_SIZE, file_buf); - CtlFileClose(fd); + if(CtlFileReadWithFilename(file_name, CTL_FILE_LEN, file_buf) != EOK) + { + plc_error("Can't open file %s\n", file_name); + //try again default file + if(strcmp(file_name, PLC_SOCK_FILE_NAME) != 0) + { + if(CtlFileReadWithFilename(PLC_SOCK_FILE_NAME, CTL_FILE_LEN, file_buf) != EOK) + { + plc_error("Can't open file %s\n", file_name); + return; + } + } + else + { + return; + } + } CtlParseJsonData(file_buf); memcpy(param->ip, ctl_file_param.ip, 4); param->port = ctl_file_param.port; param->cmd_num = ctl_file_param.cmd_num; + param->socket_type = ctl_file_param.tcp ? SOCK_STREAM : SOCK_DGRAM; for(int i = 0; i < param->cmd_num; i++) { @@ -253,17 +240,18 @@ void PlcGetParamFromFile(void) plc_print("ip: %d.%d.%d.%d\n", param->ip[0], param->ip[1], param->ip[2], param->ip[3]); plc_print("port: %d", param->port); + plc_print("tcp: %d", param->socket_type); plc_print("cmd number: %d\n", param->cmd_num); for(int i = 0; i < param->cmd_num; i++) { - plc_print("cmd %d len %d: ", i, TestPlcCmd[i].cmd_len); - for(int j = 0; j < TestPlcCmd[i].cmd_len; j++) - plc_print("%x ", TestPlcCmd[i].cmd[j]); - plc_print("\n"); + plc_print_array("cmd", TestPlcCmd[i].cmd_len, TestPlcCmd[i].cmd); } + free(file_buf); } +#endif + void PlcCheckParam(int argc, char *argv[]) { int i; @@ -278,13 +266,19 @@ void PlcCheckParam(int argc, char *argv[]) plc_print("check %d %s\n", i, str); - if(strcmp(str, "file") == 0) +#if defined(MOUNT_SDCARD) && defined(LIB_USING_CJSON) + if(strncmp(str, "file", 4) == 0) { - plc_notice("get parameter file %s\n", PLC_SOCK_FILE_NAME); - PlcGetParamFromFile(); + char file_name[CTL_FILE_NAME_LEN] = {0}; + if(sscanf(str, "file=%s", file_name) == EOF) + { + strcpy(file_name, PLC_SOCK_FILE_NAME); + } + plc_notice("get %s parameter file %s\n", str, file_name); + PlcGetParamFromFile(file_name); return; } - +#endif if(sscanf(str, "ip=%d.%d.%d.%d", ¶m->ip[0], ¶m->ip[1], diff --git a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h index 4801c63e5..6b4ec9b60 100755 --- a/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h +++ b/APP_Framework/Framework/control/plc/interoperability/socket/plc_socket.h @@ -23,9 +23,9 @@ #define PLC_BIN_CMD_LEN 512 +// for plc socket test bin commands typedef struct { - uint8_t step; uint16_t delay_ms; uint8_t cmd_len; uint8_t cmd[PLC_BIN_CMD_LEN]; @@ -43,28 +43,23 @@ enum PlcDeviceType { PLC_DEV_TYPE_END, }; -#define PLC_IP_SIZE 16 -#define PLC_DEV_SIZE 32 -#define PLC_TEST_SIZE 65536 +#define PLC_IP_LEN 16 +#define PLC_DEV_NAME_LEN 32 +#define PLC_RECV_BUF_LEN CTL_FILE_LEN typedef struct PlcSocketParamStruct{ - char ip[PLC_IP_SIZE]; + char ip[PLC_IP_LEN]; uint32_t port; uint32_t device_type; //PlcDeviceType uint32_t socket_type; //UDP or TCP - char device[PLC_DEV_SIZE]; - uint32_t step; // communication step + char device[PLC_DEV_NAME_LEN]; uint32_t cmd_num; // command number - uint32_t buf_size; - uint8_t *buf; + uint32_t recv_len; // receive length + uint8_t *recv_buf; // receive buffer }PlcSocketParamType; //debug command -<<<<<<< HEAD -#define plc_print KPrintf -======= #define plc_print //KPrintf ->>>>>>> e5d124231c72798f7f77b842cc8c631b79043914 #define plc_error KPrintf #define plc_notice KPrintf diff --git a/APP_Framework/Framework/control/shared/control_file.c b/APP_Framework/Framework/control/shared/control_file.c index d906beca8..3b383c7f3 100755 --- a/APP_Framework/Framework/control/shared/control_file.c +++ b/APP_Framework/Framework/control/shared/control_file.c @@ -36,6 +36,7 @@ "{ \r\n"\ " \"ip\": \"192.168.250.6\", \r\n"\ " \"port\": 102, \r\n"\ +" \"tcp\": 1, \r\n"\ " \"cmd\": [3, 0, 0, 22, 17, 224, 0, 0, 2, 200, 0, 193, 2, 2, 1, 194, 2, 2, 1, 192, 1, 10], \r\n"\ " \"cmd1\": [3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 0, 13, 0, 8, 0, 0, 240, 0, 0, 1, 0, 1, 0, 240], \r\n" \ " \"cmd2\": [3, 0, 0, 31, 2, 240, 128, 50, 1, 0, 0, 51, 1, 0, 14, 0, 0, 4, 1, 18, 10, 16, 2, 0, 210, 0, 52, 132, 0, 0, 0]\r\n" \ @@ -48,12 +49,21 @@ FILE *CtlFileInit(char *file) { FILE *fd = NULL; +#ifdef MOUNT_SDCARD + // SD card mount flag 1: OK + if(sd_mount_flag == 0) + { + ctl_error("SD card mount failed\n"); + return NULL; + } + fd = fopen(file, "a+"); if(fd == NULL) { ctl_error("open file %s failed\n", file); } +#endif return fd; } @@ -76,6 +86,22 @@ void CtlFileWrite(FILE *fd, int size, char *buf) ctl_print("write size %d: %s\n", size, buf); } +int CtlFileReadWithFilename(char *file, int size, char *buf) +{ + FILE *fd; + fd = fopen(file, "r"); + if(fd == NULL) + { + ctl_error("open file %s failed\n", file); + return EEMPTY; + } + + fseek(fd, 0, SEEK_SET); + fread(buf, size, 1, fd); + ctl_print("read file %d: %.100s\n", size, buf); + return EOK; +} + void CtlCreateFileTest(void) { FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME); @@ -117,10 +143,9 @@ void CtlParseJsonData(char *buf) cJSON *file_dat = NULL; cJSON *ip_dat = NULL; cJSON *port_dat = NULL; + cJSON *tcp_dat = NULL; cJSON *cmd_dat = NULL; - int cmd_num = 0; - int cmd_index = 1; - char cmd_str[10] = {0}; + char cmd_title[10] = {"cmd"}; CtlPlcSockParamType *file_param = &ctl_file_param; file_dat = cJSON_Parse(buf); @@ -132,6 +157,7 @@ void CtlParseJsonData(char *buf) ip_dat = cJSON_GetObjectItem(file_dat, "ip"); port_dat = cJSON_GetObjectItem(file_dat, "port"); + tcp_dat = cJSON_GetObjectItem(file_dat, "tcp"); ctl_print(" ip : %s\n", ip_dat->valuestring); sscanf(ip_dat->valuestring, "%d.%d.%d.%d", &file_param->ip[0], @@ -141,14 +167,17 @@ void CtlParseJsonData(char *buf) ctl_print(" port: %s %d\n", ip_dat->string, port_dat->valueint); file_param->port = port_dat->valueint; + file_param->tcp = tcp_dat->valueint; + file_param->cmd_num = 0; - strcpy(cmd_str, "cmd"); - while(cmd_dat = cJSON_GetObjectItem(file_dat, cmd_str)) + for(int i = 0; i < CTL_CMD_NUM; i++) { - CtlParseJsonArray(cmd_dat, &file_param->cmd_len[cmd_index - 1], file_param->cmd[cmd_index - 1]); - snprintf(cmd_str, sizeof(cmd_str), "cmd%d", cmd_index++); + cmd_dat = cJSON_GetObjectItem(file_dat, cmd_title); + if(!cmd_dat) + break; + CtlParseJsonArray(cmd_dat, &file_param->cmd_len[i], file_param->cmd[i]); + snprintf(cmd_title, sizeof(cmd_title), "cmd%d", ++file_param->cmd_num); } - file_param->cmd_num = cmd_index - 1; cJSON_Delete(file_dat); } @@ -156,14 +185,25 @@ void CtlParseJsonData(char *buf) void CtlParseFileTest(void) { //for PLC socket parameter file - char file_buf[CTL_FILE_SIZE] = {0}; FILE *fd = CtlFileInit(PLC_SOCK_FILE_NAME); if(fd == NULL) + { + ctl_error("ctl get file %s failed\n", PLC_SOCK_FILE_NAME); return; - memset(file_buf, 0, CTL_FILE_SIZE); - CtlFileRead(fd, CTL_FILE_SIZE, file_buf); + } + + char *file_buf = malloc(CTL_FILE_LEN); + + if(file_buf == NULL) + { + ctl_error("ctl malloc failed\n"); + return; + } + memset(file_buf, 0, CTL_FILE_LEN); + CtlFileRead(fd, CTL_FILE_LEN, file_buf); CtlFileClose(fd); CtlParseJsonData(file_buf); + free(file_buf); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), diff --git a/APP_Framework/Framework/control/shared/control_file.h b/APP_Framework/Framework/control/shared/control_file.h index dcafee179..9f8cda11e 100755 --- a/APP_Framework/Framework/control/shared/control_file.h +++ b/APP_Framework/Framework/control/shared/control_file.h @@ -21,31 +21,36 @@ #ifndef __CONTROL_FILE_H_ #define __CONTROL_FILE_H_ -#define CTL_FILE_SIZE 1000 -#define CTL_CMD_NUM 10 // max command number -#define CTL_CMD_LEN 100 -#define CTL_IP_LEN 32 +#define CTL_FILE_LEN 1000 // control file size +#define CTL_CMD_NUM 10 // support command number +#define CTL_CMD_LEN 100 // control command length +#define CTL_IP_LEN 32 // IP address length +#define CTL_FILE_NAME_LEN 100 // file name length #define PLC_SOCK_FILE_NAME "/plc/socket_param.json" -#define ctl_print KPrintf +#define ctl_print //KPrintf #define ctl_error KPrintf +// for running plc socket typedef struct CtlPlcSockParamStruct { char ip[CTL_IP_LEN]; int port; + int tcp; // 1: TCP 0: UDP int cmd_num; //command number int cmd_len[CTL_CMD_NUM]; // command length char cmd[CTL_CMD_NUM][CTL_CMD_LEN]; }CtlPlcSockParamType; extern CtlPlcSockParamType ctl_file_param; +extern int sd_mount_flag; FILE *CtlFileInit(char *file); void CtlFileClose(FILE *fd); void CtlFileRead(FILE *fd, int size, char *buf); void CtlFileWrite(FILE *fd, int size, char *buf); +int CtlFileReadWithFilename(char *file_name, int size, char *buf); #ifdef LIB_USING_CJSON void CtlParseJsonData(char *buf); diff --git a/Ubiquitous/XiZi/board/ok1052-c/board.c b/Ubiquitous/XiZi/board/ok1052-c/board.c index 82a9a10ea..284857639 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/board.c +++ b/Ubiquitous/XiZi/board/ok1052-c/board.c @@ -84,6 +84,10 @@ int MountSDCard(void) #include #endif +#ifdef BSP_USING_I2C +#include +#endif + #ifdef BSP_USING_SPI #include #endif @@ -688,6 +692,10 @@ void InitBoardHardware() Imrt1052HwAdcInit(); #endif +#ifdef BSP_USING_I2C + Imrt1052HwI2cInit(); +#endif + #ifdef BSP_USING_SPI Imrt1052HwSpiInit(); #endif diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c.c b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c.c index 4b9eec117..1b2b827ae 100755 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c.c +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c.c @@ -143,7 +143,7 @@ static int BoardI2cDevBend(void) } /*BOARD I2C INIT*/ -int Stm32HwI2cInit(void) +int Imrt1052HwI2cInit(void) { static int init_flag = 0; x_err_t ret = EOK; diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c_eeprom.c b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c_eeprom.c index 26754cd25..792a19273 100755 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c_eeprom.c +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/i2c/connect_i2c_eeprom.c @@ -65,7 +65,6 @@ void I2cEEpromTestWrite(void) int I2cEEpromTest(void) { - Stm32HwI2cInit(); BOARD_InitI2C1Pins(); I2cHardwareInit(); I2cEEpromTestWrite(); diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_i2c.h b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_i2c.h index 619e801cc..a06675be0 100755 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_i2c.h +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_i2c.h @@ -37,7 +37,7 @@ typedef struct Stm32I2c #define i2c_print KPrintf -int Stm32HwI2cInit(void); +int Imrt1052HwI2cInit(void); #ifdef __cplusplus } diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c index 88d24dc6e..5d7f8863c 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/api_lib.c @@ -245,7 +245,6 @@ netconn_delete(struct netconn *conn) err = ERR_OK; } else #endif /* LWIP_NETCONN_FULLDUPLEX */ -//tst by wly { err = netconn_prepare_delete(conn); } diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c index 1e8031672..2660f73e5 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/api/sockets.c @@ -497,18 +497,6 @@ get_socket(int fd) return sock; } -void pr_socket_buf(void) -{ - int i; - lw_debug("socket:\n"); - for (i = 0; i < NUM_SOCKETS; ++i) { -// if (!sockets[i].conn) - lw_debug("%d: conn %p rcv %d send %d wait %d\n", i, sockets[i].conn, sockets[i].rcvevent, sockets[i].sendevent, - sockets[i].select_waiting); - } -} - - /** * Allocate a new socket for a given netconn. * @@ -600,7 +588,6 @@ free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_last } if (conn != NULL) { /* netconn_prepare_delete() has already been called, here we only free the conn */ - lw_debug("lw: [%s] tcp %d socket %d accept %d recv %d\n", __func__, is_tcp, conn->socket, conn->acceptmbox, conn->recvmbox); netconn_delete(conn); } } @@ -673,8 +660,6 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) newsock = alloc_socket(newconn, 1); if (newsock == -1) { - lw_debug("lw: [%s] recv %d\n", __func__, newconn->recvmbox); - pr_socket_buf(); netconn_delete(newconn); sock_set_errno(sock, ENFILE); done_socket(sock); @@ -711,8 +696,6 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) err = netconn_peer(newconn, &naddr, &port); if (err != ERR_OK) { LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err)); - lw_debug("lw: [%s] recv %x\n", __func__, newconn->recvmbox); - netconn_delete(newconn); free_socket(nsock, 1); sock_set_errno(sock, err_to_errno(err)); @@ -1756,8 +1739,6 @@ lwip_socket(int domain, int type, int protocol) i = alloc_socket(conn, 0); if (i == -1) { - lw_debug("lw: [%s] recv %d delete no socket\n", __func__, conn->recvmbox); - pr_socket_buf(); netconn_delete(conn); set_errno(ENFILE); return -1; @@ -1766,7 +1747,6 @@ lwip_socket(int domain, int type, int protocol) done_socket(&sockets[i - LWIP_SOCKET_OFFSET]); LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); set_errno(0); - lw_debug("lw: [%s] new socket %d %p\n", __func__, i, conn); return i; } diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h index a8f4b5be8..cdff39538 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/arch/lwipopts.h @@ -250,10 +250,9 @@ typedef unsigned int nfds_t; #define MEMP_MEM_MALLOC 1 #define lw_print //KPrintf -#define lw_trace() //KPrintf("lw: [%s][%d] passed!\n", __func__, __LINE__) -#define lw_error() //KPrintf("lw: [%s][%d] failed!\n", __func__, __LINE__) -#define lw_debug KPrintf +#define lw_error KPrintf #define lw_notice KPrintf + #endif /* __LWIPOPTS_H__ */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c index 3fb89e245..724df1097 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c @@ -355,7 +355,7 @@ tcp_write_checks(struct tcp_pcb *pcb, u16_t len) * it can send them more efficiently by combining them together). * To prompt the system to send data now, call tcp_output() after * calling tcp_write(). - * + * * This function enqueues the data pointed to by the argument dataptr. The length of * the data is passed as the len parameter. The apiflags can be one or more of: * - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated @@ -1386,17 +1386,13 @@ tcp_output(struct tcp_pcb *pcb) /* In the case of fast retransmit, the packet should not go to the tail * of the unacked queue, but rather somewhere before it. We need to check for * this case. -STJ Jul 27, 2004 */ - lw_debug("check %s seg %p useg %p\n", __func__, seg, useg); if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) { /* add segment to before tail of unacked list, keeping the list sorted */ struct tcp_seg **cur_seg = &(pcb->unacked); - lw_debug("check %s ", __func__); while (*cur_seg && TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { - lw_debug("%p -> ", *cur_seg); cur_seg = &((*cur_seg)->next ); } - lw_debug("\n"); seg->next = (*cur_seg); (*cur_seg) = seg; } else { diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c index a9e662c09..7e94dc272 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_config_demo.c @@ -18,40 +18,18 @@ * @date 2021.12.15 */ -#include "lwip/opt.h" - -#if LWIP_IPV4 && LWIP_RAW - -#include "ping.h" - -#include "lwip/timeouts.h" -#include "lwip/init.h" -#include "netif/ethernet.h" - #include "board.h" -#include "pin_mux.h" -#include "clock_config.h" - -#include -#include -#include "connect_ethernet.h" +#include "sys_arch.h" /******************************************************************************/ -static void *LwipSetIPTask(void *param) +static void LwipSetIPTask(void *param) { lwip_config_net(lwip_ipaddr, lwip_netmask, lwip_gwaddr); } void LwipSetIPTest(int argc, char *argv[]) { - int result = 0; - pthread_t th_id; - pthread_attr_t attr; - - attr.schedparam.sched_priority = LWIP_DEMO_TASK_PRIO; - attr.stacksize = LWIP_TASK_STACK_SIZE; - if(argc >= 4) { lw_print("lw: [%s] ip %s mask %s gw %s\n", __func__, argv[1], argv[2], argv[3]); @@ -65,12 +43,7 @@ void LwipSetIPTest(int argc, char *argv[]) sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]); } - result = pthread_create(&th_id, &attr, LwipSetIPTask, NULL); - if (0 == result) { - lw_print("lw: [%s] thread %d successfully!\n", __func__, th_id); - } else { - lw_print("lw: [%s] failed! error code is %d\n", __func__, result); - } + sys_thread_new("SET ip address", LwipSetIPTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), @@ -98,4 +71,3 @@ void LwipShowIPTask(int argc, char *argv[]) SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), showip, LwipShowIPTask, GetIp [IP] [Netmask] [Gateway]); -#endif diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_demo.h b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_demo.h index 99e273aa1..68a78b4d7 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_demo.h +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_demo.h @@ -1,7 +1,37 @@ +/* +* Copyright (c) 2022 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file lwip_demo.h +* @brief lwip demo relative struct and definition +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2022-03-21 +*/ + #ifndef __LWIP_DEMO_H__ #define __LWIP_DEMO_H__ +typedef struct LwipTcpSocketStruct +{ + char ip[6]; + uint16_t port; + char *buf; +}LwipTcpSocketParamType; + +#define LWIP_TEST_MSG_SIZE 128 + #define LWIP_TEST_STACK_SIZE 4096 #define LWIP_TEST_TASK_PRIO 20 #endif /* __LWIP_DEMO_H__ */ + diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c index 387899abc..f57f80b4f 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_tcp_demo.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2020 AIIT XUOS Lab +* Copyright (c) 2022 AIIT XUOS Lab * XiUOS is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -11,45 +11,32 @@ */ /** -* @file tcp_echo_socket_demo.c -* @brief One UDP demo based on LwIP +* @file lwip_tcp_demo.c +* @brief TCP demo based on LwIP * @version 1.0 * @author AIIT XUOS Lab -* @date 2021-05-29 +* @date 2022-03-21 */ -#include -#include + #include "board.h" +#include "lwip_demo.h" #include "sys_arch.h" -#include -#include "lwip/sys.h" +#include "lwip/sockets.h" #include "tcpecho_raw.h" -#define MSG_SIZE 128 - -typedef struct LwipTcpSocketStruct -{ - char ip[6]; - uint16_t port; - char *buf; // test buffer -}LwipTcpSocketParamType; - -// this is for test in shell, in fact, shell restrict the length of input string, which is less then 128 -char tcp_send_msg[MSG_SIZE] = {0}; -char tcp_target[] = {192, 168, 250, 252}; -uint16_t tcp_port = LWIP_TARGET_PORT; +char tcp_demo_msg[LWIP_TEST_MSG_SIZE] = {0}; +char tcp_demo_ip[] = {192, 168, 250, 252}; +u16_t tcp_demo_port = LWIP_TARGET_PORT; /******************************************************************************/ static void LwipTcpSendTask(void *arg) { - lw_notice("LwipTcpSendTask start.\n"); - int fd = -1; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { - lw_notice("Socket error\n"); + lw_error("Socket error\n"); return; } @@ -63,7 +50,7 @@ static void LwipTcpSendTask(void *arg) if (connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr))) { - lw_notice("Unable to connect\n"); + lw_error("Unable to connect\n"); closesocket(fd); return; } @@ -71,9 +58,9 @@ static void LwipTcpSendTask(void *arg) lw_notice("tcp connect success, start to send.\n"); lw_notice("\n\nTarget Port:%d\n\n", tcp_sock.sin_port); - sendto(fd, tcp_send_msg, strlen(tcp_send_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); + sendto(fd, tcp_demo_msg, strlen(tcp_demo_msg), 0, (struct sockaddr*)&tcp_sock, sizeof(struct sockaddr)); - lw_notice("Send tcp msg: %s ", tcp_send_msg); + lw_notice("Send tcp msg: %s ", tcp_demo_msg); closesocket(fd); return; @@ -82,31 +69,31 @@ static void LwipTcpSendTask(void *arg) void LwipTcpSendTest(int argc, char *argv[]) { LwipTcpSocketParamType param; - memset(tcp_send_msg, 0, MSG_SIZE); + memset(tcp_demo_msg, 0, LWIP_TEST_MSG_SIZE); if(argc >= 2) { - strncpy(tcp_send_msg, argv[1], strlen(argv[1])); + strncpy(tcp_demo_msg, argv[1], strlen(argv[1])); } else { - strncpy(tcp_send_msg, "hello world", strlen("hello world")); + strncpy(tcp_demo_msg, "hello world", strlen("hello world")); } - strcat(tcp_send_msg, "\r\n"); + strcat(tcp_demo_msg, "\r\n"); if(argc >= 3) { - if(sscanf(argv[2], "%d.%d.%d.%d:%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3], &tcp_port) == EOK) + if(sscanf(argv[2], "%d.%d.%d.%d:%d", &tcp_demo_ip[0], &tcp_demo_ip[1], &tcp_demo_ip[2], &tcp_demo_ip[3], &tcp_demo_port) == EOK) { - sscanf(argv[2], "%d.%d.%d.%d", &tcp_target[0], &tcp_target[1], &tcp_target[2], &tcp_target[3]); + sscanf(argv[2], "%d.%d.%d.%d", &tcp_demo_ip[0], &tcp_demo_ip[1], &tcp_demo_ip[2], &tcp_demo_ip[3]); } } - lw_notice("get ipaddr %d.%d.%d.%d:%d\n", tcp_target[0], tcp_target[1], tcp_target[2], tcp_target[3], tcp_port); - lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_target); + lw_notice("get ipaddr %d.%d.%d.%d:%d\n", tcp_demo_ip[0], tcp_demo_ip[1], tcp_demo_ip[2], tcp_demo_ip[3], tcp_demo_port); + lwip_config_tcp(lwip_ipaddr, lwip_netmask, tcp_demo_ip); - memcpy(param.ip, tcp_target, 4); - param.port = tcp_port; - param.buf = malloc(MSG_SIZE); - memcpy(param.buf, tcp_send_msg, MSG_SIZE); + memcpy(param.ip, tcp_demo_ip, 4); + param.port = tcp_demo_port; + param.buf = malloc(LWIP_TEST_MSG_SIZE); + memcpy(param.buf, tcp_demo_msg, LWIP_TEST_MSG_SIZE); sys_thread_new("tcp send", LwipTcpSendTask, ¶m, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } diff --git a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c index 97d06b119..bb3f48be1 100755 --- a/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c +++ b/Ubiquitous/XiZi/resources/ethernet/cmd_lwip/lwip_udp_demo.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2021 AIIT XUOS Lab +* Copyright (c) 2022 AIIT XUOS Lab * XiUOS is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -15,25 +15,23 @@ * @brief One UDP demo based on LwIP * @version 1.0 * @author AIIT XUOS Lab -* @date 2021-05-29 +* @date 2022-03-21 */ -#include -#include #include "board.h" #include "sys_arch.h" #include "lwip/udp.h" -#include -#include "lwip/sys.h" +#include "lwip/sockets.h" + -#define UDP_TASK_STACK_SIZE 4096 -#define UDP_TASK_PRIO 15 #define PBUF_SIZE 27 static struct udp_pcb *udpecho_raw_pcb; + char udp_demo_ip[] = {192, 168, 250, 252}; -uint16_t udp_demo_port = LWIP_TARGET_PORT; +u16_t udp_demo_port = LWIP_TARGET_PORT; + char hello_str[] = {"hello world\r\n"}; -char udp_send_msg[] = "\n\nThis one is UDP pkg. Congratulations on you.\n\n"; +char udp_demo_msg[] = "\nThis one is UDP package!!!\n"; /******************************************************************************/ @@ -47,7 +45,7 @@ static void LwipUDPSendTask(void *arg) socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (socket_fd < 0) { - lw_print("Socket error\n"); + lw_error("Socket error\n"); return; } @@ -59,45 +57,43 @@ static void LwipUDPSendTask(void *arg) if (connect(socket_fd, (struct sockaddr *)&udp_sock, sizeof(struct sockaddr))) { - lw_print("Unable to connect\n"); + lw_error("Unable to connect\n"); closesocket(socket_fd); return; } - lw_print("UDP connect success, start to send.\n"); - lw_print("\n\nTarget Port:%d\n\n", udp_sock.sin_port); + lw_notice("UDP connect success, start to send.\n"); + lw_notice("\n\nTarget Port:%d\n\n", udp_sock.sin_port); - sendto(socket_fd, udp_send_msg, strlen(udp_send_msg), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); - lw_notice("Send UDP msg: %s ", udp_send_msg); + sendto(socket_fd, udp_demo_msg, strlen(udp_demo_msg), 0, (struct sockaddr*)&udp_sock, sizeof(struct sockaddr)); + lw_notice("Send UDP msg: %s ", udp_demo_msg); closesocket(socket_fd); return; } void *LwipUdpSendTest(int argc, char *argv[]) { - int result = 0; - sys_thread_t th_id; - - memset(udp_send_msg, 0, sizeof(udp_send_msg)); + memset(udp_demo_msg, 0, sizeof(udp_demo_msg)); if(argc == 1) { lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]); - strncpy(udp_send_msg, hello_str, strlen(hello_str)); + strncpy(udp_demo_msg, hello_str, strlen(hello_str)); } else { - strncpy(udp_send_msg, argv[1], strlen(argv[1])); - strncat(udp_send_msg, "\r\n", 2); + strncpy(udp_demo_msg, argv[1], strlen(argv[1])); + strncat(udp_demo_msg, "\r\n", 2); if(argc == 3) { sscanf(argv[2], "%d.%d.%d.%d", &udp_demo_ip[0], &udp_demo_ip[1], &udp_demo_ip[2], &udp_demo_ip[3]); } } + lw_print("lw: [%s] gw %d.%d.%d.%d\n", __func__, udp_demo_ip[0], udp_demo_ip[1], udp_demo_ip[2], udp_demo_ip[3]); - lwip_config_net(lwip_ipaddr, lwip_netmask, lwip_gwaddr); - sys_thread_new("udp socket send", LwipUDPSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); + lwip_config_net(lwip_ipaddr, lwip_netmask, udp_demo_ip); + sys_thread_new("udp send", LwipUDPSendTask, NULL, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3), @@ -116,6 +112,7 @@ static void LwipUdpRecvTask(void *arg, struct udp_pcb *upcb, struct pbuf *p, { return; } + udp_len = p->tot_len; lw_notice("Receive data :%dB\r\n", udp_len); @@ -158,5 +155,5 @@ void LwipUdpRecvTest(void) } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), - UDPRecv, LwipUdpRecvTest, UDP server echo); + UDPRecv, LwipUdpRecvTest, UDP Receive echo); diff --git a/Ubiquitous/XiZi/resources/include/flash_spi.h b/Ubiquitous/XiZi/resources/include/flash_spi.h index 1f6aa4913..f41d40d25 100644 --- a/Ubiquitous/XiZi/resources/include/flash_spi.h +++ b/Ubiquitous/XiZi/resources/include/flash_spi.h @@ -21,9 +21,7 @@ #ifndef FLASH_SPI_H #define FLASH_SPI_H -#ifdef RESOURCES_SPI_SFUD #include -#endif #ifdef __cplusplus extern "C" { diff --git a/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c b/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c index 5d8d21a65..661cfb604 100644 --- a/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c +++ b/Ubiquitous/XiZi/tool/shell/letter-shell/shell_port.c @@ -1,12 +1,12 @@ /** * @file shell_port.c * @author Letter (NevermindZZT@gmail.com) - * @brief + * @brief * @version 0.1 * @date 2019-02-22 - * + * * @copyright (c) 2019 Letter - * + * */ #include "xizi.h" @@ -26,11 +26,11 @@ char *shellBuffer; ShellFs shellFs; char *shellPathBuffer; -HardwareDevType console; +HardwareDevType console; /** - * @brief Shell write - * + * @brief Shell write + * * @param data write data */ void userShellWrite(char data) @@ -40,7 +40,7 @@ void userShellWrite(char data) /** * @brief shell read - * + * * @param data read data * @return char read status */ @@ -62,7 +62,7 @@ signed char userShellRead(char *data) #ifdef SHELL_ENABLE_FILESYSTEM /** * @brief list file - * + * * @param path path * @param buffer result buffer * @param maxLen the maximum buffer size @@ -86,14 +86,14 @@ size_t userShellListDir(char *path, char *buffer, size_t maxLen) #endif /** - * @brief Initialize the shell - * + * @brief Initialize the shell + * */ int userShellInit(void) { shellBuffer = x_malloc(512*sizeof(char)); - - + + #ifdef SHELL_ENABLE_FILESYSTEM shellPathBuffer = x_malloc(512*sizeof(char)); shellPathBuffer[0] = '/'; @@ -102,7 +102,7 @@ int userShellInit(void) shellFs.listdir = userShellListDir; shellFsInit(&shellFs, shellPathBuffer, 512); shellSetPath(&shell, shellPathBuffer); -#endif +#endif shell.write = userShellWrite; shell.read = userShellRead; @@ -114,13 +114,13 @@ int userShellInit(void) serial_dev_param->serial_set_mode = 0; serial_dev_param->serial_stream_mode = SIGN_OPER_STREAM; BusDevOpen(console); - - shellInit(&shell, shellBuffer, 4096); + + shellInit(&shell, shellBuffer, 512); int32 tid; tid = KTaskCreate("letter-shell", shellTask, &shell, SHELL_TASK_STACK_SIZE, SHELL_TASK_PRIORITY); - + StartupKTask(tid); return 0; } From c9455ea4429f1135b434cfdd0b0b83d27ae39b29 Mon Sep 17 00:00:00 2001 From: wlyu Date: Tue, 22 Mar 2022 14:21:49 +0800 Subject: [PATCH 6/6] fixed LWIP bug of exception --- Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c b/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c index 724df1097..456d28917 100644 --- a/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c +++ b/Ubiquitous/XiZi/resources/ethernet/LwIP/core/tcp_out.c @@ -1386,6 +1386,9 @@ tcp_output(struct tcp_pcb *pcb) /* In the case of fast retransmit, the packet should not go to the tail * of the unacked queue, but rather somewhere before it. We need to check for * this case. -STJ Jul 27, 2004 */ + /*when useg is NULL, cause exception*/ + if(useg == NULL) + break; if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) { /* add segment to before tail of unacked list, keeping the list sorted */ struct tcp_seg **cur_seg = &(pcb->unacked);