Subversion Repositories NaviCtrl

Rev

Rev 721 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 721 Rev 766
1
#include <stdio.h>
1
#include <stdio.h>
2
#include <stdarg.h>
2
#include <stdarg.h>
3
#include <string.h>
3
#include <string.h>
4
#include "91x_lib.h"
4
#include "91x_lib.h"
5
#include "91x_can.h"
5
#include "91x_can.h"
6
#include "timer1.h"
6
#include "timer1.h"
7
#include "led.h"
7
#include "led.h"
8
#include "canbus.h"
8
#include "canbus.h"
9
#include "compass.h"
9
#include "compass.h"
10
#include "main.h"
10
#include "main.h"
11
#include "uart0.h"
11
#include "uart0.h"
12
#include "uart1.h"
12
#include "uart1.h"
13
#include "GPS.h"
13
#include "GPS.h"
14
 
14
 
15
canmsg CanMsg;
15
canmsg CanMsg;
16
canmsg RxCanMsg;
16
canmsg RxCanMsg;
17
volatile u32 AllMsgsReceived;
17
volatile u32 AllMsgsReceived;
18
u32 CanbusTimeOut = 0;
18
u32 CanbusTimeOut = 0;
19
 
19
 
20
GPIO_InitTypeDef    GPIO_InitStructure;
20
GPIO_InitTypeDef    GPIO_InitStructure;
21
CAN_InitTypeDef     CAN_InitStructure;
21
CAN_InitTypeDef     CAN_InitStructure;
22
 
22
 
23
 
23
 
24
typedef  enum {
24
typedef  enum {
25
    NA,
25
    NA,
26
    Priority_1,
26
    Priority_1,
27
    Priority_2,
27
    Priority_2,
28
    Priority_3
28
    Priority_3
29
  }VIC_Priority;
29
  }VIC_Priority;
30
 
30
 
31
  /* buffer for receive messages */
31
  /* buffer for receive messages */
32
  canmsg RxCanTxMsg;
32
  canmsg RxCanTxMsg;
33
 
33
 
34
  /* used message object numbers */
34
  /* used message object numbers */
35
  enum {
35
  enum {
36
        CAN_TX_MSGOBJ = 0,
36
        CAN_TX_MSGOBJ = 0,
37
        CAN_RX_MSGOBJ = 1
37
        CAN_RX_MSGOBJ = 1
38
  };
38
  };
39
 
39
 
40
#define CAN_MSG_ADR_MA  0x200
40
#define CAN_MSG_ADR_MA  0x200
41
#define CAN_MSG_ADR_SL  0x300
41
#define CAN_MSG_ADR_SL  0x300
42
 
42
 
43
u32 CAN_IdTx; // I am Sending in this ID-Range
43
u32 CAN_IdTx; // I am Sending in this ID-Range
44
u32 CAN_IdRx; // I am Receiving in this ID-Range
44
u32 CAN_IdRx; // I am Receiving in this ID-Range
45
 
45
 
46
CanMessage_t CanTxMessage[MAX_CAN_MSG];
46
CanMessage_t CanTxMessage[MAX_CAN_MSG];
47
CanMessage_t CanRxMessage[MAX_CAN_MSG];
47
CanMessage_t CanRxMessage[MAX_CAN_MSG];
48
 
48
 
49
void CAN_IO_Init(void)
49
void CAN_IO_Init(void)
50
{
50
{
51
// P5.0 alternate input 1, CAN_RX pin 
51
// P5.0 alternate input 1, CAN_RX pin 
52
        GPIO_StructInit(&GPIO_InitStructure);
52
        GPIO_StructInit(&GPIO_InitStructure);
53
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
53
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
54
        GPIO_InitStructure.GPIO_Direction=GPIO_PinInput;
54
        GPIO_InitStructure.GPIO_Direction=GPIO_PinInput;
55
        GPIO_InitStructure.GPIO_IPInputConnected=GPIO_IPInputConnected_Enable;
55
        GPIO_InitStructure.GPIO_IPInputConnected=GPIO_IPInputConnected_Enable;
56
        GPIO_InitStructure.GPIO_Alternate=GPIO_InputAlt1;
56
        GPIO_InitStructure.GPIO_Alternate=GPIO_InputAlt1;
57
        GPIO_Init(GPIO5,&GPIO_InitStructure);
57
        GPIO_Init(GPIO5,&GPIO_InitStructure);
58
// P5.1 CAN_TX
58
// P5.1 CAN_TX
59
        GPIO_StructInit(&GPIO_InitStructure);
59
        GPIO_StructInit(&GPIO_InitStructure);
60
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
60
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
61
        GPIO_InitStructure.GPIO_Direction=GPIO_PinOutput;
61
        GPIO_InitStructure.GPIO_Direction=GPIO_PinOutput;
62
        GPIO_InitStructure.GPIO_Type=GPIO_Type_PushPull;
62
        GPIO_InitStructure.GPIO_Type=GPIO_Type_PushPull;
63
        GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt2;
63
        GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt2;
64
        GPIO_Init(GPIO5,&GPIO_InitStructure);
64
        GPIO_Init(GPIO5,&GPIO_InitStructure);
65
}
65
}
66
 
66
 
67
 
67
 
68
 
68
 
69
/*******************************************************************************
69
/*******************************************************************************
70
* Function Name  : CAN_IRQHandler
70
* Function Name  : CAN_IRQHandler
71
* Description    : This function handles the CAN interrupt request
71
* Description    : This function handles the CAN interrupt request
72
*******************************************************************************/
72
*******************************************************************************/
73
void CAN_IRQHandler(void)
73
void CAN_IRQHandler(void)
74
{
74
{
75
   u32 msgobj = 0;
75
   u32 msgobj = 0;
76
  if(CAN->IDR == 0x8000)        /* status interrupt */
76
  if(CAN->IDR == 0x8000)        /* status interrupt */
77
  {
77
  {
78
    (void)CAN->SR;      /* read the status register to clear*/
78
    (void)CAN->SR;      /* read the status register to clear*/
79
  }
79
  }
80
  else if(CAN->IDR >= 1 && CAN->IDR <= 32)
80
  else if(CAN->IDR >= 1 && CAN->IDR <= 32)
81
  {
81
  {
82
    /* get the message object number that caused the interrupt to occur */
82
    /* get the message object number that caused the interrupt to occur */
83
    switch(msgobj = CAN->IDR - 1)
83
    switch(msgobj = CAN->IDR - 1)
84
    {
84
    {
85
      case  0 /* CAN_TX_MSGOBJ */:
85
      case  0 /* CAN_TX_MSGOBJ */:
86
                CAN_ReleaseTxMessage(msgobj);
86
                CAN_ReleaseTxMessage(msgobj);
87
        break;
87
        break;
88
 
88
 
89
      case 1 /* CAN_RX_MSGOBJ */:
89
      case 1 /* CAN_RX_MSGOBJ */:
90
        CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg);
90
        CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg);
91
                CAN_ReleaseRxMessage(msgobj);
91
                CAN_ReleaseRxMessage(msgobj);
92
 
92
 
93
                if(RxCanMsg.Id >= CAN_IdRx && RxCanMsg.Id < CAN_IdRx + MAX_CAN_MSG)
93
                if(RxCanMsg.Id >= CAN_IdRx && RxCanMsg.Id < CAN_IdRx + MAX_CAN_MSG)
94
                 {
94
                 {
95
                        memcpy(&CanRxMessage[RxCanMsg.Id - CAN_IdRx], &RxCanMsg,sizeof(RxCanMsg));
95
                        memcpy(&CanRxMessage[RxCanMsg.Id - CAN_IdRx], &RxCanMsg,sizeof(RxCanMsg));
96
                 }
96
                 }
97
                if(RxCanMsg.Id == CAN_IdRx + MAX_CAN_MSG - 1)
97
                if(RxCanMsg.Id == CAN_IdRx + MAX_CAN_MSG - 1)
98
                 {
98
                 {
99
                  AllMsgsReceived = 1;
99
                  AllMsgsReceived = 1;
100
                 }
100
                 }
101
//              DebugOut.Analog[] = RxCanMsg.Id;
101
//              DebugOut.Analog[] = RxCanMsg.Id;
102
  break;
102
  break;
103
 
103
 
104
      default:
104
      default:
105
        CAN_ReleaseMessage(msgobj);
105
        CAN_ReleaseMessage(msgobj);
106
        break;
106
        break;
107
    }
107
    }
108
  }
108
  }
109
   
109
   
110
   /*write any value to VIC0 VAR*/  
110
   /*write any value to VIC0 VAR*/  
111
   VIC0->VAR = 0xFF;   
111
   VIC0->VAR = 0xFF;   
112
 
112
 
113
}
113
}
114
 
114
 
115
void CanSend(void)
115
void CanSend(void)
116
{
116
{
117
static u32 index = 1;
117
static u32 index = 1;
118
 
118
 
119
  if(CAN_SendMessage(CAN_TX_MSGOBJ, (canmsg*) &CanTxMessage[index]) == SUCCESS)
119
  if(CAN_SendMessage(CAN_TX_MSGOBJ, (canmsg*) &CanTxMessage[index]) == SUCCESS)
120
   {
120
   {
121
    if(++index >= MAX_CAN_MSG)
121
    if(++index >= MAX_CAN_MSG)
122
         {
122
         {
123
                u32 i;
123
                u32 i;
124
                index = 0;
124
                index = 0;
125
                CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode;
125
                CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode;
126
 
126
 
127
                CanTxMessage[CAN_ID_FS_LON].D.sLong = GPS_FailsafePosition.Longitude;
127
                CanTxMessage[CAN_ID_FS_LON].D.sLong[0] = GPS_FailsafePosition.Longitude;
128
                CanTxMessage[CAN_ID_FS_LAT].D.sLong = GPS_FailsafePosition.Latitude;
128
                CanTxMessage[CAN_ID_FS_LAT].D.sLong[0] = GPS_FailsafePosition.Latitude;
129
 
129
 
130
                CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode;
130
                CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode;
131
                CanTxMessage[CAN_ID_STATUS].D.Byte[1] = FC.StatusFlags;
131
                CanTxMessage[CAN_ID_STATUS].D.Byte[1] = FC.StatusFlags;
132
                CanTxMessage[CAN_ID_STATUS].D.Byte[2] = FC.StatusFlags2;
132
                CanTxMessage[CAN_ID_STATUS].D.Byte[2] = FC.StatusFlags2;
133
                CanTxMessage[CAN_ID_STATUS].D.Byte[3] = FC.StatusFlags3;
133
                CanTxMessage[CAN_ID_STATUS].D.Byte[3] = FC.StatusFlags3;
134
                CanTxMessage[CAN_ID_STATUS].D.Byte[4] = NC_To_FC_Flags;
134
                CanTxMessage[CAN_ID_STATUS].D.Byte[4] = NC_To_FC_Flags;
135
                CanTxMessage[CAN_ID_STATUS].D.Byte[5] = EarthMagneticField/5; // in %
135
                CanTxMessage[CAN_ID_STATUS].D.Byte[5] = EarthMagneticField/5; // in %
136
                CanTxMessage[CAN_ID_STATUS].D.Int[3]  = GyroCompassCorrected;
136
                CanTxMessage[CAN_ID_STATUS].D.Int[3]  = GyroCompassCorrected;
137
 
137
 
138
                for(i=0; i<8;i++)
138
                for(i=0; i<8;i++)
139
                 {
139
                 {
140
                  CanTxMessage[CAN_ID_TEXT1].D.Byte[i] = ErrorMSG[i];
140
                  CanTxMessage[CAN_ID_TEXT1].D.Byte[i] = ErrorMSG[i];
141
                  CanTxMessage[CAN_ID_TEXT2].D.Byte[i] = ErrorMSG[i + 8];
141
                  CanTxMessage[CAN_ID_TEXT2].D.Byte[i] = ErrorMSG[i + 8];
142
                  CanTxMessage[CAN_ID_TEXT3].D.Byte[i] = ErrorMSG[i + 16];
142
                  CanTxMessage[CAN_ID_TEXT3].D.Byte[i] = ErrorMSG[i + 16];
143
                 }                                                                               
143
                 }                                                                               
144
         }
144
         }
145
   }
145
   }
146
}
146
}
147
 
147
 
148
void CanReceive(void)
148
void CanReceive(void)
149
{
149
{
150
 
150
 
151
}
151
}
152
 
152
 
153
 
153
 
154
void CanbusInit(void)
154
void CanbusInit(void)
155
{
155
{
156
 UART1_PutString("\r\n Canbus init...");
156
 UART1_PutString("\r\n Canbus init...");
157
 CAN_IO_Init();
157
 CAN_IO_Init();
158
 SCU_APBPeriphClockConfig(__CAN, ENABLE);
158
 SCU_APBPeriphClockConfig(__CAN, ENABLE);
159
 SCU_APBPeriphReset(__CAN, DISABLE);
159
 SCU_APBPeriphReset(__CAN, DISABLE);
160
 
160
 
161
 VIC_Config(CAN_ITLine, VIC_IRQ, Priority_1);
161
 VIC_Config(CAN_ITLine, VIC_IRQ, Priority_1);
162
 CAN_InitStructure.CAN_ConfigParameters=CAN_CR_IE;
162
 CAN_InitStructure.CAN_ConfigParameters=CAN_CR_IE;
163
 CAN_InitStructure.CAN_Bitrate = CAN_BITRATE_1M;
163
 CAN_InitStructure.CAN_Bitrate = CAN_BITRATE_1M;
164
 CAN_Init(&CAN_InitStructure);
164
 CAN_Init(&CAN_InitStructure);
165
 VIC_ITCmd(CAN_ITLine, ENABLE);
165
 VIC_ITCmd(CAN_ITLine, ENABLE);
166
 
166
 
167
 CAN_SetUnusedAllMsgObj();
167
 CAN_SetUnusedAllMsgObj();
168
 CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE);
168
 CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE);
169
 CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);
169
 CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);
170
 
170
 
171
u32 i;
171
u32 i;
172
 
172
 
173
if(IamMaster == SLAVE)
173
if(IamMaster == SLAVE)
174
{
174
{
175
 CAN_IdRx = CAN_MSG_ADR_MA;
175
 CAN_IdRx = CAN_MSG_ADR_MA;
176
 CAN_IdTx = CAN_MSG_ADR_SL;
176
 CAN_IdTx = CAN_MSG_ADR_SL;
177
}
177
}
178
else
178
else
179
{
179
{
180
 CAN_IdRx = CAN_MSG_ADR_SL;
180
 CAN_IdRx = CAN_MSG_ADR_SL;
181
 CAN_IdTx = CAN_MSG_ADR_MA;
181
 CAN_IdTx = CAN_MSG_ADR_MA;
182
}
182
}
183
 
183
 
184
for(i=0; i< MAX_CAN_MSG;i++)
184
for(i=0; i< MAX_CAN_MSG;i++)
185
 {
185
 {
186
        // clear TX Buffer
186
        // clear TX Buffer
187
        CanTxMessage[i].IdType = CAN_STD_ID;
187
        CanTxMessage[i].IdType = CAN_STD_ID;
188
        CanTxMessage[i].Id = i + CAN_IdTx;
188
        CanTxMessage[i].Id = i + CAN_IdTx;
189
        CanTxMessage[i].Length = 8;
189
        CanTxMessage[i].Length = 8;
190
        CanTxMessage[i].D.Long = 0;
190
        CanTxMessage[i].D.Long[0] = 0;
191
 
191
 
192
        // clear receiving Buffer
192
        // clear receiving Buffer
193
        CanRxMessage[i].Id = 0;
193
        CanRxMessage[i].Id = 0;
194
        CanRxMessage[i].D.Long = 0;
194
        CanRxMessage[i].D.Long[0] = 0;
195
 }
195
 }
196
 
196
 
197
CanTxMessage[CAN_ID_VERSION].D.Byte[0]  = 0;
197
        CanTxMessage[CAN_ID_VERSION].D.Byte[0]  = 0;
198
CanTxMessage[CAN_ID_VERSION].D.Byte[1]  = Parameter.ActiveSetting;
198
        CanTxMessage[CAN_ID_VERSION].D.Byte[1]  = Parameter.ActiveSetting;
199
CanTxMessage[CAN_ID_VERSION].D.Byte[2]  = GPS_Version/1000;
199
        CanTxMessage[CAN_ID_VERSION].D.Byte[2]  = GPS_Version/1000;
200
CanTxMessage[CAN_ID_VERSION].D.Byte[3]  = UART_VersionInfo.HWMajor;
200
        CanTxMessage[CAN_ID_VERSION].D.Byte[3]  = UART_VersionInfo.HWMajor;
201
CanTxMessage[CAN_ID_VERSION].D.Byte[4]  = CAN_SLAVE_COMPATIBLE;
201
        CanTxMessage[CAN_ID_VERSION].D.Byte[4]  = CAN_SLAVE_COMPATIBLE;
202
CanTxMessage[CAN_ID_VERSION].D.Byte[5]  = VERSION_PATCH;
202
        CanTxMessage[CAN_ID_VERSION].D.Byte[5]  = VERSION_PATCH;
203
CanTxMessage[CAN_ID_VERSION].D.Byte[6]  = VERSION_MINOR;
203
        CanTxMessage[CAN_ID_VERSION].D.Byte[6]  = VERSION_MINOR;
204
CanTxMessage[CAN_ID_VERSION].D.Byte[7]  = VERSION_MAJOR;
204
        CanTxMessage[CAN_ID_VERSION].D.Byte[7]  = VERSION_MAJOR;
205
 
205
 
206
 UART1_PutString("ok");
206
 UART1_PutString("ok");
207
}
207
}
208
 
208
 
209
void ProcessCanBus(void)
209
void ProcessCanBus(void)
210
{
210
{
211
 u32 errorcnt = 0;
211
 u32 errorcnt = 0;
212
 
212
 
213
 CanSend();
213
 CanSend();
214
 CanReceive();
214
 CanReceive();
215
 
215
 
216
 errorcnt = CAN_GetTransmitErrorCounter();
216
 errorcnt = CAN_GetTransmitErrorCounter();
217
//if(errorcnt > 200) CanbusInit();
217
//if(errorcnt > 200) CanbusInit();
218
 
218
 
219
if(CanbusTimeOut < 3)
219
if(CanbusTimeOut < 3)
220
{
220
{
221
  if(CanbusTimeOut == 1) Partner.ErrorCode = 39; // ERR: Canbus
221
  if(CanbusTimeOut == 1) Partner.ErrorCode = 39; // ERR: Canbus
222
  Partner.StatusFlags = 0;
222
  Partner.StatusFlags = 0;
223
  Partner.StatusFlags2 = 0;
223
  Partner.StatusFlags2 = 0;
224
  Partner.StatusFlags3 = 0;
224
  Partner.StatusFlags3 = 0;
225
  Partner.NC_To_FC_Flags = 0;
225
  Partner.NC_To_FC_Flags = 0;
226
  Partner.MagnetField = 0;
226
  Partner.MagnetField = 0;
227
  Partner.GyroCompassCorrected = -1;
227
  Partner.GyroCompassCorrected = -1;
228
  sprintf(PartnerErrorMSG,"     ---                ");
228
  sprintf(PartnerErrorMSG,"     ---                ");
229
}
229
}
230
 
230
 
231
if(CanRxMessage[CAN_ID_VERSION].D.Byte[6] == 13) // dann ist der Testdummy angeschlossen -> nur zum Testen von EXT2
231
if(CanRxMessage[CAN_ID_VERSION].D.Byte[6] == 13) // dann ist der Testdummy angeschlossen -> nur zum Testen von EXT2
232
 {
232
 {
233
  if((PartnerErrorMSG[17] + PartnerErrorMSG[18]) & 1) EXT2_ON;
233
  if((PartnerErrorMSG[17] + PartnerErrorMSG[18]) & 1) EXT2_ON;
234
  else EXT2_OFF;
234
  else EXT2_OFF;
235
 }
235
 }
236
 
236
 
237
if(AllMsgsReceived)
237
if(AllMsgsReceived)
238
 {
238
 {
239
  u32 i;
239
  u32 i;
240
  AllMsgsReceived = 0;
240
  AllMsgsReceived = 0;
241
  CanbusTimeOut = 1000;
241
  CanbusTimeOut = 1000;
242
  for(i=0; i<8;i++)
242
  for(i=0; i<8;i++)
243
   {
243
   {
244
          PartnerErrorMSG[i]    = CanRxMessage[CAN_ID_TEXT1].D.Byte[i];
244
          PartnerErrorMSG[i]    = CanRxMessage[CAN_ID_TEXT1].D.Byte[i];
245
          PartnerErrorMSG[i+8]  = CanRxMessage[CAN_ID_TEXT2].D.Byte[i];
245
          PartnerErrorMSG[i+8]  = CanRxMessage[CAN_ID_TEXT2].D.Byte[i];
246
          PartnerErrorMSG[i+16] = CanRxMessage[CAN_ID_TEXT3].D.Byte[i];
246
          PartnerErrorMSG[i+16] = CanRxMessage[CAN_ID_TEXT3].D.Byte[i];
247
   }                                                                             
247
   }                                                                             
248
  Partner.ErrorCode                     = CanRxMessage[CAN_ID_STATUS].D.Byte[0];
248
  Partner.ErrorCode                     = CanRxMessage[CAN_ID_STATUS].D.Byte[0];
249
  Partner.StatusFlags                   = CanRxMessage[CAN_ID_STATUS].D.Byte[1];
249
  Partner.StatusFlags                   = CanRxMessage[CAN_ID_STATUS].D.Byte[1];
250
  Partner.StatusFlags2                  = CanRxMessage[CAN_ID_STATUS].D.Byte[2];
250
  Partner.StatusFlags2                  = CanRxMessage[CAN_ID_STATUS].D.Byte[2];
251
  Partner.StatusFlags3                  = CanRxMessage[CAN_ID_STATUS].D.Byte[3];
251
  Partner.StatusFlags3                  = CanRxMessage[CAN_ID_STATUS].D.Byte[3];
252
  Partner.NC_To_FC_Flags                = CanRxMessage[CAN_ID_STATUS].D.Byte[4];
252
  Partner.NC_To_FC_Flags                = CanRxMessage[CAN_ID_STATUS].D.Byte[4];
253
  Partner.MagnetField                   = CanRxMessage[CAN_ID_STATUS].D.Byte[5];
253
  Partner.MagnetField                   = CanRxMessage[CAN_ID_STATUS].D.Byte[5];
254
  Partner.GyroCompassCorrected  = CanRxMessage[CAN_ID_STATUS].D.Int[3];
254
  Partner.GyroCompassCorrected  = CanRxMessage[CAN_ID_STATUS].D.Int[3];
255
 
255
 
256
  CanTxMessage[CAN_ID_VERSION].D.Byte[1] = Parameter.ActiveSetting;
256
  CanTxMessage[CAN_ID_VERSION].D.Byte[1] = Parameter.ActiveSetting;
257
 
257
 
258
if(IamMaster == SLAVE)
258
if(IamMaster == SLAVE)
259
  {
259
  {
260
                GPS_FailsafePosition.Longitude = CanRxMessage[CAN_ID_FS_LON].D.sLong;
260
                GPS_FailsafePosition.Longitude = CanRxMessage[CAN_ID_FS_LON].D.sLong[0];
261
                GPS_FailsafePosition.Latitude = CanRxMessage[CAN_ID_FS_LAT].D.sLong;
261
                GPS_FailsafePosition.Latitude = CanRxMessage[CAN_ID_FS_LAT].D.sLong[0];
262
  }
262
  }
263
 }
263
 }
264
}                                        
264
}                                        
265
 
265
 
266
 
266
 
267
 
267
 
268
 
268
 
269
 
269
 
270
 
270