/*** * The loop function is called in an endless loop */ void loop() { char c, argC; char *argV[ARGV_MAX]; int i, pin; unsigned long curMs; // Take care of blinking LED if (startBlinking == true) { curMs = millis(); if (curMs > blinkLastChangeMs + blinkingDelayMs) { blinkLastChangeMs = curMs; if (digitalRead(blinkingPin) == HIGH) { digitalWrite(blinkingPin, LOW); } else { digitalWrite(blinkingPin, HIGH); } } } #ifdef USE_PID // Take care PID-relay variables for (i = 0; i < PID_RELAY_MAX_VARS; i++) { if (pidRelayDescs[i].isOn) { pidRelayDescs[i].inputVar = analogRead(pidRelayDescs[i].pinAnalIn); pidRelayDescs[i].handler->Compute(); // turn relay on/off according to the PID output curMs = millis(); if (curMs - pidRelayDescs[i].windowStartTime > pidRelayDescs[i].windowSize) { //time to shift the Relay Window pidRelayDescs[i].windowStartTime += pidRelayDescs[i].windowSize; } if (pidRelayDescs[i].outputVar > curMs - pidRelayDescs[i].windowStartTime) { digitalWrite(pidRelayDescs[i].pinDigiOut, HIGH); } else { digitalWrite(pidRelayDescs[i].pinDigiOut, LOW); } } } #endif // Read characters from the control serial port and act upon them if (Serial.available()) { c = Serial.read(); switch (c) { case '\n': break; case '\r': // end the string and init pMsg Serial.println(""); *(pMsg++) = NULL; pMsg = msg; // parse the command line statement and break it up into space-delimited // strings. the array of strings will be saved in the argV array. i = 0; argV[i] = strtok(msg, " "); do { argV[++i] = strtok(NULL, " "); } while ((i < ARGV_MAX) && (argV[i] != NULL)); // save off the number of arguments argC = i; pin = strtol(argV[1], NULL, 10); if (strcasecmp(argV[0], "Set") == 0) { cmdSet(argV); } else if (strcasecmp(argV[0], "Reset") == 0) { cmdReset(); } else if (strcasecmp(argV[0], "BlinkPin") == 0) { cmdBlinkPin(argV); } else if (strcasecmp(argV[0], "Read") == 0) { cmdRead(argC, argV); } else if (strcasecmp(argV[0], "Write") == 0) { cmdWrite(argV); } else if (strcasecmp(argV[0], "SetPwmFreq") == 0) { cmdSetPwmFreq(argV); #ifdef USE_PID } else if (strcasecmp(argV[0], "PidRelayCreate") == 0) { cmdPidRelayCreate(argV); } else if (strcasecmp(argV[0], "PidRelaySet") == 0) { cmdPidRelaySet(argV); } else if (strcasecmp(argV[0], "PidRelayTune") == 0) { cmdPidRelayTune(argV); } else if (strcasecmp(argV[0], "PidRelayEnable") == 0) { cmdPidRelayEnable(argV); #endif } else if (strcasecmp(argV[0], "HardSerConnect") == 0) { cmdHardSerConnect(argV); } else if (strcasecmp(argV[0], "SoftSerConnect") == 0) { cmdSoftSerConnect(argV); } else if (strcasecmp(argV[0], "SerSend") == 0) { cmdSerSend(argV); } else if (strcasecmp(argV[0], "SerReceive") == 0) { cmdSerReceive(argV); #ifdef USE_WIRE } else if (strcasecmp(argV[0], "I2cWrite") == 0) { cmdI2cWrite(argC, argV); #endif } else { // Wrong command return; } // Acknowledge the command Serial.println(doneString); break; default: // Record the received character if (isprint(c) && pMsg < msg + sizeof(msg)) { *(pMsg++) = c; } break; } } }
int main(int argc, char **argv) { int option = 0; // For getopt temp option usbDevice_t *dev; ucp_cmd_t buffer; //room for dummy report ID int err; //Initialize globalArgs before we get to work globalArgs.rFlag = 0; //False globalArgs.iFlag = 0; //False globalArgs.wFlag = 0; //False globalArgs.fFlag = 0; //False globalArgs.pFlag = 0; //False globalArgs.hashFlag = 0; //False globalArgs.kFlag = 0; //False strncpy(globalArgs.pin,"0000",sizeof(globalArgs.pin)); //Default pin globalArgs.offset = 0; //Default globalArgs.size = 512; //Default globalArgs.fileName = NULL; globalArgs.file = NULL; //Check if no arguments at all if(argc==1) printUsage(argv[0]); //If there's some argument, parse them while((option = getopt(argc, argv, "rwif:o:p:Pk:s:h?")) !=-1){ //Check option flags switch(option){ case 'r': globalArgs.rFlag = 1; //True break; case 'w': globalArgs.wFlag = 1; //True break; case 'i': globalArgs.iFlag = 1; //True break; case 'f': globalArgs.fFlag = 1; //True globalArgs.fileName = optarg; printf("File: %s\n",globalArgs.fileName); break; case 'o': globalArgs.offset = atoi(optarg); break; case 'p': globalArgs.pFlag = 1; //True strncpy(globalArgs.pin,optarg, sizeof(globalArgs.pin)); break; case 'P': globalArgs.hashFlag=1; //True break; case 'k': globalArgs.kFlag = 1; //True globalArgs.keyboard = optarg; printf("Keyboard: %s\n", globalArgs.keyboard); case 's': globalArgs.size = atoi(optarg); break; case 'h': case '?': printUsage(argv[0]); break; //Unknown flag, don't know what to do default: //After getopt prints the error printUsage(argv[0]); break; } } //Check that only one action is done at a time if(globalArgs.rFlag + globalArgs.wFlag + globalArgs.iFlag > 1) printUsage(argv[0]); //Check that not set PIN and read HASH are given at a time if(globalArgs.pFlag + globalArgs.hashFlag > 1) printUsage(argv[0]); //Check that if write from file to device, we are given a file and a pin to encrypt! if(globalArgs.wFlag && !globalArgs.fFlag) printUsage(argv[0]); if(globalArgs.wFlag && !globalArgs.pFlag) printUsage(argv[0]); //Also check pin for read flag if(globalArgs.rFlag && !globalArgs.pFlag) printUsage(argv[0]); //Try to open the device, exit if no device present. if((dev = openDevice()) == NULL) exit(1); //Clean the buffer before working with it memset((void*)&buffer, 0, sizeof(buffer)); //Check and perform the desired commands if(globalArgs.rFlag){ //READ COMMAND buffer.cmd = UCP_CMD_READ; deviceRead.offset = globalArgs.offset; deviceRead.size = globalArgs.size; memcpy((void*)&buffer.buff, (void*)&deviceRead, sizeof(deviceRead)); //give some feedback fprintf(stderr,"Reading from the MemType: offset=%d bytes, size=%d bytes.\n",deviceRead.offset, deviceRead.size); }else if(globalArgs.wFlag){ //WRITE COMMAND buffer.cmd = UCP_CMD_WRITE; deviceRead.offset = globalArgs.offset; deviceRead.size = readXML(globalArgs.fileName); memcpy((void*)&buffer.buff, (void*)&deviceRead, sizeof(deviceRead)); //give some feedback fprintf(stderr,"Writing to the MemType: offset=%d bytes, size=%d bytes.\n",deviceRead.offset, deviceRead.size); }else if(globalArgs.iFlag){ //INFO COMMAND buffer.cmd = UCP_CMD_INFO; }else if(globalArgs.hashFlag){ //READ PIN HASH COMMAND buffer.cmd = UCP_CMD_READ_PIN; }else if(globalArgs.pFlag){ //SET PIN COMMAND buffer.cmd = UCP_CMD_SET_PIN; buffer.buff[0] = 16; //sizeof hash in bytes }else if(globalArgs.kFlag){ buffer.cmd = UCP_CMD_KEYBOARD; } //Add a dummy report ID and send data to device buffer.reportid = 2; if((err = usbhidSetReport(dev, (char*)&buffer, sizeof(buffer))) != 0) fprintf(stderr, "Error sending data to device: %s\n", usbErrorMessage(err)); //Read back report int len = sizeof(buffer); if((err = usbhidGetReport(dev, 2, (char*)&buffer, &len)) != 0) { //... if not OK, print error fprintf(stderr, "Error reading data from device: %s\n", usbErrorMessage(err)); } else //... if OK, do things :) { fprintf( stderr, "\nMemType CMD Response: "); hexdump( (void*)&buffer.cmd, sizeof(buffer.cmd)+sizeof(buffer.buff)); fprintf( stderr, "Received data from the device: \n"); switch(buffer.cmd) { case UCP_CMD_RESET: fprintf( stderr, "RESET\n"); break; case UCP_CMD_READ: fprintf( stderr, "READ\n"); cmdRead(dev, deviceRead.size); break; case UCP_CMD_WRITE: fprintf( stderr, "WRITE\n"); cmdWrite(dev, flashMemory, deviceRead.size); fprintf(stderr, "[ENCRYPTION TEST] only hexdump"); break; case UCP_CMD_SET_PIN: fprintf(stderr, "SET PIN\n"); cmdSetPin(dev); break; case UCP_CMD_READ_PIN: fprintf(stderr, "READ PIN HASH\n"); cmdReadPinHash(dev); break; case UCP_CMD_KEYBOARD: fprintf(stderr, "KEYBOARD\n"); cmdKeyboard(dev); break; case UCP_CMD_DATA: fprintf( stderr, "DATA\n"); break; case UCP_CMD_INFO: fprintf( stderr, "sizeof(info) -> %lu\n", sizeof(deviceInfo)); memcpy((void*)&deviceInfo, (void*)buffer.buff, sizeof(deviceInfo)); /* Call info */ cmdInfo(&deviceInfo); break; case UCP_CMD_ERROR: //Wait! the device returned one error! switch( (unsigned char) buffer.buff[0] ) { case UCP_ERR: fprintf( stderr, "GENERIC ERROR\n"); break; case UCP_ERR_PACKET: fprintf( stderr, "PACKET ERROR\n"); break; case UCP_ERR_CMD: fprintf( stderr, "CMD ERROR\n"); break; case UCP_ERR_ADDR: fprintf( stderr, "ADDR ERROR\n"); break; case UCP_ERR_SIZE: fprintf( stderr, "SIZE ERRROR\n"); break; case UCP_ERR_PROTOCOL: fprintf( stderr, "PROTOCOL ERROR\n"); break; case UCP_ERR_LOCKED: fprintf( stderr, "DEVICE LOCKED ERROR\n"); break; default: fprintf( stderr, "UNKNOWN ERROR\n"); } break; default: fprintf( stderr, "UNKNOWN CMD ERROR\n"); } } usbhidCloseDevice(dev); return 0; }