forked from xuos/xiuos
support control json file
This commit is contained in:
parent
52bf15ecac
commit
4843ff9e61
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
||||
|
|
|
@ -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[];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
SRC_FILES := plc_socket.c
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
SRC_FILES := control.c
|
||||
|
||||
ifeq ($(CONFIG_MOUNT_SDCARD),y)
|
||||
SRC_FILES += control_file.c
|
||||
endif
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
|
||||
|
|
|
@ -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 <stdio.h>
|
||||
#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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
SRC_FILES := cJSON.c
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -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 <connect_ethernet.h>
|
||||
#endif
|
||||
#ifdef BSP_USING_LPUART
|
||||
#include <connect_uart.h>
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_ADC
|
||||
#include <connect_adc.h>
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_SPI
|
||||
#include <connect_spi.h>
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_RTC
|
||||
#include <connect_rtc.h>
|
||||
#endif
|
||||
|
||||
#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority
|
||||
4 bits for subpriority */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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****/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -21,7 +21,9 @@
|
|||
#ifndef FLASH_SPI_H
|
||||
#define FLASH_SPI_H
|
||||
|
||||
#ifdef RESOURCES_SPI_SFUD
|
||||
#include <sfud_port.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue