Files @ 51e4ad5deebf
Branch filter:

Location: seniordesign-firmware/slave/slave/lib/masterComm.c

kripperger@CL-SEC241-09.cedarville.edu
Finished Master comms format
/*
 * masterComm.c
 *
 * Created: 1/22/2013 3:40:53 PM
 *  Author: kripperger
 */ 


#include <avr/io.h>
#include <stdio.h>
#include "../config.h"
#include "masterComm.h"
#include "serial.h"
#include "serparser.h"
#include "inputOutput.h"
#include "sensors.h"
#include "geiger.h"
#include "led.h"

uint8_t dataTypes;
char buff2[64];


char masterComm_checksum(const char* stringPtr)
{
	char sum = 0;
	while(*stringPtr != 0x00)
	{
		sum += *stringPtr;
		stringPtr++;
	}
	return sum;
}


void masterComm_types()
{
	switch(io_getModuleId())
	{
		case 0:
			// Generic
			dataTypes = DATATYPES_GENERIC;
			break;
			
		case 1:
			// Sensors
			dataTypes = DATATYPES_SENSOR;
			break;
			
		case 2:
			// Geiger
			dataTypes = DATATYPES_GEIGER;
			break;
			
		case 3:
			// Camera
			dataTypes = DATATYPES_CAMERA;
			break;
			
		default:
			dataTypes = DATATYPES_GENERIC;
			break;
	}
}


void masterComm_packetSend_unsigned(uint8_t id, uint32_t data)
{
	serial0_sendChar('[');
	snprintf(buff2,64,"%u%u",id,data);
	serial0_sendString(buff2);
	serial0_sendChar(']');
	serial0_sendChar(masterComm_checksum(buff2));
}

void masterComm_packetSend_signed(uint8_t id, int32_t data)
{
	serial0_sendChar('[');
	snprintf(buff2,64,"%u%d",id,data);
	serial0_sendString(buff2);
	serial0_sendChar(']');
	serial0_sendChar(masterComm_checksum(buff2));
}



void masterComm_modules()
{
	// Send Board Temperature (Common for all modules)
	masterComm_packetSend_signed(0,sensors_getBoardTemp());

	// Send Heater Status (Common for all modules)
	masterComm_packetSend_unsigned(1,/*Heater Status Get Function Here */0);
	
	// Send Battery Level (Common for all modules)
	masterComm_packetSend_unsigned(2,/*Battery Level Get Function Here */0);
	
	
	// Send module specific sensor readings
	switch(io_getModuleId())
	{
		case 0:
			// Generic
			
			break;
		
		case 1:
			// Sensors
			
			// Send SPI Temperature (Air)
			masterComm_packetSend_unsigned(3,sensors_getSpiTemp());
			
			// Send Ambient Light (Needs to be formatted)
			masterComm_packetSend_unsigned(4,/*Ambient Light Get Function Here */0);
			
			// Send Humidity
			masterComm_packetSend_unsigned(5,/*Humidity Get Function Here */0);		
			
			// Send Pressure 
			masterComm_packetSend_unsigned(6,/*Pressure Get Function Here */0);			
			
			// Send Altitude
			masterComm_packetSend_unsigned(7,/*Altitude Get Function Here */0);
			break;
			
		case 2:
			// Geiger
			
			// Send CPM (radiation)
			masterComm_packetSend_unsigned(8,geiger_getCpm());
			break;
		
		case 3:
			// Camera
			
			
			break;
		
		default:
			
			break;
	}
}


void masterComm_send()
{
	masterComm_types();		// Calculates how many data types to send
	
	// Return request with number of data types to be sent
	serial0_sendChar('[');						// Send opening bracket
	snprintf(buff2,64,"@%u",dataTypes);				// Send package (@ reply and number of data types)
	serial0_sendString(buff2);
	serial0_sendChar(']');						// Send closing bracket
	serial0_sendChar(masterComm_checksum(buff2));	// Calculate and send checksum
	
	masterComm_modules();	// Send sensor data
}


void masterComm_checkParser()
{
	if (serparser_parse() == PARSERESULT_PARSEOK)
	{
		if (getPayloadType() == ('@'-0x30))		// Request for data recieved
		{
			led_on(2);
			// Send all data
			masterComm_send();
			//led_off(2);
		}	
	}
}