void Slave::OpenNewNode(IKernel * kernel, s32 nodeType, s32 nodeId, const OArgs & args) { s32 newNodeType = args.GetDataInt32(0); s32 newNodeId = args.GetDataInt32(1); OASSERT(_executes.find(newNodeType) != _executes.end(), "unknown nodeType %d", newNodeType); s64 node = (((s64)newNodeType) << 32) | newNodeId; auto itr = _cmds.find(node); if (itr != _cmds.end()) StartNode(kernel, itr->second.cmd); else StartNewNode(kernel, _executes[newNodeType].name, _executes[newNodeType].cmd, newNodeType, newNodeId); }
int ProcessFocusedCommand(char* command) { int ret = 0; int sec = 0; int NodeID; int NodeType; UNS32 data = 0; char buf[50]; int size; int index; int subindex = 0; int datatype = 0; EnterMutex(); switch(command[0]) { case 's' : /* Slave Start*/ StartNode(CurrentNode); break; case 't' : /* slave stop */ StopNode(CurrentNode); break; case 'x' : /* slave reset */ ResetNode(CurrentNode); break; case 'r' : /* Read device entry */ ret = sscanf(command, "r%4x,%2x", &index, &subindex); if (ret) ReadSDOEntry(CurrentNode,index,subindex); break; case 'w' : /* Write device entry */ ret = sscanf(command, "w%4x,%2x,%2x,%x", &index, &subindex, &size, &data); if (ret) WriteSDOEntry(CurrentNode,index,subindex,size,data); break; case '?' : /* Read device entry */ ReadSDOEntry(CurrentNode,0x6041,0); break; case 'c' : /* Write device entry */ ret = sscanf(command, "w%x", &data); if (ret) WriteSDOEntry(CurrentNode,0x6040,0,0x2,data); break; default : help_menu(); } LeaveMutex(); return 0; }
void Slave::StartNewNode(IKernel * kernel, const char * name, const char * cmd, const s32 nodeType, const s32 nodeId) { std::string tmp(cmd); std::string::size_type pos = tmp.find(EXECUTE_CMD_PORT); while (pos != std::string::npos) { OASSERT(_startPort < _endPort, "port is not enough"); char portStr[64]; SafeSprintf(portStr, sizeof(portStr), "%d", _startPort++); tmp.replace(pos, EXECUTE_CMD_PORT_SIZE, portStr); pos = tmp.find(EXECUTE_CMD_PORT); } pos = tmp.find(EXECUTE_CMD_OUT_PORT); while (pos != std::string::npos) { OASSERT(_startOutPort < _endOutPort, "out port is not enough"); char portStr[64]; SafeSprintf(portStr, sizeof(portStr), "%d", _startOutPort++); tmp.replace(pos, EXECUTE_CMD_OUT_PORT_SIZE, portStr); pos = tmp.find(EXECUTE_CMD_OUT_PORT); } pos = tmp.find(EXECUTE_CMD_ID); if (pos != std::string::npos) { char idStr[64]; SafeSprintf(idStr, sizeof(idStr), "%d", nodeId); tmp.replace(pos, EXECUTE_CMD_ID_SIZE, idStr); } s64 node = (((s64)nodeType) << 32) | nodeId; SafeSprintf(_cmds[node].cmd, MAX_CMD_LEN, tmp.c_str()); StartNode(kernel, _cmds[node].cmd); }
int ProcessCommand(char* command) { int ret = 0; int sec = 0; int NodeID; int NodeType; EnterMutex(); switch(cst_str4(command[0], command[1], command[2], command[3])) { case cst_str4('h', 'e', 'l', 'p') : /* Display Help*/ help_menu(); break; case cst_str4('s', 's', 't', 'a') : /* Slave Start*/ StartNode(ExtractNodeId(command + 5)); break; case cst_str4('s', 's', 't', 'o') : /* Slave Stop */ StopNode(ExtractNodeId(command + 5)); break; case cst_str4('s', 'r', 's', 't') : /* Slave Reset */ ResetNode(ExtractNodeId(command + 5)); break; case cst_str4('i', 'n', 'f', 'o') : /* Retrieve node informations */ GetSlaveNodeInfo(ExtractNodeId(command + 5)); break; case cst_str4('r', 's', 'd', 'o') : /* Read device entry */ ReadDeviceEntry(command); break; case cst_str4('w', 's', 'd', 'o') : /* Write device entry */ WriteDeviceEntry(command); break; case cst_str4('s', 'c', 'a', 'n') : /* Display master node state */ DiscoverNodes(); break; case cst_str4('w', 'a', 'i', 't') : /* Display master node state */ ret = sscanf(command, "wait#%d", &sec); if(ret == 1) { LeaveMutex(); SleepFunction(sec); return 0; } break; case cst_str4('q', 'u', 'i', 't') : /* Quit application */ LeaveMutex(); return QUIT; case cst_str4('l', 'o', 'a', 'd') : /* Library Interface*/ ret = sscanf(command, "load#%100[^,],%30[^,],%4[^,],%d,%d", LibraryPath, BoardBusName, BoardBaudRate, &NodeID, &NodeType); if(ret == 5) { LeaveMutex(); ret = NodeInit(NodeID, NodeType); return ret; } else { printf("Invalid load parameters\n"); } break; default : help_menu(); } LeaveMutex(); return 0; }
int ProcessCommand(char* command) { int ret = 0; int sec = 0; int NodeID; int NodeType; UNS32 data = 0; char buf[50]; EnterMutex(); switch(cst_str4(command[0], command[1], command[2], command[3])) { case cst_str4('h', 'e', 'l', 'p') : /* Display Help*/ help_menu(); break; case cst_str4('c', 'l', 'e', 'a') : /* Display Help*/ system(CLEARSCREEN); break; case cst_str4('s', 's', 't', 'a') : /* Slave Start*/ StartNode(ExtractNodeId(command + 5)); break; case cst_str4('s', 's', 't', 'o') : /* Slave Stop */ StopNode(ExtractNodeId(command + 5)); break; case cst_str4('s', 'r', 's', 't') : /* Slave Reset */ ResetNode(ExtractNodeId(command + 5)); break; case cst_str4('i', 'n', 'f', 'o') : /* Retrieve node informations */ GetSlaveNodeInfo(ExtractNodeId(command + 5)); break; case cst_str4('r', 's', 'd', 'o') : /* Read device entry */ ReadDeviceEntry(command); break; case cst_str4('w', 's', 'd', 'o') : /* Write device entry */ WriteDeviceEntry(command); break; case cst_str4('n', 'o', 'd', 'e') : /* Write device entry */ ret = sscanf(command, "node %2x", &NodeID); data = 0; SDO_write(CANOpenShellOD_Data,NodeID,0x1024,0x00,1, 0, &data, 0); CurrentNode = NodeID; break; case cst_str4('c', 'm', 'd', ' ') : /* Write device entry */ ret = sscanf(command, "cmd %2x,%s", &NodeID, buf ); SDO_write(CANOpenShellOD_Data,NodeID,0x1023,0x01,strlen(buf),visible_string, buf, 0); SDO_read(CANOpenShellOD_Data,NodeID,0x1023,0x03,visible_string,0); return 0; break; case cst_str4('s', 'y', 'n', '0') : /* Display master node state */ stopSYNC(CANOpenShellOD_Data); break; case cst_str4('s', 'y', 'n', '1') : /* Display master node state */ startSYNC(CANOpenShellOD_Data); break; case cst_str4('s', 't', 'a', 't') : /* Display master node state */ printf("Status3: %x\n",Status3); Status3 = 0; break; case cst_str4('s', 'c', 'a', 'n') : /* Display master node state */ DiscoverNodes(); break; case cst_str4('w', 'a', 'i', 't') : /* Display master node state */ ret = sscanf(command, "wait#%d", &sec); if(ret == 1) { LeaveMutex(); SleepFunction(sec); return 0; } break; case cst_str4('g', 'o', 'o', 'o') : /* Quit application */ setState(CANOpenShellOD_Data, Operational); break; case cst_str4('q', 'u', 'i', 't') : /* Quit application */ LeaveMutex(); return QUIT; case cst_str4('l', 'o', 'a', 'd') : /* Library Interface*/ ret = sscanf(command, "load#%100[^,],%30[^,],%4[^,],%d,%d", LibraryPath, BoardBusName, BoardBaudRate, &NodeID, &NodeType); if(ret == 5) { LeaveMutex(); ret = NodeInit(NodeID, NodeType); return ret; } else { printf("Invalid load parameters\n"); } break; default : help_menu(); } LeaveMutex(); return 0; }