00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIN32
00023 #include <avr/io.h>
00024 #include <avr/pgmspace.h>
00025 #include <math.h>
00026 #include <stdlib.h>
00027 #endif
00028
00029 #include "global.h"
00030 #include "buffer.h"
00031 #include "rprintf.h"
00032 #include "uart2.h"
00033 #include "gps.h"
00034
00035 #include "tsip.h"
00036
00037
00038
00039
00040 extern GpsInfoType GpsInfo;
00041 #define BUFFERSIZE 0x40
00042 u08 TsipPacket[BUFFERSIZE];
00043 u08 debug;
00044
00045
00046 static void (*TsipTxByteFunc)(unsigned char c);
00047
00048 void tsipInit(void (*txbytefunc)(unsigned char c))
00049 {
00050
00051
00052 TsipTxByteFunc = txbytefunc;
00053
00054
00055 debug = 0;
00056
00057
00058 u08 packet[4];
00059 packet[0] = BV(POS_LLA);
00060 packet[1] = BV(VEL_ENU);
00061 packet[2] = 0;
00062 packet[3] = 0;
00063
00064 tsipSendPacket(TSIPTYPE_SET_IO_OPTIONS, 4, packet);
00065 }
00066
00067 void tsipSendPacket(u08 tsipType, u08 dataLength, u08* data)
00068 {
00069 u08 i;
00070 u08 dataIdx = 0;
00071
00072
00073 TsipPacket[dataIdx++] = DLE;
00074
00075 TsipPacket[dataIdx++] = tsipType;
00076
00077 for(i=0; i<dataLength; i++)
00078 {
00079 if(*data == DLE)
00080 {
00081
00082 TsipPacket[dataIdx++] = *data;
00083 TsipPacket[dataIdx++] = *data++;
00084 }
00085 else
00086 TsipPacket[dataIdx++] = *data++;
00087 }
00088
00089 TsipPacket[dataIdx++] = DLE;
00090 TsipPacket[dataIdx++] = ETX;
00091
00092 for(i=0; i<dataIdx; i++)
00093 TsipTxByteFunc(TsipPacket[i]);
00094 }
00095
00096 u08 tsipProcess(cBuffer* rxBuffer)
00097 {
00098 u08 foundpacket = FALSE;
00099 u08 startFlag = FALSE;
00100 u08 data;
00101 u08 i,j,k;
00102
00103 u08 TsipPacketIdx;
00104
00105
00106
00107 while(rxBuffer->datalength > 1)
00108 {
00109
00110 if(bufferGetAtIndex(rxBuffer,0) == DLE)
00111 {
00112
00113 data = bufferGetAtIndex(rxBuffer,1);
00114 if((data != DLE) && (data != ETX))
00115 {
00116
00117 startFlag = TRUE;
00118
00119 break;
00120 }
00121 }
00122 else
00123
00124 bufferGetFromFront(rxBuffer);
00125 }
00126
00127
00128 if(startFlag)
00129 {
00130 for(i=1; i<(rxBuffer->datalength)-1; i++)
00131 {
00132
00133 if((bufferGetAtIndex(rxBuffer,i) == DLE) && (bufferGetAtIndex(rxBuffer,i+1) == ETX))
00134 {
00135
00136
00137 bufferGetFromFront(rxBuffer);
00138
00139 TsipPacketIdx = 0;
00140 for(j=0; j<(i-1); j++)
00141 {
00142 data = bufferGetFromFront(rxBuffer);
00143 if(data == DLE)
00144 {
00145 if(bufferGetAtIndex(rxBuffer,0) == DLE)
00146 {
00147
00148 bufferGetFromFront(rxBuffer);
00149 j++;
00150 }
00151 }
00152 TsipPacket[TsipPacketIdx++] = data;
00153 }
00154
00155 bufferGetFromFront(rxBuffer);
00156 bufferGetFromFront(rxBuffer);
00157
00158
00159 if(debug)
00160 {
00161 rprintf("Rx TSIP packet type: 0x%x len: %d rawlen: %d\r\n",
00162 TsipPacket[0],
00163 TsipPacketIdx,
00164 i);
00165 for(k=0; k<TsipPacketIdx; k++)
00166 {
00167 rprintfu08(TsipPacket[k]);
00168 rprintfChar(' ');
00169 }
00170
00171
00172
00173 rprintfCRLF();
00174 }
00175
00176 foundpacket = TRUE;
00177 break;
00178 }
00179 }
00180 }
00181
00182 if(foundpacket)
00183 {
00184
00185 switch(TsipPacket[0])
00186 {
00187 case TSIPTYPE_GPSTIME: tsipProcessGPSTIME(TsipPacket); break;
00188 case TSIPTYPE_POSFIX_XYZ_SP: tsipProcessPOSFIX_XYZ_SP(TsipPacket); break;
00189 case TSIPTYPE_VELFIX_XYZ: tsipProcessVELFIX_XYZ(TsipPacket); break;
00190
00191 case TSIPTYPE_POSFIX_LLA_SP: tsipProcessPOSFIX_LLA_SP(TsipPacket); break;
00192 case TSIPTYPE_VELFIX_ENU: tsipProcessVELFIX_ENU(TsipPacket); break;
00193
00194 case TSIPTYPE_RAWDATA: break;
00195 default:
00196
00197 break;
00198 }
00199 }
00200
00201 return foundpacket;
00202 }
00203
00204 void tsipProcessGPSTIME(u08* packet)
00205 {
00206
00207 GpsInfo.TimeOfWeek.b[3] = packet[1];
00208 GpsInfo.TimeOfWeek.b[2] = packet[2];
00209 GpsInfo.TimeOfWeek.b[1] = packet[3];
00210 GpsInfo.TimeOfWeek.b[0] = packet[4];
00211
00212 GpsInfo.WeekNum = ((u16)packet[5]<<8)|((u16)packet[6]);
00213
00214 GpsInfo.UtcOffset.b[3] = packet[7];
00215 GpsInfo.UtcOffset.b[2] = packet[8];
00216 GpsInfo.UtcOffset.b[1] = packet[9];
00217 GpsInfo.UtcOffset.b[0] = packet[10];
00218 }
00219
00220 void tsipProcessPOSFIX_XYZ_SP(u08* packet)
00221 {
00222
00223 GpsInfo.PosECEF.x.b[3] = packet[1];
00224 GpsInfo.PosECEF.x.b[2] = packet[2];
00225 GpsInfo.PosECEF.x.b[1] = packet[3];
00226 GpsInfo.PosECEF.x.b[0] = packet[4];
00227
00228 GpsInfo.PosECEF.y.b[3] = packet[5];
00229 GpsInfo.PosECEF.y.b[2] = packet[6];
00230 GpsInfo.PosECEF.y.b[1] = packet[7];
00231 GpsInfo.PosECEF.y.b[0] = packet[8];
00232
00233 GpsInfo.PosECEF.z.b[3] = packet[9];
00234 GpsInfo.PosECEF.z.b[2] = packet[10];
00235 GpsInfo.PosECEF.z.b[1] = packet[11];
00236 GpsInfo.PosECEF.z.b[0] = packet[12];
00237
00238 GpsInfo.PosECEF.TimeOfFix.b[3] = packet[13];
00239 GpsInfo.PosECEF.TimeOfFix.b[2] = packet[14];
00240 GpsInfo.PosECEF.TimeOfFix.b[1] = packet[15];
00241 GpsInfo.PosECEF.TimeOfFix.b[0] = packet[16];
00242
00243 GpsInfo.PosECEF.updates++;
00244
00245
00246 }
00247
00248 void tsipProcessVELFIX_XYZ(u08* packet)
00249 {
00250 }
00251
00252 void tsipProcessPOSFIX_LLA_SP(u08* packet)
00253 {
00254
00255 GpsInfo.PosLLA.lat.b[3] = packet[1];
00256 GpsInfo.PosLLA.lat.b[2] = packet[2];
00257 GpsInfo.PosLLA.lat.b[1] = packet[3];
00258 GpsInfo.PosLLA.lat.b[0] = packet[4];
00259
00260 GpsInfo.PosLLA.lon.b[3] = packet[5];
00261 GpsInfo.PosLLA.lon.b[2] = packet[6];
00262 GpsInfo.PosLLA.lon.b[1] = packet[7];
00263 GpsInfo.PosLLA.lon.b[0] = packet[8];
00264
00265 GpsInfo.PosLLA.alt.b[3] = packet[9];
00266 GpsInfo.PosLLA.alt.b[2] = packet[10];
00267 GpsInfo.PosLLA.alt.b[1] = packet[11];
00268 GpsInfo.PosLLA.alt.b[0] = packet[12];
00269
00270 GpsInfo.PosLLA.TimeOfFix.b[3] = packet[17];
00271 GpsInfo.PosLLA.TimeOfFix.b[2] = packet[18];
00272 GpsInfo.PosLLA.TimeOfFix.b[1] = packet[18];
00273 GpsInfo.PosLLA.TimeOfFix.b[0] = packet[20];
00274
00275 GpsInfo.PosLLA.updates++;
00276 }
00277
00278 void tsipProcessVELFIX_ENU(u08* packet)
00279 {
00280
00281 GpsInfo.VelENU.east.b[3] = packet[1];
00282 GpsInfo.VelENU.east.b[2] = packet[2];
00283 GpsInfo.VelENU.east.b[1] = packet[3];
00284 GpsInfo.VelENU.east.b[0] = packet[4];
00285
00286 GpsInfo.VelENU.north.b[3] = packet[5];
00287 GpsInfo.VelENU.north.b[2] = packet[6];
00288 GpsInfo.VelENU.north.b[1] = packet[7];
00289 GpsInfo.VelENU.north.b[0] = packet[8];
00290
00291 GpsInfo.VelENU.up.b[3] = packet[9];
00292 GpsInfo.VelENU.up.b[2] = packet[10];
00293 GpsInfo.VelENU.up.b[1] = packet[11];
00294 GpsInfo.VelENU.up.b[0] = packet[12];
00295
00296 GpsInfo.VelENU.TimeOfFix.b[3] = packet[17];
00297 GpsInfo.VelENU.TimeOfFix.b[2] = packet[18];
00298 GpsInfo.VelENU.TimeOfFix.b[1] = packet[19];
00299 GpsInfo.VelENU.TimeOfFix.b[0] = packet[20];
00300
00301 GpsInfo.VelENU.updates++;
00302 }
00303
00304 void tsipProcessRAWDATA(cBuffer* packet)
00305 {
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 }
00331