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) |