diff --git a/master/master/config.h b/master/master/config.h --- a/master/master/config.h +++ b/master/master/config.h @@ -15,6 +15,8 @@ #include +// NOTE: Some settings may be overridden by SD card config.ini parameters + // -------------------------------------------------------------------------- // Hardware settings // -------------------------------------------------------------------------- @@ -38,7 +40,7 @@ #define HEATER_THRESHOLD 5 // Regulate to 5 degrees Celsius // Touchdown buzzer -#define BUZZER_RATE 5000 +#define BUZZER_RATE 7000 #define BUZZER_DURATION 1000 #define BUZZER_FAILSAFE_DURATION 9600000 // 160min #define BUZZER_TRIGGER_MINDURATION 2700000 // 45min @@ -53,12 +55,13 @@ #define ERROR_SD_INIT 1 #define ERROR_SD_PARTITION 2 #define ERROR_SD_FILE 3 -#define ERROR_XBEETIMEOUT 4 -#define ERROR_FATAL 5 -#define ERROR_ATFAIL 6 -#define ERROR_EXITAT 7 -#define ERROR_INFOTEXT 8 -#define ERROR_WATCHDOG 9 +#define ERROR_CONFIGPARSE 4 +#define ERROR_XBEETIMEOUT 5 +#define ERROR_FATAL 6 +#define ERROR_ATFAIL 7 +#define ERROR_EXITAT 8 +#define ERROR_INFOTEXT 9 +#define ERROR_WATCHDOG 10 // !!! Please specify/update detailed messages for these error codes in logger.c // -------------------------------------------------------------------------- @@ -164,7 +167,7 @@ #define WATCHDOG_PROGTIMER_EEPROM_ADDR 0x20 // Written to the beginning of every log file -#define LOGGER_HEADERTEXT "HAB Control Master - 1.1\n" +#define LOGGER_HEADERTEXT "HAB Master v1.2\n" // Log to SD card every X milliseconds #define LOGGER_RATE 1000 @@ -173,4 +176,25 @@ #define LEDCYCLE_RATE 100 + +// -------------------------------------------------------------------------- +// Dynamic Configuration (iniparse.c) - You probably don't want to change this +// -------------------------------------------------------------------------- +#include +typedef struct +{ + bool blackout_enable; + uint32_t blackout_timeout; + int8_t heater_threshold; + uint32_t buzzer_failsafe_duration; + uint32_t buzzer_trigger_minduration; + uint32_t buzzer_trigger_maxaltitude; + uint32_t datarequest_rate; + char s_callsign[10]; + uint8_t s_callsign_id; + uint32_t aprs_transmit_period; +} configuration; + +configuration* sysconfig; + #endif /* CONFIG_H_ */ \ No newline at end of file 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 @@ -27,7 +27,7 @@ void aprs_send() { const struct s_address addresses[] = { {D_CALLSIGN, D_CALLSIGN_ID}, // Destination callsign - {S_CALLSIGN, S_CALLSIGN_ID}, // Source callsign (-11 = balloon, -9 = car) + {sysconfig->s_callsign, sysconfig->s_callsign_id}, // Source callsign (-11 = balloon, -9 = car) #ifdef DIGI_PATH1 {DIGI_PATH1, DIGI_PATH1_TTL}, // Digi1 (first digi in the chain) #endif diff --git a/master/master/lib/gps.c b/master/master/lib/gps.c --- a/master/master/lib/gps.c +++ b/master/master/lib/gps.c @@ -97,6 +97,11 @@ char* get_hdop() } char altitude[10]; //xxxxxx.x +char* get_gpsaltitude() +{ + return altitude; +} + char wgs84Height[8]; //sxxx.x char lastUpdated[8]; //blank - included for testing char stationID[8]; //blank - included for testing diff --git a/master/master/lib/gps.h b/master/master/lib/gps.h --- a/master/master/lib/gps.h +++ b/master/master/lib/gps.h @@ -26,6 +26,7 @@ char* get_longitudeLSBs(); char* get_latitudeTrimmed(); char* get_latitudeLSBs(); char* get_timestamp(); +char* get_gpsaltitude(); char* get_speedKnots(); char* get_course(); char* get_hdop(); diff --git a/master/master/lib/heater.c b/master/master/lib/heater.c --- a/master/master/lib/heater.c +++ b/master/master/lib/heater.c @@ -17,12 +17,12 @@ void heater_regulateTemp() { // Gets board temperature and enables heater if below threshold - if (sensors_getBoardTemp() <= HEATER_THRESHOLD) + if (sensors_getBoardTemp() <= sysconfig->heater_threshold) { led_on(LED_HEAT); led_on(LED_STATUS); } - else if (sensors_getBoardTemp() > (HEATER_THRESHOLD + 5)) + else if (sensors_getBoardTemp() > (sysconfig->heater_threshold + 5)) { led_off(LED_HEAT); led_off(LED_STATUS); diff --git a/master/master/lib/logger.c b/master/master/lib/logger.c --- a/master/master/lib/logger.c +++ b/master/master/lib/logger.c @@ -36,12 +36,13 @@ const char err_0[] PROGMEM = "slave time const char err_1[] PROGMEM = "initializing SD card failed"; const char err_2[] PROGMEM = "opening SD partition failed"; const char err_3[] PROGMEM = "opening SD file failed"; -const char err_4[] PROGMEM = "XBee timeout"; -const char err_5[] PROGMEM = "FATAL UNHANDLED ERROR"; -const char err_6[] PROGMEM = "enter AT mode failed"; -const char err_7[] PROGMEM = "exit AT mode failed"; -const char err_8[] PROGMEM = "infotext"; -const char err_9[] PROGMEM = "watchdog"; +const char err_4[] PROGMEM = "error parsing config file"; +const char err_5[] PROGMEM = "XBee timeout"; +const char err_6[] PROGMEM = "FATAL UNHANDLED ERROR"; +const char err_7[] PROGMEM = "enter AT mode failed"; +const char err_8[] PROGMEM = "exit AT mode failed"; +const char err_9[] PROGMEM = "infotext"; +const char err_10[] PROGMEM = "watchdog"; const char *const errorMessageLookup[] PROGMEM = { @@ -54,7 +55,8 @@ const char *const errorMessageLookup[] P err_6, err_7, err_8, - err_9 + err_9, + err_10 }; @@ -62,8 +64,10 @@ const char *const errorMessageLookup[] P struct partition_struct* partition; struct fat_fs_struct* fs; struct fat_dir_struct* dd; + struct fat_file_struct* fd_datalog; struct fat_file_struct* fd_errorlog; +struct fat_file_struct* fd_config; void logger_setup() { @@ -122,14 +126,12 @@ void logger_setup() struct fat_dir_entry_struct errorDirEntry; if(fat_create_file(dd, errorFilename, &errorDirEntry) == 0) { - serial0_sendString("Error create errorlog\r\n"); error_log(ERROR_SD_FILE, true); } // Search for file in current directory and open it fd_errorlog = open_file_in_dir(fs, dd, errorFilename); if(!fd_errorlog) { - serial0_sendString("Error open errorlog!\r\n"); error_log(ERROR_SD_FILE, true); return; } @@ -137,7 +139,6 @@ void logger_setup() if(!fat_seek_file(fd_errorlog, &errorOffset, FAT_SEEK_SET)) { // Error seeking to file - serial0_sendString("Error seek errorlog!\r\n"); error_log(ERROR_SD_FILE, true); fat_close_file(fd_errorlog); return; @@ -153,14 +154,12 @@ void logger_setup() // Create new data log file if(fat_create_file(dd, dataFilename, &dataDirEntry) == 0) { - serial0_sendString("Error create datalog\r\n"); error_log(ERROR_SD_FILE, true); } // Search for file in current directory and open it fd_datalog = open_file_in_dir(fs, dd, dataFilename); if(!fd_datalog) { - serial0_sendString("Error open datalog!\r\n"); error_log(ERROR_SD_FILE, true); return; } @@ -168,22 +167,50 @@ void logger_setup() if(!fat_seek_file(fd_datalog, &dataOffset, FAT_SEEK_SET)) { // Error seeking to file - serial0_sendString("Error seek datalog!\r\n"); error_log(ERROR_SD_FILE, true); fat_close_file(fd_datalog); return; } + + + int32_t configOffset = 0; + + // Search for file in current directory and open it + fd_config = open_file_in_dir(fs, dd, "config.ini"); + if(!fd_config) + { + error_log_msg(ERROR_CONFIGPARSE, true, "opening"); + return; + } + configOffset=0; + if(!fat_seek_file(fd_config, &configOffset, FAT_SEEK_SET)) + { + // Error seeking to file + error_log_msg(ERROR_CONFIGPARSE, true, "seeking"); + fat_close_file(fd_config); + //Don't return, just continue + } + + // Write header information logger_log(LOGGER_HEADERTEXT); - logger_log("\n-- BEGIN DATA --\n"); error_log_rawwrite(LOGGER_HEADERTEXT); - error_log_rawwrite("\n-- BEGIN ERROR --\n"); - error_log_rawwrite("\nErrorNo,ErrorMsg,ErrorInfo,\r\n"); + error_log_rawwrite("\nErrNo,ErrMsg,ErrInfo,\r\n"); } +struct fat_file_struct* logger_getconfigfd() +{ + return fd_config; +} + +void logger_closeconffd() +{ + fat_close_file(fd_config); +} + void logger_log(char *buffer) { uint8_t len = strlen(buffer); @@ -285,6 +312,45 @@ void logger_closeLog() partition_close(partition); } +char* logger_config_fgets(char* line, uint8_t max) { + int len = 0; + //char line[50]; + while(len= max) // too long line + { + // Null-terminate and hope that the comment was the long part + line[len] = 0x00; + } + else + { + line[len] = 0x00; // terminate string + } + + return line; +} + // INTERNAL FUNCTIONS diff --git a/master/master/lib/logger.h b/master/master/lib/logger.h --- a/master/master/lib/logger.h +++ b/master/master/lib/logger.h @@ -17,6 +17,9 @@ #include void logger_setup(); +struct fat_file_struct* logger_getconfigfd(); +char* logger_config_fgets(char* line, uint8_t max); +void logger_closeconffd(); uint8_t logger_writeLine(char* dateLine, uint8_t length); struct fat_file_struct* open_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name); uint8_t find_file_in_dir(struct fat_fs_struct* fs, struct fat_dir_struct* dd, const char* name, struct fat_dir_entry_struct* dir_entry); diff --git a/master/master/lib/sdcard/fat_config.h b/master/master/lib/sdcard/fat_config.h --- a/master/master/lib/sdcard/fat_config.h +++ b/master/master/lib/sdcard/fat_config.h @@ -102,7 +102,7 @@ void get_datetime(uint16_t* year, uint8_ * \ingroup fat_config * Maximum number of file handles. */ -#define FAT_FILE_COUNT 2 +#define FAT_FILE_COUNT 3 /** * \ingroup fat_config diff --git a/master/master/lib/sensordata.c b/master/master/lib/sensordata.c --- a/master/master/lib/sensordata.c +++ b/master/master/lib/sensordata.c @@ -164,7 +164,7 @@ void sensordata_logvalues() csvHeader[0] = 0x00; // Add master data headers - logger_log("Time,BoardTemp,VBatt,GPSTime,GPSLat,GPSLon,GPSSpeed,GPSHDOP,GPSCourse,GPSSV,"); + logger_log("Time,BoardTemp,VBatt,GPSTime,GPSLat,GPSLon,GPSAlt,GPSSpeed,GPSHDOP,GPSCourse,GPSSV,"); // Add slave data headers for(uint8_t i=0; i BUZZER_FAILSAFE_DURATION) + if(time_millis() > sysconfig->buzzer_failsafe_duration) { isTouchdown = true; } else { int32_t altitude = sensordata_getSensorValue(SENSOR_ALTITUDE); - if(altitude != -2111111111 && altitude < BUZZER_TRIGGER_MAXALTITUDE && time_millis() > BUZZER_TRIGGER_MINDURATION) + if(altitude != -2111111111 && altitude < sysconfig->buzzer_trigger_maxaltitude && time_millis() > sysconfig->buzzer_trigger_minduration) { isTouchdown = true; } diff --git a/master/master/master.c b/master/master/master.c --- a/master/master/master.c +++ b/master/master/master.c @@ -35,6 +35,7 @@ #include "lib/slavesensors.h" #include "lib/serparser.h" #include "lib/sensordata.h" +#include "lib/iniparse.h" int main(void) { @@ -55,8 +56,9 @@ int main(void) sensors_setup(); logger_setup(); watchdog_checkreset(); + iniparse_getconfig(); afsk_setup(); - serial0_sendString("\r\nHello.\r\n\r\n"); + serial0_sendString("Hello.\n\n"); // Blocking ZigBee node discovery slavesensors_network_scan(); @@ -108,10 +110,6 @@ int main(void) sensors_readBoardTemp(); sensors_readBatt(); - - //char buftmp[15]; - //snprintf(buftmp, 15, "vbatt: %u\r\n", sensors_getBatt()); - //serial0_sendString(buftmp); // Write CSV header and log data values sensordata_logvalues(); @@ -137,7 +135,7 @@ int main(void) } // Periodic: Data Request - if(time_millis() - lastDataReq > DATAREQUEST_RATE) + if(time_millis() - lastDataReq > sysconfig->datarequest_rate) { // Start getting values for next transmission if(slavesensors_isrequesting()) @@ -155,7 +153,7 @@ int main(void) // Periodic: APRS transmission - if(time_millis() - lastAprsBroadcast > APRS_TRANSMIT_PERIOD) + if(time_millis() - lastAprsBroadcast > sysconfig->aprs_transmit_period) { // Check for touchdown sensordata_checkTouchdown(); @@ -170,15 +168,14 @@ int main(void) lastAprsBroadcast = time_millis(); } - #ifdef BLACKOUT_ENABLE + // Periodic: Blackout timer check bool black = false; - if(!black && time_millis() > BLACKOUT_TIMEOUT) + if(sysconfig->blackout_enable && !black && time_millis() > sysconfig->blackout_timeout) { // LED blackout led_blackout(); black = true; } - #endif // Parse any serial data in the XBee software buffer parseResult = serparser_parse(); diff --git a/master/master/master.cproj b/master/master/master.cproj --- a/master/master/master.cproj +++ b/master/master/master.cproj @@ -132,6 +132,18 @@ compile + + compile + + + compile + + + compile + + + compile + compile @@ -246,6 +258,7 @@ +