/** * \fn BOOL Packet_Get(void) * \brief Attempts to get a packet from the received data. * \return TRUE if a valid packet was received */ BOOL Packet_Get(void) { /* temps for packet receive state machine */ static PACKET_STATE state = STATE_1; static UINT8 command = 0, parameter1 = 0, parameter2 = 0, parameter3 = 0, checksum = 0; #ifdef NO_INTERRUPT SCI_Poll(); #endif switch(state) { case STATE_0: if (SCI_InChar(&command)) { state = STATE_1; } break; case STATE_1: if (SCI_InChar(¶meter1)) { state = STATE_2; } break; case STATE_2: if (SCI_InChar(¶meter2)) { state = STATE_3; } break; case STATE_3: if (SCI_InChar(¶meter3)) { state = STATE_4; } break; case STATE_4: if (SCI_InChar(&checksum)) { state = STATE_5; } break; case STATE_5: if (checksum != Packet_Checksum(command, parameter1, parameter2, parameter3)) { command = parameter1; parameter1 = parameter2; parameter2 = parameter3; parameter3 = checksum; state = STATE_4; } else { Packet_Command = command; Packet_Parameter1 = parameter1; Packet_Parameter2 = parameter2; Packet_Parameter3 = parameter3; state = STATE_0; return bTRUE; } break; default: break; } return bFALSE; }
int main(int argc, char **argv) { sci_info_t info; sci_filter_info_t filter_info; char msg[256]; char *s; int i, rc, num_bes, job_key, sizes[1]; int pollfd; void *bufs[1]; char pwd[256]; char hfile[256], bpath[256], fpath[256]; fd_set fdSet; getcwd(pwd, 256); sprintf(hfile, "%s/host.list", pwd); #ifdef __64BIT__ sprintf(bpath, "%s/dsh_be64", pwd); #else sprintf(bpath, "%s/dsh_be", pwd); #endif bzero(&info, sizeof(info)); info.type = SCI_FRONT_END; info.fe_info.mode = SCI_POLLING; info.fe_info.hostfile = hfile; info.fe_info.bepath = bpath; info.fe_info.hndlr = (SCI_msg_hndlr *)&handler; info.fe_info.param = NULL; rc = SCI_Initialize(&info); if (rc != SCI_SUCCESS) { exit(1); } rc = SCI_Query(NUM_BACKENDS, &num_bes); if (rc != SCI_SUCCESS) { exit(1); } rc = SCI_Query(POLLING_FD, &pollfd); if (rc != SCI_SUCCESS) { exit(1); } FD_ZERO(&fdSet); FD_SET(pollfd, &fdSet); while (1) { printf(">>> "); fflush(stdout); memset(msg, 0 , sizeof(msg)); fgets(msg, sizeof(msg), stdin); msg[strlen(msg) - 1] = '\0'; if (0 == strcmp(msg, "quit")) break; num_resp = 0; bufs[0] = msg; sizes[0] = strlen(msg) + 1; rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes); if (rc != SCI_SUCCESS) { exit(1); } do { int rc = ::select(pollfd+1, &fdSet, 0, 0, NULL); if (rc > 0) { SCI_Poll(-1); } } while (num_resp < num_bes); } rc = SCI_Terminate(); return rc; }