diff --git a/master/master/config.h b/master/master/config.h --- a/master/master/config.h +++ b/master/master/config.h @@ -44,6 +44,9 @@ #define SLAVE6_SENSORS NONE #define SLAVE7_SENSORS NONE +// MAX_SLAVES should be one more than the number of slaves we actually have (loop ends when next slave first sensor is NONE) +#define MAX_SLAVES 8 +#define MAX_SLAVE_SENSORS 8 // -------------------------------------------------------------------------- // Command Parser config (serparser.c) 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 @@ -32,17 +32,31 @@ uint8_t parserState = STATE_RESET; uint8_t lastParserState = STATE_RESET; // Length of current payload data (and checksum) -uint8_t dataLength = 0; +uint8_t payloadLength = 0; // Data and checksum of most recent transmission char receivedPayload[MAX_PAYLOAD_LEN]; // Payload type ID of the sensor of most recent transmission -char receivedDataType = 0; +char receivedPayloadType = 0; // Checksum to be calculated and then compared to the received checksum char checksumCalc = 0; +// Accessors +uint8_t getPayloadLength() +{ + return payloadLength; +} +uint8_t* getPayload() +{ + return receivedPayload; +} +uint8_t getPayloadType() { + return receivedPayloadType; +} + + // Could inline if program space available static void setParserState(uint8_t state) { @@ -52,7 +66,7 @@ static void setParserState(uint8_t state // If resetting, clear vars if(state == STATE_RESET) { - dataLength = 0; + payloadLength = 0; checksumCalc = 0; } @@ -66,7 +80,6 @@ char debugBuff[16]; ISR(USART0__RX_vect) { - led_on(POWER); buffer[bufferDataPosition % BUFFER_SIZE] = UDR0; bufferDataPosition = (bufferDataPosition + 1) % BUFFER_SIZE; /*sprintf(debugBuff, "bdp: %d, bpp: %d \r\n", bufferDataPosition, bufferParsePosition); @@ -134,7 +147,7 @@ int serparser_parse(void) #ifdef DEBUG serial0_sendString("type\r\n"); #endif - receivedDataType = byte; // Store the type of data receiving + receivedPayloadType = byte; // Store the type of data receiving checksumCalc += byte; setParserState(STATE_GETDATA); } @@ -144,11 +157,13 @@ int serparser_parse(void) { if (byte == ']') // End of frame { - #ifdef DEBUG + //#ifdef DEBUG serial0_sendString("eof\r\n"); - sprintf(debugBuff, "%d B, sum=%d\r\n", dataLength, checksumCalc); + sprintf(debugBuff, "%d B, sum=%d\r\n", payloadLength, checksumCalc); serial0_sendString((debugBuff)); - #endif + //#endif + + receivedPayload[payloadLength] = 0; // null-terminate string for atoi setParserState(STATE_GETCHECKSUM); // Checksum is now after the close bracket to solve bug FS#29 @@ -160,12 +175,12 @@ int serparser_parse(void) #ifdef DEBUG serial0_sendString("data\r\n"); #endif - receivedPayload[dataLength] = byte; - dataLength++; + receivedPayload[payloadLength] = byte; + payloadLength++; checksumCalc += byte; // Data buffer overrun protection - if(dataLength > MAX_PAYLOAD_LEN) { + if(payloadLength > MAX_PAYLOAD_LEN) { #ifdef DEBUG serial0_sendString("ovf\r\n"); #endif @@ -192,6 +207,7 @@ int serparser_parse(void) else { serial0_sendString("bcheck\r\n"); setParserState(STATE_RESET); + return PARSERESULT_FAIL; } diff --git a/master/master/lib/serparser.h b/master/master/lib/serparser.h --- a/master/master/lib/serparser.h +++ b/master/master/lib/serparser.h @@ -32,6 +32,12 @@ enum parseStates STATE_GETCHECKSUM, }; + +// Accessors +uint8_t getPayloadLength(); +uint8_t* getPayload(); +uint8_t getPayloadType(); + // Prototypes int serparser_parse(void); 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 @@ -17,34 +17,19 @@ #include "serparser.h" #include "slavesensors.h" -// Serial Commands -enum sensorTypes // CMD ID# -{ - NONE = 0, - BOARDTEMP = (1<<0), - PRESSURE = (1<<1), - GEIGER = (1<<2), - TEMPERATURE = (1<<3), - HUMIDITY = (1<<4), - AMBIENTLIGHT = (1<<5), - CAMERA = (1<<5), -}; - uint8_t currentSlave = 0; uint8_t currentSlaveSensor = 0; -uint8_t maxSlave = 8; -uint8_t maxSensorsPerSlave = 8; -uint16_t slaves[8][8]; +uint16_t slaves[MAX_SLAVES][MAX_SLAVE_SENSORS]; bool requesting = false; void slavesensors_setup() { // Empty array - for(int i=0; i #include +// Serial Commands +enum sensorTypes // CMD ID# +{ + NONE = 0, + BOARDTEMP, + PRESSURE, + GEIGER, + TEMPERATURE, + HUMIDITY, + AMBIENTLIGHT, + CAMERA, +}; + bool slavesensors_isrequesting(); void slavesensors_setup(); void slavesensors_startprocess(); -static void slavesensors_request(); +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 @@ -30,6 +30,7 @@ #include "lib/looptime.h" #include "lib/slavesensors.h" #include "lib/serparser.h" +#include "lib/sensordata.h" void micro_setup() { @@ -41,24 +42,29 @@ int main(void) // Initialize libraries time_setup(); + micro_setup(); watchdog_setup(); + led_setup(); + serial0_setup(); serial1_setup(); + + sensordata_setup(); // must happen before sensors/logger/afsk slavesensors_setup(); logger_setup(); afsk_setup(); - serial0_sendString("\r\n\r\n---------------------------------\r\n"); - serial0_sendString("HAB Controller 1.0 - Initialized!\r\n"); - serial0_sendString("---------------------------------\r\n\r\n"); + //serial0_sendString("\r\n\r\n---------------------------------\r\n"); + //serial0_sendString("HAB Controller 1.0 - Initialized!\r\n"); + //serial0_sendString("---------------------------------\r\n\r\n"); + serial0_sendString("\r\n\r\nHELLO.\r\n\r\n"); - //led_on(POWER); + led_on(POWER); // Buffer for string operations char logbuf[32]; - const char* logBufPtr = logbuf; // Software timers uint32_t lastAprsBroadcast = 0; @@ -72,24 +78,12 @@ int main(void) while(1) { - // Periodic: Logging if(time_millis() - lastLog > LOGGER_RATE) { - - // TODO: Acquire data from daughterboards - // This will be complicated because we need timeouts / unreliable transmission, etc - // - // For each daughterboard... - // 1. Send request to daughterboard for sensor data - // 2. Wait for response from daughterboard (timeout!) - // 3. Put data into local variables for transmission / logging - led_on(STAT); - snprintf(logbuf, 32, "%lu,%lu,%lu,\r\n", time_millis(), lastAprsBroadcast,lastLog); - logger_log(logbuf); - //serial0_sendString("SD Logger: "); - //serial0_sendString(logBufPtr); + //snprintf(logbuf, 32, "%lu,%lu,%lu,\r\n", time_millis(), lastAprsBroadcast,lastLog); + //logger_log(logbuf); led_off(STAT); lastLog = time_millis(); } @@ -102,9 +96,12 @@ int main(void) //serial0_sendString("Initiating APRS transmission...\r\n"); // Start getting values for next transmission - // TODO: Check ifRequesting first. If we are still requesting, something is terribly wrong. - if(!slavesensors_isrequesting()) + if(slavesensors_isrequesting()) { + // TODO: something is terribly wrong + } + else + { slavesensors_startprocess(); } diff --git a/master/master/master.cproj b/master/master/master.cproj --- a/master/master/master.cproj +++ b/master/master/master.cproj @@ -186,6 +186,12 @@ compile + + compile + + + compile + compile