Ansi C serial decoder source
Note: This source code can be freely used, but is supplied without warrantee or support
/******************************************************************************************************
*
* Project : Serial Decoder
* File : tskSerialDecode.c
* Description : Serial data processing functions
* Author : Dr. Andrew J. Durrant
* Copyright : Race Technology Ltd, UK
*
*
* Version Date Author Change/Reason
* ------- ---------- -------------------- -------------------------------------------------------
* 1.0 2006 Dr.Andrew Durrant Originally created in Visual Basic
* 2.0 01-02-2007 Thisara Matharage Converted to C language
* 3.0 06-06-2007 Sumudu Fernando Optimizing the code
* 3.1 14-06-2007 Bug Fixing
* 3.2 23-08-2007 Thisara Matharage Bug Fixing
* 3.3 07-09-2007 Thisara Matharage DVR commading added based on the Serial Commands on DRAFT 1
* 3.4 25-09-2007 Thisara Matharage RUN file write
* 3.5 29-09-2007 Thisara Matharage Removal of pointers, Extract msg, Bug fixing and improvement
* 3.6 10-10-2007 Thisara Matharage RUN file header signature (Ln 723)
Save msg type 0x68 (video frame number) Ln 1252
* 3.7 10-11-2007 Thisara Matharage Control Playback
* 3.8 12-04-2007 Nuwan Gajaweera Optimize code by eliminating seperate fucntion for checksum calculation
Added MessagesLengths[] array
Added functions - func80_HARDC_GPSYAW(), func81_HARDC_PITCH_RATE (), func82_HARDC_PITCH (),
func83_HARDC_ROLL_RATE (), func86_HARDC_PULSE0 (), func90_HARDC_BASELINERTK ()
Changed func20_ADC0HARDC - added channels ADC16HARDC to ADC31HARDC
* 3.9 07-01-2008 Nuwan Gajaweera Added function f_NoData. The following channels are pointed to new func
52~54, 63, 65~70, 76, 77, 91, 101, 102, 104
and 103 (in Non DVR systems)
Added function func83_HARDC_ROLL_RATE and related constants GYROROLLRATE_, GPSROLLRATELENGTH
Added following functions (unused and untested) - func63_HARDC_START_OF_RUN, func65_HARDC_GEAR_SETUP_DATA
func67_HARDC_DASHBOARD_SETUP_DATA, func68_HARDC_DASHBOARD_SETUP_DATA_2, func69_HARDC_NEW_TARGET_SECTOR_TIME
func70_HARDC_NEW_TARGET_MARKER_TIME, func76_HARDC_NEW_LCD_DATA, func77_HARDC_NEW_LED_DATA
func91_HARDC_UNIT_CONTROL, func0x65_HARDC_SECTOR_DEFINITION, func0x68_HARDC_VIDEO_FRAME_INDEX
*******************************************************************************************************/
///////////////////////////////////////////////////////////////////////////////////////////
// Header files
///////////////////////////////////////////////////////////////////////////////////////////
#include <string.h> // strcpy, strcat, memmove
#include <math.h> // pow
#include <stdio.h>
///////////////////////////////////////////////////////////////////////////////////////////
//#define C6000
//#define C2000
#define PC
#ifndef RTMSGDEC_H
#define RTMSGDEC_H
#define MAX_MSG_LEN 255
#define ARRAY_LEN 256
#define GRAVG ((F64)9.80665) //gravitational contant g
#define PI ((F64)3.141592654) //Pi!
#define TICKPERIOD (1.66666666666667E-07) // Add comment (###)
////////////////////////////////////////////////////////////////////////////////////////
// Message Length Defs
////////////////////////////////////////////////////////////////////////////////////////
#define ENCSERIALHARDCLENGTH 9
#define GPSALTLENGTH 10
#define GPSHEADINGLENGTH 10
#define GPSDATELENGTH 10
#define MARKERCHANNELLENGTH 21
#define SECTORTIMECHANNELLENGTH 7
#define ADCCHANNELLENGTH 4
#define ACCELCHANNELLENGTH 6
#define ZACCELCHANNELLENGTH 4
#define GPSPOSCHANNELLENGTH 14
#define GPSSPEEDCHANNELLENGTH 10
#define DIGITALCHANNELLENGTH 3
#define U24CHANNELLENGTH 5
#define U32CHANNELLENGTH 6
#define FREQCHANNELLENGTH 5
#define EXTENDEDFREQCHANNELLENGTH 11
#define PROCESSEDSPEEDCHANNELLENGTH 5
#define LOGGERSERIALNUMBERCHANNELLENGTH 6
#define DEBUGVAR_CHANNELLENGTH 6
#define ECU_MODULETYPE_CHANNELLENGTH 3
#define ECU_TEMP_CHANNELLENGTH 5
#define ECU_FREQ_CHANNELLENGTH 5
#define ECU_PERC_CHANNELLENGTH 5
#define ECU_TIME_CHANNELLENGTH 6
#define ECU_ANGLE_CHANNELLENGTH 5
#define ECU_PRESSURE_CHANNELLENGTH 6
#define ECU_MISC_CHANNELLENGTH 5
#define STARTSTOPCHANNELLENGTH 11
#define GPSGRADIENTCHANNELLENGTH 10
#define PROCESSEDDISTANCECHANNELLENGTH 6
#define YAWGYROCHANNELLENGTH 4
#define GPSYAWLENGTH 4
#define GPSPITCHRATELENGTH 5
#define GPSPITCHLENGTH 5
#define GPSROLLRATELENGTH 5
#define PULSECOUNTLENGTH 5
#define BASELINERTKLENGTH 6
// DVR COMMAND LENGTH
#define DVR_CMD_CHANNELLENGTH 18
//###
#define CHANNELDATALENGTH 67
#define DISPLAYCHANNELLENGTH 11
#define REFLASHCHANNELLENGTH 6
#define STARTOFRUNLENGTH 3
#define GEARSETUPDATALENGTH 30
#define BARGRAPHSETUPDATALENGTH 11
#define DASHBOARD_SETUP_DATALENGTH 4
#define DASHBOARDSETUPDATA2LENGTH 4
#define NEWTARGETSECTORTIMELENGTH 42
#define NEWTARGETMARKERTIMELENGTH 42
#define NEWLCDDATA 24
#define NEWLEDDATA 3
#define ROLLANGLELENGTH 5
#define UNITCONTROLLENGTH 5
#define SECTORDEFINITIONLENGTH 19
#define VIDEOINDEXLENGTH 6
////////////////////////////////////////////////////////////////////////////////////////
// End of Message Length Defs
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// InternalVariableReference
////////////////////////////////////////////////////////////////////////////////////////
#define MAXVARS 8000 //maximum number of calculated variables allowed
enum InternalVariableReference_{
TIMES_ = 1,
ACCELLONG_ = 2,
ACCELLONGFLAG_ = 3,
ACCELLAT_ = 4,
ACCELVECT_ = 5,
RPM_ = 6,
GPSSPEED_ = 7,
WHEELSPEED_ = 8,
DISTANCE_ = 9,
POWERATWHEELS_ = 10,
TORQUEATWHEELS_ = 11,
GEAR_ = 12,
POSXM_ = 13,
POSYM_ = 14,
CTIME_ = 15,
CTIMERATE_ = 16,
TRACKHEADING_ = 17,
CHANGEINHEADING_ = 18,
CORNERRADIUS_ = 19,
BICYCLELEANANGLE_ = 20,
LAPTIMES_ = 21,
SECTORTIMES_ = 22,
TRACKBEACON_ = 23,
GYROYAWRATE_ = 24,
GYROYAW_ = 25,
GYROSLIPANGLE_ = 26,
BUFFERSIZE_ = 27,
SERIALDATACOUNT_ = 28,
ACCEL_Z_ = 29,
GYROPITCHRATE_ = 30,
GYROROLLRATE_ = 31,
DL1_ANAL0_ = 200,
DL1_ANAL1_ = 201,
DL1_ANAL2_ = 202,
DL1_ANAL3_ = 203,
DL1_ANAL4_ = 204,
DL1_ANAL5_ = 205,
DL1_ANAL6_ = 206,
DL1_ANAL7_ = 207,
DL1_ANAL8_ = 208,
DL1_ANAL9_ = 209,
DL1_ANAL10_ = 210,
DL1_ANAL11_ = 211,
DL1_ANAL12_ = 212,
DL1_ANAL13_ = 213,
DL1_ANAL14_ = 214,
DL1_ANAL15_ = 215,
DL1_ANAL16_ = 216,
DL1_ANAL17_ = 217,
DL1_ANAL18_ = 218,
DL1_ANAL19_ = 219,
DL1_ANAL20_ = 220,
DL1_ANAL21_ = 221,
DL1_ANAL22_ = 222,
DL1_ANAL23_ = 223,
DL1_ANAL24_ = 224,
DL1_ANAL25_ = 225,
DL1_ANAL26_ = 226,
DL1_ANAL27_ = 227,
DL1_ANAL28_ = 228,
DL1_ANAL29_ = 229,
DL1_ANAL30_ = 230,
DL1_ANAL31_ = 231,
DL1_FREQ1_ = 300,
DL1_FREQ2_ = 301,
DL1_FREQ3_ = 302,
DL1_FREQ4_ = 303,
FREQ1_HIGHPERIOD_ = 304,
FREQ1_LOWPERIOD_ = 305,
FREQ1_PULSEPOSITION_ = 306,
FREQ2_HIGHPERIOD_ = 307,
FREQ2_LOWPERIOD_ = 308,
FREQ2_PULSEPOSITION_ = 309,
FREQ3_HIGHPERIOD_ = 310,
FREQ3_LOWPERIOD_ = 311,
FREQ3_PULSEPOSITION_ = 312,
FREQ4_HIGHPERIOD_ = 313,
FREQ4_LOWPERIOD_ = 314,
FREQ4_PULSEPOSITION_ = 315,
FREQ1_PULSE_COUNT_ = 316,
FREQ2_PULSE_COUNT_ = 317,
FREQ3_PULSE_COUNT_ = 318,
FREQ4_PULSE_COUNT_ = 319,
RPM_HIGHPERIOD_ = 320, //Added by Nuwan
RPM_LOWPERIOD_ = 321,
RPM_PULSEPOSITION_ = 322,
GPSALTITUDE_ = 400,
GPSLATACCEL_ = 401,
GPSLONGACCEL_ = 402,
GPSHEADING_ = 403,
GPSGRADIENT_ = 404,
GPSMSTIME_ = 405,
GPSPOSITIONACC_ = 406,
GPSSPEEDACC_ = 407,
GPSHEADINGACC_ = 408,
GPSGRADIENTACC_ = 409,
GPSALTACC_ = 410,
ACTUALGPSSATCOUNT_ = 411,
WEIGHTEDGPSSATCOUNT_ = 412,
GPSVELSOURCE_ = 413,
GPSRAWVEL_ = 414,
GPSRTKPITCH_ = 430,
GPSRTKYAW_ = 431,
GPSROLL_ = 432,//Added by nuwan
GPSRTKBASELINE_ = 450,
GPSRTKBASELINEACC_ = 451,
GPSDATACOUNT_ = 500,
ECU_FIRST_TEMP_ = 1000,
ECU_FIRST_FREQ_ = 1500,
ECU_FIRST_PERC_ = 2000,
ECU_FIRST_TIME_ = 2500,
ECU_FIRST_ANGLE_ = 1500,
ECU_FIRST_PRESSURE_ = 2000,
ECU_FIRST_MISC_ = 2500,
DEBUG_VAR_FP_0_ = 5050,
DEBUG_VAR_FP_1_ = 5051,
DEBUG_VAR_FP_2_ = 5052,
DEBUG_VAR_FP_3_ = 5053,
DEBUG_VAR_FP_4_ = 5054,
DEBUG_VAR_FP_5_ = 5055,
DEBUG_VAR_FP_6_ = 5056,
DEBUG_VAR_FP_7_ = 5057,
DEBUG_VAR_FP_8_ = 5058,
DEBUG_VAR_FP_9_ = 5059,
DEBUG_VAR_FP_A_ = 5060,
DEBUG_VAR_FP_B_ = 5061,
DEBUG_VAR_FP_C_ = 5062,
DEBUG_VAR_FP_D_ = 5063,
DEBUG_VAR_FP_E_ = 5064,
DEBUG_VAR_FP_F_ = 5065,
DEBUG_VAR_U32_0_ = 5066,
DEBUG_VAR_U32_1_ = 5067,
DEBUG_VAR_U32_2_ = 5068,
DEBUG_VAR_U32_3_ = 5069,
DEBUG_VAR_U32_4_ = 5070,
DEBUG_VAR_U32_5_ = 5071,
DEBUG_VAR_U32_6_ = 5072,
DEBUG_VAR_U32_7_ = 5073,
DEBUG_VAR_S32_0_ = 5074,
DEBUG_VAR_S32_1_ = 5075,
DEBUG_VAR_S32_2_ = 5076,
DEBUG_VAR_S32_3_ = 5077,
DEBUG_VAR_S32_4_ = 5078,
DEBUG_VAR_S32_5_ = 5079,
DEBUG_VAR_S32_6_ = 5080,
DEBUG_VAR_S32_7_ = 5081,
USER_VAR_1_ = 6001,
USER_VAR_2_ = 6002,
USER_VAR_3_ = 6003,
USER_VAR_4_ = 6004,
USER_VAR_5_ = 6005,
USER_VAR_6_ = 6006,
USER_VAR_7_ = 6007,
USER_VAR_8_ = 6008,
USER_VAR_9_ = 6009,
USER_VAR_10_ = 6010,
USER_VAR_11_ = 6011,
USER_VAR_12_ = 6012,
USER_VAR_13_ = 6013,
USER_VAR_14_ = 6014,
USER_VAR_15_ = 6015,
USER_VAR_16_ = 6016,
USER_VAR_17_ = 6017,
USER_VAR_18_ = 6018,
USER_VAR_19_ = 6019,
USER_VAR_20_ = 6020,
USER_VAR_21_ = 6021,
USER_VAR_22_ = 6022,
USER_VAR_23_ = 6023,
USER_VAR_24_ = 6024,
USER_VAR_25_ = 6025,
NODATA_ = MAXVARS
};
////////////////////////////////////////////////////////////////////////////////////////
// InternalVariableReference
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Hardware Channels
////////////////////////////////////////////////////////////////////////////////////////
typedef enum HardwareChannels_{
ENCSERIALHARDC = 1,
STARTSTOPHARDC = 2,
GPSRAWDATA = 3,
SECTORTIMEHARDC = 4,
MARKERHARDC = 5,
LOGGERSERIALNUMBERC = 6,
GPSTIMEMSWEEKC = 7,
ACCELSHARDC = 8,
TIMEHARDC = 9,
GPSPOSHARDC = 10,
GPSSPEEDHARDC = 11,
BEACONHARDC = 12,
GPSPULSEHARDC = 13,
FREQ0HARDC = 14,
FREQ1HARDC = 15,
FREQ2HARDC = 16,
FREQ3HARDC = 17,
RPMHARDC = 18,
SERIALDATAHARDC = 19,
ADC0HARDC = 20,
ADC1HARDC = 21,
ADC2HARDC = 22,
ADC3HARDC = 23,
ADC4HARDC = 24,
ADC5HARDC = 25,
ADC6HARDC = 26,
ADC7HARDC = 27,
ADC8HARDC = 28,
ADC9HARDC = 29,
ADC10HARDC = 30, // PROCESSEDSPEEDHARDC__OLD = 30,
ADC11HARDC = 31,
ADC12HARDC = 32,
ADC13HARDC = 33,
ADC14HARDC = 34,
ADC15HARDC = 35,
ADC16HARDC = 36,
ADC17HARDC = 37,
ADC18HARDC = 38,
ADC19HARDC = 39,
ADC20HARDC = 40,
ADC21HARDC = 41,
ADC22HARDC = 42,
ADC23HARDC = 43,
ADC24HARDC = 44,
ADC25HARDC = 45,
ADC26HARDC = 46,
ADC27HARDC = 47,
ADC28HARDC = 48,
ADC29HARDC = 49,
ADC30HARDC = 50,
ADC31HARDC = 51,
CHANNELDATA = 52,
DISPLAYCHANNEL = 53,
REFLASHCHANNEL = 54,
GPSDATEHARDC = 55,
GPSHEADINGHARDC = 56,
GPSALTHARDC = 57,
EXTENDED_FREQ0HARDC = 58,
EXTENDED_FREQ1HARDC = 59,
EXTENDED_FREQ2HARDC = 60,
EXTENDED_FREQ3HARDC = 61,
EXTENDED_RPMHARDC = 62,
PROCESSEDSPEEDHARDC = 64,
HARDC_GEAR_SETUP_DATA = 65,
HARDC_BARGRAPH_SETUP_DATA = 66,
HARDC_DASHBOARD_SETUP_DATA = 67,
HARDC_DASHBOARD_SETUP_DATA_2 = 68,
HARDC_NEW_TARGET_SECTOR_TIME = 69,
HARDC_NEW_TARGET_MARKER_TIME = 70,
HARDC_ECU_MODULETYPE = 71,
HARDC_ECU_TEMP = 72,
HARDC_ECU_FREQ = 73,
HARDC_ECU_PERC = 74,
HARDC_ECU_TIME = 75,
PROCESSEDDISTANCEHARDC = 78,
YAWGYROHARDC = 79,
HARDC_GPSYAW = 80,
HARDC_PITCH_RATE = 81,
HARDC_PITCH = 82,
HARDC_ROLL_RATE = 83,
HARDC_ROLL = 84,
GPSGRADIENTHARDC = 85,
HARDC_PULSE0 = 86,
HARDC_PULSE1 = 87,
HARDC_PULSE2 = 88,
HARDC_PULSE3 = 89,
HARDC_BASELINERTK = 90,
HARDC_UNIT_CONTROL = 91,
HARDC_Z_ACCEL = 92,
HARDC_ECU_ANGLE = 93,
HARDC_ECU_PRESSURE = 94,
HARDC_ECU_MISC = 95,
HARDC_SECTOR_DEFINITION = 0x65,
HARDC_BREAKBOX_PC_COMM = 0x66,
HARDC_DVR_CMD = 0x67,
HARDC_VIDEO_INDEX = 0x68,
HARDC_DEBUG_VAR_FP_0 = 0xD0,
HARDC_DEBUG_VAR_FP_1 = 0xD1,
HARDC_DEBUG_VAR_FP_2 = 0xD2,
HARDC_DEBUG_VAR_FP_3 = 0xD3,
HARDC_DEBUG_VAR_FP_4 = 0xD4,
HARDC_DEBUG_VAR_FP_5 = 0xD5,
HARDC_DEBUG_VAR_FP_6 = 0xD6,
HARDC_DEBUG_VAR_FP_7 = 0xD7,
HARDC_DEBUG_VAR_FP_8 = 0xD8,
HARDC_DEBUG_VAR_FP_9 = 0xD9,
HARDC_DEBUG_VAR_FP_A = 0xDA,
HARDC_DEBUG_VAR_FP_B = 0xDB,
HARDC_DEBUG_VAR_FP_C = 0xDC,
HARDC_DEBUG_VAR_FP_D = 0xDD,
HARDC_DEBUG_VAR_FP_E = 0xDE,
HARDC_DEBUG_VAR_FP_F = 0xDF,
HARDC_DEBUG_VAR_U32_0 = 0xE0,
HARDC_DEBUG_VAR_U32_1 = 0xE1,
HARDC_DEBUG_VAR_U32_2 = 0xE2,
HARDC_DEBUG_VAR_U32_3 = 0xE3,
HARDC_DEBUG_VAR_U32_4 = 0xE4,
HARDC_DEBUG_VAR_U32_5 = 0xE5,
HARDC_DEBUG_VAR_U32_6 = 0xE6,
HARDC_DEBUG_VAR_U32_7 = 0xE7,
HARDC_DEBUG_VAR_S32_0 = 0xF0,
HARDC_DEBUG_VAR_S32_1 = 0xF1,
HARDC_DEBUG_VAR_S32_2 = 0xF2,
HARDC_DEBUG_VAR_S32_3 = 0xF3,
HARDC_DEBUG_VAR_S32_4 = 0xF4,
HARDC_DEBUG_VAR_S32_5 = 0xF5,
HARDC_DEBUG_VAR_S32_6 = 0xF6,
HARDC_DEBUG_VAR_S32_7 = 0xF7,
};
////////////////////////////////////////////////////////////////////////////////////////
// End of Hardware Channels
////////////////////////////////////////////////////////////////////////////////////////
#define TRUE 1
#define FALSE 0
#ifdef C2000
typedef unsigned char U8;
typedef unsigned int U16;
typedef unsigned long U32;
typedef char S8;
typedef int S16;
typedef long S32;
typedef float F32;
typedef long double F64;
#else
typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned int U32;
typedef char S8;
typedef short S16;
typedef int S32;
typedef float F32;
typedef double F64;
#endif
typedef void (*CHPF) ();
#ifdef C2000
extern const U8 MessagesLengths[];
extern void serialDecode (U8 c);
extern void decodeData(U8 decode);
extern void initDecoder(void);
#endif
#ifdef PC
extern void serialDecode (U8 c);
void open_log(char *f_name);
void close_log(void);
#endif
#endif
///////////////////////////////////////////////////////////////////////////////////////////
// Common variables
///////////////////////////////////////////////////////////////////////////////////////////
U8 bDecoderRunning = FALSE; //This gives the decoder state (TRUE - we're in the middle of decoding a message, FALSE - we're about to decode a new message)
U8 bReturnDataValues = TRUE; //This specifies whether the date should be decoded(TRUE) or not(FALSE)
U8 iHardwareChannel; // this is the hardware channel that the data was extracted from
U8 iLengthOfMsg; // length of current message
//U16 iChecksum1;
U8 serial_Buf[MAX_MSG_LEN<<1]; // this is the main raw data input array
U16 iRawInput = 0; // the next data byte recived will be stored at this index in the serial_Buf[]
U16 iRawSample = 0; // the start of the current message, this is an index into the serial_Buf[] as well
U8 iNumReturnedFloatChannels; // this is the number of valid results
S32 iArrReturnedChannels[21]; // these are the soft channels associated with the results array (internal variable reference)
F64 dArrReturnedFloatValues[21]; // these are the returned float values
U8 bBytesReturned; // this specifies whether bytes we extracted from the current message
U8 iNumberOfBytesReturned; // this is the number of bytes that are returned
U8 bArrReturnedByteValues[257]; // this is the returned byte values
U8 bDataValid;
#ifdef PC
FILE *file_out;
#endif
//This array gives the message length for each message type. The index into the array is the hardware channel
const U8 MessagesLengths[ARRAY_LEN] = {
0, // channel #0(0)
ENCSERIALHARDCLENGTH, // channel #1(1)
STARTSTOPCHANNELLENGTH, // channel #2(2)
MAX_MSG_LEN, // channel #3(3)
SECTORTIMECHANNELLENGTH, // channel #4(4)
MARKERCHANNELLENGTH, // channel #5(5)
LOGGERSERIALNUMBERCHANNELLENGTH, // channel #6(6)
U32CHANNELLENGTH, // channel #7(7)
ACCELCHANNELLENGTH, // channel #8(8)
U24CHANNELLENGTH, // channel #9(9)
GPSPOSCHANNELLENGTH, // channel #10(A)
GPSSPEEDCHANNELLENGTH, // channel #11(B)
DIGITALCHANNELLENGTH, // channel #12(C)
DIGITALCHANNELLENGTH, // channel #13(D)
FREQCHANNELLENGTH, // channel #14(E)
FREQCHANNELLENGTH, // channel #15(F)
FREQCHANNELLENGTH, // channel #16(10)
FREQCHANNELLENGTH, // channel #17(11)
FREQCHANNELLENGTH, // channel #18(12)
MAX_MSG_LEN, // channel #19(13)
ADCCHANNELLENGTH, // channel #20(14)
ADCCHANNELLENGTH, // channel #21(15)
ADCCHANNELLENGTH, // channel #22(16)
ADCCHANNELLENGTH, // channel #23(17)
ADCCHANNELLENGTH, // channel #24(18)
ADCCHANNELLENGTH, // channel #25(19)
ADCCHANNELLENGTH, // channel #26(1A)
ADCCHANNELLENGTH, // channel #27(1B)
ADCCHANNELLENGTH, // channel #28(1C)
ADCCHANNELLENGTH, // channel #29(1D)
ADCCHANNELLENGTH, // channel #30(1E)
ADCCHANNELLENGTH, // channel #31(1F)
ADCCHANNELLENGTH, // channel #32(20)
ADCCHANNELLENGTH, // channel #33(21)
ADCCHANNELLENGTH, // channel #34(22)
ADCCHANNELLENGTH, // channel #35(23)
ADCCHANNELLENGTH, // channel #36(24)
ADCCHANNELLENGTH, // channel #37(25)
ADCCHANNELLENGTH, // channel #38(26)
ADCCHANNELLENGTH, // channel #39(27)
ADCCHANNELLENGTH, // channel #40(28)
ADCCHANNELLENGTH, // channel #41(29)
ADCCHANNELLENGTH, // channel #42(2A)
ADCCHANNELLENGTH, // channel #43(2B)
ADCCHANNELLENGTH, // channel #44(2C)
ADCCHANNELLENGTH, // channel #45(2D)
ADCCHANNELLENGTH, // channel #46(2E)
ADCCHANNELLENGTH, // channel #47(2F)
ADCCHANNELLENGTH, // channel #48(30)
ADCCHANNELLENGTH, // channel #49(31)
ADCCHANNELLENGTH, // channel #50(32)
ADCCHANNELLENGTH, // channel #51(33)
CHANNELDATALENGTH, // channel #52(34)
DISPLAYCHANNELLENGTH, // channel #53(35)
REFLASHCHANNELLENGTH, // channel #54(36)
GPSDATELENGTH, // channel #55(37)
GPSHEADINGLENGTH, // channel #56(38)
GPSALTLENGTH, // channel #57(39)
EXTENDEDFREQCHANNELLENGTH, // channel #58(3A)
EXTENDEDFREQCHANNELLENGTH, // channel #59(3B)
EXTENDEDFREQCHANNELLENGTH, // channel #60(3C)
EXTENDEDFREQCHANNELLENGTH, // channel #61(3D)
EXTENDEDFREQCHANNELLENGTH, // channel #62(3E)
STARTOFRUNLENGTH, // channel #63(3F)
PROCESSEDSPEEDCHANNELLENGTH, // channel #64(40)
GEARSETUPDATALENGTH, // channel #65(41)
BARGRAPHSETUPDATALENGTH, // channel #66(42)
DASHBOARD_SETUP_DATALENGTH, // channel #67(43)
DASHBOARDSETUPDATA2LENGTH, // channel #68(44)
NEWTARGETSECTORTIMELENGTH, // channel #69(45)
NEWTARGETMARKERTIMELENGTH, // channel #70(46)
ECU_MODULETYPE_CHANNELLENGTH, // channel #71(47)
ECU_TEMP_CHANNELLENGTH, // channel #72(48)
ECU_FREQ_CHANNELLENGTH, // channel #73(49)
ECU_PERC_CHANNELLENGTH, // channel #74(4A)
ECU_TIME_CHANNELLENGTH, // channel #75(4B)
NEWLCDDATA, // channel #76(4C)
NEWLEDDATA, // channel #77(4D)
PROCESSEDDISTANCECHANNELLENGTH, // channel #78(4E)
YAWGYROCHANNELLENGTH, // channel #79(4F)
GPSYAWLENGTH, // channel #80(50)
GPSPITCHRATELENGTH, // channel #81(51)
GPSPITCHLENGTH, // channel #82(52)
GPSROLLRATELENGTH, // channel #83(53)
ROLLANGLELENGTH, // channel #84(54)
GPSGRADIENTCHANNELLENGTH, // channel #85(55)
PULSECOUNTLENGTH, // channel #86(56)
PULSECOUNTLENGTH, // channel #87(57)
PULSECOUNTLENGTH, // channel #88(58)
PULSECOUNTLENGTH, // channel #89(59)
BASELINERTKLENGTH, // channel #90(5A)
UNITCONTROLLENGTH, // channel #91(5B)
ZACCELCHANNELLENGTH, // channel #92(5C)
ECU_ANGLE_CHANNELLENGTH, // channel #93(5D)
ECU_PRESSURE_CHANNELLENGTH, // channel #94(5E)
ECU_MISC_CHANNELLENGTH, // channel #95(5F)
0, // channel #96(60)
0, // channel #97(61)
0, // channel #98(62)
0, // channel #99(63)
0, // channel #100(64)
SECTORDEFINITIONLENGTH, // channel #101(65)
MAX_MSG_LEN, // channel #102(66)
DVR_CMD_CHANNELLENGTH, // channel #103(67)
VIDEOINDEXLENGTH, // channel #104(68)
0, // channel #105(69)
0, // channel #106(6A)
0, // channel #107(6B)
0, // channel #108(6C)
0, // channel #109(6D)
0, // channel #110(6E)
0, // channel #111(6F)
0, // channel #112(70)
0, // channel #113(71)
0, // channel #114(72)
0, // channel #115(73)
0, // channel #116(74)
0, // channel #117(75)
0, // channel #118(76)
0, // channel #119(77)
0, // channel #120(78)
0, // channel #121(79)
0, // channel #122(7A)
0, // channel #123(7B)
0, // channel #124(7C)
0, // channel #125(7D)
0, // channel #126(7E)
0, // channel #127(7F)
0, // channel #128(80)
0, // channel #129(81)
0, // channel #130(82)
0, // channel #131(83)
0, // channel #132(84)
0, // channel #133(85)
0, // channel #134(86)
0, // channel #135(87)
0, // channel #136(88)
0, // channel #137(89)
0, // channel #138(8A)
0, // channel #139(8B)
0, // channel #140(8C)
0, // channel #141(8D)
0, // channel #142(8E)
0, // channel #143(8F)
0, // channel #144(90)
0, // channel #145(91)
0, // channel #146(92)
0, // channel #147(93)
0, // channel #148(94)
0, // channel #149(95)
0, // channel #150(96)
0, // channel #151(97)
0, // channel #152(98)
0, // channel #153(99)
0, // channel #154(9A)
0, // channel #155(9B)
0, // channel #156(9C)
0, // channel #157(9D)
0, // channel #158(9E)
0, // channel #159(9F)
0, // channel #160(A0)
0, // channel #161(A1)
0, // channel #162(A2)
0, // channel #163(A3)
0, // channel #164(A4)
0, // channel #165(A5)
0, // channel #166(A6)
0, // channel #167(A7)
0, // channel #168(A8)
0, // channel #169(A9)
0, // channel #170(AA)
0, // channel #171(AB)
0, // channel #172(AC)
0, // channel #173(AD)
0, // channel #174(AE)
0, // channel #175(AF)
0, // channel #176(B0)
0, // channel #177(B1)
0, // channel #178(B2)
0, // channel #179(B3)
0, // channel #180(B4)
0, // channel #181(B5)
0, // channel #182(B6)
0, // channel #183(B7)
0, // channel #184(B8)
0, // channel #185(B9)
0, // channel #186(BA)
0, // channel #187(BB)
0, // channel #188(BC)
0, // channel #189(BD)
0, // channel #190(BE)
0, // channel #191(BF)
0, // channel #192(C0)
0, // channel #193(C1)
0, // channel #194(C2)
0, // channel #195(C3)
0, // channel #196(C4)
0, // channel #197(C5)
0, // channel #198(C6)
0, // channel #199(C7)
0, // channel #200(C8)
0, // channel #201(C9)
0, // channel #202(CA)
0, // channel #203(CB)
0, // channel #204(CC)
0, // channel #205(CD)
0, // channel #206(CE)
0, // channel #207(CF)
DEBUGVAR_CHANNELLENGTH, // channel #208(D0)
DEBUGVAR_CHANNELLENGTH, // channel #209(D1)
DEBUGVAR_CHANNELLENGTH, // channel #210(D2)
DEBUGVAR_CHANNELLENGTH, // channel #211(D3)
DEBUGVAR_CHANNELLENGTH, // channel #212(D4)
DEBUGVAR_CHANNELLENGTH, // channel #213(D5)
DEBUGVAR_CHANNELLENGTH, // channel #214(D6)
DEBUGVAR_CHANNELLENGTH, // channel #215(D7)
DEBUGVAR_CHANNELLENGTH, // channel #216(D8)
DEBUGVAR_CHANNELLENGTH, // channel #217(D9)
DEBUGVAR_CHANNELLENGTH, // channel #218(DA)
DEBUGVAR_CHANNELLENGTH, // channel #219(DB)
DEBUGVAR_CHANNELLENGTH, // channel #220(DC)
DEBUGVAR_CHANNELLENGTH, // channel #221(DD)
DEBUGVAR_CHANNELLENGTH, // channel #222(DE)
DEBUGVAR_CHANNELLENGTH, // channel #223(DF)
DEBUGVAR_CHANNELLENGTH, // channel #224(E0)
DEBUGVAR_CHANNELLENGTH, // channel #225(E1)
DEBUGVAR_CHANNELLENGTH, // channel #226(E2)
DEBUGVAR_CHANNELLENGTH, // channel #227(E3)
DEBUGVAR_CHANNELLENGTH, // channel #228(E4)
DEBUGVAR_CHANNELLENGTH, // channel #229(E5)
DEBUGVAR_CHANNELLENGTH, // channel #230(E6)
DEBUGVAR_CHANNELLENGTH, // channel #231(E7)
0, // channel #232(E8)
0, // channel #233(E9)
0, // channel #234(EA)
0, // channel #235(EB)
0, // channel #236(EC)
0, // channel #237(ED)
0, // channel #238(EE)
0, // channel #239(EF)
DEBUGVAR_CHANNELLENGTH, // channel #240(F0)
DEBUGVAR_CHANNELLENGTH, // channel #241(F1)
DEBUGVAR_CHANNELLENGTH, // channel #242(F2)
DEBUGVAR_CHANNELLENGTH, // channel #243(F3)
DEBUGVAR_CHANNELLENGTH, // channel #244(F4)
DEBUGVAR_CHANNELLENGTH, // channel #245(F5)
DEBUGVAR_CHANNELLENGTH, // channel #246(F6)
DEBUGVAR_CHANNELLENGTH, // channel #247(F7)
0, // channel #248(F8)
0, // channel #249(F9)
0, // channel #250(FA)
0, // channel #251(FB)
0, // channel #252(FC)
0, // channel #253(FD)
0, // channel #254(FE)
0 // channel #255(FF)
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// DVR SERIAL COMMAND
/////////////////////////////////////////////////////////////////////////////////////////////////////
void func0x67_HARDC_DVR_CMD (U16 iCheckSum)
{
iNumReturnedFloatChannels = 0;
iNumberOfBytesReturned = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
// Functions for Standard Serial Decoder
///////////////////////////////////////////////////////////////////////////////////////////
F64 ExtractI32MsbFirst ( U8 *RawData, S32 Offset)
{
F64 ret;
#ifndef C6000
ret = (F64) ( (S32) ( ((U32)(RawData[Offset + 0]) <<24) + ((S32)(RawData[Offset + 1])<<16) + ((S32)(RawData[Offset + 2])<<8) + RawData[Offset + 3] ) );
return ret;
#else
ret = (F64) ( ((S32)(RawData[Offset + 0] & 0x7F)<<24) + ((S32)(RawData[Offset + 1])<<16) + ((S32)(RawData[Offset + 2])<<8) + RawData[Offset + 3] );
if ((RawData[Offset + 0] & 0x80) != 0)
return (-(1L<<31) + ret);
else
return ret;
#endif
}
F64 ExtractU32MsbFirst ( U8 *RawData, S32 Offset){
return (F64) ( ((S32)(RawData[Offset])<<24) + ((S32)(RawData[Offset + 1])<<16) + ((S32)(RawData[Offset + 2])<<8) + RawData[Offset + 3] );
}
// ***** Functions called through pFuncArray *****//
void func1_ENCSERIALHARDC ()
{
iNumReturnedFloatChannels = 0;
bBytesReturned = 0;
}
void func2_STARTSTOPHARDC ()
{
S8 str[160];
str[0]='\0';
//GetStartStopInfo
switch (serial_Buf[iRawSample+1])
{
case 1:
strcpy(str," Logging started by button press. ");
break;
case 2:
strcpy(str," Logging started automatically. ");
switch (serial_Buf[iRawSample + 6]){
case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
strcat(str, "Autostart based on analogue voltage. ");
break;
case 15:
strcat(str, "Autostart based on lateral acceleration.");
break;
case 16:
strcat(str, "Autostart based on longitudinal acceleration. ");
break;
default:
break;
}
break;
case 3:
strcpy(str, " Logging started by pretrigger. ");
break;
default:
break;
}
switch (serial_Buf[iRawSample + 2])
{
case 1:
strcat(str, "Logging stopped by button press. ");
break;
case 2:
strcat(str, "Logging stopped automatically. ");
switch(serial_Buf[iRawSample + 7])
{
#ifdef C6000
case 1 - 8:
#else
case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:
#endif
strcat(str, "Autostop based on analogue voltage. ");
case 15:
strcat(str, "Autostop based on lateral acceleration.");
case 16:
strcat(str, "Autostop based on longitudinal acceleration. ");
default:
break;
}
break;
case 3:
strcat(str, "Logging stopped by posttrigger. ");
break;
case 4:
strcat(str, "Logging stopped by low battery. ");
break;
case 5:
strcat(str, "Logging stopped by slow CF card. ");
break;
case 6:
strcat(str, "Logging stopped by GSM command. ");
break;
case 7:
strcat(str, "Logging stopped by full CF card. ");
break;
default:
break;
}
bBytesReturned = 1;
iNumberOfBytesReturned = strlen(str) - 1;
strcpy ((S8 *)bArrReturnedByteValues, str);
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = ((S32)(serial_Buf[iRawSample + 8])<<8) + serial_Buf[iRawSample + 9];
iArrReturnedChannels[0] = BUFFERSIZE_;
}
void func3_GPSRAWDATA ()
{
S32 ByteCounter;
iNumReturnedFloatChannels = 0;
bBytesReturned = 1;
iNumberOfBytesReturned = serial_Buf[iRawSample + 1];
for (ByteCounter = 0; ByteCounter < iNumberOfBytesReturned; ByteCounter++)
bArrReturnedByteValues[ByteCounter] = serial_Buf[iRawSample + 2 + ByteCounter];
}
void func4_SECTORTIMEHARDC ()
{
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = 0;
iArrReturnedChannels[0] = NODATA_;
bBytesReturned = 0;
}
void func5_MARKERHARDC ()
{
//this channel defines a new marker on the track
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = 0;
iArrReturnedChannels[0] = NODATA_;
bBytesReturned = 0;
}
void func6_LOGGERSERIALNUMBERC ()
{
// Channel, serial number MSB? , serial number LSB?, software version,bootloader version, checksum.
dArrReturnedFloatValues[0] = (S32)( (F64) ( ((S32)(serial_Buf[iRawSample+1] & 0x3F)<<8) + serial_Buf[iRawSample + 2] ) ); //int LoggerSerialNumber
dArrReturnedFloatValues[1] = (S32)( serial_Buf[iRawSample + 3] ); //int FirmVersion
dArrReturnedFloatValues[2] = (S32)( serial_Buf[iRawSample + 4] ); //int BootVersion
iNumReturnedFloatChannels = 3;
iArrReturnedChannels[0] = NODATA_;
iArrReturnedChannels[1] = NODATA_;
iArrReturnedChannels[2] = NODATA_;
bBytesReturned = 0;
}
void func7_GPSTIMEMSWEEKC ()
{
// AJD - no interpolation, is it required?
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = ExtractU32MsbFirst(serial_Buf, iRawSample + 1);
iArrReturnedChannels[0] = GPSMSTIME_;
bBytesReturned = 0;
}
void func8_ACCELSHARDC ()
{
F32 LongAccel, LatAccel;
LatAccel = (F64)(serial_Buf[iRawSample+1] & 0x7F) + ( (F64)(serial_Buf[iRawSample + 2]) / 0x100 );
if (!(serial_Buf[iRawSample+1] & 0x80))
LatAccel = -(LatAccel);
LongAccel = (F64)(serial_Buf[iRawSample + 3] & 0x7F) + ( (F64)(serial_Buf[iRawSample + 4]) / 0x100 );
if (!(serial_Buf[iRawSample + 3] & 0x80))
LongAccel = -(LongAccel);
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = LongAccel;
dArrReturnedFloatValues[1] = LatAccel;
iArrReturnedChannels[0] = ACCELLONG_;
iArrReturnedChannels[1] = ACCELLAT_;
bBytesReturned = 0;
}
void func9_TIMEHARDC ()
{
S32 NewTimeIndex;
NewTimeIndex = ((S32)(serial_Buf[iRawSample+1])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+3];
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = NewTimeIndex / 100;
iArrReturnedChannels[0] = TIMES_;
bBytesReturned = 0;
}
void func10_GPSPOSHARDC ()
{
F32 PosAcc;
dArrReturnedFloatValues[0] = ExtractI32MsbFirst(serial_Buf, iRawSample+1) * 0.0000001; //double Longitude
dArrReturnedFloatValues[1] = ExtractI32MsbFirst(serial_Buf, iRawSample+5) * 0.0000001; //double Latitude
PosAcc = ExtractU32MsbFirst(serial_Buf, iRawSample+9) / 1000;
dArrReturnedFloatValues[2] = PosAcc;
iNumReturnedFloatChannels = 3;
iArrReturnedChannels[0] = POSXM_;
iArrReturnedChannels[1] = POSXM_;
iArrReturnedChannels[2] = GPSPOSITIONACC_;
bBytesReturned = 0;
}
void func11_GPSSPEEDHARDC ()
{
F32 GpsSpeedOutput, GpsSpeedAccuracyOutput;
GpsSpeedOutput = ExtractU32MsbFirst(serial_Buf, iRawSample+1) / 100;
GpsSpeedAccuracyOutput = ExtractU32MsbFirst(serial_Buf, iRawSample+5) / 100;
iNumReturnedFloatChannels = 2;
if ( GpsSpeedAccuracyOutput < 2)
dArrReturnedFloatValues[0] = GpsSpeedOutput * 3.6; //the factor of 3.6 goes from m/s to kph
else
dArrReturnedFloatValues[0] = -1;
dArrReturnedFloatValues[1] = GpsSpeedAccuracyOutput;
iArrReturnedChannels[0] = GPSSPEED_;
iArrReturnedChannels[1] = GPSSPEEDACC_;
bBytesReturned = 0;
}
void func12_BEACONHARDC ()
{
F32 BeaconOutput;
if (serial_Buf[iRawSample+1] == 1)
BeaconOutput = 1;
else
BeaconOutput = 0;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = BeaconOutput;
iArrReturnedChannels[0] = TRACKBEACON_;
bBytesReturned = 0;
}
void func13_GPSPULSEHARDC ()
{
F32 DigOutput;
if (serial_Buf[iRawSample+1] == 1)
DigOutput = 1;
else
DigOutput = 0;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = DigOutput;
iArrReturnedChannels[0] = NODATA_;
bBytesReturned = 0;
}
void func14_FREQ0HARDC ()
{
F32 Frequency;
Frequency = (F64) ( ((S32)(serial_Buf[iRawSample+1])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+3] );
Frequency = Frequency * TICKPERIOD;
if (Frequency > 0)
Frequency = 1 / Frequency;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = Frequency;
switch (iHardwareChannel)
{
case FREQ0HARDC:
iArrReturnedChannels[0]= DL1_FREQ2_;
break;
case FREQ1HARDC:
iArrReturnedChannels[0]= DL1_FREQ3_;
break;
case FREQ2HARDC:
iArrReturnedChannels[0]= DL1_FREQ4_;
break;
case FREQ3HARDC:
iArrReturnedChannels[0]= DL1_FREQ1_;
break;
case RPMHARDC:
iArrReturnedChannels[0]= RPM_;
break;
default:
iArrReturnedChannels[0]= NODATA_;
break;
}
bBytesReturned = 0;
}
void func19_SERIALDATAHARDC ()
{
S32 ByteCounter;
iNumReturnedFloatChannels = 0;
bBytesReturned = 1;
iNumberOfBytesReturned = serial_Buf[iRawSample + 1];
for (ByteCounter = 0; ByteCounter < iNumberOfBytesReturned; ByteCounter++)
bArrReturnedByteValues[iNumberOfBytesReturned - ByteCounter - 1] = serial_Buf[iRawSample+2 + ByteCounter];
}
void func20_ADC0HARDC ()
{
F32 AnalogueOutput;
AnalogueOutput= (F64)(((S32)(serial_Buf[iRawSample+1])<<8) + serial_Buf[iRawSample+2]) / 1000.0;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = AnalogueOutput;
switch ( serial_Buf[iRawSample] )
{
case ADC0HARDC:
iArrReturnedChannels[0] = DL1_ANAL7_;
break;
case ADC1HARDC:
iArrReturnedChannels[0] = DL1_ANAL5_;
break;
case ADC2HARDC:
iArrReturnedChannels[0] = DL1_ANAL6_;
break;
case ADC3HARDC:
iArrReturnedChannels[0] = DL1_ANAL4_;
break;
case ADC4HARDC:
iArrReturnedChannels[0] = DL1_ANAL3_;
break;
case ADC5HARDC:
iArrReturnedChannels[0] = DL1_ANAL1_;
break;
case ADC6HARDC:
iArrReturnedChannels[0] = DL1_ANAL2_;
break;
case ADC7HARDC:
iArrReturnedChannels[0] = DL1_ANAL0_;
break;
case ADC8HARDC:
iArrReturnedChannels[0] = DL1_ANAL15_;
break;
case ADC9HARDC:
iArrReturnedChannels[0] = DL1_ANAL13_;
break;
case ADC10HARDC:
iArrReturnedChannels[0] = DL1_ANAL14_;
break;
case ADC11HARDC:
iArrReturnedChannels[0] = DL1_ANAL12_;
break;
case ADC12HARDC:
iArrReturnedChannels[0] = DL1_ANAL11_;
break;
case ADC13HARDC:
iArrReturnedChannels[0] = DL1_ANAL9_;
break;
case ADC14HARDC:
iArrReturnedChannels[0] = DL1_ANAL10_;
break;
case ADC15HARDC:
iArrReturnedChannels[0] = DL1_ANAL8_;
break;
case ADC16HARDC:
iArrReturnedChannels[0] = DL1_ANAL16_;
break;
case ADC17HARDC:
iArrReturnedChannels[0] = DL1_ANAL17_;
break;
case ADC18HARDC:
iArrReturnedChannels[0] = DL1_ANAL18_;
break;
case ADC19HARDC:
iArrReturnedChannels[0] = DL1_ANAL19_;
break;
case ADC20HARDC:
iArrReturnedChannels[0] = DL1_ANAL20_;
break;
case ADC21HARDC:
iArrReturnedChannels[0] = DL1_ANAL21_;
break;
case ADC22HARDC:
iArrReturnedChannels[0] = DL1_ANAL22_;
break;
case ADC23HARDC:
iArrReturnedChannels[0] = DL1_ANAL23_;
break;
case ADC24HARDC:
iArrReturnedChannels[0] = DL1_ANAL24_;
break;
case ADC25HARDC:
iArrReturnedChannels[0] = DL1_ANAL25_;
break;
case ADC26HARDC:
iArrReturnedChannels[0] = DL1_ANAL26_;
break;
case ADC27HARDC:
iArrReturnedChannels[0] = DL1_ANAL27_;
break;
case ADC28HARDC:
iArrReturnedChannels[0] = DL1_ANAL28_;
break;
case ADC29HARDC:
iArrReturnedChannels[0] = DL1_ANAL29_;
break;
case ADC30HARDC:
iArrReturnedChannels[0] = DL1_ANAL30_;
break;
case ADC31HARDC:
iArrReturnedChannels[0] = DL1_ANAL31_;
break;
default:
iArrReturnedChannels[0] = NODATA_;
break;
}
bBytesReturned = 0;
}
void func55_GPSDATEHARDC ()
{
iNumReturnedFloatChannels = 6;
dArrReturnedFloatValues[0] = serial_Buf[iRawSample];
dArrReturnedFloatValues[1] = serial_Buf[iRawSample+1];
dArrReturnedFloatValues[2] = serial_Buf[iRawSample+2];
dArrReturnedFloatValues[3] = serial_Buf[iRawSample+3];
dArrReturnedFloatValues[4] = serial_Buf[iRawSample+4];
dArrReturnedFloatValues[5] = ((S32)(serial_Buf[iRawSample+5])<<8) + serial_Buf[iRawSample+6];
iArrReturnedChannels[0] = NODATA_;
iArrReturnedChannels[1] = NODATA_;
iArrReturnedChannels[2] = NODATA_;
iArrReturnedChannels[3] = NODATA_;
iArrReturnedChannels[4] = NODATA_;
iArrReturnedChannels[5] = NODATA_;
bBytesReturned = 0;
}
void func56_GPSHEADINGHARDC ()
{
F32 Heading, HeadAcc;
Heading = ExtractI32MsbFirst(serial_Buf, iRawSample+1) * 0.00001 / 180 * PI; // convert from ublox units to rads
HeadAcc = ExtractU32MsbFirst(serial_Buf, iRawSample+5) * 0.00001 / 180 * PI; // convert from ublox units to rads
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = Heading;
dArrReturnedFloatValues[1] = HeadAcc;
iArrReturnedChannels[0] = GPSHEADING_;
iArrReturnedChannels[1] = GPSHEADINGACC_;
bBytesReturned = 0;
}
void func57_GPSALTHARDC ()
{
F32 Altitude, AltAcc;
Altitude = ExtractI32MsbFirst (serial_Buf, iRawSample+1) / 1000; // convert from mm to m
AltAcc = ExtractI32MsbFirst (serial_Buf, iRawSample+5) / 1000; // convert from mm to m
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = Altitude;
dArrReturnedFloatValues[1] = AltAcc;
iArrReturnedChannels[0] = GPSALTITUDE_;
iArrReturnedChannels[1] = GPSALTACC_;
bBytesReturned = 0;
}
void func58_EXTENDED_FREQ0HARDC ()
{
F32 HighPeriod, LowPeriod, PulsePosition;
PulsePosition = (F64) ( ((S32)(serial_Buf[iRawSample+1])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+3] ) * TICKPERIOD;
LowPeriod = (F64) ( ((S32)(serial_Buf[iRawSample+4])<<16) + ((S32)(serial_Buf[iRawSample+5])<<8) + serial_Buf[iRawSample+6] ) * TICKPERIOD;
HighPeriod = (F64) ( ((S32)(serial_Buf[iRawSample+7])<<16) + ((S32)(serial_Buf[iRawSample+8])<<8) + serial_Buf[iRawSample+9] ) * TICKPERIOD;
iNumReturnedFloatChannels = 3;
dArrReturnedFloatValues[0] = HighPeriod;
dArrReturnedFloatValues[1] = LowPeriod;
dArrReturnedFloatValues[2] = PulsePosition;
switch ( serial_Buf[iRawSample] )
{
case EXTENDED_FREQ0HARDC:
iArrReturnedChannels[0] = FREQ2_HIGHPERIOD_;
iArrReturnedChannels[1] = FREQ2_LOWPERIOD_;
iArrReturnedChannels[2] = FREQ2_PULSEPOSITION_;
break;
case EXTENDED_FREQ1HARDC:
iArrReturnedChannels[0] = FREQ3_HIGHPERIOD_;
iArrReturnedChannels[1] = FREQ3_LOWPERIOD_;
iArrReturnedChannels[2] = FREQ3_PULSEPOSITION_;
break;
case EXTENDED_FREQ2HARDC:
iArrReturnedChannels[0] = FREQ4_HIGHPERIOD_;
iArrReturnedChannels[1] = FREQ4_LOWPERIOD_;
iArrReturnedChannels[2] = FREQ4_PULSEPOSITION_;
break;
case EXTENDED_FREQ3HARDC:
iArrReturnedChannels[0] = FREQ1_HIGHPERIOD_;
iArrReturnedChannels[1] = FREQ1_LOWPERIOD_;
iArrReturnedChannels[2] = FREQ1_PULSEPOSITION_;
break;
case EXTENDED_RPMHARDC:
//NB: Added by nuwan
iArrReturnedChannels[0] = RPM_HIGHPERIOD_;
iArrReturnedChannels[1] = RPM_LOWPERIOD_;
iArrReturnedChannels[2] = RPM_PULSEPOSITION_;
break;
default:
//NB: Added by nuwan
iArrReturnedChannels[0] = NODATA_;
iArrReturnedChannels[1] = NODATA_;
iArrReturnedChannels[2] = NODATA_;
break;
}
bBytesReturned = 0;
}
//Pointed to f_Nodata
void func63_HARDC_START_OF_RUN ()
{
iNumReturnedFloatChannels = 1;
if (serial_Buf[iRawSample+1] == 1)
dArrReturnedFloatValues[0] = 1;
else
dArrReturnedFloatValues[0] = 0;
iArrReturnedChannels[0] = NODATA_;
bBytesReturned = 0;
}
void func64_PROCESSEDSPEEDHARDC ()
{
F32 ProcessedSpeed;
ProcessedSpeed = (F64) ( ((S32)(serial_Buf[iRawSample+1])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+3] );
ProcessedSpeed *= 0.001379060159;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = ProcessedSpeed;
iArrReturnedChannels[0] = GPSSPEED_;
bBytesReturned = 0;
}
//Pointed to f_Nodata
void func65_HARDC_GEAR_SETUP_DATA ()
{
U8 i;
bBytesReturned = 0;
iNumReturnedFloatChannels = 14; //7 gears each having Lower and Upper gear check values
//Upper Gear (N+1) Check value = Data(N+3) + Data(N+4) x 2^8
//Lower Gear (N+1) check value = Data(N+1) + Data(N+2) x 2^8
for(i=0;i<14;i++) {
dArrReturnedFloatValues[i] = (F64) ( ((U16) serial_Buf[iRawSample+1+2*i])
| (((U16) serial_Buf[iRawSample+2+2*i])<<8) );
iArrReturnedChannels[i] = NODATA_;
}
}
//Pointed to f_Nodata
void func67_HARDC_DASHBOARD_SETUP_DATA ()
{
bBytesReturned = 0;
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = (F64) serial_Buf[iRawSample+1]; //Warning hold time in secs
iArrReturnedChannels[0] = NODATA_;
dArrReturnedFloatValues[1] = (F64) serial_Buf[iRawSample+2]; //Sector time hold time in secs
iArrReturnedChannels[1] = NODATA_;
}
//Pointed to f_Nodata
void func68_HARDC_DASHBOARD_SETUP_DATA_2 ()
{
bBytesReturned = 0;
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = (F64) serial_Buf[iRawSample+1]; //Highest RPM hold time (ms)
dArrReturnedFloatValues[0] = 40*dArrReturnedFloatValues[0];
iArrReturnedChannels[0] = NODATA_;
dArrReturnedFloatValues[1] = (F64) serial_Buf[iRawSample+2]; //RPM reduction rate (per 40ms)
iArrReturnedChannels[1] = NODATA_;
}
//Pointed to f_Nodata
void func69_HARDC_NEW_TARGET_SECTOR_TIME ()
{
U8 i;
bBytesReturned = 0;
iNumReturnedFloatChannels = 9; //Number of sectors
//Sector N+1 target time (ms) = Data(4N+1) + Data(4N+2) x 2^8 + Data(4N+3) x 2^16 + Data(4N+4) x 2^24
for(i=0;i<9;i++) {
dArrReturnedFloatValues[i] = (F64) ( ((U32) serial_Buf[iRawSample+1+4*i])
| (((U32) serial_Buf[iRawSample+2+4*i])<<8)
| (((U32) serial_Buf[iRawSample+3+4*i])<<16)
| (((U32) serial_Buf[iRawSample+4+4*i])<<24) );
iArrReturnedChannels[i] = NODATA_;
}
}
//Pointed to f_Nodata
void func70_HARDC_NEW_TARGET_MARKER_TIME ()
{
U8 i;
bBytesReturned = 0;
iNumReturnedFloatChannels = 9; //Number of markers
//Marker N+1 target time (ms) = Data(4N+1) + Data(4N+2) x 2^8 + Data(4N+3) x 2^16 + Data(4N+4) x 2^24
for(i=0;i<9;i++) {
dArrReturnedFloatValues[i] = (F64) ( ((U32) serial_Buf[iRawSample+1+4*i])
| (((U32) serial_Buf[iRawSample+2+4*i])<<8)
| (((U32) serial_Buf[iRawSample+3+4*i])<<16)
| (((U32) serial_Buf[iRawSample+4+4*i])<<24) );
iArrReturnedChannels[i] = NODATA_;
}
}
void func71_HARDC_ECU_MODULETYPE ()
{
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = 0;
iArrReturnedChannels[0] = NODATA_;
bBytesReturned = 0;
}
void func72_HARDC_ECU_TEMP ()
{
#ifndef C6000
dArrReturnedFloatValues[0] = (S32) ( ((S32)(serial_Buf[iRawSample+3]) <<8) + serial_Buf[iRawSample+2] );
#else
dArrReturnedFloatValues[0] = ((S32)(serial_Buf[iRawSample+3] & 0x107F)<<8) + serial_Buf[iRawSample+2];
if ((serial_Buf[iRawSample+3] & 0x80) != 0)
dArrReturnedFloatValues[0] -= 32768;
#endif
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] * 0.1;
iArrReturnedChannels[0] = serial_Buf[iRawSample+1] + ECU_FIRST_TEMP_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func73_HARDC_ECU_FREQ ()
{
dArrReturnedFloatValues[0] = ((S32)(serial_Buf[iRawSample+3])<<8) + serial_Buf[iRawSample+2];
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] * 0.1;
iArrReturnedChannels[0] = serial_Buf[iRawSample+1] + ECU_FIRST_FREQ_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func74_HARDC_ECU_PERC ()
{
dArrReturnedFloatValues[0] = ((S32)(serial_Buf[iRawSample+3])<<8) + serial_Buf[iRawSample+2];
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] * 0.1;
iArrReturnedChannels[0] = serial_Buf[iRawSample+1] + ECU_FIRST_PERC_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func75_HARDC_ECU_TIME ()
{
iArrReturnedChannels[0] = serial_Buf[iRawSample+2] + ECU_FIRST_TIME_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
if (serial_Buf[iRawSample+2] < 20 && (S8)serial_Buf[iRawSample+2] > -20)
dArrReturnedFloatValues[0] = ( (serial_Buf[iRawSample+4] + serial_Buf[iRawSample+3]) * pow(10,serial_Buf[iRawSample+2]) );
else
dArrReturnedFloatValues[0] = 0;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
//Pointed to f_Nodata
void func76_HARDC_NEW_LCD_DATA ()
{
U8 i;
bBytesReturned = 1;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = (F64) serial_Buf[iRawSample+1]; //Display location
iArrReturnedChannels[0] = NODATA_;
iNumberOfBytesReturned = (serial_Buf[iRawSample+2]>20)?20:serial_Buf[iRawSample+2]; //Number of characters
for(i=0;i<iNumberOfBytesReturned;i++) {
bArrReturnedByteValues[i] = serial_Buf[iRawSample+3+i];
}
}
//Pointed to f_Nodata
void func77_HARDC_NEW_LED_DATA ()
{
bBytesReturned = 0;
iNumReturnedFloatChannels = 1;
//this is an 8 bit data value signifying if given LED is on or off
dArrReturnedFloatValues[0] = (F64) serial_Buf[iRawSample+1];
iArrReturnedChannels[0] = NODATA_;
}
void func78_PROCESSEDDISTANCEHARDC ()
{
F32 ProcessedDistance;
ProcessedDistance = (F32) ( ((S32)(serial_Buf[iRawSample+1])<<24) + ((S32)(serial_Buf[iRawSample+2])<<16) + ((S32)(serial_Buf[+3])<<8) + serial_Buf[iRawSample+4] );
ProcessedDistance /= 1000000; // convert from mm to km
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = (S32)ProcessedDistance;
iArrReturnedChannels[0] = DISTANCE_;
bBytesReturned = 0;
}
void func79_YAWGYROHARDC ()
{
F32 YawRate;
YawRate = (F32) ( ((S32)(serial_Buf[iRawSample+1])<<8) + serial_Buf[iRawSample+2] );
YawRate = -((YawRate - 32768) / 100 / 180 * PI);
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = YawRate;
iArrReturnedChannels[0] = GYROYAWRATE_;
bBytesReturned = 0;
}
void func80_HARDC_GPSYAW ()
{
dArrReturnedFloatValues[0] = ( (F64) ( ( ( (U16) (0x7F & serial_Buf[iRawSample+1]) ) << 8 )
+ serial_Buf[iRawSample+2] ) )/100;
if(serial_Buf[iRawSample+1] & (1<<7))
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] - ( ((F64) 256) * 128)/100;
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] / 180 * PI;
iNumReturnedFloatChannels = 1;
iArrReturnedChannels[0] = GPSRTKYAW_;
bBytesReturned = 0;
}
void func81_HARDC_PITCH_RATE ()
{
dArrReturnedFloatValues[0] = (F64) ( ( ((U16) serial_Buf[iRawSample+1]) << 8 ) +
( (U16) serial_Buf[iRawSample+2]) );
dArrReturnedFloatValues[0] = -(dArrReturnedFloatValues[0] - 32768 )*PI/(100*180);
iArrReturnedChannels[0] = GYROPITCHRATE_;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func82_HARDC_PITCH ()
{
dArrReturnedFloatValues[0] = ( (F64) ( ( ( (U16) (0x7F & serial_Buf[iRawSample+1]) ) << 8 )
+ serial_Buf[iRawSample+2] ) )/100;
if(serial_Buf[iRawSample+1] & (1<<7))
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] - ( ((F64) 256) * 128)/100;
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0] / 180 * PI;
iNumReturnedFloatChannels = 1;
iArrReturnedChannels[0] = GPSRTKPITCH_;
bBytesReturned = 0;
}
void func83_HARDC_ROLL_RATE ()
{
dArrReturnedFloatValues[0] = (F64) ( ( ((U16) serial_Buf[iRawSample+1]) << 8 ) +
( (U16) serial_Buf[iRawSample+2]) );
dArrReturnedFloatValues[0] = -(dArrReturnedFloatValues[0] - 32768 )*PI/(100*180);
iArrReturnedChannels[0] = GYROROLLRATE_;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func84_HARDC_ROLL_ANGLE ()
{
bBytesReturned = 0;
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = (F64) ( (((U16) serial_Buf[iRawSample+1])<<8) | ((U16) serial_Buf[iRawSample+2]) );
dArrReturnedFloatValues[0] = dArrReturnedFloatValues[0]/100;
iArrReturnedChannels[0] = GPSROLL_;
}
void func85_GPSGRADIENTHARDC ()
{
F32 Gradient, GradientAcc;
F64 Lower = -PI;
F64 Upper = PI;
// this was added to support the brakebox
Gradient = ExtractI32MsbFirst(serial_Buf, iRawSample+1) * 0.00001 / 180 * PI; // convert from ublox units to rads
GradientAcc = ExtractU32MsbFirst(serial_Buf, iRawSample+5) * 0.00001 / 180 * PI; // convert from ublox units to rads
// rescale so it goes from -pi to pi, instead of 0 to 2*pi
//Constrain(Gradient, -PI, PI);
if (Lower > Upper)
Gradient = Lower;
else
{
Gradient -= ((S32)(Gradient / (Upper - Lower)) * (Upper - Lower));
while (Gradient < Lower)
Gradient += (Upper - Lower);
while (Gradient > Upper)
Gradient -= (Upper - Lower);
}
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = Gradient;
dArrReturnedFloatValues[1] = GradientAcc;
iArrReturnedChannels[0] = GPSGRADIENT_;
iArrReturnedChannels[1] = GPSGRADIENTACC_;
bBytesReturned = 0;
}
void func86_HARDC_PULSE0 ()
{
/*dArrReturnedFloatValues[0] = ( (F64) serial_Buf[iRawSample+1] ) * (65536) +
( (F64) serial_Buf[iRawSample+2] ) * (256) + ( (F64) serial_Buf[iRawSample+3] );*/
dArrReturnedFloatValues[0] = (F64) ( ((U32) serial_Buf[iRawSample+1])<<16 |
((U32) serial_Buf[iRawSample+2])<<8 | ((U32) serial_Buf[iRawSample+3]) );
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
switch (iHardwareChannel)
{
case HARDC_PULSE0:
iArrReturnedChannels[0] = FREQ2_PULSE_COUNT_;
break;
case HARDC_PULSE1:
iArrReturnedChannels[0] = FREQ3_PULSE_COUNT_;
break;
case HARDC_PULSE2:
iArrReturnedChannels[0] = FREQ4_PULSE_COUNT_;
break;
case HARDC_PULSE3:
iArrReturnedChannels[0] = FREQ1_PULSE_COUNT_;
break;
default:
iArrReturnedChannels[0] = NODATA_;
break;
}
}
void func90_HARDC_BASELINERTK ()
{
iArrReturnedChannels[0] = GPSRTKBASELINE_;
dArrReturnedFloatValues[0] = ( (F64) ( (((U16) serial_Buf[iRawSample+1]) << 8) + serial_Buf[iRawSample+2] ) )/1000;
iArrReturnedChannels[1] = GPSRTKBASELINEACC_;
dArrReturnedFloatValues[1] = ( (F64) ( (((U16) serial_Buf[iRawSample+3]) << 8) + serial_Buf[iRawSample+4] ) )/10000;
iNumReturnedFloatChannels = 2;
bBytesReturned = 0;
}
//Pointed to f_Nodata
void func91_HARDC_UNIT_CONTROL ()
{
bBytesReturned = 0;
iNumReturnedFloatChannels = 2;
dArrReturnedFloatValues[0] = (F64) ( (((U16) serial_Buf[iRawSample+1])<<8) | ((U16) serial_Buf[iRawSample+2]) );
iArrReturnedChannels[0] = NODATA_;
dArrReturnedFloatValues[0] = (F64) serial_Buf[iRawSample+3];
iArrReturnedChannels[0] = NODATA_;
}
void func92_HARDC_Z_ACCEL ()
{
F32 ZAccel;
ZAccel = ((F64)(serial_Buf[iRawSample+1] & 0x7F) ) + ( (F64)(serial_Buf[iRawSample+2]) / 0x100);
if (serial_Buf[iRawSample+1] & 0x80)
ZAccel = -ZAccel;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = ZAccel;
iArrReturnedChannels[0] = ACCEL_Z_;
bBytesReturned = 0;
}
void func93_HARDC_ECU_ANGLE ()
{
dArrReturnedFloatValues[0] = ((S32)(serial_Buf[iRawSample+3])<<8) + serial_Buf[iRawSample+2];
dArrReturnedFloatValues[0] = dArrReturnedFloatValues [0] * 0.1;
iArrReturnedChannels[0] = serial_Buf[iRawSample+1] + ECU_FIRST_ANGLE_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func94_HARDC_ECU_PRESSURE ()
{
iArrReturnedChannels[0] = serial_Buf[iRawSample+1] + ECU_FIRST_PRESSURE_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
if( serial_Buf[iRawSample+2] < 20 && (S8)serial_Buf[iRawSample+2] > -20 )
dArrReturnedFloatValues[0] = (serial_Buf[iRawSample+4] <<8 ) + serial_Buf[iRawSample+3] * 10 ^ serial_Buf[iRawSample+2];
else
dArrReturnedFloatValues[0] = 0;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func95_HARDC_ECU_MISC ()
{
dArrReturnedFloatValues[0] = (serial_Buf[iRawSample+3] <<8 ) + serial_Buf[iRawSample+2];
iArrReturnedChannels[0] = serial_Buf[iRawSample+1] + ECU_FIRST_MISC_ - 1;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
//Pointed to f_Nodata
void func0x65_HARDC_SECTOR_DEFINITION ()
{
U8 i;
bBytesReturned = 1;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = serial_Buf[iRawSample+1];
iArrReturnedChannels[0] = NODATA_;
iNumberOfBytesReturned = 16;
for(i=0;i<16;i++) {
bArrReturnedByteValues[i] = serial_Buf[iRawSample+2+i];
}
}
//Pointed to f_Nodata
void func0x68_HARDC_VIDEO_FRAME_INDEX ()
{
bBytesReturned = 0;
iNumReturnedFloatChannels = 1;
dArrReturnedFloatValues[0] = (F64) ( (((U32) serial_Buf[iRawSample+1])<<24)
| (((U32) serial_Buf[iRawSample+2])<<16)
| (((U32) serial_Buf[iRawSample+3])<<8)
| ((U32) serial_Buf[iRawSample+4]) );
iArrReturnedChannels[0] = NODATA_;
}
void func0xD0_HARDC_DEBUG_VAR_FP_0 ()
{
S32 c;
U8 b[4];
U8 d[8];
U8 s;
F64 Answer;
s = serial_Buf[iRawSample+1] & 0x80;
b[0] = serial_Buf[iRawSample+1];
b[1] = serial_Buf[iRawSample+2];
b[2] = serial_Buf[iRawSample+3];
b[3] = serial_Buf[iRawSample+4];
d[6] = (b[0] & 0x78)>>3;
d[5] = ((S32)(b[0] & 0x7)<<5) + (S32)((b[1] & 0xF8)>>3);
d[4] = ((S32)(b[1] & 0x7)<<5) + (S32)((b[2] & 0xF8)>>3);
d[3] = ((S32)(b[2] & 0x7)<<5);
c = b[3] + 896;
d[6] = d[6] + ((S32)(c & 0xF)<<4);
if (s) d[7] = 0x80;
d[7] += c>>4;
//contruct short arrays
#ifdef C2000
d[0] = (d[0] << 8) | d[1];
d[1] = (d[2] << 8) | d[3];
d[2] = (d[4] << 8) | d[5];
d[3] = (d[6] << 8) | d[7];
memmove (&Answer, &d, 4);
#else
memmove (&Answer, &d, 8);
#endif
dArrReturnedFloatValues[0] = Answer;
iArrReturnedChannels[0] = serial_Buf[iRawSample] - HARDC_DEBUG_VAR_FP_0 + DEBUG_VAR_FP_0_;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func0xE0_HARDC_DEBUG_VAR_U32_0 ()
{
dArrReturnedFloatValues[0] = (F64) ( ((S32)(serial_Buf[iRawSample+4])<<24) + ((S32)(serial_Buf[iRawSample+3])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+1] );
iArrReturnedChannels[0] = serial_Buf[iRawSample] - HARDC_DEBUG_VAR_U32_0 + DEBUG_VAR_U32_0_;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void func0xF0_HARDC_DEBUG_VAR_S32_0 ()
{
F64 result;
#ifdef C6000
result = (F64) ( ((S32)(serial_Buf[iRawSample+4] & 0x7F)<<24) + ((S32)(serial_Buf[iRawSample+3])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+1] );
#else
result = (F64) ((S32) ( ((S32)(serial_Buf[iRawSample+4]) <<24) + ((S32)(serial_Buf[iRawSample+3])<<16) + ((S32)(serial_Buf[iRawSample+2])<<8) + serial_Buf[iRawSample+1] ) );
#endif
if ((serial_Buf[iRawSample+4] & 0x80) != 0) {
//dArrReturnedFloatValues[0] = (-(1U<<31) + result);
dArrReturnedFloatValues[0] = -(2^31) + result; // ??
} else {
dArrReturnedFloatValues[0] = result;
}
iArrReturnedChannels[0] = serial_Buf[iRawSample] - HARDC_DEBUG_VAR_S32_0 + DEBUG_VAR_S32_0_;
iNumReturnedFloatChannels = 1;
bBytesReturned = 0;
}
void f_NoData () {
iNumReturnedFloatChannels = 0;
iNumberOfBytesReturned = 0;
}
//This func is nver called
void f_NotDef ()
{
}
// ***** Array of ponters to functions *****//
CHPF pFuncArray[ARRAY_LEN] = {
f_NotDef, // channel #0(0)
func1_ENCSERIALHARDC, // channel #1(1)
func2_STARTSTOPHARDC, // channel #2(2)
func3_GPSRAWDATA, // channel #3(3)
func4_SECTORTIMEHARDC, // channel #4(4)
func5_MARKERHARDC, // channel #5(5)
func6_LOGGERSERIALNUMBERC, // channel #6(6)
func7_GPSTIMEMSWEEKC, // channel #7(7)
func8_ACCELSHARDC, // channel #8(8)
func9_TIMEHARDC, // channel #9(9)
func10_GPSPOSHARDC, // channel #10(A)
func11_GPSSPEEDHARDC, // channel #11(B)
func12_BEACONHARDC, // channel #12(C)
func13_GPSPULSEHARDC, // channel #13(D)
func14_FREQ0HARDC, // channel #14(E)
func14_FREQ0HARDC, // channel #15(F)
func14_FREQ0HARDC, // channel #16(10)
func14_FREQ0HARDC, // channel #17(11)
func14_FREQ0HARDC, // channel #18(12)
func19_SERIALDATAHARDC, // channel #19(13)
func20_ADC0HARDC, // channel #20(14)
func20_ADC0HARDC, // channel #21(15)
func20_ADC0HARDC, // channel #22(16)
func20_ADC0HARDC, // channel #23(17)
func20_ADC0HARDC, // channel #24(18)
func20_ADC0HARDC, // channel #25(19)
func20_ADC0HARDC, // channel #26(1A)
func20_ADC0HARDC, // channel #27(1B)
func20_ADC0HARDC, // channel #28(1C)
func20_ADC0HARDC, // channel #29(1D)
func20_ADC0HARDC, // channel #30(1E)
func20_ADC0HARDC, // channel #31(1F)
func20_ADC0HARDC, // channel #32(20)
func20_ADC0HARDC, // channel #33(21)
func20_ADC0HARDC, // channel #34(22)
func20_ADC0HARDC, // channel #35(23)
func20_ADC0HARDC, // channel #36(24)
func20_ADC0HARDC, // channel #37(25)
func20_ADC0HARDC, // channel #38(26)
func20_ADC0HARDC, // channel #39(27)
func20_ADC0HARDC, // channel #40(28)
func20_ADC0HARDC, // channel #41(29)
func20_ADC0HARDC, // channel #42(2A)
func20_ADC0HARDC, // channel #43(2B)
func20_ADC0HARDC, // channel #44(2C)
func20_ADC0HARDC, // channel #45(2D)
func20_ADC0HARDC, // channel #46(2E)
func20_ADC0HARDC, // channel #47(2F)
func20_ADC0HARDC, // channel #48(30)
func20_ADC0HARDC, // channel #49(31)
func20_ADC0HARDC, // channel #50(32)
func20_ADC0HARDC, // channel #51(33)
f_NoData, // channel #52(34)
f_NoData, // channel #53(35)
f_NoData, // channel #54(36)
func55_GPSDATEHARDC, // channel #55(37)
func56_GPSHEADINGHARDC, // channel #56(38)
func57_GPSALTHARDC, // channel #57(39)
func58_EXTENDED_FREQ0HARDC, // channel #58(3A)
func58_EXTENDED_FREQ0HARDC, // channel #59(3B)
func58_EXTENDED_FREQ0HARDC, // channel #60(3C)
func58_EXTENDED_FREQ0HARDC, // channel #61(3D)
func58_EXTENDED_FREQ0HARDC, // channel #62(3E)
f_NoData, // channel #63(3F)
func64_PROCESSEDSPEEDHARDC, // channel #64(40)
f_NoData, // channel #65(41)
f_NoData, // channel #66(42)
f_NoData, // channel #67(43)
f_NoData, // channel #68(44)
f_NoData, // channel #69(45)
f_NoData, // channel #70(46)
func71_HARDC_ECU_MODULETYPE, // channel #71(47)
func72_HARDC_ECU_TEMP, // channel #72(48)
func73_HARDC_ECU_FREQ, // channel #73(49)
func74_HARDC_ECU_PERC, // channel #74(4A)
func75_HARDC_ECU_TIME, // channel #75(4B)
f_NoData, // channel #76(4C)
f_NoData, // channel #77(4D)
func78_PROCESSEDDISTANCEHARDC, // channel #78(4E)
func79_YAWGYROHARDC, // channel #79(4F)
func80_HARDC_GPSYAW, // channel #80(50)
func81_HARDC_PITCH_RATE, // channel #81(51)
func82_HARDC_PITCH, // channel #82(52)
func83_HARDC_ROLL_RATE, // channel #83(53)
func84_HARDC_ROLL_ANGLE, // channel #84(54)
func85_GPSGRADIENTHARDC, // channel #85(55)
func86_HARDC_PULSE0, // channel #86(56)
func86_HARDC_PULSE0, // channel #87(57)
func86_HARDC_PULSE0, // channel #88(58)
func86_HARDC_PULSE0, // channel #89(59)
func90_HARDC_BASELINERTK, // channel #90(5A)
f_NoData, // channel #91(5B)
func92_HARDC_Z_ACCEL, // channel #92(5C)
func93_HARDC_ECU_ANGLE, // channel #93(5D)
func94_HARDC_ECU_PRESSURE, // channel #94(5E)
func95_HARDC_ECU_MISC, // channel #95(5F)
f_NotDef, // channel #96(60)
f_NotDef, // channel #97(61)
f_NotDef, // channel #98(62)
f_NotDef, // channel #99(63)
f_NotDef, // channel #100(64)
f_NoData, // channel #101(65)
f_NoData, // channel #102(66)
f_NoData, // channel #103(67)
f_NoData, // channel #104(68)
f_NotDef, // channel #105(69)
f_NotDef, // channel #106(6A)
f_NotDef, // channel #107(6B)
f_NotDef, // channel #108(6C)
f_NotDef, // channel #109(6D)
f_NotDef, // channel #110(6E)
f_NotDef, // channel #111(6F)
f_NotDef, // channel #112(70)
f_NotDef, // channel #113(71)
f_NotDef, // channel #114(72)
f_NotDef, // channel #115(73)
f_NotDef, // channel #116(74)
f_NotDef, // channel #117(75)
f_NotDef, // channel #118(76)
f_NotDef, // channel #119(77)
f_NotDef, // channel #120(78)
f_NotDef, // channel #121(79)
f_NotDef, // channel #122(7A)
f_NotDef, // channel #123(7B)
f_NotDef, // channel #124(7C)
f_NotDef, // channel #125(7D)
f_NotDef, // channel #126(7E)
f_NotDef, // channel #127(7F)
f_NotDef, // channel #128(80)
f_NotDef, // channel #129(81)
f_NotDef, // channel #130(82)
f_NotDef, // channel #131(83)
f_NotDef, // channel #132(84)
f_NotDef, // channel #133(85)
f_NotDef, // channel #134(86)
f_NotDef, // channel #135(87)
f_NotDef, // channel #136(88)
f_NotDef, // channel #137(89)
f_NotDef, // channel #138(8A)
f_NotDef, // channel #139(8B)
f_NotDef, // channel #140(8C)
f_NotDef, // channel #141(8D)
f_NotDef, // channel #142(8E)
f_NotDef, // channel #143(8F)
f_NotDef, // channel #144(90)
f_NotDef, // channel #145(91)
f_NotDef, // channel #146(92)
f_NotDef, // channel #147(93)
f_NotDef, // channel #148(94)
f_NotDef, // channel #149(95)
f_NotDef, // channel #150(96)
f_NotDef, // channel #151(97)
f_NotDef, // channel #152(98)
f_NotDef, // channel #153(99)
f_NotDef, // channel #154(9A)
f_NotDef, // channel #155(9B)
f_NotDef, // channel #156(9C)
f_NotDef, // channel #157(9D)
f_NotDef, // channel #158(9E)
f_NotDef, // channel #159(9F)
f_NotDef, // channel #160(A0)
f_NotDef, // channel #161(A1)
f_NotDef, // channel #162(A2)
f_NotDef, // channel #163(A3)
f_NotDef, // channel #164(A4)
f_NotDef, // channel #165(A5)
f_NotDef, // channel #166(A6)
f_NotDef, // channel #167(A7)
f_NotDef, // channel #168(A8)
f_NotDef, // channel #169(A9)
f_NotDef, // channel #170(AA)
f_NotDef, // channel #171(AB)
f_NotDef, // channel #172(AC)
f_NotDef, // channel #173(AD)
f_NotDef, // channel #174(AE)
f_NotDef, // channel #175(AF)
f_NotDef, // channel #176(B0)
f_NotDef, // channel #177(B1)
f_NotDef, // channel #178(B2)
f_NotDef, // channel #179(B3)
f_NotDef, // channel #180(B4)
f_NotDef, // channel #181(B5)
f_NotDef, // channel #182(B6)
f_NotDef, // channel #183(B7)
f_NotDef, // channel #184(B8)
f_NotDef, // channel #185(B9)
f_NotDef, // channel #186(BA)
f_NotDef, // channel #187(BB)
f_NotDef, // channel #188(BC)
f_NotDef, // channel #189(BD)
f_NotDef, // channel #190(BE)
f_NotDef, // channel #191(BF)
f_NotDef, // channel #192(C0)
f_NotDef, // channel #193(C1)
f_NotDef, // channel #194(C2)
f_NotDef, // channel #195(C3)
f_NotDef, // channel #196(C4)
f_NotDef, // channel #197(C5)
f_NotDef, // channel #198(C6)
f_NotDef, // channel #199(C7)
f_NotDef, // channel #200(C8)
f_NotDef, // channel #201(C9)
f_NotDef, // channel #202(CA)
f_NotDef, // channel #203(CB)
f_NotDef, // channel #204(CC)
f_NotDef, // channel #205(CD)
f_NotDef, // channel #206(CE)
f_NotDef, // channel #207(CF)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #208(D0)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #209(D1)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #210(D2)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #211(D3)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #212(D4)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #213(D5)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #214(D6)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #215(D7)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #216(D8)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #217(D9)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #218(DA)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #219(DB)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #220(DC)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #221(DD)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #222(DE)
func0xD0_HARDC_DEBUG_VAR_FP_0, // channel #223(DF)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #224(E0)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #225(E1)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #226(E2)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #227(E3)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #228(E4)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #229(E5)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #230(E6)
func0xE0_HARDC_DEBUG_VAR_U32_0, // channel #231(E7)
f_NotDef, // channel #232(E8)
f_NotDef, // channel #233(E9)
f_NotDef, // channel #234(EA)
f_NotDef, // channel #235(EB)
f_NotDef, // channel #236(EC)
f_NotDef, // channel #237(ED)
f_NotDef, // channel #238(EE)
f_NotDef, // channel #239(EF)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #240(F0)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #241(F1)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #242(F2)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #243(F3)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #244(F4)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #245(F5)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #246(F6)
func0xF0_HARDC_DEBUG_VAR_S32_0, // channel #247(F7)
f_NotDef, // channel #248(F8)
f_NotDef, // channel #249(F9)
f_NotDef, // channel #250(FA)
f_NotDef, // channel #251(FB)
f_NotDef, // channel #252(FC)
f_NotDef, // channel #253(FD)
f_NotDef, // channel #254(FE)
f_NotDef // channel #255(FF)
};
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
// Standard Serial Decoder
///////////////////////////////////////////////////////////////////////////////////////////
void serialDecode (U8 c) {
U16 iLengthOfRawArray, iChecksum = 0, iCalculatedCheckSum;
U8 i, bChecksumValid = FALSE;
serial_Buf[iRawInput++] = c; //insert new data byte in to the serial_Buf[]
iLengthOfRawArray = iRawInput - iRawSample; //get the number of new(unprocesses) data bytes received
if(iRawInput >= MAX_MSG_LEN) { //prevent buffer overflow
if (iLengthOfRawArray) {
memmove(serial_Buf, serial_Buf+iRawSample, iLengthOfRawArray);
}
iRawInput = iLengthOfRawArray;
iRawSample = 0;
}
while (iLengthOfRawArray>0) {
// the decoder has just complted decoding a message
// now we're about to start on a completely new packet
if(!bDecoderRunning) {
iHardwareChannel = serial_Buf[iRawSample]; //assume start of message current message
iLengthOfMsg = MessagesLengths[iHardwareChannel]; //assuming the above, fetch the message length
bDecoderRunning = TRUE; //start reading data
if(iLengthOfMsg == 0) {
// the message is an unknown type -- move on to the next byte
bDecoderRunning = FALSE;
if(iLengthOfRawArray>0) {
iRawSample++;
}
} else if(iLengthOfMsg == MAX_MSG_LEN) {
// the message has varibel length --- length is given by second byte of the message
iLengthOfMsg = serial_Buf[iRawSample+1];
}
} else {
// the decoder is running - i.e. we know the type and length of current message
if(iLengthOfRawArray >= iLengthOfMsg) {
//there is sufficient data in the buffer to do a checksum
//calculation and subsequent decoding of data
//Checksum calculation
if(iHardwareChannel == HARDC_DVR_CMD) {
if ( (serial_Buf[iRawSample+1] == 0x13) && (serial_Buf[iRawSample+2] == 0x01) ){
for (i = 0; i < (iLengthOfMsg-2); i++) {
iChecksum = (iChecksum + serial_Buf[iRawSample + i]);
}
iCalculatedCheckSum = (serial_Buf[iRawSample+i]<<8) + serial_Buf[iRawSample+i+1];
if(iChecksum == iCalculatedCheckSum) {
func0x67_HARDC_DVR_CMD(iChecksum);
bChecksumValid = TRUE;
iRawSample += iLengthOfMsg;
iLengthOfRawArray = 0;
}
}
} else {
for (i = 0; i < (iLengthOfMsg-1); i++) {
iChecksum = 0xFF & (iChecksum + serial_Buf[iRawSample + i]);
}
if(iChecksum == serial_Buf[iRawSample+i]) {
//data ok - calculated checksum and received checksum are equal
//fprintf(file_out, "HW Channel=%d: ", iHardwareChannel);
//printf("HW Channel=%d: ", iHardwareChannel);
if(bReturnDataValues) {
//decode data
pFuncArray[iHardwareChannel]();
/*for (i = 0; i < iNumReturnedFloatChannels; i++){
fprintf(file_out, "%d=%f ", iArrReturnedChannels[i], dArrReturnedFloatValues[i]);
printf("%d=%f ", iArrReturnedChannels[i], dArrReturnedFloatValues[i]);
}
printf("\r\n", iHardwareChannel);
fprintf(file_out, "\r\n", iHardwareChannel);*/
} //else {
//don't decode data
//}
bChecksumValid = TRUE;
iRawSample += iLengthOfMsg;
iLengthOfRawArray = 0;
}
}
if(!bChecksumValid) {
//data corrupt
if(iLengthOfRawArray>0)
iRawSample++;
}
bDecoderRunning = FALSE;
} else {
//there is insufficient data in the buffer -- fetch more data
break;
}
}
iLengthOfRawArray = iRawInput - iRawSample; //get the number of unprocessesed data bytes in the buffer
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// End Standard Serial Decoder
///////////////////////////////////////////////////////////////////////////////////////////
#ifdef PC
void open_log(char *f_name)
{
file_out = fopen(f_name, "w+");
}
void close_log(void)
{
fclose(file_out);
}
#endif