Changeset - 7214de94743d
[Not reviewed]
default
0 2 0
ethanzonca@CL-ENS241-08.cedarville.edu - 12 years ago 2013-02-22 16:22:20
ethanzonca@CL-ENS241-08.cedarville.edu
Added additional sensor readings to APRS message
2 files changed with 27 insertions and 2 deletions:
0 comments (0 inline, 0 general)
master/master/lib/gps.c
Show inline comments
 
@@ -83,100 +83,100 @@ char* get_longitudeLSBs()
 
	return longitudeTmp;
 
}
 

	
 
char quality;		//quality for GGA and validity for RMC
 
char numSatellites[4];
 
char* get_sv() 
 
{
 
	return numSatellites;
 
}
 

	
 
char hdop[6];		//xx.x
 
char* get_hdop() 
 
{
 
	return hdop;
 
}
 

	
 
char altitude[10];	//xxxxxx.x
 
char wgs84Height[8];	//sxxx.x
 
char lastUpdated[8];	//blank - included for testing
 
char stationID[8];	//blank - included for testing
 
char checksum[3];	//xx
 

	
 
char knots[8];		//xxx.xx
 
char* get_speedKnots() 
 
{
 
	return knots;
 
}
 

	
 
char course[8];		//xxx.x
 
char* get_course() 
 
{
 
	return course;
 
}
 
	
 
char dayofmonth[9];	//ddmmyy
 
char* get_dayofmonth() 
 
{
 
	return dayofmonth;
 
}
 

	
 

	
 
bool gps_hadfix = false;
 

	
 
bool gps_hasfix() 
 
{
 
	bool hasFix = get_latitudeTrimmed()[0] != 0x00;
 
	
 
	if(hasFix && !gps_hadfix) {
 
		info_log_msg("Lost GPS fix");
 
		info_log_msg("Acquired GPS fix");
 
	}
 
	else if(!hasFix && gps_hadfix) {
 
		info_log_msg("Acquired GPS fix");
 
		info_log_msg("Lost GPS fix");
 
	}
 
	
 
	gps_hadfix = hasFix;
 
	return hasFix;
 
}
 

	
 
char variation[9];	//xxx.xb
 
int calculatedChecksum;
 
int receivedChecksum;
 

	
 
// transmission state machine
 
enum decodeState {
 
	//shared fields
 
	INITIALIZE=0,
 
	GET_TYPE,
 
	GPS_CHECKSUM,	//XOR of all the bytes between the $ and the * (not including the delimiters themselves), written in hexadecimal
 
	//GGA data fields
 
	GGA_TIME,
 
	GGA_LATITUDE,
 
	GGA_LONGITUDE,
 
	GGA_QUALITY,
 
	GGA_SATELLITES,
 
	GGA_HDOP,
 
	GGA_ALTITUDE,
 
	GGA_WGS84,
 
	GGA_LAST_UPDATE,
 
	GGA_STATION_ID,
 
	//RMC data fields
 
	RMC_TIME,
 
	RMC_VALIDITY,
 
	RMC_LATITUDE,
 
	RMC_LONGITUDE,
 
	RMC_KNOTS,
 
	RMC_COURSE,
 
	RMC_DATE,
 
	RMC_MAG_VARIATION,
 
	
 
}decodeState;
 

	
 

	
 
ISR(USART1_RX_vect)
 
{
 
	nmeaBuffer[nmeaBufferDataPosition % NMEABUFFER_SIZE] = UDR1;
 
	nmeaBufferDataPosition = (nmeaBufferDataPosition + 1) % NMEABUFFER_SIZE;
 
}
 

	
 
void gps_setup() 
 
{
master/master/lib/sensordata.c
Show inline comments
 
@@ -25,113 +25,138 @@
 
int32_t slaves[MAX_NUM_SLAVES][MAX_NUM_SENSORS];
 

	
 
void sensordata_setup() 
 
{
 
	for(int i=0; i<MAX_NUM_SLAVES; i++) 
 
	{
 
		for(int j=0; j<MAX_NUM_SENSORS; j++) 
 
		{
 
			slaves[i][j] = -2111111111; // minimum value of 16 bit integer
 
		}
 
	}
 
}
 
 
// Store a sensor value in memory
 
void sensordata_set(uint8_t nodeID, uint8_t type, int32_t value)
 
{
 
	if(nodeID < MAX_NUM_SLAVES) 
 
	{
 
		slaves[nodeID][type] = value;
 
	}	
 
}
 
 
// Retrieve a sensor value from memory
 
int32_t sensordata_get(uint8_t nodeID, uint8_t type) 
 
{
 
	// Avoid reading out of bad places!
 
	if(nodeID < MAX_NUM_SLAVES) 
 
	{
 
		return slaves[nodeID][type];
 
	}
 
	else 
 
	{
 
		return 0;
 
	}
 
}
 
 
 
// Generate APRS comment
 
// TODO: Can we move this buffer to a local scope of this function?
 
#define COMMENTBUFFER_SIZE 128
 
char commentBuffer[COMMENTBUFFER_SIZE];
 
char* slavesensors_getAPRScomment() 
 
{
 
	snprintf(commentBuffer,COMMENTBUFFER_SIZE, "t9%d s%s v%s h%s _%s |%s ", sensors_getBoardTemp(), get_sv(), get_speedKnots(), get_hdop(), get_latitudeLSBs(), get_longitudeLSBs());
 
	
 
	// Find slave sensors to include in this log
 
	for(int i=0; i<MAX_NUM_SLAVES; i++)
 
	{
 
		// Board temperature sensors (all slaves)
 
		uint32_t val = sensordata_get(i, SENSOR_BOARDTEMP);
 
		if(val != -2111111111) {
 
			uint16_t len = strlen(commentBuffer);
 
			snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " t%u%li",i,val);
 
		}
 
		
 
		// Battery voltages (all slaves)
 
		val = sensordata_get(i, SENSOR_BATTERYLEVEL);
 
		if(val != -2111111111) {
 
			uint16_t len = strlen(commentBuffer);
 
			snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " l%u%li",i,val);
 
		}
 
		
 
		// Pressure
 
		val = sensordata_get(i, SENSOR_PRESSURE);
 
		if(val != -2111111111) {
 
			uint16_t len = strlen(commentBuffer);
 
			snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " P%li",val);
 
		}
 
		
 
		// Air Temperature
 
		val = sensordata_get(i, SENSOR_AIRTEMP);
 
		if(val != -2111111111) {
 
			uint16_t len = strlen(commentBuffer);
 
			snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " C%li",val);
 
		}
 
		
 
		// Altitude
 
		val = sensordata_get(i, SENSOR_ALTITUDE);
 
		if(val != -2111111111) {
 
			uint16_t len = strlen(commentBuffer);
 
			snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " A%li",val);
 
		}
 
		
 
		// Radiation
 
		val = sensordata_get(i, SENSOR_CPM_RADIATION);
 
		if(val != -2111111111) {
 
			uint16_t len = strlen(commentBuffer);
 
			snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " R%li",val);
 
		}
 
		
 
	}
 
	
 
	if(logger_aprsInfoTextAvailable())
 
	{
 
		uint16_t len = strlen(commentBuffer);
 
		snprintf(commentBuffer + len, COMMENTBUFFER_SIZE-len, " %s",logger_getAprsInfoText());
 
		logger_aprsInfoTextConsumed();
 
	}
 
	
 
	
 
	return commentBuffer;
 
}
 
 
 
// Generates CSV headers on first run and logs values to the SD card (if data available)
 
bool dataWasReady = false;
 
void sensordata_logvalues() 
 
{
 
	// Generate CSV header after we have queried all slaves once
 
	if(slavesensors_dataReady()) 
 
	{
 
	
 
		// Only generate/write header the first time data is ready
 
		if(!dataWasReady) 
 
		{
 
			#define CSV_BUFFER_SIZE 64
 
			char csvHeader[CSV_BUFFER_SIZE];
 
			csvHeader[0] = 0x00;
 
			
 
			// Add master data headers
 
			logger_log("Time,BoardTemp,GPSTime,GPSLat,GPSLon,GPSSpeed,GPSHDOP,GPSCourse,GPSSV,");
 
			
 
			// Add slave data headers
 
			for(uint8_t i=0; i<MAX_NUM_SLAVES; i++) 
 
			{
 
				for(uint8_t j=0; j<MAX_NUM_SENSORS; j++) 
 
				{
 
					int32_t tmp = sensordata_get(i, j);
 
					
 
					// If a sensor value exists, write a header for it
 
					if(tmp != -2111111111) 
 
					{
 
						snprintf(csvHeader, CSV_BUFFER_SIZE,"%s-%s,", slavesensors_slavename(i), slavesensors_getLabel(j));
 
						logger_log(csvHeader);
 
					}
 
				}
 
			}
 
		
0 comments (0 inline, 0 general)