Changeset - 8fb88c0ed65a
[Not reviewed]
default
0 8 4
kripperger@CL-SEC241-09.cedarville.edu - 12 years ago 2013-01-22 22:33:14
kripperger@CL-SEC241-09.cedarville.edu
Added serial parser and began writing master communication functions
12 files changed with 515 insertions and 51 deletions:
0 comments (0 inline, 0 general)
slave/slave/config.h
Show inline comments
 
@@ -11,11 +11,19 @@
 
 
 #define F_CPU 11059200				// Clock frequency (used in calculations)
 
 
//Serial
 
#define USART0_BAUDRATE 115200
 
#define USART1_BAUDRATE 115200 
 
 
#define SENSOR_LOOP 100				// Frequency of sensor reads (in ms)
 
// Circular serial buffer size. Must be at least MAX_CMD_LEN + 5
 
#define BUFFER_SIZE 32
 
 
// Maximum payload size of command
 
#define MAX_PAYLOAD_LEN 16
 
 
 
//Sensors and IO
 
#define SENSOR_LOOP 200				// Frequency of sensor reads (in ms)
 
#define HEATER_THRESHOLD 40			// Temperature threshold in Fahrenheit where heater is activated
 
 
 //I2C Addresses
slave/slave/lib/inputOutput.c
Show inline comments
 
@@ -8,6 +8,8 @@
 
#include <avr/io.h>
 
#include "../config.h"
 
#include "inputOutput.h"
 
#include "led.h"
 
#include "sensors.h"
 
 
 
 void io_configure()
 
 {
slave/slave/lib/led.c
Show inline comments
 
@@ -83,23 +83,19 @@ void led_toggle(uint8_t led)
 
	switch(led)
 
	{
 
		case 0:
 
			if ((PORTB & 0b00000001) == 1)		PORTB &= ~(1 << PB0);	//OFF
 
			else								PORTB |= (1 << PB0);	//ON
 
			PORTB ^= (1 << PB0);
 
			break;
 
		
 
		case 1:
 
			if (((PORTB & 0b00000010)>>1) == 1)	PORTB &= ~(1 << PB1);	//OFF
 
			else								PORTB |= (1 << PB1);	//ON
 
			PORTB ^= (1 << PB1);
 
			break;
 
		
 
		case 2:
 
			if (((PORTB & 0b00000100)>>2) == 1)	PORTB &= ~(1 << PB2);	//OFF
 
			else								PORTB |= (1 << PB2);	//ON
 
			PORTB ^= (1 << PB2);
 
			break;
 
		
 
		case 3:
 
			if (((PORTB & 0b00001000)>>3) == 1)	PORTB &= ~(1 << PB3);	//OFF
 
			else								PORTB |= (1 << PB3);	//ON
 
			PORTB ^= (1 << PB3);
 
			break;
 
		
 
		default:
slave/slave/lib/masterComm.c
Show inline comments
 
new file 100644
 
/*
 
 * masterComm.c
 
 *
 
 * Created: 1/22/2013 3:40:53 PM
 
 *  Author: kripperger
 
 */ 
 
 
 
#include <avr/io.h>
 
#include "../config.h"
 
#include "masterComm.h"
 
#include "serial.h"
 
#include "serparser.h"
 
 
 
void masterComm_send()
 
{
 
	//Send stuff
 
	serial0_sendString("got data\r\n");
 
}
 
 
 
void masterComm_check()
 
{
 
	if (serparser_parse() == PARSERESULT_PARSEOK)
 
	{
 
		if (getPayloadType() == ('@'-0x30))		// Request for data recieved
 
		{
 
			// Send all data
 
			masterComm_send();
 
		}	
 
	}
 
}
 
 
slave/slave/lib/masterComm.h
Show inline comments
 
new file 100644
 
/*
 
 * masterComm.h
 
 *
 
 * Created: 1/22/2013 3:40:43 PM
 
 *  Author: kripperger
 
 */ 
 
 
 
#ifndef MASTERCOMM_H_
 
#define MASTERCOMM_H_
 
 
 
 
void masterComm_check();
 
void masterComm_send();
 
 
 
 
 
#endif /* MASTERCOMM_H_ */
 
\ No newline at end of file
slave/slave/lib/sensors.c
Show inline comments
 
@@ -13,6 +13,7 @@
 
#include <util/delay.h>
 
#include "sensors.h"
 
#include "spi.h"
 
#include "i2c.h"
 
 
int16_t	spiTemp;	// Thermocouple Temperature (from spi)
 
int8_t	boardTemp;	// Board Temperature (from i2c)
slave/slave/lib/serial.c
Show inline comments
 
/*
 
 * serial.c
 
 * Master Firmware: USART Send/Recieve
 
 *
 
 * Wireless Observational Modular Aerial Network
 
 *
 
 * Created: 10/25/2012 3:19:49 PM
 
 *  Author: ethanzonca
 
 * Ethan Zonca
 
 * Matthew Kanning
 
 * Kyle Ripperger
 
 * Matthew Kroening
 
 *
 
 */ 
 
 
#include "serial.h"
 
#include "led.h"
 
#include "../config.h"
 
#include <avr/io.h>
 
#include <avr/interrupt.h>
 
#include <avr/wdt.h>
 
 
// NOTE: USART ISRs for character reception are included in serparser.c
 
 
void serial0_setup() {
 
	//PORTD &= ~(1<<PD0);
 
	//PORTD |= (1<<PD1);
 
	
 
	/* Enable receiver and transmitter */
 
	UCSR0B |= (1<<RXEN0)|(1<<TXEN0); // Enable rx/tx
 
	/* Set frame format: 8data, 1stop bit */
 
	UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01); // - 1 stop bit
 
	
 
	/* Set baud rate */
 
	UBRR0H = (unsigned char)(USART0_BAUD_PRESCALE>>8);
 
	UBRR0L = (unsigned char)USART0_BAUD_PRESCALE;
 
	/* Enable receiver and transmitter */
 
	UCSR0B = (1<<RXEN0)|(1<<TXEN0);
 
	/* Set frame format: 8data, 1stop bit */
 
	UCSR0C = (3<<UCSZ00); // - 1 stop bit
 
	
 
	UCSR0B |= (1 << RXCIE0); // Enable interrupt
 
	
 
	//UCSR0A |= (1<<RXC0);
 
}
 
 
 
 
 
 
 
void serial1_setup() {
 
//PROVEN in test project
 
 
	/* Enable receiver and transmitter */
 
	UCSR1B |= (1<<RXEN1)|(1<<TXEN1); // Enable rx/tx
 
	/* Set frame format: 8data, 1stop bit */
 
	UCSR1C |= (1 << UCSZ10) | (1 << UCSZ11); // - 1 stop bit
 
	
 
	/* Set baud rate */
 
	UBRR1H = (unsigned char)(USART1_BAUD_PRESCALE>>8);
 
	UBRR1L = (unsigned char)USART1_BAUD_PRESCALE;
 
	/* Enable receiver and transmitter */
 
	UCSR1B = (1<<RXEN1)|(1<<TXEN1);
 
	/* Set frame format: 8data, 1stop bit */
 
	UCSR1C = (3<<UCSZ10); // - 1 stop bit
 
	
 
	UCSR1B |= (1 << RXCIE1); // Enable interrupt
 
}
 
 
void serial1_ion() {
 
	UCSR1B |= (1<<RXEN1); // Enable rx
 
	UCSR1B |= (1 << RXCIE1); // Enable interrupt
 
}
 
void serial1_ioff() {
 
	UCSR1B &= ~(1<<RXEN1); // Disable rx
 
	UCSR1B &= ~(1 << RXCIE1); // Disable interrupt
 
}
 
 
void serial0_ion() {
 
	UCSR0B |= (1 << RXCIE0); // Enable interrupt
 
}
 
void serial0_ioff() {
 
	UCSR0B &= ~(1 << RXCIE0); // Disable interrupt
 
}
 
 
 
void serial0_sendChar( unsigned char byte )
 
{
 
@@ -42,44 +86,76 @@ void serial1_sendChar( unsigned char byt
 
	UDR1 = byte;
 
}
 
 
void serial0_sendString(char* stringPtr){
 
	while(*stringPtr != 0x00){
 
 
unsigned char serial0_readChar()
 
{
 
	while(!(UCSR0A &(1<<RXC0)));
 
	//char c = UDR0;
 
	//serial0_sendString("Read: ");
 
	//serial0_sendChar(c);
 
	//serial0_sendChar('\n');
 
	return UDR0;
 
}
 
 
uint8_t serial0_hasChar() {
 
	return (UCSR0A &(1<<RXC0));
 
}
 
 
char readBuf[128];
 
char* serial0_readLine() {
 
	char c;
 
	
 
	int i = 0;
 
	
 
	while(i < 128) {
 
		c = serial0_readChar();
 
 
		if(c == 0x0D) break;
 
		readBuf[i] = c;
 
		i++;
 
	}
 
	
 
	readBuf[i] = '\0';
 
	return readBuf;
 
}
 
 
 
void serial0_sendString(const char* stringPtr){
 
	while(*stringPtr != 0x00)
 
	{
 
		serial0_sendChar(*stringPtr);
 
		stringPtr++;
 
	}
 
}
 
 
void serial1_sendString(char* stringPtr){
 
	while(*stringPtr != 0x00){
 
void serial1_sendString(const char* stringPtr){
 
	while(*stringPtr != 0x00)
 
	{
 
		serial1_sendChar(*stringPtr);
 
		stringPtr++;
 
	}
 
}
 
 
 
void serial_sendCommand( char moduleID, char sensorID, uint8_t dataLength, char* data )
 
void serial_sendCommand(char* data )
 
{
 
	char checkSum = 0x00; //initialize checksum
 
	
 
	serial0_sendChar('['); //bracket indicates start of command
 
	serial0_sendChar(moduleID);
 
	checkSum+=moduleID;
 
	
 
	serial0_sendChar(sensorID);
 
	checkSum+=sensorID;
 
	
 
	//send each character of data individually
 
	for (int i=0; i<dataLength; i++)
 
	// send data, null-terminated
 
	while(*data != 0x00)
 
	{
 
		serial0_sendChar(data[i]);
 
		checkSum+=data[i];
 
		serial0_sendChar(*data);
 
		checkSum += *data;
 
		data++;
 
	}
 
	
 
	serial0_sendChar(checkSum);
 
	serial0_sendChar(']'); //bracket indicates end of command
 
	serial0_sendChar(checkSum); // checksum moved behind bracket to solve bug FS#29
 
}
 
 
void serial_sendResponseData(){
 
void serial_sendResponseData()
 
{
 
	
 
}
 
slave/slave/lib/serial.h
Show inline comments
 
/*
 
 * serial.h
 
 * Master Firmware: USART Send/Recieve
 
 *
 
 * Wireless Observational Modular Aerial Network
 
 *
 
 * Created: 10/25/2012 3:19:42 PM
 
 *  Author: ethanzonca
 
 * Ethan Zonca
 
 * Matthew Kanning
 
 * Kyle Ripperger
 
 * Matthew Kroening
 
 *
 
 */ 
 
 
 
@@ -20,11 +25,17 @@ void serial1_sendChar( unsigned char byt
 
void serial0_setup();
 
void serial1_setup();
 
 
void serial0_sendString(char* stringPtr);
 
void serial1_sendString(char* stringPtr);
 
void serial0_sendString(const char* stringPtr);
 
void serial1_sendString(const char* stringPtr);
 
 
void serial_sendCommand( char moduleID, char sensorID, uint8_t dataLength, char* data );
 
unsigned char serial0_readChar();
 
uint8_t serial0_hasChar();
 
char* serial0_readLine();
 
 
void serial_sendCommand( char* data );
 
void serial_sendResponseData();
 
 
void serial1_ion();
 
void serial1_ioff();
 
 
#endif /* SERIAL_H_ */
 
\ No newline at end of file
slave/slave/lib/serparser.c
Show inline comments
 
new file 100644
 
/*
 
 * Master Firmware: Serial Parser
 
 *
 
 * Wireless Observational Modular Aerial Network
 
 * 
 
 * Ethan Zonca
 
 * Matthew Kanning
 
 * Kyle Ripperger
 
 * Matthew Kroening
 
 *
 
 */
 
 
 
#include <avr/io.h>
 
#include <avr/interrupt.h>
 
#include "../config.h"
 
#include "serial.h"
 
#include "serparser.h"
 
#include "led.h"
 
 
// Circular buffer for incoming data
 
uint8_t buffer[BUFFER_SIZE];
 
 
// Location of parser in the buffer
 
uint8_t bufferParsePosition = 0;
 
 
// Location of receive byte interrupt in the buffer
 
volatile uint16_t bufferDataPosition = 0;
 
 
// Parser state
 
uint8_t parserState = STATE_RESET;
 
uint8_t lastParserState = STATE_RESET;
 
 
// Length of current payload data (and checksum)
 
uint8_t payloadLength = 0;
 
 
// Data and checksum of most recent transmission
 
char receivedPayload[MAX_PAYLOAD_LEN];
 
 
// Payload type ID of the sensor of most recent transmission
 
char receivedPayloadType = 0;
 
 
// Checksum to be calculated and then compared to the received checksum
 
char checksumCalc = 0;
 
 
// Accessors
 
uint8_t getPayloadLength() 
 
{
 
	return payloadLength;
 
}
 
uint8_t* getPayload() 
 
{
 
	return receivedPayload;
 
}
 
uint8_t getPayloadType() {
 
	return receivedPayloadType;
 
}
 
 
 
// Could inline if program space available
 
static void setParserState(uint8_t state)
 
{
 
	lastParserState = parserState;
 
	parserState = state;
 
	
 
	// If resetting, clear vars
 
	if(state == STATE_RESET) 
 
	{
 
		payloadLength = 0;
 
		checksumCalc = 0;
 
	}
 
	
 
	// Every time we change state, we have parsed a byte
 
	bufferParsePosition = (bufferParsePosition + 1) % BUFFER_SIZE;
 
}
 
 
// Receive data on USART
 
 
char debugBuff[16];
 
 
 
ISR(USART0_RX_vect)
 
{
 
	buffer[bufferDataPosition % BUFFER_SIZE] = UDR0;
 
	bufferDataPosition = (bufferDataPosition + 1) % BUFFER_SIZE;
 
	//sprintf(debugBuff, "bdp: %d, bpp: %d \r\n", bufferDataPosition, bufferParsePosition);
 
	//serial0_sendString((debugBuff)); 
 
}
 
 
 
 
 
#define DEBUG
 
 
// Parse data from circular buffer
 
int serparser_parse(void)
 
{
 
	
 
	char byte;
 
 
	// Process first command (if any) on the circular buffer
 
	while(bufferDataPosition != bufferParsePosition)
 
	{
 
		byte = buffer[bufferParsePosition];
 
		
 
		// Reset 
 
		if(parserState == STATE_RESET)
 
		{
 
			if(byte == '[') // Start of frame; keep parsing
 
			{
 
				#ifdef DEBUG
 
				serial0_sendString("start\r\n");
 
				#endif
 
				setParserState(STATE_GETDATATYPE);
 
			}
 
			else // Not start of frame, reset
 
			{
 
				#ifdef DEBUG
 
				serial0_sendString("invalid\r\n");
 
				#endif
 
				setParserState(STATE_RESET);
 
				return PARSERESULT_NODATA; // no valid start bit; better luck next time. run the function the next time around the main loop.
 
			}
 
		}
 
		
 
		// Get payload type ID
 
		else if(parserState == STATE_GETDATATYPE)
 
		{
 
			#ifdef DEBUG
 
			serial0_sendString("type\r\n");
 
			#endif
 
			receivedPayloadType = byte - 0x30; // Store the type of data receiving
 
			checksumCalc += byte;
 
			setParserState(STATE_GETDATA);
 
		}
 
		
 
		// Get payload data
 
		else if(parserState == STATE_GETDATA)
 
		{		
 
			if (byte == ']') // End of frame
 
			{
 
				#ifdef DEBUG
 
				serial0_sendString("eof\r\n");
 
				sprintf(debugBuff, "%d B, sum=%d\r\n", payloadLength, checksumCalc);
 
				serial0_sendString((debugBuff));
 
				#endif
 
				
 
				receivedPayload[payloadLength] = 0; // null-terminate string for atoi
 
				
 
				setParserState(STATE_GETCHECKSUM);
 
				// Checksum is now after the close bracket to solve bug FS#29		
 
				
 
 
			}
 
			else // Still receiving data
 
			{
 
				#ifdef DEBUG
 
				serial0_sendString("data\r\n");
 
				#endif
 
				receivedPayload[payloadLength] = byte;
 
				payloadLength++;
 
				checksumCalc += byte;
 
				
 
				// Data buffer overrun protection
 
				if(payloadLength > MAX_PAYLOAD_LEN) {
 
					#ifdef DEBUG
 
					serial0_sendString("ovf\r\n");
 
					#endif
 
					setParserState(STATE_RESET);
 
					return PARSERESULT_FAIL;
 
				}
 
				else {
 
					// Set state. MUST call even though state is maintained to update parse position
 
					setParserState(STATE_GETDATA);
 
					return PARSERESULT_STILLPARSING;
 
				}
 
				
 
			}
 
 
		}
 
		else if(STATE_GETCHECKSUM)
 
		{
 
			// TODO: Compare checksums
 
			if(byte == checksumCalc) {
 
				#ifdef DEBUG
 
				serial0_sendString("check\r\n");
 
				#endif
 
				setParserState(STATE_RESET);
 
				return PARSERESULT_PARSEOK;
 
			}
 
			else {
 
				#ifdef DEBUG
 
				serial0_sendString("bcheck\r\n");
 
				#endif
 
				setParserState(STATE_RESET);
 
				
 
				return PARSERESULT_PARSEOK;
 
				// !!!!!!!!!!!!!DEBUGGGGG ignore checksum ///// return PARSERESULT_FAIL;
 
			}
 
			
 
			/*
 
			if(bufferParsePosition == bufferDataPosition)
 
			{
 
				// We are at the end of the line. No more data to parse.
 
				setParserState(STATE_RESET);
 
				return PARSERESULT_PARSEOK;
 
			}
 
			else
 
			{
 
				setParserState(STATE_RESET);
 
				// we could choose to keep parsing now, or parse the next message next loop around (better idea).
 
				// return now so we hit it the next time around
 
				return PARSERESULT_PARSEOK;
 
			}
 
			*/
 
		}			
 
	}
 
	return PARSERESULT_NODATA;
 
	
 
}
 
\ No newline at end of file
slave/slave/lib/serparser.h
Show inline comments
 
new file 100644
 
/*
 
 * Master Firmware: Serial Parser
 
 *
 
 * Wireless Observational Modular Aerial Network
 
 * 
 
 * Ethan Zonca
 
 * Matthew Kanning
 
 * Kyle Ripperger
 
 * Matthew Kroening
 
 *
 
 */
 
 
 
#ifndef SERPARSER_H_
 
#define SERPARSER_H_
 
 
enum parseResults
 
{
 
	PARSERESULT_FAIL = 0,
 
	PARSERESULT_NODATA,
 
	PARSERESULT_STILLPARSING,
 
	PARSERESULT_PARSEOK,
 
};
 
 
// Parser states
 
enum parseStates
 
{
 
	STATE_RESET = 0,
 
	STATE_GETDATATYPE,
 
	STATE_GETDATA,
 
	STATE_GETCHECKSUM,
 
};
 
 
 
// Accessors
 
uint8_t getPayloadLength();
 
uint8_t* getPayload();
 
uint8_t getPayloadType();
 
 
// Prototypes
 
int serparser_parse(void);
 
 
#endif /* SERPARSER_H_ */
 
\ No newline at end of file
slave/slave/slave.c
Show inline comments
 
@@ -13,6 +13,7 @@
 
 
#include "config.h"
 
 
#include <stdio.h>
 
#include <inttypes.h>
 
#include <avr/io.h>
 
#include <compat/twi.h>
 
@@ -21,6 +22,7 @@
 
#include <avr/interrupt.h>
 
#include "modules.h"
 
#include "lib/serial.h"
 
#include "lib/serparser.h"
 
#include "lib/led.h"
 
#include "lib/inputOutput.h"
 
#include "lib/i2c.h"
 
@@ -29,6 +31,9 @@
 
#include "lib/sensors.h"
 
#include "lib/cameras.h"
 
#include "lib/loopTimer.h"
 
#include "lib/masterComm.h"
 
 
 
 
void micro_setup()
 
{
 
@@ -64,20 +69,28 @@ int main(void)
 
	
 
    while(1)
 
    {		
 
		
 
		// Master communication
 
		//masterComm_check();
 
 
		
 
		// Main slave operations
 
		if ((time_millis() % SENSOR_LOOP) == 0)	// Uses program timer to run every so often. Time interval defined in config.h
 
		{
 
			sensors_readBoardTemp();	// Read board temperature sensor (Common on all slaves) (Data Read)
 
			modules_run(moduleID);		// Runs specific module functions (like data reading)
 
			led_toggle(2);
 
//			sensors_readBoardTemp();	// Read board temperature sensor (Common on all slaves) (Data Read)
 
//			modules_run(moduleID);		// Runs specific module functions (like data reading)
 
			
 
			io_regulateTemp();			// Gets board temperature and enables heater if below threshold
 
			
 
			snprintf(buff,64,"|ModuleID: %u |BoardTemp: %i |Millis: %lu |Heater: %u\r\n",moduleID,sensors_getBoardTemp(),time_millis(),io_heaterStatus()); //DEBUG
 
			serial0_sendString(buff); //DEBUG
 
//			io_regulateTemp();			// Gets board temperature and enables heater if below threshold
 
			led_toggle(1);
 
//			snprintf(buff,64,"|ModuleID: %u |BoardTemp: %i |Millis: %lu |Heater: %u\r\n",moduleID,sensors_getBoardTemp(),time_millis(),io_heaterStatus()); //DEBUG
 
//			snprintf(buff,64,"lol%i\r\n",sensors_getBoardTemp());
 
//			serial0_sendString(buff); //DEBUG
 
			
 
			led_toggle(0);		// Toggle LED0(Blue) to show loop running	
 
			_delay_ms(1);		// Delay to prevent the sensor loop from running again before time_millis changes
 
		}
 
		
 
 
    }
 
	
 
	return 0;
slave/slave/slave.cproj
Show inline comments
 
@@ -22,7 +22,7 @@
 
    <eraseonlaunchrule>0</eraseonlaunchrule>
 
    <AsfVersion>3.1.3</AsfVersion>
 
    <avrtoolinterface>ISP</avrtoolinterface>
 
    <avrtool>com.atmel.avrdbg.tool.ispmk2</avrtool>
 
    <avrtool>com.atmel.avrdbg.tool.avrdragon</avrtool>
 
    <com_atmel_avrdbg_tool_simulator>
 
      <ToolType xmlns="">com.atmel.avrdbg.tool.simulator</ToolType>
 
      <ToolName xmlns="">AVR Simulator</ToolName>
 
@@ -67,6 +67,34 @@
 
      </ToolOptions>
 
    </com_atmel_avrdbg_tool_ispmk2>
 
    <preserveEEPROM>True</preserveEEPROM>
 
    <com_atmel_avrdbg_tool_avrdragon>
 
      <ToolType>com.atmel.avrdbg.tool.avrdragon</ToolType>
 
      <ToolName>AVR Dragon</ToolName>
 
      <ToolNumber>00A200035378</ToolNumber>
 
      <KeepTimersRunning>true</KeepTimersRunning>
 
      <OverrideVtor>false</OverrideVtor>
 
      <OverrideVtorValue>
 
      </OverrideVtorValue>
 
      <Channel>
 
        <host>127.0.0.1</host>
 
        <port>64369</port>
 
        <ssl>False</ssl>
 
      </Channel>
 
      <ToolOptions>
 
        <InterfaceName>ISP</InterfaceName>
 
        <InterfaceProperties>
 
          <JtagDbgClock>0</JtagDbgClock>
 
          <JtagProgClock>1000000</JtagProgClock>
 
          <IspClock>2000000</IspClock>
 
          <JtagInChain>false</JtagInChain>
 
          <JtagEnableExtResetOnStartSession>false</JtagEnableExtResetOnStartSession>
 
          <JtagDevicesBefore>0</JtagDevicesBefore>
 
          <JtagDevicesAfter>0</JtagDevicesAfter>
 
          <JtagInstrBitsBefore>0</JtagInstrBitsBefore>
 
          <JtagInstrBitsAfter>0</JtagInstrBitsAfter>
 
        </InterfaceProperties>
 
      </ToolOptions>
 
    </com_atmel_avrdbg_tool_avrdragon>
 
  </PropertyGroup>
 
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
 
    <ToolchainSettings>
 
@@ -150,6 +178,12 @@
 
    <Compile Include="lib\loopTimer.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\masterComm.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\masterComm.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sensors.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
@@ -162,6 +196,12 @@
 
    <Compile Include="lib\serial.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\serparser.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\serparser.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\spi.c">
 
      <SubType>compile</SubType>
 
    </Compile>
0 comments (0 inline, 0 general)