Changeset - d96de01781be
[Not reviewed]
default
4 3 2
mkanning@CL-SEC241-10.cedarville.edu - 13 years ago 2012-11-15 14:02:59
mkanning@CL-SEC241-10.cedarville.edu
more changes to GPS tracker
9 files changed with 76 insertions and 921 deletions:
0 comments (0 inline, 0 general)
master/master/lib/aprs_trackuino/gps.c
Show inline comments
 
deleted file
master/master/lib/aprs_trackuino/gps.cpp
Show inline comments
 
deleted file
master/master/lib/aprs_trackuino/gps.h
Show inline comments
 
deleted file
master/master/lib/aprs_trackuino/trackuino.pde
Show inline comments
 
deleted file
master/master/lib/trackuinoGPS/gps.c
Show inline comments
 
@@ -64,334 +64,336 @@ static const t_nmea_parser gga_parsers[]
 
static const t_nmea_parser rmc_parsers[] = {
 
	NULL,             // $GPRMC
 
	parse_time,       // Time
 
	parse_status,     // A=active, V=void
 
	parse_lat,        // Latitude,
 
	parse_lat_hemi,   // N/S
 
	parse_lon,        // Longitude
 
	parse_lon_hemi,   // E/W
 
	parse_speed,      // Speed over ground in knots
 
	parse_course,     // Track angle in degrees (true)
 
	NULL,             // Date (DDMMYY)
 
	NULL,             // Magnetic variation
 
	NULL              // E/W
 
};
 

	
 

	
 

	
 
static const int NUM_OF_UNK_PARSERS = (sizeof(unk_parsers) / sizeof(t_nmea_parser));
 
static const int NUM_OF_GGA_PARSERS = (sizeof(gga_parsers) / sizeof(t_nmea_parser));
 
static const int NUM_OF_RMC_PARSERS = (sizeof(rmc_parsers) / sizeof(t_nmea_parser));
 

	
 

	
 

	
 
// Module variables
 
static t_sentence_type sentence_type = SENTENCE_UNK;
 
static bool at_checksum = false;
 
static unsigned char our_checksum = '$';
 
static unsigned char their_checksum = 0;
 
static char token[16];
 
static int num_tokens = 0;
 
static unsigned int offset = 0;
 
static bool active = false;
 
static char gga_time[7] = "", rmc_time[7] = "";
 
static char new_time[7];
 
static uint32_t new_seconds;
 
static float new_lat;
 
static float new_lon;
 
static char new_aprs_lat[9];
 
static char new_aprs_lon[10];
 
static float new_course;
 
static float new_speed;
 
static float new_altitude;
 

	
 
// Public (extern) variables, readable from other modules
 
char gps_time[7];       // HHMMSS
 
uint32_t gps_seconds = 0;   // seconds after midnight
 
float gps_lat = 0;
 
float gps_lon = 0;
 
char gps_aprs_lat[9];
 
char gps_aprs_lon[10];
 
float gps_course = 0;
 
float gps_speed = 0;
 
float gps_altitude = 0;
 

	
 
// Module functions
 
/// convert hex to binary ??
 
unsigned char from_hex(char a)
 
{
 
	if (a >= 'A' && a <= 'F'){
 
		return a - 'A' + 10;
 
	}else if (a >= 'a' && a <= 'f'){
 
		return a - 'a' + 10;
 
	}else if (a >= '0' && a <= '9'){
 
		return a - '0';
 
	}else{
 
		return 0;
 
	}
 
}
 

	
 
/// determine what type of message is being sent ??
 
/// we only send one message type so may not be needed
 
void parse_sentence_type(const char *token)
 
{
 
	if (strcmp(token, "$GPGGA") == 0) {
 
		sentence_type = SENTENCE_GGA;
 
	} else if (strcmp(token, "$GPRMC") == 0) {
 
		sentence_type = SENTENCE_RMC;
 
	} else {
 
		sentence_type = SENTENCE_UNK;
 
	}
 
}
 

	
 

	
 
void parse_time(const char *token)
 
{
 
	// Time can have decimals (fractions of a second), but we only take HHMMSS
 
	///we prolly want the entire time (unix time) ??
 
	strncpy(new_time, token, 6);
 
	// Terminate string
 
	new_time[6] = '\0';
 

	
 
	new_seconds =
 
		((new_time[0] - '0') * 10 + (new_time[1] - '0')) * 60 * 60UL +
 
		((new_time[2] - '0') * 10 + (new_time[3] - '0')) * 60 +
 
		((new_time[4] - '0') * 10 + (new_time[5] - '0'));
 
}
 

	
 
/// not sure of exact purpose, besides the name...
 
void parse_status(const char *token)
 
{
 
	// "A" = active, "V" = void. We should disregard void sentences
 
	if (strcmp(token, "A") == 0){
 
		active = true;
 
	}else{
 
		active = false;
 
	}
 
}
 

	
 
/// this is a vital function
 
void parse_lat(const char *token)
 
{
 
	// Parses latitude in the format "DD" + "MM" (+ ".M{...}M")
 
	/// not sure about the format...
 
	char degs[3];
 
	if (strlen(token) >= 4) {
 
		degs[0] = token[0];
 
		degs[1] = token[1];
 
		degs[2] = '\0';
 
		new_lat = atof(degs) + atof(token + 2) / 60;
 
	}
 
	// APRS-ready latitude
 
	strncpy(new_aprs_lat, token, 7);
 
	new_aprs_lat[7] = '\0';
 
}
 

	
 
/// if this is hemisphere it is not needed. we are in the north.
 
void parse_lat_hemi(const char *token)
 
{
 
	if (token[0] == 'S'){
 
		new_lat = -new_lat;
 
	}
 
	new_aprs_lat[7] = token[0];
 
	new_aprs_lon[8] = '\0';
 
}
 

	
 
/// another vital function
 
void parse_lon(const char *token)
 
{
 
	// Longitude is in the format "DDD" + "MM" (+ ".M{...}M")
 
	/// again not sure of formatting...
 
	char degs[4];
 
	if (strlen(token) >= 5) {
 
		degs[0] = token[0];
 
		degs[1] = token[1];
 
		degs[2] = token[2];
 
		degs[3] = '\0';
 
		new_lon = atof(degs) + atof(token + 3) / 60;
 
	}
 
	// APRS-ready longitude
 
	strncpy(new_aprs_lon, token, 8);
 
	new_aprs_lon[8] = '\0';
 
}
 

	
 
/// if this is hemisphere it is not needed
 
void parse_lon_hemi(const char *token)
 
{
 
	if (token[0] == 'W'){
 
		new_lon = -new_lon;
 
	}
 
	new_aprs_lon[8] = token[0];
 
	new_aprs_lon[9] = '\0';
 
}
 

	
 
/// we do not need to record speed
 
void parse_speed(const char *token)
 
{
 
	new_speed = atof(token);
 
}
 

	
 
/// we do not need to record course
 
void parse_course(const char *token)
 
{
 
	new_course = atof(token);
 
}
 

	
 
/// will use this to validate pressure readings
 
void parse_altitude(const char *token)
 
{
 
	new_altitude = atof(token);
 
}
 

	
 

	
 
//
 
// Exported functions
 
//
 
/// void zeroing of data. presumably to be called at start
 
void gps_setup() {
 
	strcpy(gps_time, "000000");
 
	strcpy(gps_aprs_lat, "0000.00N");
 
	strcpy(gps_aprs_lon, "00000.00E");
 
}
 

	
 
/// MKa GPS transmission parser
 
void parse_gps_transmission(char c){
 
/// MKa GPS transmission parser START
 
void parse_gps_transmission(char gpsToken){
 
	// i think c is the most recent character of transmission and is constantly 
 
	// tested if terminal character. if terminal then do parse on previous transmission.
 
	 
 
	// $--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx
 
	if(c == '\n') //end of transmission sentence. may need more checks
 
	if(gpsToken == '$') //start of transmission sentence
 
	{
 
		
 
	}
 
}
 

	
 
/// MKa GPS transmission parser END
 

	
 
/// process gps transmission 
 
bool gps_decode(char c)
 
{
 
	int ret = false;
 

	
 
	switch(c) {
 
		case '\r':
 
		case '\n': // End of sentence
 
			if (num_tokens && our_checksum == their_checksum) { ///checksum is valid (good transmission)
 
				#ifdef DEBUG_GPS
 
				Serial.print(" (OK!) ");
 
				Serial.print(millis());
 
				#endif
 
				// Return a valid position only when we have two rmc and gga
 
				// messages with the same timestamp.
 
				switch (sentence_type) {
 
					case SENTENCE_UNK:
 
						break;    // Keeps gcc happy
 
					case SENTENCE_GGA:
 
						strcpy(gga_time, new_time);
 
						break;
 
					case SENTENCE_RMC:
 
						strcpy(rmc_time, new_time);
 
						break;
 
				}
 

	
 
				// Valid position scenario:
 
				//
 
				// 1. The timestamps of the two previous GGA/RMC sentences must match.
 
				//
 
				// 2. We just processed a known (GGA/RMC) sentence. Suppose the
 
				//    contrary: after starting up this module, gga_time and rmc_time
 
				//    are both equal (they're both initialized to ""), so (1) holds
 
				//    and we wrongly report a valid position.
 
				//
 
				// 3. The GPS has a valid fix. For some reason, the Venus 634FLPX
 
				//    reports 24 deg N, 121 deg E (the middle of Taiwan) until a valid
 
				//    fix is acquired:
 
				//
 
				//    $GPGGA,120003.000,2400.0000,N,12100.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*69 (OK!)
 
				//    $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 (OK!)
 
				//    $GPRMC,120003.000,V,2400.0000,N,12100.0000,E,000.0,000.0,280606,,,N*78 (OK!)
 
				//    $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 (OK!)
 

	
 
				if (sentence_type != SENTENCE_UNK &&      // Known sentence?
 
				strcmp(gga_time, rmc_time) == 0 &&    // RMC/GGA times match?
 
				active) {                             // Valid fix?
 
					// Atomically merge data from the two sentences
 
					strcpy(gps_time, new_time);
 
					gps_seconds = new_seconds;
 
					gps_lat = new_lat;
 
					gps_lon = new_lon;
 
					strcpy(gps_aprs_lat, new_aprs_lat);
 
					strcpy(gps_aprs_lon, new_aprs_lon);
 
					gps_course = new_course;
 
					gps_speed = new_speed;
 
					gps_altitude = new_altitude;
 
					ret = true;
 
				}
 
			}
 
			#ifdef DEBUG_GPS
 
			if (num_tokens){
 
				Serial.println();
 
			}
 
			#endif
 
			at_checksum = false;        // CR/LF signals the end of the checksum
 
			our_checksum = '$';         // Reset checksums
 
			their_checksum = 0;
 
			offset = 0;                 // Prepare for the next incoming sentence
 
			num_tokens = 0;
 
			sentence_type = SENTENCE_UNK;
 
			break;
 

	
 
		case '*':
 
			// Handle as ',', but prepares to receive checksum (ie. do not break)
 
			at_checksum = true;
 
			our_checksum ^= c;
 

	
 
		case ',':
 
			// Process token
 
			token[offset] = '\0';
 
			our_checksum ^= c;  // Checksum the ',', undo the '*'
 

	
 
			// Parse token
 
			switch (sentence_type) {
 
				case SENTENCE_UNK:
 
					if (num_tokens < NUM_OF_UNK_PARSERS && unk_parsers[num_tokens]){
 
						unk_parsers[num_tokens](token);
 
					}
 
					break;
 
				case SENTENCE_GGA:
 
					if (num_tokens < NUM_OF_GGA_PARSERS && gga_parsers[num_tokens]){
 
						gga_parsers[num_tokens](token);
 
					}
 
					break;
 
				case SENTENCE_RMC:
 
					if (num_tokens < NUM_OF_RMC_PARSERS && rmc_parsers[num_tokens]){
 
						rmc_parsers[num_tokens](token);
 
					}
 
					break;
 
			}
 

	
 
			// Prepare for next token
 
			num_tokens++;
 
			offset = 0;
 
			#ifdef DEBUG_GPS
 
			Serial.print(c);
 
			#endif
 
			break;
 

	
 
		default:
 
			// Any other character
 
			if (at_checksum) {
 
				// Checksum value
 
				their_checksum = their_checksum * 16 + from_hex(c);
 
			} else {
 
				// Regular NMEA data
 
				if (offset < 15) {  // Avoid buffer overrun (tokens can't be > 15 chars)
 
					token[offset] = c;
 
					offset++;
 
					our_checksum ^= c;
 
				}
 
			}
 
			#ifdef DEBUG_GPS
 
			Serial.print(c);
 
			#endif
 
	}
 
	return ret;
 
}
 

	
master/master/lib/trackuinoGPS/gps.h
Show inline comments
 
/* trackuino copyright (C) 2010  EA5HAV Javi
 
 *
 
 * This program is free software; you can redistribute it and/or
 
 * modify it under the terms of the GNU General Public License
 
 * as published by the Free Software Foundation; either version 2
 
 * of the License, or (at your option) any later version.
 
 *
 
 * This program 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 General Public License for more details.
 
 *
 
 * You should have received a copy of the GNU General Public License
 
 * along with this program; if not, write to the Free Software
 
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 */
 

	
 
#ifndef __GPS_H__
 
#define __GPS_H__
 

	
 
#include <stdint.h>
 
#include <stdlib.h>
 
#include <string.h>
 
#include <stdbool.h>
 

	
 
extern char gps_time[7];       // HHMMSS
 
extern uint32_t gps_seconds;   // seconds after midnight
 
extern char gps_date[7];       // DDMMYY
 
extern float gps_lat;
 
extern float gps_lon;
 
extern char gps_aprs_lat[9];
 
extern char gps_aprs_lon[10];
 
extern float gps_course;
 
extern float gps_speed;
 
extern float gps_altitude;
 

	
 

	
 

	
 
void gps_setup();
 
bool gps_decode(char c);
 

	
 
#endif
 
enum t_sentence_type {
 
typedef enum t_sentence_type {
 
	SENTENCE_UNK,
 
	SENTENCE_GGA,
 
	SENTENCE_RMC
 
};
 
\ No newline at end of file
 
}t_sentence_type;
 
#endif
master/master/lib/trackuinoGPS/gpsMKa.c
Show inline comments
 
new file 100644
 
/*
 
 * gpsMKa.c
 
 *
 
 * Created: 11/15/2012 12:02:38 PM
 
 *  Author: mkanning
 
 */ 
 
#include <stdbool.h>
 

	
 
// has the transmission started 
 
bool transmissionBegin = false;
 

	
 
// holds the byte ALREADY PARSED. includes starting character
 
int bytesReceived = 0;
 

	
 
//data (and checksum) of most recent transmission
 
char data[16];
 

	
 
/// MKa GPS transmission parser START
 
void parse_gps_transmission(void){
 
	
 
	// Pull byte off of the buffer
 
	char byte = uart_getchar();
 
	
 
	// $--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx
 
	if(byte == '$') //start of transmission sentence
 
	{
 
		transmissionBegin = true;
 
		bytesReceived = 1; //resets transmission if '$' is found
 
	}
 
	
 
	if (transmissionBegin)
 
	{
 
		if (bytesReceived == 3) //check 4th byte
 
		{
 
			if(byte == ' ')
 
			{
 
				
 
			}
 
		} 
 
		else
 
		{
 
		}
 
		//use a state machine implementation rather than this
 
	}
 
	
 
}
 

	
 
/// MKa GPS transmission parser END
 
\ No newline at end of file
master/master/lib/trackuinoGPS/gpsMKa.h
Show inline comments
 
new file 100644
 
/*
 
 * gpsMKa.h
 
 *
 
 * Created: 11/15/2012 12:02:53 PM
 
 *  Author: mkanning
 
 */ 
 
 
 
#ifndef GPSMKA_H_
 
#define GPSMKA_H_
 
#define GGA_MESSAGE
 
#define RMC_MESSAGE
 
#define UKN_MESSAGE
 
// states
 
#define 
 
 
 
#endif /* GPSMKA_H_ */
 
\ No newline at end of file
master/master/master.cproj
Show inline comments
 
@@ -6,214 +6,209 @@
 
    <ToolchainName>com.Atmel.AVRGCC8</ToolchainName>
 
    <ProjectGuid>{8579ec2d-5815-40db-84e0-1d14239c7aea}</ProjectGuid>
 
    <avrdevice>ATmega324P</avrdevice>
 
    <avrdeviceseries>none</avrdeviceseries>
 
    <OutputType>Executable</OutputType>
 
    <Language>C</Language>
 
    <OutputFileName>$(MSBuildProjectName)</OutputFileName>
 
    <OutputFileExtension>.elf</OutputFileExtension>
 
    <OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
 
    <AssemblyName>master</AssemblyName>
 
    <Name>master</Name>
 
    <RootNamespace>master</RootNamespace>
 
    <ToolchainFlavour>Native</ToolchainFlavour>
 
    <KeepTimersRunning>true</KeepTimersRunning>
 
    <OverrideVtor>false</OverrideVtor>
 
    <OverrideVtorValue />
 
    <eraseonlaunchrule>0</eraseonlaunchrule>
 
    <AsfVersion>3.1.3</AsfVersion>
 
    <avrtool>com.atmel.avrdbg.tool.ispmk2</avrtool>
 
    <avrtoolinterface>ISP</avrtoolinterface>
 
    <com_atmel_avrdbg_tool_simulator>
 
      <ToolType xmlns="">com.atmel.avrdbg.tool.simulator</ToolType>
 
      <ToolName xmlns="">AVR Simulator</ToolName>
 
      <ToolNumber xmlns="">
 
      </ToolNumber>
 
      <KeepTimersRunning xmlns="">true</KeepTimersRunning>
 
      <OverrideVtor xmlns="">false</OverrideVtor>
 
      <OverrideVtorValue xmlns="">
 
      </OverrideVtorValue>
 
      <Channel xmlns="">
 
        <host>127.0.0.1</host>
 
        <port>52692</port>
 
        <ssl>False</ssl>
 
      </Channel>
 
    </com_atmel_avrdbg_tool_simulator>
 
    <com_atmel_avrdbg_tool_ispmk2>
 
      <ToolType>com.atmel.avrdbg.tool.ispmk2</ToolType>
 
      <ToolName>AVRISP mkII</ToolName>
 
      <ToolNumber>000200131077</ToolNumber>
 
      <KeepTimersRunning>true</KeepTimersRunning>
 
      <OverrideVtor>false</OverrideVtor>
 
      <OverrideVtorValue>
 
      </OverrideVtorValue>
 
      <Channel>
 
        <host>127.0.0.1</host>
 
        <port>61309</port>
 
        <ssl>False</ssl>
 
      </Channel>
 
      <ToolOptions>
 
        <InterfaceName>ISP</InterfaceName>
 
        <InterfaceProperties>
 
          <JtagDbgClock>249000</JtagDbgClock>
 
          <JtagProgClock>1000000</JtagProgClock>
 
          <IspClock>2010000</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_ispmk2>
 
    <preserveEEPROM>True</preserveEEPROM>
 
  </PropertyGroup>
 
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
 
    <ToolchainSettings>
 
      <AvrGcc>
 
        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
 
        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
 
        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
 
        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
 
        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
 
        <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
 
        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
 
        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
 
        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
 
        <avrgcc.linker.libraries.Libraries>
 
          <ListValues>
 
            <Value>m</Value>
 
          </ListValues>
 
        </avrgcc.linker.libraries.Libraries>
 
      </AvrGcc>
 
    </ToolchainSettings>
 
  </PropertyGroup>
 
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
 
    <ToolchainSettings>
 
      <AvrGcc>
 
        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
 
        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
 
        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
 
        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
 
        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
 
        <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
 
        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
 
        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
 
        <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
 
        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
 
        <avrgcc.linker.libraries.Libraries>
 
          <ListValues>
 
            <Value>m</Value>
 
          </ListValues>
 
        </avrgcc.linker.libraries.Libraries>
 
        <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
 
      </AvrGcc>
 
    </ToolchainSettings>
 
  </PropertyGroup>
 
  <ItemGroup>
 
    <Compile Include="config.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\afsk.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\afsk.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\aprs.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\aprs.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\ax25.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\ax25.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\logger.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\led.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\led.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\logger.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\byteordering.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\byteordering.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\fat.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\fat.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\fat_config.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\partition.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\partition.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\partition_config.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\sd-reader_config.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\sd_raw.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\sd_raw.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\sd\sd_raw_config.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\serial.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <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\trackuinoGPS\config.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\trackuinoGPS\gps.c">
 
    <Compile Include="lib\trackuinoGPS\gpsMKa.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="lib\trackuinoGPS\gps.h">
 
    <Compile Include="lib\trackuinoGPS\gpsMKa.h">
 
      <SubType>compile</SubType>
 
    </Compile>
 
    <Compile Include="master.c">
 
      <SubType>compile</SubType>
 
    </Compile>
 
  </ItemGroup>
 
  <ItemGroup>
 
    <Folder Include="lib" />
 
    <Folder Include="lib\trackuinoGPS" />
 
    <Folder Include="lib\sd" />
 
  </ItemGroup>
 
  <ItemGroup>
 
    <None Include="lib\trackuinoGPS\trackuino.pde">
 
      <SubType>compile</SubType>
 
    </None>
 
  </ItemGroup>
 
  <Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
 
</Project>
 
\ No newline at end of file
0 comments (0 inline, 0 general)