diff --git a/slave/slave/config.h b/slave/slave/config.h --- a/slave/slave/config.h +++ b/slave/slave/config.h @@ -34,8 +34,9 @@ //I2C Addresses #define EEPROM_ADDR 0xA0 // Read 0xA1 - Write 0xA0 #define BOARDTEMP_ADDR 0x90 // Read 0x91 - Write 0x90 - #define PRESSURE_ADDR 0xB1 //THIS VALUE IS WRONG - #define HUMID_ADDR 0xB4 //THIS VALUE IS WRONG + #define PRESSURE_ADDR 0xEF // Read 0xEF - Write 0xEE + #define HUMID_ADDR 0x27 // Read 0x27 - Write 0x26 + #define LIGHT_ADDR 0x95 // Read 0x95 - Write 0x94 #define RTC_ADDR 0xB2 //DEBUG [Used for testing] // Read 0xA3 - Write 0xA2 diff --git a/slave/slave/lib/masterComm.c b/slave/slave/lib/masterComm.c --- a/slave/slave/lib/masterComm.c +++ b/slave/slave/lib/masterComm.c @@ -14,47 +14,155 @@ #include "serparser.h" #include "inputOutput.h" +uint8_t dataTypes; char buff2[64]; -void masterComm_send() + +char masterComm_checksum(const char* stringPtr) +{ + char sum = 0; + while(*stringPtr != 0x00) + { + sum += *stringPtr; + stringPtr++; + } + return sum; +} + + +void masterComm_types() { - serial0_sendString("[@"); switch(io_getModuleId()) { case 0: // Generic - snprintf(buff2,64,"%u",DATATYPES_GENERIC); + dataTypes = DATATYPES_GENERIC; break; case 1: // Sensors - snprintf(buff2,64,"%u",DATATYPES_SENSOR); + dataTypes = DATATYPES_SENSOR; break; case 2: // Geiger - snprintf(buff2,64,"%u",DATATYPES_GEIGER); + dataTypes = DATATYPES_GEIGER; break; case 3: // Camera - snprintf(buff2,64,"%u",DATATYPES_CAMERA); + dataTypes = DATATYPES_CAMERA; break; default: - snprintf(buff2,64,"%u",DATATYPES_GENERIC); + dataTypes = DATATYPES_GENERIC; break; - } - - serial0_sendString(buff2); - - - - serial0_sendString("got data\r\n"); + } } -void masterComm_check() +void masterComm_modules() +{ + // Send BoardTemperature (Common for all modules) + serial0_sendString("["); + snprintf(buff2,64,"1%u",sensors_getBoardTemp()); + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); + + // Send module specific sensor readings + switch(io_getModuleId()) + { + case 0: + // Generic + + break; + + case 1: + // Sensors + + // Send SPI Temperature (Air) + serial0_sendString("["); + snprintf(buff2,64,"2%u",sensors_getSpiTemp()); + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); + + // Send Ambient Light (Needs to be formatted) + serial0_sendString("["); + snprintf(buff2,64,"3%u",geiger_getCpm()); //FIX + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); + +/* + // Send CPM (radiation) + serial0_sendString("["); + snprintf(buff2,64,"7%u",geiger_getCpm()); + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); + + // Send CPM (radiation) + serial0_sendString("["); + snprintf(buff2,64,"7%u",geiger_getCpm()); + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); + + // Send CPM (radiation) + serial0_sendString("["); + snprintf(buff2,64,"7%u",geiger_getCpm()); + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); +*/ + + break; + + case 2: + // Geiger + + // Send CPM (radiation) + serial0_sendString("["); + snprintf(buff2,64,"7%u",geiger_getCpm()); + serial0_sendString(buff2); + serial0_sendString("]"); + serial0_sendString(masterComm_checksum(buff2)); + + break; + + case 3: + // Camera + + break; + + default: + + break; + } +} + + +void masterComm_send() +{ + masterComm_types(); // Calculates how many data types to send + + // Return resquest with number of data types to be sent + serial0_sendString("["); // Send opening bracket + snprintf(buff2,64,"@%u",dataTypes); // Send package (@ reply and number of data types) + serial0_sendString(buff2); + serial0_sendString("]"); // Send closing bracket + serial0_sendString(masterComm_checksum(buff2)); // Calculate and send checksum + + masterComm_modules(); // Send sensor data + + + serial0_sendString("got request\r\n"); //DEBUG +} + + +void masterComm_checkParser() { if (serparser_parse() == PARSERESULT_PARSEOK) { diff --git a/slave/slave/lib/masterComm.h b/slave/slave/lib/masterComm.h --- a/slave/slave/lib/masterComm.h +++ b/slave/slave/lib/masterComm.h @@ -8,9 +8,12 @@ #ifndef MASTERCOMM_H_ #define MASTERCOMM_H_ - +char masterComm_checksum(const char* stringPtr); -void masterComm_check(); // Runs parser and checks for data request +void masterComm_types(); // Calculates the number of types the module has +void masterComm_modules(); // Sends sensor data depending on module + +void masterComm_checkParser(); // Runs parser and checks for data request void masterComm_send(); // Sends data after being requested diff --git a/slave/slave/lib/sensors.c b/slave/slave/lib/sensors.c --- a/slave/slave/lib/sensors.c +++ b/slave/slave/lib/sensors.c @@ -17,6 +17,9 @@ int16_t spiTemp; // Thermocouple Temperature (from spi) int8_t boardTemp; // Board Temperature (from i2c) +uint16_t pressure; // Pressure (from i2c) +//int humid; // Humidity (from i2c) +uint8_t light; // Lux reading (from i2c) void sensors_readSpiTemp() @@ -52,6 +55,33 @@ void sensors_readBoardTemp() boardTemp = boardTemp - 3; // Linear offset } +void sensors_readPressure() +{//needs editing + pressure = i2c_read(PRESSURE_ADDR, 0xF6); + pressure = pressure << 8; + pressure = pressure | i2c_read(PRESSURE_ADDR, 0xF7); +} + +void sensors_readHumid() +{ + //humid = i2c_read(HUMID_ADDR, 0xXX); +} + +void sensors_readLight() +{ + light = i2c_read(LIGHT_ADDR, 0x03); + // light = light << 4; + // light = light | (0x0F & i2c_read(LIGHT_ADDR, 0x04)); // This can be used to read in the 4 LSBs from the second register + // FOR FIRST BYTE: + // Lux = 2^(exponent)*mantissa*0.72 + // exponent = 8xE3 + 4xE2 + 2xE1 + E0 + // mantissa = 8xM7 + 4xM6 + 2xM5 + M4 + // FOR BOTH BYTES: + // Lux = 2^(exponent)*mantissa*0.045 + // exponent = 8xE3 + 4xE2 + 2xE1 + E0 + // mantissa = 128xM7 + 64xM6 + 32xM5 + 16xM4 + 8xM3 + 4xM2 + 2xM1 + M0 +} + int16_t sensors_getSpiTemp(void) // Gets spi temperature from variable { return spiTemp; @@ -62,3 +92,17 @@ int8_t sensors_getBoardTemp(void) // Get return boardTemp; } +uint16_t sensors_getPressure(void) +{ + return pressure; +} + +//int sensors_getHumid(void) +//{ + //return humid; +//} + +uint8_t sensors_getLight(void) +{ + return light; +} \ No newline at end of file diff --git a/slave/slave/lib/sensors.h b/slave/slave/lib/sensors.h --- a/slave/slave/lib/sensors.h +++ b/slave/slave/lib/sensors.h @@ -12,8 +12,14 @@ void sensors_readSpiTemp(void); // Reads spi temperature void sensors_readBoardTemp(void); // Reads board temperature +void sensors_readPressure(void); // Reads pressure +void sensors_readHumid(void); // Reads humidity +void sensors_readLight(void); // Reads lux int16_t sensors_getSpiTemp(void); // Gets spi temperature from variable int8_t sensors_getBoardTemp(void); // Gets board temperature from variable +uint16_t sensors_getPressure(void); // Gets pressure from variable +//int sensors_getHumid(void); // Gets humidity from variable +uint8_t sensors_getLight(void); // Gets lux from variable #endif /* SENSORS_H_ */ \ No newline at end of file diff --git a/slave/slave/slave.cproj b/slave/slave/slave.cproj --- a/slave/slave/slave.cproj +++ b/slave/slave/slave.cproj @@ -20,7 +20,7 @@ false 0 - 3.1.3 + 2.11.1 ISP com.atmel.avrdbg.tool.ispmk2