コード例 #1
0
ファイル: controlino.cpp プロジェクト: FatihZor/instrumentino
/***
 * 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;
		}
	}
}
コード例 #2
0
ファイル: mttool.c プロジェクト: peterjanetka/memtype
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;
}