// master: enques new module into topology arry // slave: sends detected module upstream byte PMRTopology::enqueModule(byte adress, bool orientation) { Serial.println("Try to register new module with orientation: "+(String)orientation); if((adress>15) || (adress<1)) { Serial.println("ERROR: Invalid adress"); return modulesCount; } if(searchDuplicateInTopology(adress)) { Serial.print("ERROR: Module "); Serial.print(adress); Serial.println(" is already registered"); return modulesCount; } topology[modulesCount].adress = adress; topology[modulesCount].orientation = orientation ? topology[modulesCount-1].orientation : !topology[modulesCount-1].orientation; modulesCount++; countPitchingJoints(); printTopology(); return modulesCount; }
int main(int argc, char **argv) { // ------------------------------------------------------------------------ // Handle commandline arguments if (argc != 5) { printf("usage: emulator -p <port> -f <filename>\n"); exit(1); } char *portStr = NULL; char *filename = NULL; int cmd; while ((cmd = getopt(argc, argv, "p:f:")) != -1) { switch(cmd) { case 'p': portStr = optarg; break; case 'f': filename = optarg; break; case '?': if (optopt == 'p' || optopt == 'f') fprintf(stderr, "Option -%c requires an argument.\n", optopt); else if (isprint(optopt)) fprintf(stderr, "Unknown option -%c.\n", optopt); else fprintf(stderr, "Unknown option character '\\x%x'.\n", optopt); exit(EXIT_FAILURE); break; default: printf("Unhandled argument: %d\n", cmd); exit(EXIT_FAILURE); } } printf("Port : %s\n", portStr); printf("Filename : %s\n", filename); // Convert program args to values int port = atoi(portStr); // Validate the argument values if (port < 1 || port > 65536) ferrorExit("Invalid port"); puts(""); // Read network topology struct entry **topology = readtopology(filename); printTopology(topology); // Create network routes from topology createRoutes(topology); // TODO: this is temporary, need to get sender address info from fwd table // Setup sender address info struct addrinfo ehints; bzero(&ehints, sizeof(struct addrinfo)); ehints.ai_family = AF_INET; ehints.ai_socktype = SOCK_DGRAM; ehints.ai_flags = 0; // Setup emu sending socket struct sockaddr_in emuaddr; int sockfd; if( (sockfd = socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0)) == -1){ perrorExit("Socket error"); } emuaddr.sin_family = AF_INET; emuaddr.sin_port = htons(port); emuaddr.sin_addr.s_addr = INADDR_ANY; bzero(&(emuaddr.sin_zero), 8); if (bind(sockfd, (struct sockaddr*)&emuaddr, sizeof(emuaddr)) == -1) { close(sockfd); perrorExit("Bind error"); } printf("Emulator socket created on port:%d\n", port ); //------------------------------------------------------------------------- // BEGIN NETWORK EMULATION LOOP puts("Emulator waiting for packets...\n"); struct sockaddr_in recvAddr; socklen_t recvLen = sizeof(recvAddr); //socklen_t sendLen = sizeof(sendAddr); // HACK: Don't like hard coding this, but don't know any other way size_t MAX_HOST_LEN = 256; char name[MAX_HOST_LEN]; gethostname(name, MAX_HOST_LEN); //Need to just get lowest level dns name i.e. mumble-30 while (1) { void *msg = malloc(sizeof(struct packet)); bzero(msg, sizeof(struct packet)); size_t bytesRecvd; bytesRecvd = recvfrom(sockfd, msg, sizeof(struct packet), 0, (struct sockaddr *)&recvAddr, &recvLen); if (bytesRecvd != -1) { //printf("Received %d bytes\n", (int)bytesRecvd); // Deserialize the message into a packet struct packet *pkt = malloc(sizeof(struct packet)); bzero(pkt, sizeof(struct packet)); deserializePacket(msg, pkt); struct addrinfo entryHints; bzero(&entryHints, sizeof(struct addrinfo)); entryHints.ai_family = AF_INET; entryHints.ai_socktype = SOCK_DGRAM; entryHints.ai_flags = 0; } } if (close(sockfd) == -1) perrorExit("Close error"); else puts("Connection closed.\n"); // All done! exit(EXIT_SUCCESS); }