Subversion Repositories NaviCtrl

Rev

Rev 696 | Rev 710 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 696 Rev 698
Line 2... Line 2...
2
#include "91x_lib.h"
2
#include "91x_lib.h"
3
#include "91x_can.h"
3
#include "91x_can.h"
4
#include "timer1.h"
4
#include "timer1.h"
5
#include "led.h"
5
#include "led.h"
6
#include "canbus.h"
6
#include "canbus.h"
-
 
7
#include "compass.h"
7
#include "main.h"
8
#include "main.h"
-
 
9
#include "uart0.h"
8
#include "uart1.h"
10
#include "uart1.h"
9
#include "GPS.h"
11
#include "GPS.h"
Line 10... Line 12...
10
 
12
 
11
canmsg CanMsg;
13
canmsg CanMsg;
12
canmsg RxCanMsg;
14
canmsg RxCanMsg;
-
 
15
volatile u32 AllMsgsReceived;
Line 13... Line 16...
13
volatile u32 AllMsgsReceived;
16
u32 CanbusTimeOut = 0;
14
 
17
 
Line 30... Line 33...
30
  enum {
33
  enum {
31
        CAN_TX_MSGOBJ = 0,
34
        CAN_TX_MSGOBJ = 0,
32
        CAN_RX_MSGOBJ = 1
35
        CAN_RX_MSGOBJ = 1
33
  };
36
  };
Line -... Line 37...
-
 
37
 
34
 
38
#define CAN_MSG_ADR_MA  0x200
Line 35... Line -...
35
#define CAN_MSG_ADR     0x100
-
 
36
 
-
 
37
#define CAN_ID_VERSION  0
-
 
38
#define CAN_ID_STATUS   1
39
#define CAN_MSG_ADR_SL  0x300
39
#define CAN_ID_FS_LON   2
40
 
40
#define CAN_ID_FS_LAT   3
-
 
41
#define CAN_ID_FS_ALT   4
-
 
Line 42... Line 41...
42
 
41
u32 CAN_IdTx; // I am Sending in this ID-Range
43
#define MAX_CAN_MSG     10
42
u32 CAN_IdRx; // I am Receiving in this ID-Range
Line 44... Line 43...
44
 
43
 
Line 87... Line 86...
87
 
86
 
88
      case 1 /* CAN_RX_MSGOBJ */:
87
      case 1 /* CAN_RX_MSGOBJ */:
89
        CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg);
88
        CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg);
Line 90... Line 89...
90
                CAN_ReleaseRxMessage(msgobj);
89
                CAN_ReleaseRxMessage(msgobj);
91
 
90
 
92
                if(RxCanMsg.Id >= CAN_MSG_ADR && RxCanMsg.Id < CAN_MSG_ADR + MAX_CAN_MSG)
91
                if(RxCanMsg.Id >= CAN_IdRx && RxCanMsg.Id < CAN_IdRx + MAX_CAN_MSG)
93
                 {
92
                 {
94
                        memcpy(&CanRxMessage[RxCanMsg.Id - CAN_MSG_ADR], &RxCanMsg,sizeof(RxCanMsg));
93
                        memcpy(&CanRxMessage[RxCanMsg.Id - CAN_IdRx], &RxCanMsg,sizeof(RxCanMsg));
95
                 }
94
                 }
96
                if(RxCanMsg.Id == CAN_MSG_ADR + MAX_CAN_MSG - 1)
95
                if(RxCanMsg.Id == CAN_IdRx + MAX_CAN_MSG - 1)
97
                 {
96
                 {
98
                  AllMsgsReceived = 1;
97
                  AllMsgsReceived = 1;
99
                 }
98
                 }
Line 100... Line 99...
100
                DebugOut.Analog[16] = RxCanMsg.Id;
99
//              DebugOut.Analog[] = RxCanMsg.Id;
101
  break;
100
  break;
102
 
101
 
Line 112... Line 111...
112
}
111
}
Line 113... Line 112...
113
 
112
 
114
void CanSend(void)
113
void CanSend(void)
115
{
114
{
116
static u32 index = 1;
-
 
117
CanTxMessage[4].D.sLong = DebugOut.Analog[24];
-
 
-
 
115
static u32 index = 1;
118
//  CAN_SendMessage(CAN_TX_MSGOBJ, &TxCanMsg[1]);
116
 
119
  if(CAN_SendMessage(CAN_TX_MSGOBJ, &CanTxMessage[index]) == SUCCESS)
117
  if(CAN_SendMessage(CAN_TX_MSGOBJ, &CanTxMessage[index]) == SUCCESS)
120
   {
118
   {
121
    if(++index >= MAX_CAN_MSG)
119
    if(++index >= MAX_CAN_MSG)
-
 
120
         {
122
         {
121
                u32 i;
-
 
122
                index = 0;
-
 
123
                CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode;
123
                index = 0;
124
 
124
                CanTxMessage[CAN_ID_FS_LON].D.sLong = GPS_FailsafePosition.Longitude;
125
                CanTxMessage[CAN_ID_FS_LON].D.sLong = GPS_FailsafePosition.Longitude;
-
 
126
                CanTxMessage[CAN_ID_FS_LAT].D.sLong = GPS_FailsafePosition.Latitude;
-
 
127
 
-
 
128
                CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode;
-
 
129
                CanTxMessage[CAN_ID_STATUS].D.Byte[1] = FC.StatusFlags;
-
 
130
                CanTxMessage[CAN_ID_STATUS].D.Byte[2] = FC.StatusFlags2;
-
 
131
                CanTxMessage[CAN_ID_STATUS].D.Byte[3] = FC.StatusFlags3;
-
 
132
                CanTxMessage[CAN_ID_STATUS].D.Byte[4] = NC_To_FC_Flags;
-
 
133
                CanTxMessage[CAN_ID_STATUS].D.Byte[5] = EarthMagneticField/5; // in %
-
 
134
                CanTxMessage[CAN_ID_STATUS].D.Int[3]  = GyroCompassCorrected;
-
 
135
 
-
 
136
                for(i=0; i<8;i++)
-
 
137
                 {
-
 
138
                  CanTxMessage[CAN_ID_TEXT1].D.Byte[i] = ErrorMSG[i];
-
 
139
                  CanTxMessage[CAN_ID_TEXT2].D.Byte[i] = ErrorMSG[i + 8];
-
 
140
                  CanTxMessage[CAN_ID_TEXT3].D.Byte[i] = ErrorMSG[i + 16];
125
                CanTxMessage[CAN_ID_FS_LAT].D.sLong = GPS_FailsafePosition.Latitude;
141
                 }                                                                               
126
         }
142
         }
127
   }
143
   }
Line 128... Line 144...
128
}
144
}
Line 149... Line 165...
149
 CAN_SetUnusedAllMsgObj();
165
 CAN_SetUnusedAllMsgObj();
150
 CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE);
166
 CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE);
151
 CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);
167
 CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);
Line 152... Line 168...
152
 
168
 
-
 
169
u32 i;
-
 
170
 
-
 
171
if(IamMaster == SLAVE)
-
 
172
{
-
 
173
 CAN_IdRx = CAN_MSG_ADR_MA;
-
 
174
 CAN_IdTx = CAN_MSG_ADR_SL;
-
 
175
}
-
 
176
else
-
 
177
{
-
 
178
 CAN_IdRx = CAN_MSG_ADR_SL;
-
 
179
 CAN_IdTx = CAN_MSG_ADR_MA;
-
 
180
}
153
u32 i;
181
 
154
for(i=0; i< MAX_CAN_MSG;i++)
182
for(i=0; i< MAX_CAN_MSG;i++)
-
 
183
 {
155
 {
184
        // clear TX Buffer
156
        CanTxMessage[i].IdType = CAN_STD_ID;
185
        CanTxMessage[i].IdType = CAN_STD_ID;
157
        CanTxMessage[i].Id = i + CAN_MSG_ADR;
186
        CanTxMessage[i].Id = i + CAN_IdTx;
158
        CanTxMessage[i].Length = 8;
187
        CanTxMessage[i].Length = 8;
-
 
188
        CanTxMessage[i].D.Long = 0;
-
 
189
 
-
 
190
        // clear receiving Buffer
-
 
191
        CanRxMessage[i].Id = 0;
159
        CanTxMessage[i].D.Long = i;
192
        CanRxMessage[i].D.Long = 0;
Line -... Line 193...
-
 
193
 }
-
 
194
 
-
 
195
CanTxMessage[CAN_ID_VERSION].D.Byte[0]  = 0;
-
 
196
CanTxMessage[CAN_ID_VERSION].D.Byte[1]  = Parameter.ActiveSetting;
160
 }
197
CanTxMessage[CAN_ID_VERSION].D.Byte[2]  = GPS_Version/1000;
161
 
198
CanTxMessage[CAN_ID_VERSION].D.Byte[3]  = UART_VersionInfo.HWMajor;
162
CanTxMessage[CAN_ID_VERSION].D.Byte[0]  = CAN_SLAVE_COMPATIBLE;
199
CanTxMessage[CAN_ID_VERSION].D.Byte[4]  = CAN_SLAVE_COMPATIBLE;
163
CanTxMessage[CAN_ID_VERSION].D.Byte[1]  = VERSION_PATCH;
200
CanTxMessage[CAN_ID_VERSION].D.Byte[5]  = VERSION_PATCH;
Line 164... Line 201...
164
CanTxMessage[CAN_ID_VERSION].D.Byte[2]  = VERSION_MINOR;
201
CanTxMessage[CAN_ID_VERSION].D.Byte[6]  = VERSION_MINOR;
165
CanTxMessage[CAN_ID_VERSION].D.Byte[3]  = VERSION_MAJOR;
202
CanTxMessage[CAN_ID_VERSION].D.Byte[7]  = VERSION_MAJOR;
Line 166... Line 203...
166
 
203
 
167
 UART1_PutString("ok");
204
 UART1_PutString("ok");
168
}
-
 
-
 
205
}
169
 
206
 
170
void ProcessCanBus(void)
207
void ProcessCanBus(void)
-
 
208
{
-
 
209
 u32 errorcnt = 0;
-
 
210
 CanSend();
171
{
211
 CanReceive();
Line 172... Line 212...
172
 
212
 
Line 173... Line 213...
173
 CanSend();
213
errorcnt = CAN_GetTransmitErrorCounter();
174
 CanReceive();
214
DebugOut.Analog[18] = errorcnt;
-
 
215
//if(errorcnt > 200) CanbusInit();
175
if(CAN_GetTransmitErrorCounter() > 200) CanbusInit();
216
 
176
 
217
//DebugOut.Analog[16] = CAN->SR ;
177
//DebugOut.Analog[16] = CAN->SR ;
218
 
-
 
219
if(AllMsgsReceived)
-
 
220
 {
-
 
221
  u32 i;
-
 
222
  AllMsgsReceived = 0;
-
 
223
  DebugOut.Analog[16]++;       
-
 
224
  CanbusTimeOut = 1000;
-
 
225
  for(i=0; i<8;i++)
-
 
226
   {
-
 
227
          PartnerErrorMSG[i]    = CanRxMessage[CAN_ID_TEXT1].D.Byte[i];
-
 
228
          PartnerErrorMSG[i+8]  = CanRxMessage[CAN_ID_TEXT2].D.Byte[i];
-
 
229
          PartnerErrorMSG[i+16] = CanRxMessage[CAN_ID_TEXT3].D.Byte[i];
-
 
230
   }                                                                             
-
 
231
  Partner.ErrorCode                     = CanRxMessage[CAN_ID_STATUS].D.Byte[0];
-
 
232
  Partner.StatusFlags                   = CanRxMessage[CAN_ID_STATUS].D.Byte[1];
-
 
233
  Partner.StatusFlags2                  = CanRxMessage[CAN_ID_STATUS].D.Byte[2];
Line 178... Line -...
178
 
-
 
179
if(AllMsgsReceived)
234
  Partner.StatusFlags3                  = CanRxMessage[CAN_ID_STATUS].D.Byte[3];
Line 180... Line 235...
180
 {
235
  Partner.NC_To_FC_Flags                = CanRxMessage[CAN_ID_STATUS].D.Byte[4];
181
  AllMsgsReceived = 0;
236
  Partner.MagnetField                   = CanRxMessage[CAN_ID_STATUS].D.Byte[5];
182
  DebugOut.Analog[17] = CanRxMessage[4].D.sLong;
237
  Partner.GyroCompassCorrected  = CanRxMessage[CAN_ID_STATUS].D.Int[3];
183
  DebugOut.Analog[19]++;       
238
 
-
 
239
  CanTxMessage[CAN_ID_VERSION].D.Byte[1] = Parameter.ActiveSetting;
-
 
240
 
184
 
241
DebugOut.Analog[19] = Partner.GyroCompassCorrected;
185
DebugOut.Analog[17] = CanRxMessage[CAN_ID_FS_LON].D.sLong / 100000;
242
 
186
DebugOut.Analog[18] = CanRxMessage[CAN_ID_FS_LAT].D.sLong / 100000;
243
if(IamMaster == SLAVE)