diff --git a/master/master/config.h b/master/master/config.h --- a/master/master/config.h +++ b/master/master/config.h @@ -33,6 +33,8 @@ // Slave Sensors config (slavesensors.c) // -------------------------------------------------------------------------- +// NOT USED. Could integrate into slavesensors.c setup function for configurability eventually. +// Currently manual configuration of sensors is done in slavesensors.c #define SLAVE0_SENSORS BOARDTEMP #define SLAVE1_SENSORS BOARDTEMP | HUMIDITY | TEMPERATURE | PRESSURE | AMBIENTLIGHT #define SLAVE2_SENSORS BOARDTEMP | GEIGER @@ -103,7 +105,7 @@ // APRS comment: this goes in the comment portion of the APRS message. You // might want to keep this short. The longer the packet, the more vulnerable // it is to noise. -#define APRS_COMMENT "Custom payload data here, eventually..." +#define APRS_COMMENT "Payload data..." // Transmit the APRS sentence every X milliseconds #define APRS_TRANSMIT_PERIOD 5000 diff --git a/master/master/lib/aprs.c b/master/master/lib/aprs.c --- a/master/master/lib/aprs.c +++ b/master/master/lib/aprs.c @@ -15,9 +15,9 @@ #include "ax25.h" #include -const char *gps_aprs_lat = "omgmylatitude"; -const char *gps_aprs_lon = "omgmylongitude"; -const char *gps_time = "omgmygpstime"; +const char *gps_aprs_lat = "latitude"; +const char *gps_aprs_lon = "longitude"; +const char *gps_time = "gpstime"; float gps_altitude = 123.5; int gps_course = 5; int gps_speed = 13; diff --git a/master/master/lib/serparser.c b/master/master/lib/serparser.c --- a/master/master/lib/serparser.c +++ b/master/master/lib/serparser.c @@ -62,20 +62,20 @@ static void setParserState(uint8_t state // Receive data on USART -char buffmeh[16]; +char debugBuff[16]; ISR(USART0__RX_vect) { led_on(POWER); buffer[bufferDataPosition % BUFFER_SIZE] = UDR0; bufferDataPosition = (bufferDataPosition + 1) % BUFFER_SIZE; - /*sprintf(buffmeh, "bdp: %d, bpp: %d \r\n", bufferDataPosition, bufferParsePosition); - serial0_sendString((buffmeh)); */ + /*sprintf(debugBuff, "bdp: %d, bpp: %d \r\n", bufferDataPosition, bufferParsePosition); + serial0_sendString((debugBuff)); */ } -#define DEBUG +//#define DEBUG // Parse data from circular buffer int serparser_parse(void) @@ -94,14 +94,14 @@ int serparser_parse(void) if(byte == '[') // Start of frame; keep parsing { #ifdef DEBUG - serial0_sendString("start ok\r\n"); + serial0_sendString("start\r\n"); #endif setParserState(STATE_GETID); } else // Not start of frame, reset { #ifdef DEBUG - serial0_sendString("not start\r\n"); + //serial0_sendString("invalid\r\n"); #endif setParserState(STATE_RESET); return PARSERESULT_NODATA; // no valid start bit; better luck next time. run the function the next time around the main loop. @@ -114,7 +114,7 @@ int serparser_parse(void) if(byte == MODULE_ID) // Message intended for this module; keep parsing { #ifdef DEBUG - serial0_sendString("dest ok\r\n"); + serial0_sendString("dest\r\n"); #endif checksumCalc += byte; setParserState(STATE_GETDATATYPE); @@ -122,7 +122,7 @@ int serparser_parse(void) else // Transmission is intended for another module; reset { #ifdef DEBUG - serial0_sendString("bad dest\r\n"); + //serial0_sendString("bad dest\r\n"); #endif setParserState(STATE_RESET); } @@ -132,7 +132,7 @@ int serparser_parse(void) else if(parserState == STATE_GETDATATYPE) { #ifdef DEBUG - serial0_sendString("type ok\r\n"); + serial0_sendString("type\r\n"); #endif receivedDataType = byte; // Store the type of data receiving checksumCalc += byte; @@ -145,9 +145,9 @@ int serparser_parse(void) if (byte == ']') // End of frame { #ifdef DEBUG - serial0_sendString("eof ok\r\n"); - sprintf(buffmeh, "recvd %d bytes data\r\n", dataLength); - serial0_sendString((buffmeh)); + serial0_sendString("eof\r\n"); + sprintf(debugBuff, "%d B, sum=%d\r\n", dataLength, checksumCalc); + serial0_sendString((debugBuff)); #endif setParserState(STATE_GETCHECKSUM); @@ -158,7 +158,7 @@ int serparser_parse(void) else // Still receiving data { #ifdef DEBUG - serial0_sendString("data ok\r\n"); + serial0_sendString("data\r\n"); #endif receivedPayload[dataLength] = byte; dataLength++; @@ -167,7 +167,7 @@ int serparser_parse(void) // Data buffer overrun protection if(dataLength > MAX_PAYLOAD_LEN) { #ifdef DEBUG - serial0_sendString("data ovf\r\n"); + serial0_sendString("ovf\r\n"); #endif setParserState(STATE_RESET); return PARSERESULT_FAIL; @@ -185,11 +185,17 @@ int serparser_parse(void) { // TODO: Compare checksums if(byte == checksumCalc) { - serial0_sendString("checksum ok\r\n"); + serial0_sendString("check\r\n"); + setParserState(STATE_RESET); + return PARSERESULT_PARSEOK; } else { - serial0_sendString("checksum fail\r\n"); + serial0_sendString("bcheck\r\n"); + setParserState(STATE_RESET); + return PARSERESULT_FAIL; } + + /* if(bufferParsePosition == bufferDataPosition) { // We are at the end of the line. No more data to parse. @@ -203,6 +209,7 @@ int serparser_parse(void) // return now so we hit it the next time around return PARSERESULT_PARSEOK; } + */ } } return PARSERESULT_NODATA; diff --git a/master/master/lib/slavesensors.c b/master/master/lib/slavesensors.c --- a/master/master/lib/slavesensors.c +++ b/master/master/lib/slavesensors.c @@ -15,6 +15,7 @@ #include "../config.h" #include "serial.h" #include "serparser.h" +#include "slavesensors.h" // Serial Commands enum sensorTypes // CMD ID# @@ -29,68 +30,120 @@ enum sensorTypes // CMD ID# CAMERA = (1<<5), }; -uint8_t receptionFinished = 0; uint8_t currentSlave = 0; uint8_t currentSlaveSensor = 0; uint8_t maxSlave = 8; -uint16_t slaves[8]; +uint8_t maxSensorsPerSlave = 8; +uint16_t slaves[8][8]; + +bool requesting = false; void slavesensors_setup() { // Empty array - for(int i=0; i<8; i++) + for(int i=0; i= maxSlave && weFinishedTHeLastSlaveSensor) + // If we finished all sensors for all slaves + if(slaves[currentSlave+1][0] == NONE && slaves[currentSlave][currentSlaveSensor+1] == NONE) // If next sensor is none and finished all slaves, reset { currentSlave = 0; - return false; // We're done for now! + currentSlaveSensor = 0; + requesting = false; } + // If we finished up one slave, go to the next + else if(slaves[currentSlave][currentSlaveSensor+1] == NONE) + { + currentSlave++; + currentSlaveSensor = 0; + requesting = true; + slavesensors_request(); + } + // If we haven't finished a slave (or all of them), just get the next sensor of the current slave else { - // Request data from the next slave - currentSlave++; - - // Need to check the next bit over to see if it has that... - - serial_sendCommand(currentSlave, 'a', ""); // send req for data - return true; // Keep going... + // request data for the current sensor of the current slave + currentSlaveSensor++; + requesting = true; + slavesensors_request(); } } - // TODO: Handle errors. If we got a parse fail, then we probably need to retransmit the message. etc. - else + + // If fail, try retransmit. Or we could skip and hit it next time. + // TODO: Maximum number of retransmissions + else if(parseResult == PARSERESULT_FAIL) { + if(requesting) { + slavesensors_request(); // re-request + } + } + + + else if(parseResult == PARSERESULT_STILLPARSING) { - return true; // Keep going... + return; // do nothing + } + else { + // something is terribly wrong! + return; } } \ No newline at end of file diff --git a/master/master/lib/slavesensors.h b/master/master/lib/slavesensors.h --- a/master/master/lib/slavesensors.h +++ b/master/master/lib/slavesensors.h @@ -15,9 +15,12 @@ #define SLAVESENSORS_H_ #include +#include +bool slavesensors_isrequesting(); void slavesensors_setup(); -bool slavesensors_process(); - +void slavesensors_startprocess(); +static void slavesensors_request(); +void slavesensors_process(uint8_t parseResult); #endif /* SLAVESENSORS_H_ */ \ No newline at end of file diff --git a/master/master/master.c b/master/master/master.c --- a/master/master/master.c +++ b/master/master/master.c @@ -64,12 +64,8 @@ int main(void) uint32_t lastAprsBroadcast = 0; uint32_t lastLog = 0; - // If we are currently processing sensor data - bool isProcessing = false; - // Result of last parser run int parseResult = PARSERESULT_NODATA; - bool haveDataToHandle = false; // Write CSV header to SD card logger_log("ProgramTime,LastAprsBroadcast,LastLog\n"); @@ -106,19 +102,18 @@ int main(void) //serial0_sendString("Initiating APRS transmission...\r\n"); // Start getting values for next transmission - isProcessing = true; + // TODO: Check ifRequesting first. If we are still requesting, something is terribly wrong. + if(!slavesensors_isrequesting()) + { + slavesensors_startprocess(); + } lastAprsBroadcast = time_millis(); } parseResult = serparser_parse(); - - // TODO: If we receive a command, we should still process it even if we aren't isProcessing, right? - // Maybe we should isolate the received command handling ("Execution") and the issuing of requests. - //if(isProcessing) - //{ - // isProcessing = slavesensors_process(parseResult); - //} + slavesensors_process(parseResult); + wdt_reset(); } } \ No newline at end of file