/*
* Master Firmware: Slave Sensor Data Acquisition
*
* This file is part of OpenTrack.
* OpenTrack is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* OpenTrack is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
* You should have received a copy of the GNU Affero General Public License
* along with OpenTrack. If not, see <http://www.gnu.org/licenses/>.
* Ethan Zonca
* Matthew Kanning
* Kyle Ripperger
* Matthew Kroening
*/
#include "../config.h"
#include <avr/io.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
#include "serial.h"
#include "serparser.h"
#include "slavesensors.h"
#include "sensordata.h"
#include "led.h"
#include "looptime.h"
#include "logger.h"
// !!! Remember to update the ENUM in slavesensors.h when changing things here
// Label lookup table
// Make sure there are never more labels than there are MAX_NUM_SENSORS!
const char label_0[] PROGMEM = "BoardTemp";
const char label_1[] PROGMEM = "Heater";
const char label_2[] PROGMEM = "VBatt";
const char label_3[] PROGMEM = "AirTemp";
const char label_4[] PROGMEM = "Light";
const char label_5[] PROGMEM = "Humidity";
const char label_6[] PROGMEM = "Pressure";
const char label_7[] PROGMEM = "Altitude";
const char label_8[] PROGMEM = "Radiation";
const char *const labelLookup[] PROGMEM =
{
label_0,
label_1,
label_2,
label_3,
label_4,
label_5,
label_6,
label_7,
label_8
};
char labelBuffer[15]; // Size to length of label
char* slavesensors_getLabel(uint8_t sensorID)
if(sensorID < 9)
strncpy_P(labelBuffer,(char*)pgm_read_word(&(labelLookup[sensorID])),15);
return labelBuffer;
}
else
return NULL;
// Print out the sensor ID if there is no label in the lookup table
snprintf(labelBuffer, 15,"%u",sensorID);
uint8_t currentSlave = 0;
uint8_t currentSlaveSensor = 0;
bool requesting = false;
//#define DEBUG_NETWORKSCAN
//#define DEBUG_GETSLAVEDATA
char* bufPtr = 0x00;
static char slaveAddressLow[MAX_NUM_SLAVES][9];
static char slaveAddressHigh[MAX_NUM_SLAVES][9];
static char slaveNames[MAX_NUM_SLAVES][15];
static char loggerAddressLow[9];
static char loggerAddressHigh[9];
uint8_t nodeCount = 0;
bool dataReady = false;
void slavesensors_setup()
loggerAddressLow[0] = 0x00;
loggerAddressHigh[0] = 0x00;
char* slavesensors_slavename(uint8_t id)
return slaveNames[id];
void slavesensors_network_scan()
serial0_ioff();
int atOK;
#ifdef DEBUG_OUTPUT
serial0_sendString("Beginning network scan...\r\n\r\n");
#endif
_delay_ms(500); // xbee warmup
_delay_ms(200); // xbee warmup
wdt_reset();
led_on(LED_ACTIVITY);
atOK = slavesensors_enterAT();
// wait for OK
if(atOK == 0)
led_on(LED_CYCLE);
serial0_sendString("ATND");
serial0_sendChar(0x0D);
// Scan data end when newline by itself ("")
int lineCount = 0;
while(1)
// Wait for scan to complete. If we timeout, return.
if(waitTimeout(TIMEOUT_NETWORKSCAN))
return;
bufPtr = serial0_readLine();
// If we're starting a new block but got a newline instead, we're done!
if(lineCount == 0 && strcmp(bufPtr, "") == 0)
break;
if(lineCount == 1)
strncpy(slaveAddressHigh[nodeCount],bufPtr, 9);
else if(lineCount == 2)
strncpy(slaveAddressLow[nodeCount],bufPtr, 9);
else if(lineCount == 3)
strncpy(slaveNames[nodeCount], bufPtr, 15);
// If we finished one chunk (including the newline after it). Can't be else if because it controls increment.
if(lineCount == 9)
if(strcmp(slaveNames[nodeCount], XBEE_LOGDEST_NAME) == 0)
// Save logger address in the loggerAddressXXXX variables
Status change: