50 printf(
"Starting new connection to the IO Server\r\n");
52 ATTEMPT_IO_CONNECTION:
63 if (connectionIndex == MAX_IO_CONNECTIONS)
67 puts(
"IO server already connected... not accepting last attempt.");
73 puts(
"IO server already connected... closing old connection.");
75 goto ATTEMPT_IO_CONNECTION;
81 mpSetsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (
char*)&sockOpt,
sizeof(sockOpt));
85 printf(
"Creating new task: tidIoConnections (connectionIndex = %d)\n", connectionIndex);
88 controller->
tidIoConnections[connectionIndex] = mpCreateTask(MP_PRI_TIME_NORMAL, MP_STACK_SIZE,
90 (
int)controller, connectionIndex, 0, 0, 0, 0, 0, 0, 0, 0);
92 if (controller->tidIoConnections[connectionIndex] !=
ERROR)
99 puts(
"Could not create new task in the IO server. Check robot parameters.");
102 controller->tidIoConnections[connectionIndex] =
INVALID_TASK;
104 mpSetAlarm(8004,
"MOTOROS FAILED TO CREATE TASK", 7);
118 printf(
"Closing IO Server Connection\r\n");
128 printf(
"IO Server Connection Closed\r\n");
171 int invalidSubcode = 0;
207 printf(
"Invalid message type: %d\n", receiveMsg->
header.
msgType);
213 if (invalidSubcode != 0)
229 int byteSize = 0, byteSizeResponse = 0;
233 BOOL bDisconnect =
FALSE;
234 int partialMsgByteCount = 0;
235 BOOL bSkipNetworkRecv =
FALSE;
241 if (!bSkipNetworkRecv)
244 memset((&receiveMsg) + partialMsgByteCount, 0x00,
sizeof(
SimpleMsg) - partialMsgByteCount);
245 byteSize = mpRecv(controller->
sdIoConnections[connectionIndex], (
char*)((&receiveMsg) + partialMsgByteCount),
sizeof(
SimpleMsg) - partialMsgByteCount, 0);
249 byteSize += partialMsgByteCount;
250 partialMsgByteCount = 0;
254 byteSize = partialMsgByteCount;
255 partialMsgByteCount = 0;
256 bSkipNetworkRecv =
FALSE;
261 if (byteSize >= minSize)
265 if (expectedSize == -1)
267 printf(
"Unknown Message Received (%d)\r\n", receiveMsg.
header.
msgType);
270 else if (byteSize >= expectedSize)
278 else if (byteSize > expectedSize)
281 Db_Print(
"MessageReceived(%d bytes): expectedSize=%d, processing rest of bytes (%d, %d, %d)\r\n", byteSize, expectedSize,
sizeof(receiveMsg), receiveMsg.
body.
jointTrajData.
sequence, ((
int*)((
char*)&receiveMsg + expectedSize))[5]);
282 partialMsgByteCount = byteSize - expectedSize;
283 memmove(&receiveMsg, (
char*)&receiveMsg + expectedSize, partialMsgByteCount);
286 if (partialMsgByteCount >= minSize)
289 bSkipNetworkRecv = (partialMsgByteCount >= expectedSize);
293 partialMsgByteCount = 0;
297 Db_Print(
"MessageReceived(%d bytes): expectedSize=%d\r\n", byteSize, expectedSize);
303 Db_Print(
"Unknown Data Received (%d bytes)\r\n", byteSize);
309 if (byteSizeResponse <= 0)
322 MP_IO_INFO ioReadInfo;
326 memset(replyMsg, 0x00,
sizeof(
SimpleMsg));
357 MP_IO_INFO ioReadInfo[8];
363 memset(replyMsg, 0x00,
sizeof(
SimpleMsg));
374 for (i = 0; i < 8; i += 1)
381 for (i = 0; i < 8; i += 1)
383 resultValue |= (ioValue[i] << i);
403 MP_IO_DATA ioWriteData;
408 memset(replyMsg, 0x00,
sizeof(
SimpleMsg));
420 if (bAddressOk && bValueOk)
445 MP_IO_DATA ioWriteData[8];
451 memset(replyMsg, 0x00,
sizeof(
SimpleMsg));
463 if (bAddressOk && bValueOk)
470 apiRet = mpWriteIO(ioWriteData, QUANTITY_BYTE);
491 MP_IO_INFO ioReadInfo;
495 memset(replyMsg, 0x00,
sizeof(
SimpleMsg));
529 MP_IO_DATA ioWriteData;
534 memset(replyMsg, 0x00,
sizeof(
SimpleMsg));
549 if (bAddressOk && bValueOk)
584 if ((address >= GENERALINMIN && address <= GENERALINMAX) ||
585 (address >= GENERALOUTMIN && address <= GENERALOUTMAX) ||
586 (address >= EXTERNALINMIN && address <= EXTERNALINMAX) ||
587 (address >= NETWORKINMIN && address <= NETWORKINMAX) ||
588 (address >= NETWORKOUTMIN && address <= NETWORKOUTMAX) ||
589 (address >= EXTERNALOUTMIN && address <= EXTERNALOUTMAX) ||
590 (address >= SPECIFICINMIN && address <= SPECIFICINMAX) ||
591 (address >= SPECIFICOUTMIN && address <= SPECIFICOUTMAX) ||
592 (address >= IFPANELMIN && address <= IFPANELMAX) ||
593 (address >= AUXRELAYMIN && address <= AUXRELAYMAX) ||
594 (address >= CONTROLSTATUSMIN && address <= CONTROLSTATUSMAX) ||
595 (address >= PSEUDOINPUTMIN && address <= PSEUDOINPUTMAX) ||
596 (address >= REGISTERMIN && address <= REGISTERMAX_READ))
617 if ((address >= GENERALOUTMIN && address <= GENERALOUTMAX) ||
618 (address >= NETWORKINMIN && address <= NETWORKINMAX) ||
619 (address >= IFPANELMIN && address <= IFPANELMAX) ||
620 (address >= REGISTERMIN && address <= REGISTERMAX_WRITE))
void Ros_Controller_SetIOState(ULONG signal, BOOL status)
SmBodyMotoWriteIOGroup writeIOGroup
SmBodyMotoReadIOBit readIOBit
int sdIoConnections[MAX_IO_CONNECTIONS]
SmBodyMotoReadIOMRegisterReply readRegisterReply
SmBodyJointTrajPtFull jointTrajData
#define IO_FEEDBACK_FAILURE
BOOL Ros_IoServer_IsValidWriteAddress(UINT32 address, IoAccessSize size)
BOOL Ros_IoServer_IsValidWriteValue(UINT32 value, IoAccessSize size)
int Ros_IoServer_WriteIORegister(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
struct _SmHeader SmHeader
void Ros_IoServer_StartNewConnection(Controller *controller, int sd)
SmBodyMotoReadIOBitReply readIOBitReply
int Ros_IoServer_WriteIOBit(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
struct _SmBodyMotoWriteIOGroup SmBodyMotoWriteIOGroup
int Ros_IoServer_WriteIOGroup(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
void Db_Print(char *msgFormat,...)
int Ros_IoServer_SimpleMsgProcess(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
struct _SmBodyMotoReadIOGroup SmBodyMotoReadIOGroup
void Ros_IoServer_StopConnection(Controller *controller, int connectionIndex)
BOOL Ros_IoServer_IsValidReadAddress(UINT32 address, IoAccessSize size)
void Ros_Sleep(float milliseconds)
struct _SmBodyMotoReadIOMRegister SmBodyMotoReadIOMRegister
int Ros_IoServer_ReadIORegister(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
void Ros_IoServer_WaitForSimpleMsg(Controller *controller, int connectionIndex)
SmBodyMotoWriteIOBitReply writeIOBitReply
int Ros_SimpleMsg_IoReply(int result, int subcode, SimpleMsg *replyMsg)
#define IO_FEEDBACK_IOSERVERCONNECTED
int Ros_IoServer_ReadIOGroup(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
struct _SmBodyMotoWriteIOMRegister SmBodyMotoWriteIOMRegister
int Ros_IoServer_GetExpectedByteSizeForMessageType(SimpleMsg *receiveMsg)
struct _SmBodyMotoWriteIOBit SmBodyMotoWriteIOBit
SmBodyMotoWriteIOMRegister writeRegister
BOOL Ros_MotionServer_HasDataInQueue(Controller *controller)
int tidIoConnections[MAX_IO_CONNECTIONS]
int Ros_IoServer_ReadIOBit(SimpleMsg *receiveMsg, SimpleMsg *replyMsg)
SmBodyMotoWriteIOGroupReply writeIOGroupReply
SmBodyMotoReadIOGroup readIOGroup
struct _SmBodyMotoReadIOBit SmBodyMotoReadIOBit
SmBodyMotoReadIOMRegister readRegister
SmBodyMotoWriteIOMRegisterReply writeRegisterReply
SmBodyMotoReadIOGroupReply readIOGroupReply
#define MAX_IO_CONNECTIONS
SmBodyMotoWriteIOBit writeIOBit