uint8_t temperature_GetReading (tmprData *tr) { r = temperature_InitOneShotReading(); if (r) { tr->verification = r; return r; } // temperature conversion time, typically 30ms for (Timer2 = 4; Timer2; ); // Wait for 40ms to be sure // read ambient temperature from the device r = I2C_Start(); // len = sprintf(str, "\n\r I2C_Start: 0x%x\n\r", r); // outputStringToUART0(str); if (r == TW_START) { r = I2C_Write(TCN75A_ADDR_WRITE); // address the device, say we are going to write // len = sprintf(str, "\n\r I2C_Write(TCN75A_ADDR_WRITE): 0x%x\n\r", r); // outputStringToUART0(str); if (r == TW_MT_SLA_ACK) { r = I2C_Write(TCN75A_TA); // len = sprintf(str, "\n\r I2C_Write(TCN75A_CONFIG): 0x%x\n\r", r); // outputStringToUART0(str); if (r == TW_MT_DATA_ACK) { r = I2C_Start(); // restart, prep to read // len = sprintf(str, "\n\r I2C_Start: 0x%x\n\r", r); // outputStringToUART0(str); if (r == TW_REP_START) { r = I2C_Write(TCN75A_ADDR_READ); // address the device, say we are going to read // len = sprintf(str, "\n\r I2C_Write(TCN75A_ADDR_READ): 0x%x\n\r", r); // outputStringToUART0(str); if (r == TW_MR_SLA_ACK) { tr->tmprHiByte = I2C_Read(1); // do ACK, because not last byte tr->tmprLoByte = I2C_Read(0); // do NACK, since this is the last byte // len = sprintf(str, "\n\r I2C_READ(tr->tmprHiByte): 0x%x\n\r", (tr->tmprHiByte)); // len = sprintf(str, "\n\r I2C_READ(tr->tmprHiByte): %d\n\r", (tr->tmprHiByte)); // outputStringToUART0(str); I2C_Stop(); tr->verification = I2C_OK; return I2C_OK; } else { // could not address device to READ I2C_Stop(); tr->verification = errNoI2CAddrAckRead; return errNoI2CAddrAckRead; } } else { // could not reSTART I2C_Stop(); tr->verification = errNoI2CRepStart; return errNoI2CRepStart; } } else { // could not write to device I2C_Stop(); tr->verification = errNoI2CDataAck; return errNoI2CDataAck; } } else { // could not address device I2C_Stop(); tr->verification = errNoI2CAddressAck; return errNoI2CAddressAck; } // outputStringToUART0("\n\r STOP completed \n\r"); } else { // could not START tr->verification = errNoI2CStart; return errNoI2CStart; } }
void checkForCommands (void) { char c; char tmpStr[commandBufferLen]; while (uart0_char_waiting_in()) { c = uart0_getchar(); if (c == 0x08) { // backspace if (commandBufferPtr > commandBuffer) { // if there is anything to backspace commandBufferPtr--; } } if (c == 0x0d) // if carriage-return c = 0x0a; // substitute linefeed if (c == 0x0a) { // if linefeed, attempt to parse the command stayRoused(120); // keep system roused *commandBufferPtr++ = '\0'; // null terminate switch (commandBuffer[0]) { // command is 1st char in buffer case '$': { // an NMEA string from the GPS // outputStringToUART1("\r\n NMEA from GPS \r\n"); strcpy(tmpStr, commandBuffer + 1); if (!strncmp(tmpStr,"GPRMC",5)) { outputStringToUART1(tmpStr); outputStringToUART1("\r\n"); } break; } case 'V': case 'v': { // show firmware version outputStringToBothUARTs(versionString); break; } case 'T': case 't': { // set time // get info from commandBuffer before any UART output, // because in some configurations any Tx feeds back to Rx strcpy(tmpStr, commandBuffer + 1); if (!isValidDateTime(tmpStr)) { outputStringToUART0("\r\n Invalid timestamp\r\n"); break; } if (!isValidTimezone(tmpStr + 20)) { outputStringToUART0("\r\n Invalid hour offset\r\n"); break; } outputStringToUART0("\r\n Time changed from "); strcat(strJSON, "\r\n{\"timechange\":{\"from\":\""); intTmp1 = rtc_readTime(&dt_RTC); datetime_getstring(datetime_string, &dt_RTC); strcat(strJSON, datetime_string); outputStringToUART0(datetime_string); datetime_getFromUnixString(&dt_tmp, tmpStr, 0); rtc_setTime(&dt_tmp); strcat(strJSON, "\",\"to\":\""); outputStringToUART0(" to "); datetime_getstring(datetime_string, &dt_tmp); strcat(strJSON, datetime_string); outputStringToUART0(datetime_string); strcat(strJSON, "\",\"by\":\"hand\"}}\r\n"); outputStringToUART0("\r\n"); stateFlags1 |= (1<<writeJSONMsg); // log JSON message on next SD card write stateFlags1 |= (1<<writeDataHeaders); // log data column headers on next SD card write rtcStatus = rtcTimeManuallySet; outputStringToUART0(strHdr); intTmp1 = rtc_setupNextAlarm(&dt_CurAlarm); timeZoneOffset = dt_tmp.houroffset; timeFlags &= ~(1<<timeZoneWritten); // flag that time zone needs to be written syncTimeZone(); // attempt to write the time zone; will retry later if e.g. power too low // /* startTimer1ToRunThisManySeconds(30); // keep system Roused */ break; } case 'L': case 'l': { // experimenting with the accelerometer Leveling functions uint8_t rs, val; // outputStringToUART0("\r\n about to initialize ADXL345\r\n"); // rs = initializeADXL345(); // if (rs) { // len = sprintf(str, "\n\r initialize failed: %d\n\r", rs); // outputStringToUART0(str); // break; // } // outputStringToUART0("\r\n ADXL345 initialized\r\n"); // bring out of low power mode // use 100Hz for now ; bit 4 set = reduced power, higher noise rs = setADXL345Register(ADXL345_REG_BW_RATE, 0x0a); if (rs) { len = sprintf(str, "\n\r could not set ADXL345_REG_BW_RATE: %d\n\r", rs); outputStringToUART0(str); break; } // for (iTmp = 1; iTmp < 6; iTmp++) { // try reading bit 7, INT_SOURCE.DATA_READY // rs = readADXL345Register(ADXL345_REG_INT_SOURCE, &val); // if (rs) { // len = sprintf(str, "\n\r could not read ADXL345_REG_INT_SOURCE: %d\n\r", rs); // outputStringToUART0(str); // break; // } // if (val & (1 << 7)) { // len = sprintf(str, "\n\r INT_SOURCE.DATA_READY set: 0x%x\n\r", val); // } else { // len = sprintf(str, "\n\r INT_SOURCE.DATA_READY clear: 0x%x\n\r", val); // } // outputStringToUART0(str); // } // outputStringToUART0("\r\n set ADXL345_REG_BW_RATE, 0x0a \r\n"); if (readADXL345Axes (&accelData)) { outputStringToUART0("\r\n could not get ADXL345 data\r\n"); break; } // set low power bit (4) and 25Hz sampling rate, for 40uA current rs = setADXL345Register(ADXL345_REG_BW_RATE, 0x18); if (rs) { len = sprintf(str, "\n\r could not set ADXL345_REG_BW_RATE: %d\n\r", rs); outputStringToUART0(str); break; } // len = sprintf(str, "\n\r X = %i, Y = %i, Z = %i\n\r", (unsigned int)((int)x1 << 8 | (int)x0), // (unsigned int)((int)y1 << 8 | (int)y0), (unsigned int)((int)z1 << 8 | (int)z0)); len = sprintf(str, "\n\r X = %i, Y = %i, Z = %i\n\r", accelData.xWholeWord, accelData.yWholeWord, accelData.zWholeWord); outputStringToUART0(str); break; } case 'C': case 'c': { len = sprintf(str, "\n\r test write to SD card 0x%x\n\r", (disk_initialize(0))); intTmp1 = writeCharsToSDCard(str, len); // sd card diagnostics outputStringToUART0("\r\n test write to SD card\r\n"); // len = sprintf(str, "\n\r PINB: 0x%x\n\r", (PINB)); // send_cmd(CMD0, 0) // len = sprintf(str, "\n\r CMD0: 0x%x\n\r", (send_cmd(CMD0, 0))); break; } case 'P': case 'p': { // force SD card power off outputStringToUART0("\r\n turning SD card power off\r\n"); turnSDCardPowerOff(); outputStringToUART0("\r\n SD card power turned off\r\n"); break; } case 'A': case 'a': { findADXL345(); break; } case 'F': case 'f': { // experimenting with temperature functions if (!temperature_InitOneShotReading()) { // temperature conversion time, typically 30ms for (Timer2 = 4; Timer2; ); // Wait for 40ms to be sure if (!temperature_GetReading(&temperatureReading)) { len = sprintf(str, "\n\r Temperature: %d degrees C\n\r", (temperatureReading.tmprHiByte)); outputStringToUART0(str); } } break; } //case 'I': case 'i': //{ // experimenting with irradiance functions //uint8_t result; //result = getIrrReading(TSL2561_UpLooking, TSL2561_CHANNEL_BROADBAND, &irrReadings[0]); //if (!result) { //len = sprintf(str, "\n\r Val: %lu; Mult: %lu; Irr: %lu \n\r", //(unsigned long)irrReadings[0].irrWholeWord, (unsigned long)irrReadings[0].irrMultiplier, //(unsigned long)((unsigned long)irrReadings[0].irrWholeWord * (unsigned long)irrReadings[0].irrMultiplier)); //} else { //len = sprintf(str, "\n\r Could not get irradiance, err code: %d", result); //} //outputStringToUART0(str); //break; //} // //case 'B': case 'b': //{ // experimenting with reading the battery voltage using the Analog to Digital converter //len = sprintf(str, "\n\r Hi byte: %d \n\r", readCellVoltage(&cellVoltageReading)); //outputStringToUART0(str); //len = sprintf(str, "\n\r 16bit value: %d \n\r", cellVoltageReading.adcWholeWord); //outputStringToUART0(str); // // //break; //} // // case 'D': case 'd': { // output file 'D'ata (or 'D'ump) outputStringToUART0("\r\n (data dump only works from Bluetooth)\r\n"); break; } // put other commands here default: { // if no valid command, echo back the input outputStringToUART0("\r\n> "); outputStringToUART0(commandBuffer); outputStringToUART0("\r\n"); // startTimer1ToRunThisManySeconds(30); // keep system Roused another two minutes break; } } // switch (commandBuffer[0]) commandBuffer[0] = '\0'; commandBufferPtr = commandBuffer; // "empty" the command buffer } else { // some other character // ignore repeated linefeed (or linefeed following carriage return) or carriage return if (!((c == 0x0a) || (c == 0x0a))) { if (commandBufferPtr < (commandBuffer + commandBufferLen - 1)) // if there is room *commandBufferPtr++ = c; // append char to the command buffer } } // done parsing character } // while (1) } // end of checkForCommands