Esempio n. 1
0
int parseCommand() {
	int result = OK;
	
	do {
		switch(cmdRead()) {
		case LINE_TERMINATOR:
			// Be fair: return after a command line has been processed
			break;
		case '+':
			result = parseCmdClass(ASCII);
			break;
		case '$':
			result = parseCmdClass(BINARY);
			break;
		}
		
		if (result!=OK) {
			// Error on cmds parsing... aborting next commands
			break;
		}
		
	} while ( cmdAvailable() );
	
	Serial_printFlush();
	Serial_printLine("");
	if (result==OK)
		Serial_printLine("OK");
	else
		Serial_printLine("ERROR");
	
	return result;
	
}
Esempio n. 2
0
/// Copy a command value from UART buffer to local (d_outBuff) buffer
void cmdReadValue() {
	short iValRead = 0;
	do {
		d_outBuff[iValRead] = cmdLook();
		if (d_outBuff[iValRead]!=-1 &&		// uart empty
		    d_outBuff[iValRead]!=LINE_TERMINATOR &&	// line end
		    d_outBuff[iValRead]!='+') {		// cmd following
			// Removing char from uart buffer
			cmdRead();
			iValRead++;
		} else {
			// Null terminating string and returning
			d_outBuff[iValRead]=0;
			return;
		}
	} while(1);
}
Esempio n. 3
0
inline int parseCmdClass(int type) {
	switch(cmdRead()) {
	case 'A':
		// Alarms
		return parseAlarmCmd(type);
		break;
	case 'G':
		// GPS
		return parseGpsCmd(type);
		break;
	case 'O':
		// Odometer
		return parseOdoCmd(type);
		break;
	case 'Q':
		// Query registry
		return parseQueryCmd(type);
		break;
	}
	return ERROR;
}
Esempio n. 4
0
int main()
{
    char cmd[256];
    char *token;

    printf ("Testing for T2FS - v 1.0\n");
    cmdMan();

    while (1) {
        printf ("T2FS> ");
        gets(cmd);
        if( (token = strtok(cmd," \t")) != NULL ) {
            if (strcmp(token,"exit")==0) { cmdExit(); break; }
            else if (strcmp(token,"man")==0) cmdMan();
            else if (strcmp(token,"who")==0) cmdWho();
            else if (strcmp(token,"cp")==0)  cmdCp();
            else if (strcmp(token,"fscp")==0) cmdFscp();
            else if (strcmp(token,"create")==0) cmdCreate();
            else if (strcmp(token,"del")==0) cmdDelete();
            else if (strcmp(token,"open")==0) cmdOpen();
            else if (strcmp(token,"close")==0) cmdClose();
            else if (strcmp(token,"read")==0) cmdRead();
            else if (strcmp(token,"mkdir")==0) cmdMkdir();
            else if (strcmp(token,"md")==0) cmdMkdir();
            else if (strcmp(token,"rmdir")==0) cmdRmdir();
            else if (strcmp(token,"rm")==0) cmdRmdir();
            else if (strcmp(token,"getcwd")==0) cmdGetcwd();
            else if (strcmp(token,"chdir")==0) cmdChdir();
            else if (strcmp(token,"cd")==0) cmdChdir();
            else if (strcmp(token,"ls")==0) cmdLs();
            else if (strcmp(token,"dir")==0) cmdLs();
            else printf ("???\n");
        }
    }

    return 0;
}
Esempio n. 5
0
inline int parseOdoCmd(int type) {

	switch(cmdRead()) {
	case 'C':
		switch(cmdRead()) { 
		case 'P':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Pulse conunt"
				ShowValueUL(d_pcount);
				goto poc_ok;
			case '=':
				// WRITE "Pulse conunt"
				cmdRead();
				ReadValueUL(d_pcount);
				goto poc_ok;
			}
			goto poc_error;
		}
		goto poc_error;
	case 'F':
		switch(cmdRead()) { 
		case 'P':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Pulse frequency"
				ShowValueUL(d_freq);
				goto poc_ok;
			}
			goto poc_error;
		}
		goto poc_error;
	}
	
poc_error:
	return ERROR;
poc_ok:
	return OK;

}
Esempio n. 6
0
int main(int argc, char *argv[]) {
	int i, j;
	int thisSocket, thatSocket;
	int *confPort;
	unsigned int tmpSeconds;

	char *confConfig, *confEngine, *confPassword;
	char magicCookie[] = "TELLUTELLUTELLUTELLUTELLUTELLU";

	size_t s;

	uid_t *thisUid;
	gid_t *thisGid;

	/*
	 *
	 * Initialize default values.
	 *
	 */

	pMainMainInfo = &mainMainInfo;
	pMainThreadInfo = &mainThreadInfo;

	memset(pMainMainInfo, 0, sizeof(mainMainInfo));
	memset(pMainThreadInfo, 0, sizeof(mainThreadInfo));

	/*
	 *
	 * Read command line and parse configuration file.
	 *
	 */

	cmdRead(argv, argc);

	if((confConfig = configFetch("config_file", &i)) != NULL) {
		if(configRead(confConfig) != 0) {
			warningMessage(ERROR_SLIGHT, "Error occurred while trying to read configuration file");
		}
	}
	else {
		if(configRead(CONFIG_DEFAULT_FILE) != 0) {
			warningMessage(ERROR_SLIGHT, "Error occurred while trying to read configuration file");
		}
	}

	cmdRead(argv, argc);

	nodeInitNames();

	/*
	 *
	 * Initialize thread pool.
	 *
	 */

	if((threadPool = malloc(sizeof(struct threadInfo) * THREAD_TELSKIND)) == NULL) {
		warningMessage(ERROR_FATAL, "Error occurred while trying to allocate memory for thread pool");
	}

	memset(threadPool, 0, sizeof(struct threadInfo) * THREAD_TELSKIND);

	/*
	 *
	 * Initialize configurable subroutines.
	 *
	 */

	pMainThreadInfo->threadReady = 1;

	for(j = 0; j < THREAD_TELSKIND; j++) {
		threadPool[j].threadReady = 1;

		threadPool[j].magicCookie = magicCookie;
		threadPool[j].pMainInfo = pMainMainInfo;

		if((confEngine = configFetch("storage_engine", &i)) != NULL) {
			if(strncasecmp(confEngine, "plain", strlen(confEngine)) == 0) {
				threadPool[j].dbInfo.connect = plainConnect;
				threadPool[j].dbInfo.disconnect = plainDisconnect;
				threadPool[j].dbInfo.escape = plainEscape;
				threadPool[j].dbInfo.push = plainPush;
				threadPool[j].dbInfo.pull = plainPull;
				threadPool[j].dbInfo.round = plainRound;
				threadPool[j].dbInfo.free = plainFree;
				threadPool[j].dbInfo.expire = plainExpire;
				threadPool[j].dbInfo.cookie = plainCookie;
				threadPool[j].dbInfo.insert = plainInsert;
				threadPool[j].dbInfo.login = plainLogin;
				threadPool[j].dbInfo.logout = plainLogout;
				threadPool[j].dbInfo.session = plainSession;
				threadPool[j].dbInfo.permission = plainPermission;

				pMainThreadInfo->dbInfo.connect = plainConnect;
				pMainThreadInfo->dbInfo.disconnect = plainDisconnect;
				pMainThreadInfo->dbInfo.escape = plainEscape;
				pMainThreadInfo->dbInfo.push = plainPush;
				pMainThreadInfo->dbInfo.pull = plainPull;
				pMainThreadInfo->dbInfo.round = plainRound;
				pMainThreadInfo->dbInfo.free = plainFree;
				pMainThreadInfo->dbInfo.expire = plainExpire;
				pMainThreadInfo->dbInfo.cookie = plainCookie;
				pMainThreadInfo->dbInfo.insert = plainInsert;
				pMainThreadInfo->dbInfo.login = plainLogin;
				pMainThreadInfo->dbInfo.logout = plainLogout;
				pMainThreadInfo->dbInfo.session = plainSession;
				pMainThreadInfo->dbInfo.permission = plainPermission;

				continue;
			}
		}

		threadPool[j].dbInfo.connect = mysqlConnect;
		threadPool[j].dbInfo.disconnect = mysqlDisconnect;
		threadPool[j].dbInfo.escape = mysqlEscape;
		threadPool[j].dbInfo.push = mysqlPush;
		threadPool[j].dbInfo.pull = mysqlPull;
		threadPool[j].dbInfo.round = mysqlRound;
		threadPool[j].dbInfo.free = mysqlFree;
		threadPool[j].dbInfo.expire = mysqlExpire;
		threadPool[j].dbInfo.cookie = mysqlCookie;
		threadPool[j].dbInfo.insert = mysqlInsert;
		threadPool[j].dbInfo.login = mysqlLogin;
		threadPool[j].dbInfo.logout = mysqlLogout;
		threadPool[j].dbInfo.session = mysqlSession;
		threadPool[j].dbInfo.permission = mysqlPermission;

		pMainThreadInfo->dbInfo.connect = mysqlConnect;
		pMainThreadInfo->dbInfo.disconnect = mysqlDisconnect;
		pMainThreadInfo->dbInfo.escape = mysqlEscape;
		pMainThreadInfo->dbInfo.push = mysqlPush;
		pMainThreadInfo->dbInfo.pull = mysqlPull;
		pMainThreadInfo->dbInfo.round = mysqlRound;
		pMainThreadInfo->dbInfo.free = mysqlFree;
		pMainThreadInfo->dbInfo.expire = mysqlExpire;
		pMainThreadInfo->dbInfo.cookie = mysqlCookie;
		pMainThreadInfo->dbInfo.insert = mysqlInsert;
		pMainThreadInfo->dbInfo.login = mysqlLogin;
		pMainThreadInfo->dbInfo.logout = mysqlLogout;
		pMainThreadInfo->dbInfo.session = mysqlSession;
		pMainThreadInfo->dbInfo.permission = mysqlPermission;
	}

	/*
	 *
	 * Initialize magick cookie.
	 *
	 */

	if((confPassword = configFetch("agent_password", &i)) != NULL) {
		s = strlen(confPassword);

		if(s > DATA_COOKIE_SIZE) {
			s = DATA_COOKIE_SIZE;
		}

		strncpy(magicCookie, confPassword, s);
	}

	/*
	 *
	 * Initialize main thread.
	 *
	 */

	configSetUmask(0077);

	if(configSetLocale(CONFIG_DEFAULT_LOCALE) != 0) {
		warningMessage(ERROR_SLIGHT, "Error occurred while trying to set default locale");
	}

	if(configChangeRoot(CONFIG_DEFAULT_ROOT) != 0) {
		warningMessage(ERROR_SLIGHT, "Error occurred while trying to change root directory");
	}

	if(configCloseInput() != 0) {
		warningMessage(ERROR_SLIGHT, "Error occurred while trying to close standard input");
	}

	if(configDaemonize() != 0) {
		warningMessage(ERROR_SLIGHT, "Error occurred while trying to daemonize process");
	}

	threadStack(THREAD_TELSKIND);
	beginProcess(pMainThreadInfo);

	/*
	 *
	 * Initialize timer.
	 *
	 */

	if(timerInit(TIMER_RESOLUTION_STATUS, 0, timerStatThreads) != 0) {
		warningMessage(ERROR_FATAL, "Error occurred while trying to initialize timer");
	}

	/*
	 *
	 * Initialize worker threads.
	 *
	 */

	pMainMainInfo->allRunning = 0;
	pMainMainInfo->theEnd = 0;
	pMainMainInfo->threadEnd = 0;

	for(i = 0; i < THREAD_TELSKIND; i++) {
		if(threadInit(&threadPool[i], workerThread, &threadPool[i]) != 0) {
			warningMessage(ERROR_FATAL, "Error occurred while trying to initialize worker thread");
		}

		j = 0;

		while(threadPool[i].threadReady != 0) {
			timerWait(&tmpSeconds, 0, THREAD_AGAIN);

			if(j == 10000 || j == 20000 || j == 30000 || j == 40000 || j == 50000) {
				warningMessage(ERROR_SLIGHT, "Waiting for worker threads to start taking too long, still waiting");
			}
			else if(j >= 60000) {
				warningMessage(ERROR_FATAL, "Waiting for threads to start taking too long");
			}

			j++;
		}
	}

	/*
	 *
	 * Create socket to listen.
	 *
	 */

	if((confPort = configFetch("listen_port", &i)) != NULL) {
		thisSocket = netCreateListenSocket(*confPort);
	}
	else {
		thisSocket = netCreateListenSocket(CONFIG_DEFAULT_PORT);
	}

	/*
	 *
	 * Create process id, shm segment, switch user and group id's.
	 *
	 */

	pidCreate();
	shmCreate(DAEMON_TELSKIND, THREAD_TELSKIND);

	if((thisUid = configFetch("user_id", &i)) != NULL) {
		if(*thisUid != -1) {
			if(uidSwitch(*thisUid) != 0) {
				warningMessage(ERROR_SLIGHT, "Error occurred while trying to change user id");
			}
		}
	}

	if((thisGid = configFetch("group_id", &i)) != NULL) {
		if(*thisGid != -1) {
			if(gidSwitch(*thisGid) != 0) {
				warningMessage(ERROR_SLIGHT, "Error occurred while trying to change group id");
			}
		}
	}

	/*
	 *
	 * Serve connected clients.
	 *
	 */

	startProcess(THREAD_TELSKIND);

	pMainMainInfo->allRunning++;
	pMainMainInfo->rushThreadCounter = 0;

	while(pMainMainInfo->theEnd == 0) {
		thatSocket = netWaitConnection(thisSocket, pMainThreadInfo);

		if(pMainMainInfo->theEnd != 0) {
			break;
		}
mainLoop:
		for(i = 0; i < THREAD_TELSKIND; i++) {
			if(threadPool[i].threadReady == 0) {
				threadPool[i].threadReady++;
				threadPool[i].threadSocket = thatSocket;

				shmUpdate(i, DAEMON_TELSKIND);

				if(threadWake(&threadPool[i]) != 0) {
					netCloseSocket(threadPool[i].threadSocket);

					threadPool[i].threadReady = 0;
					threadPool[i].threadSocket = 0;

					warningMessage(ERROR_SLIGHT, "Error occurred while trying to start worker thread");
				}

				pMainMainInfo->rushThreadCounter = 0;

				break;
			}
		}

		if(i == THREAD_TELSKIND) {
			if(pMainMainInfo->rushThreadCounter > 1000) {
				pMainMainInfo->rushThreadCounter = 0;

				warningMessage(ERROR_SLIGHT, "No free worker thread available, dropping agent");

				netCloseSocket(thatSocket);
			}
			else {
				pMainMainInfo->rushThreadCounter++;

				if(pMainMainInfo->rushThreadCounter < 2) {
					warningMessage(ERROR_SLIGHT, "No free worker thread available, it may be necessary to enlarge the thread pool");
				}

				timerWait(&tmpSeconds, 0, THREAD_AGAIN);

				goto mainLoop;
			}
		}
	}

	/*
	 *
	 * Free allocated resources and terminate program.
	 *
	 */

	netCloseSocket(thisSocket);

	pMainMainInfo->threadEnd++;

	if(timerInit(TIMER_RESOLUTION_THREADSTOP, 0, timerStopThreads) == 0) {
		pMainMainInfo->timerThreadAccess = 1;

		for(i = 0; i < THREAD_TELSKIND; i++) {
			threadWake(&threadPool[i]);
		}

		pMainMainInfo->timerThreadAccess = 0;
	}
	else {
		for(i = 0; i < THREAD_TELSKIND; i++) {
			threadKill(&threadPool[i]);
		}
	}

	timesProcess(pMainThreadInfo);

	pidRemove();
	shmRemove(DAEMON_TELSKIND);

	free(threadPool);

	exitProcess(0);
	exit(0);
}
Esempio n. 7
0
/***
 * 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;
		}
	}
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
inline int parseQueryCmd(int type) {
	unsigned long events;
	
	switch(cmdRead()) {
	case 'C':
		switch(cmdRead()) {
		case 'M':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Continuous monitor"
				ShowValueU(d_displayTime);
				goto pqc_ok;
			case '=':
				// WRITE "Continuous monitor"
				cmdRead();
				ReadValueU(d_displayTime);
				goto pqc_ok;
			}
			goto pqc_error;
		}
		goto pqc_error;
	case 'E':
		switch(cmdRead()) {
		case 'R':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Event register"
				events = d_pendingEvents[EVENT_CLASS_GPS];
				events <<= 8;
				events |= d_pendingEvents[EVENT_CLASS_ODO];
				snprintf(d_outBuff, OUTPUT_BUFFER_SIZE, "%lu 0x%02X%02X",
						events,
						d_pendingEvents[EVENT_CLASS_GPS],
						d_pendingEvents[EVENT_CLASS_ODO]);
// 				Serial_printLine(d_outBuff);
				Serial_printValue(d_outBuff);
				
				// Resetting pending event
				d_pendingEvents[EVENT_CLASS_GPS] = EVENT_NONE;
				d_pendingEvents[EVENT_CLASS_ODO] = EVENT_NONE;
				
				// Releasgin interrupt pin
				pinMode(intReq, INPUT);
				
				goto pqc_ok;
			}
			goto pqc_error;
		}
		goto pqc_error;
	case 'I':
		switch(cmdRead()) {
		case 'T':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Interrupt timeout"
				ShowValueU(d_intrTimeout);
				goto pqc_ok;
			case '=':
				// WRITE "Interrupt timeout"
				cmdRead();
				ReadValueU(d_intrTimeout);
				goto pqc_ok;
			}
			goto pqc_error;
		}
		goto pqc_error;
	}

pqc_error:
	return ERROR;
pqc_ok:
	return OK;

}
Esempio n. 10
0
inline int parseGpsCmd(int type) {
	
	switch(cmdRead()) {
	case 'F':
		switch(cmdRead()) {
		case 'V':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Fix value"
				ShowValueU(gpsFix());
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;
	case 'G':
		switch(cmdRead()) {
		case 'S':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Ground speed"
				ShowValueD(gpsSpeed());
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;
	case 'H':
		switch(cmdRead()) {
		case 'P':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "HDOP"
				ShowValueD(gpsHdop());
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;
	case 'L':
		switch(cmdRead()) {
		case 'A':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Lat"
				if (gpsIsPosValid()) {
					ShowValueD(gpsLat());
				} else
					Serial_printStr("NA ");
				goto pgc_ok;
			}
			goto pgc_error;
		case 'O':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Lon"
				if (gpsIsPosValid()) {
					ShowValueD(gpsLon());
				} else
					Serial_printStr("NA ");
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;
	case 'P':
		switch(cmdRead()) {
		case 'S':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Power State"
				ShowValueU(d_gpsPowerState);
				goto pgc_ok;
			case '=':
				// WRITE "Power State"
				cmdRead();
				ReadValueU(d_gpsPowerState);
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;
	case 'S':
		switch(cmdRead()) {
		case 'C':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '=': // WRITE "GPS Command"
				cmdRead();
				ReadValueUL(d_gpsNextCmd);
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;

	case 'T':
		switch(cmdRead()) {
		case 'D':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Track Degree"
				ShowValueD(gpsDegree());
				goto pgc_ok;
			}
			goto pgc_error;
		}
		goto pgc_error;
	}

pgc_error:
	return ERROR;
pgc_ok:
	return OK;

}
Esempio n. 11
0
inline int parseAlarmCmd(int type) {
	
	switch(cmdRead()) {
	case 'E':
		switch(cmdRead()) { 
		case 'B':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Emergency Break"
				ShowValueUL(d_minEmergencyBreak);
				goto pac_ok;
			case '=':
				// WRITE "Emergency Break"
				cmdRead();
				ReadValueUL(d_minEmergencyBreak);
				goto pac_ok;
			}
			goto pac_error;
		}
		goto pac_error;
	case 'P':
		switch(cmdRead()) { 
		case 'C':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Pulse Count Interrupt"
				ShowValueU(d_distIntrPCount);
				goto pac_ok;
			case '=': // WRITE "Pulse Count Interrupt"
				cmdRead();
				ReadValueU(d_distIntrPCount);
				d_distIntrNext = d_pcount+d_distIntrPCount;
				goto pac_ok;
			}
			goto pac_error;
		}
		goto pac_error;

	case 'S':
		switch(cmdRead()) { 
		case 'L':
			switch(cmdLook()) {
			case LINE_TERMINATOR:
				cmdRead();
			case '+':
				// READ  "Speed Limit"
				ShowValueUL(d_minOverSpeed);
				goto pac_ok;
			case '=': // WRITE "Speed Limit"
				cmdRead();
				ReadValueUL(d_minOverSpeed);
				goto pac_ok;
			}
			goto pac_error;
		}
		goto pac_error;
	}

pac_error:
	return ERROR;
pac_ok:
	return OK;

}