Subversion Repositories NaviCtrl

Rev

Rev 27 | Rev 48 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 27 Rev 41
Line 52... Line 52...
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
// +  POSSIBILITY OF SUCH DAMAGE. 
55
// +  POSSIBILITY OF SUCH DAMAGE.
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
57
 
-
 
58
#include <string.h>
-
 
59
#include "91x_lib.h"
-
 
60
#include "led.h"
-
 
61
#include "GPS.h"
-
 
62
#include "uart1.h"
-
 
63
#include "spi_slave.h"
-
 
64
#include "i2c.h"
-
 
65
#include "timer.h"
57
#include "main.h"
66
#include "main.h"
-
 
67
#include "fifo.h"
Line 58... Line -...
58
 
-
 
59
struct str_FromFlightCtrl   FromFlightCtrl;
-
 
Line -... Line 68...
-
 
68
 
-
 
69
 
-
 
70
#define SPI_RXSYNCBYTE1 0xAA
-
 
71
#define SPI_RXSYNCBYTE2 0x83
-
 
72
#define SPI_TXSYNCBYTE1 0x81
-
 
73
#define SPI_TXSYNCBYTE2 0x55
-
 
74
 
-
 
75
typedef enum
-
 
76
{
-
 
77
        SPI_SYNC1,
-
 
78
        SPI_SYNC2,
-
 
79
        SPI_DATA
-
 
80
} SPI_State_t;
-
 
81
 
60
struct str_ToFlightCtrl     ToFlightCtrl;
82
//communication packets
-
 
83
volatile FromFlightCtrl_t   FromFlightCtrl;
-
 
84
volatile ToFlightCtrl_t     ToFlightCtrl;
-
 
85
 
-
 
86
// tx packet buffer
-
 
87
#define SPI_TXBUFFER_LEN (2 + sizeof(ToFlightCtrl)) // 2 bytes at start are for synchronization
-
 
88
volatile u8 SPI_TxBuffer[SPI_TXBUFFER_LEN];
-
 
89
volatile u8 SPI_TxBufferIndex = 0;
-
 
90
u8 *Ptr_TxChksum = NULL ;  // pointer to checksum in TxBuffer
-
 
91
 
-
 
92
// rx packet buffer
-
 
93
#define SPI_RXBUFFER_LEN sizeof(FromFlightCtrl)
-
 
94
volatile u8 SPI_RxBuffer[SPI_RXBUFFER_LEN];
-
 
95
volatile u8 SPI_RxBufferIndex = 0;
Line -... Line 96...
-
 
96
volatile u8 SPI_RxBuffer_Request = 0;
61
 
97
#define SPI_COMMAND_INDEX 0
62
struct str_ToFlightCtrl     SPI_TxBuffer;
98
 
63
 
99
s32 FC_Kalman_K = 32;
Line -... Line 100...
-
 
100
s32 Kalman_MaxDrift = 5 * 16;
64
volatile unsigned char      SPI_Buffer[sizeof(FromFlightCtrl)];
101
s32 Kalman_MaxFusion = 64;
Line 65... Line 102...
65
volatile unsigned char      SPI_BufferIndex = 0;
102
u32 CheckSPIOkay = 0;
Line 66... Line 103...
66
volatile unsigned char      SPI_TXBufferIndex = 0;
103
 
67
 
-
 
68
s16 CompassValue;
-
 
69
 
104
u8 SPI_CommandSequence[] = { SPI_KALMAN, SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_KALMAN, SPI_CMD_GPS_TARGET};
70
volatile struct str_MicroMag  MicroMag;
-
 
Line 71... Line -...
71
 
-
 
72
#define SPI_COMMAND_INDEX 0
105
u8 SPI_CommandCounter = 0;
Line 73... Line 106...
73
unsigned char *Ptr_buffer_Tx = (unsigned char *) &SPI_TxBuffer;
106
 
74
//unsigned char *Ptr_buffer_Tx = (unsigned char *) &ToFlightCtrl;
107
SPI_Version_t FC_Version;
75
unsigned char *Ptr_buffer_Rx = (unsigned char *) &FromFlightCtrl;
108
 
76
volatile unsigned char SPI_state = 0, SPI_TXUpdatebufferRequest = 0, SPI_RXUpdatebufferRequest = 0;
109
u8 CompassCalStateQueue[10];
77
 
110
fifo_t CompassCalcStateFiFo;
-
 
111
 
Line 78... Line 112...
78
unsigned char SPI_CommandSequence[] = { SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_CMD_GPS_TARGET};
112
u8 CompassCalState = 0;
79
unsigned char SPI_CommandCounter = 0;
113
 
80
 
-
 
-
 
114
//--------------------------------------------------------------
81
//--------------------------------------------------------------
115
void SSP0_IRQHandler(void)
82
void SSP0_IRQHandler(void)
116
{
83
{
117
        static u8 rxchksum = 0;
-
 
118
        u8 rxdata;
84
 static u8 chksum = 0;
119
        static SPI_State_t SPI_State = SPI_SYNC1;
85
 u8 data;
120
 
86
 
121
        // clear pending bit
87
 GPIO_ToggleBit(GPIO5, GPIO_Pin_7);
122
        SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
88
 SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
123
        // Fill TxFIFO while its not full or end of packet is reached
89
 
124
        while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
90
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
125
        {
91
 {
-
 
92
    if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
126
                if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN)   // still data to send ?
93
    { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
127
                {
94
      SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
128
                        SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex];       // send a byte
-
 
129
                        *Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
95
          SPI_TXBufferIndex++;  
130
                        SPI_TxBufferIndex++;  // pointer to next byte
96
    }
131
                }
97
    else    
132
                else // TxBuffer end is reached then reset and copy data to tx buffer
98
    {
-
 
-
 
133
                {
99
      SPI_TXBufferIndex = 0;
134
                        SPI_TxBufferIndex = 0;   // reset buffer index
100
          SPI_TXUpdatebufferRequest = 1;
135
                        ToFlightCtrl.Chksum = 0;  // initialize checksum
101
          ToFlightCtrl.Chksum = 0;  
-
 
102
      ToFlightCtrl.BeepTime = BeepTime;
136
                        ToFlightCtrl.BeepTime = BeepTime; // set beeptime
103
          BeepTime = 0;
-
 
-
 
137
                        BeepTime = 0; // reset local beeptime
104
          memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)     &ToFlightCtrl, sizeof(ToFlightCtrl));
138
                        // copy contents of ToFlightCtrl->SPI_TxBuffer
105
   }
139
                        memcpy( (u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
106
 }
140
                }
-
 
141
        }
107
 
142
        // while RxFIFO not empty
108
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
143
        while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
109
 {
144
        {
110
 
145
                rxdata =  SSP0->DR; // catch the received byte
-
 
146
                // Fill TxFIFO while its not full or end of packet is reached
-
 
147
                while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
-
 
148
                {
-
 
149
                if (SPI_TxBufferIndex  < SPI_TXBUFFER_LEN)   // still data to send ?
-
 
150
                {
-
 
151
                                SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex];       // send a byte
-
 
152
                        *Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
-
 
153
                                SPI_TxBufferIndex++; // pointer to next byte
-
 
154
                }
-
 
155
                else // end of packet is reached reset and copy data to tx buffer
-
 
156
                {
-
 
157
                        SPI_TxBufferIndex = 0;  // reset buffer index
-
 
158
                                ToFlightCtrl.Chksum = 0;  // initialize checksum
-
 
159
                        ToFlightCtrl.BeepTime = BeepTime;  // set beeptime
-
 
160
                                BeepTime = 0; // reset local beeptime
-
 
161
                                // copy contents of ToFlightCtrl->SPI_TxBuffer
-
 
162
                                memcpy((u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
-
 
163
                        }
-
 
164
                }
-
 
165
                switch (SPI_State)
-
 
166
                {
-
 
167
                        case SPI_SYNC1:
-
 
168
                                SPI_RxBufferIndex = 0; // reset buffer index
-
 
169
                                rxchksum = rxdata;     // init checksum
-
 
170
                                if (rxdata == SPI_RXSYNCBYTE1)
-
 
171
                                {   // 1st syncbyte ok
111
  data =  SSP0->DR;
172
                                        SPI_State = SPI_SYNC2;  // step to sync2
112
 
173
                                }
113
   while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
-
 
114
 {
-
 
115
     if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
174
                                break;
116
     { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
-
 
117
       SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
-
 
118
           SPI_TXBufferIndex++;  
-
 
119
     }
-
 
120
     else
-
 
121
     {
175
                        case SPI_SYNC2:
122
       SPI_TXBufferIndex = 0;
-
 
123
           ToFlightCtrl.Chksum = 0;  
-
 
124
           SPI_TXUpdatebufferRequest = 1;
-
 
125
       ToFlightCtrl.BeepTime = BeepTime;
-
 
126
           BeepTime = 0;
-
 
127
           memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)    &ToFlightCtrl, sizeof(ToFlightCtrl));
-
 
128
         }
-
 
129
 
-
 
130
 }  
176
                                if (rxdata == SPI_RXSYNCBYTE2)
131
  switch (SPI_state )
-
 
132
  {
177
                                {  // 2nd Syncbyte ok
133
   case 0:
-
 
134
                        SPI_BufferIndex = 0;
-
 
135
                       
-
 
136
                        chksum = data;  
-
 
137
                        if (data == 0xAA && !SPI_RXUpdatebufferRequest)  { SPI_state  = 1;  }   // 1. Syncbyte ok 
-
 
138
                       
-
 
139
           break;
178
                                        rxchksum += rxdata;
140
 
-
 
141
   case 1:
179
                                        SPI_State = SPI_DATA;
142
                    if (data == 0x83) { chksum += data; SPI_state  = 2;  }   // 2. Syncbyte ok 
180
                                }  // 2nd Syncbyte does not match
143
                 else SPI_state  = 0;      
181
                                else
144
                       
182
                                {
-
 
183
                                        SPI_State  = SPI_SYNC1; //jump back to sync1
-
 
184
                                }
145
           break;
185
                                break;
-
 
186
                        case SPI_DATA:
146
   
187
                                SPI_RxBuffer[SPI_RxBufferIndex++]= rxdata; // copy databyte to rx buffer
147
   case 2:
-
 
148
                   SPI_Buffer[SPI_BufferIndex++]= data;             // get data
188
                                if (SPI_RxBufferIndex >= SPI_RXBUFFER_LEN) // end of packet is reached
-
 
189
                                {
149
 
190
                                        if (rxdata == rxchksum) // verify checksum byte
150
                   if (SPI_BufferIndex >= sizeof(SPI_Buffer))           // end of packet
191
                                        {
151
                   {  
192
                                                // copy SPI_RxBuffer -> FromFlightCtrl
-
 
193
                                                if(!SPI_RxBuffer_Request) // block writing to FromFlightCtrl on reading access
-
 
194
                                                {
152
                if (data == chksum)
195
                                                        memcpy((u8 *) &FromFlightCtrl, (u8 *) SPI_RxBuffer, sizeof(FromFlightCtrl));
153
                        {
196
                                                        SPI_RxBuffer_Request = 1;
-
 
197
                                                }
-
 
198
                                                CheckSPIOkay++;
-
 
199
                                                DebugOut.Analog[13]++;
-
 
200
                                        }
154
                          u8 i;
201
                                        else // bad checksum byte
155
              SPI_RXUpdatebufferRequest = 1;
-
 
156
                  for (i=0;i<sizeof(SPI_Buffer);i++) { Ptr_buffer_Rx[i] = SPI_Buffer[i]; }
202
                                        {
157
 
203
                                                DebugOut.Analog[12]++; // increase SPI chksum error counter
158
                          DebugOut.Analog[13]++;
204
                                        }
-
 
205
                                        SPI_State  = SPI_SYNC1; // reset state
159
                        }
206
                                }
160
                         else { DebugOut.Analog[12]++; }
207
                                else // end of packet not reached
161
                       
-
 
162
                        SPI_state  = 0;  
-
 
163
                   }
-
 
164
                 else chksum += data;
208
                                {
Line 165... Line 209...
165
    break;
209
                                        rxchksum += rxdata;      // update checksum
166
 
210
                                }
167
        default: SPI_state  = 0;  break;
211
                                break;
168
  }
212
                        default:
169
 }
213
                                SPI_State  = SPI_SYNC1;
Line 170... Line 214...
170
 
214
                                break;
Line 171... Line 215...
171
 
215
                }
172
 
216
        }
Line 173... Line 217...
173
}
217
}
174
 
218
 
-
 
219
//--------------------------------------------------------------
175
//--------------------------------------------------------------
220
void SPI0_Init(void)
176
void SPI0_Init(void)
221
{
177
{
222
        GPIO_InitTypeDef GPIO_InitStructure;
178
  GPIO_InitTypeDef GPIO_InitStructure;
223
        SSP_InitTypeDef   SSP_InitStructure;
179
  SSP_InitTypeDef   SSP_InitStructure;
224
 
180
 
225
        SerialPutString("\r\n SPI init...");
Line 181... Line 226...
181
  SerialPutString("SPI init...");
226
 
-
 
227
        SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
182
 
228
        SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
183
  SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
229
 
184
  SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
230
        GPIO_DeInit(GPIO2);
185
   
231
        //SSP0_CLK, SSP0_MOSI, SSP0_NSS pins
186
  GPIO_DeInit(GPIO2);
232
        GPIO_StructInit(&GPIO_InitStructure);
187
  //SSP0_CLK, SSP0_MOSI, SSP0_SS pins 
233
        GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
Line 188... Line 234...
188
  GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
234
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
189
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
235
        GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
190
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
236
        GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
Line 211... Line 257...
211
 
257
 
Line 212... Line 258...
212
  SSP_Init(SSP0, &SSP_InitStructure);
258
        SSP_Init(SSP0, &SSP_InitStructure);
Line 213... Line 259...
213
 
259
 
Line 214... Line 260...
214
  SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
260
        SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
215
 
261
 
-
 
262
        fifo_init(&CompassCalcStateFiFo, CompassCalStateQueue, sizeof(CompassCalStateQueue));
-
 
263
 
-
 
264
        SSP_Cmd(SSP0, ENABLE);
-
 
265
        // initialize the syncbytes in the tx buffer
Line 216... Line 266...
216
  SSP_Cmd(SSP0, ENABLE);
266
        SPI_TxBuffer[0] = SPI_TXSYNCBYTE1;
217
 
267
        SPI_TxBuffer[1] = SPI_TXSYNCBYTE2;
Line 218... Line 268...
218
  ToFlightCtrl.Sync1 = 0x81;
268
        // set the pointer to the checksum byte in the tx buffer
219
  ToFlightCtrl.Sync2 = 0x55;
-
 
220
   
-
 
221
  VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
269
        Ptr_TxChksum = (u8 *) &(((ToFlightCtrl_t *) &(SPI_TxBuffer[2]))->Chksum);
Line 222... Line 270...
222
  VIC_ITCmd(SSP0_ITLine, ENABLE);  
270
 
223
 
-
 
224
  SerialPutString("ok\n\r");
-
 
225
 
-
 
226
 
-
 
227
}
-
 
228
 
-
 
229
//------------------------------------------------------
-
 
230
void SPI_CheckSlaveSelect(void)
-
 
231
{
-
 
232
 
-
 
233
 //if (SS_PIN)  { SPI_BufferIndex = 0;  }
-
 
234
 
-
 
235
   DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
-
 
236
   DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
-
 
237
   DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
-
 
238
   DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
-
 
239
 
-
 
240
/* DebugOut.Analog[2] = FromFlightCtrl.StickNick;
-
 
241
 DebugOut.Analog[3] = FromFlightCtrl.Command;
-
 
242
 DebugOut.Analog[4] = FromFlightCtrl.StickRoll;
271
        VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
243
 DebugOut.Analog[5] = FromFlightCtrl.StickGier;
272
        VIC_ITCmd(SSP0_ITLine, ENABLE);
244
 */
-
 
245
 DebugOut.Analog[25] = FromFlightCtrl.GyroCompass;
273
 
246
 
274
        SerialPutString("ok");
-
 
275
}
-
 
276
 
Line 247... Line -...
247
}
-
 
248
//------------------------------------------------------
-
 
249
void UpdateSPI_Buffer(void)
277
//------------------------------------------------------
250
{
278
void SPI0_UpdateBuffer(void)
251
   if(CompassUpdateActiv) return;  // testweise deaktiviert
279
{
252
   if(SPI_RXUpdatebufferRequest)
280
        if (SPI_RxBuffer_Request)
253
   {
-
 
-
 
281
        {
254
                                 
282
                // avoid sending data via SPI during the update of the  ToFlightCtrl structure
255
          VIC_ITCmd(SSP0_ITLine, DISABLE);  
283
                VIC_ITCmd(SSP0_ITLine, DISABLE); // disable SPI interrupt
Line 256... Line 284...
256
 
284
 
257
          ToFlightCtrl.CompassValue = I2C_Heading.Heading;
285
                ToFlightCtrl.CompassHeading = I2C_Heading.Heading;
258
          ToFlightCtrl.GPS_Nick = GPS_Nick;
286
                ToFlightCtrl.GPS_Nick   = GPS_Stick.Nick;
259
          ToFlightCtrl.GPS_Roll = GPS_Roll;
287
                ToFlightCtrl.GPS_Roll   = GPS_Stick.Roll;
260
      DebugOut.Analog[26] = I2C_Heading.Heading;
288
                ToFlightCtrl.GPS_Yaw    = GPS_Stick.Yaw;
-
 
289
                // cycle spi commands
261
 
290
                ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
Line 262... Line 291...
262
      ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
291
                if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
263
      if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
292
 
264
 
293
                switch (ToFlightCtrl.Command)
265
          switch (ToFlightCtrl.Command)
294
                {
Line 266... Line 295...
266
          {
295
                        case  SPI_KALMAN:
-
 
296
                                ToFlightCtrl.Param.Byte[0] = (char) FC_Kalman_K;
-
 
297
                                ToFlightCtrl.Param.Byte[1] = (char) Kalman_MaxFusion;
-
 
298
                                ToFlightCtrl.Param.Byte[2] = (char) Kalman_MaxDrift;
-
 
299
                                break;
267
            case  SPI_CMD_OSD_DATA:
300
 
268
                                  ToFlightCtrl.Param.Byte[0] = OsdBar;
301
                        case  SPI_CMD_GPS_POS:
269
                                  ToFlightCtrl.Param.Int[1]  = OsdDistance;
-
 
270
                  break;
-
 
271
 
-
 
272
            case  SPI_CMD_GPS_POS:
-
 
273
                                  ToFlightCtrl.Param.Long[0]  = GPS_Data.Longitude;
302
                                ToFlightCtrl.Param.Long[0]  = GPSData.Position.Longitude;
274
                                  ToFlightCtrl.Param.Long[1]  = GPS_Data.Latitude;
-
 
275
                  break;
-
 
276
 
303
                                ToFlightCtrl.Param.Long[1]  = GPSData.Position.Latitude;
277
            case  SPI_CMD_GPS_TARGET:
304
                                break;
-
 
305
 
-
 
306
                        case  SPI_CMD_GPS_TARGET:
-
 
307
                                if(GPS_pTargetPosition != NULL)
278
                                  ToFlightCtrl.Param.Long[0]  = GPS_Data.TargetLongitude;
308
                                {
279
                                  ToFlightCtrl.Param.Long[1]  = GPS_Data.TargetLatitude;
309
                                        if(GPS_pTargetPosition->Status != INVALID)
280
                  break;
310
                                        {
281
 
311
                                                ToFlightCtrl.Param.Long[0]  = GPS_pTargetPosition->Longitude;
282
                default:
312
                                                ToFlightCtrl.Param.Long[1]  = GPS_pTargetPosition->Latitude;
283
                  break;
313
                                        }
-
 
314
                                        else
Line -... Line 315...
-
 
315
                                        {
-
 
316
                                                ToFlightCtrl.Param.Long[0]  = 0;
-
 
317
                                                ToFlightCtrl.Param.Long[1]  = 0;
284
          }
318
                                        }
Line 285... Line -...
285
          VIC_ITCmd(SSP0_ITLine, ENABLE);  
-
 
Line 286... Line -...
286
 
-
 
287
         if (I2C_Heading.Heading <= 359)
319
                                }
288
         {
320
                                else
289
         }    
321
                                {
290
         else
-
 
291
         {
322
                                        ToFlightCtrl.Param.Long[0]  = 0;
292
           if (I2C_Version.Hauptversion != 0xff) TimerCompassUpdate = SetDelay(1);
323
                                        ToFlightCtrl.Param.Long[1]  = 0;
293
           return;
324
                                }
294
         }
325
                                break;
295
 
326
 
296
         SPI_TXUpdatebufferRequest = 0;
327
                        default:
297
 
328
                                break;
298
 //----------------
329
                }
-
 
330
                VIC_ITCmd(SSP0_ITLine, ENABLE);         // enable SPI interrupt
-
 
331
 
-
 
332
 
299
 
333
                switch(FromFlightCtrl.Command)
-
 
334
                {
300
//      DebugOut.Analog[11] = FromFlightCtrl.Command;
335
                        case SPI_CMD_USER:
301
         switch(FromFlightCtrl.Command)
336
                                Parameter.User1 = FromFlightCtrl.Param.Byte[0];
302
         {
337
                                Parameter.User2 = FromFlightCtrl.Param.Byte[1];
303
           case SPI_CMD_USER:
338
                                Parameter.User3 = FromFlightCtrl.Param.Byte[2];
304
           DebugOut.Analog[7]++;
-
 
305
                                    Parameter_UserParam1 = FromFlightCtrl.Param.Byte[0];
-
 
306
                                    Parameter_UserParam2 = FromFlightCtrl.Param.Byte[1];
339
                                Parameter.User4 = FromFlightCtrl.Param.Byte[3];
Line -... Line 340...
-
 
340
                                Parameter.User5 = FromFlightCtrl.Param.Byte[4];
307
                                    Parameter_UserParam3 = FromFlightCtrl.Param.Byte[2];
341
                                Parameter.User6 = FromFlightCtrl.Param.Byte[5];
308
                                    Parameter_UserParam4 = FromFlightCtrl.Param.Byte[3];
342
                                Parameter.User7 = FromFlightCtrl.Param.Byte[6];
309
                                    Parameter_UserParam5 = FromFlightCtrl.Param.Byte[4];
343
                                Parameter.User8 = FromFlightCtrl.Param.Byte[7];
310
                                    Parameter_UserParam6 = FromFlightCtrl.Param.Byte[5];
344
                                if(ClearMKFlags)
311
                                    Parameter_UserParam7 = FromFlightCtrl.Param.Byte[6];
345
                                {
312
                                    Parameter_UserParam8 = FromFlightCtrl.Param.Byte[7];
346
                                        FC.MKFlags = 0;
313
                                        if(ClearFlags) {MikroKopterFlags = 0; ClearFlags = 0;};
347
                                        ClearMKFlags = 0;
314
                                        MikroKopterFlags |= (s32) FromFlightCtrl.Param.Byte[8];
348
                                }
315
                                        UBat = FromFlightCtrl.Param.Byte[9];
349
                                FC.MKFlags         |= FromFlightCtrl.Param.Byte[8];
-
 
350
                                FC.UBat                 = FromFlightCtrl.Param.Byte[9];
316
                                        UndervoltageLevel = FromFlightCtrl.Param.Byte[10];
351
                                Parameter.LowVoltageWarning = FromFlightCtrl.Param.Byte[10];
-
 
352
                                Parameter.ActiveSetting         = FromFlightCtrl.Param.Byte[11];
-
 
353
                                break;
-
 
354
 
-
 
355
 #define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = FC.Poti1; else if(a == 252) b = FC.Poti2; else if(a == 253) b = FC.Poti3; else if(a == 254) b = FC.Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;}
-
 
356
                        case SPI_CMD_PARAMETER1:
317
                                        ActiveSetting = FromFlightCtrl.Param.Byte[11];
357
                                CHK_POTI_MM(Parameter.NaviGpsModeControl,FromFlightCtrl.Param.Byte[0],0,255);
-
 
358
                                CHK_POTI_MM(Parameter.NaviGpsGain,FromFlightCtrl.Param.Byte[1],0,255);
318
           //DebugOut.Analog[7] = MikroKopterFlags;
359
                                CHK_POTI_MM(Parameter.NaviGpsP,FromFlightCtrl.Param.Byte[2],0,255);
319
       if(MikroKopterFlags & 0x004) DebugOut.Analog[8]++;
360
                                CHK_POTI_MM(Parameter.NaviGpsI,FromFlightCtrl.Param.Byte[3],0,255);
320
                     break;
361
                                CHK_POTI_MM(Parameter.NaviGpsD,FromFlightCtrl.Param.Byte[4],0,255);
321
 
362
                                CHK_POTI_MM(Parameter.NaviGpsACC,FromFlightCtrl.Param.Byte[5],0,255);
322
           case SPI_CMD_PARAMETER1:
363
                                Parameter.NaviGpsMinSat = FromFlightCtrl.Param.Byte[6];
323
                                   Parameter_NaviGpsModeControl = FromFlightCtrl.Param.Byte[0];
364
                                Parameter.NaviStickThreshold = FromFlightCtrl.Param.Byte[7];
324
                   Parameter_NaviGpsGain = FromFlightCtrl.Param.Byte[1];
365
                                CHK_POTI_MM(Parameter.NaviOperatingRadius,FromFlightCtrl.Param.Byte[8],10,255);
325
                   Parameter_NaviGpsP   = FromFlightCtrl.Param.Byte[2];
366
                                CHK_POTI_MM(Parameter.NaviWindCorrection,FromFlightCtrl.Param.Byte[9],0,255);
326
                   Parameter_NaviGpsI   = FromFlightCtrl.Param.Byte[3];
367
                                CHK_POTI_MM(Parameter.NaviSpeedCompensation,FromFlightCtrl.Param.Byte[10],0,255);
327
                   Parameter_NaviGpsD   = FromFlightCtrl.Param.Byte[4];
368
                                CHK_POTI_MM(Parameter.NaviAngleLimitation,FromFlightCtrl.Param.Byte[11],0,255);
328
                   Parameter_NaviGpsACC = FromFlightCtrl.Param.Byte[5];
369
//              DebugOut.Analog[4] = Parameter.NaviRadiusAlert;
Line 329... Line 370...
329
                                   Parameter_NaviGpsMinSat = FromFlightCtrl.Param.Byte[6];
370
//              DebugOut.Analog[5] = Parameter.NaviWindCorrection;
330
                                   Parameter_NaviStickThreshold = FromFlightCtrl.Param.Byte[7];
371
//              DebugOut.Analog[6] = Parameter.NaviSpeedCompensation;
-
 
372
                        break;
331
                                   Parameter_RadiusAlert = FromFlightCtrl.Param.Byte[8];
373
 
-
 
374
                        case SPI_CMD_STICK:
-
 
375
                                FC.StickGas     = FromFlightCtrl.Param.sByte[0];
-
 
376
                                FC.StickYaw     = FromFlightCtrl.Param.sByte[1];
-
 
377
                                FC.StickRoll    = FromFlightCtrl.Param.sByte[2];
-
 
378
                                FC.StickNick    = FromFlightCtrl.Param.sByte[3];
-
 
379
                                FC.Poti1                = FromFlightCtrl.Param.Byte[4];
-
 
380
                                FC.Poti2                = FromFlightCtrl.Param.Byte[5];
-
 
381
                                FC.Poti3                = FromFlightCtrl.Param.Byte[6];
-
 
382
                                FC.Poti4                = FromFlightCtrl.Param.Byte[7];
-
 
383
                                FC.RC_Quality   = FromFlightCtrl.Param.Byte[8];
332
             break;
384
                                break;
Line 333... Line 385...
333
       case SPI_CMD_STICK:
385
 
334
                                    FC_StickGas  = (s32) FromFlightCtrl.Param.sByte[0];
386
                        case SPI_CMD_MISC:
335
                                    FC_StickGier = (s32) FromFlightCtrl.Param.sByte[1];
387
                                if(CompassCalState != FromFlightCtrl.Param.Byte[0])
Line -... Line 388...
-
 
388
                                {       // put only new CompassCalState into queue to send via I2C
-
 
389
                                        CompassCalState = FromFlightCtrl.Param.Byte[0];
-
 
390
                                        fifo_put(&CompassCalcStateFiFo, CompassCalState);
Line 336... Line 391...
336
                                        FC_StickNick = (s32) FromFlightCtrl.Param.sByte[2];
391
                                }
337
                                    FC_StickRoll = (s32) FromFlightCtrl.Param.sByte[3];
-
 
338
                                    FC_Poti1     = (s32) FromFlightCtrl.Param.Byte[4];
-
 
Line -... Line 392...
-
 
392
                                NaviData.Altimeter = (s16) FromFlightCtrl.Param.Int[1];
-
 
393
                                break;
-
 
394
 
-
 
395
                        case SPI_CMD_VERSION:
-
 
396
                                FC_Version.Major = FromFlightCtrl.Param.Byte[0];
-
 
397
                                FC_Version.Minor = FromFlightCtrl.Param.Byte[1];
339
                                    FC_Poti2     = (s32) FromFlightCtrl.Param.Byte[5];
398
                                FC_Version.Patch = FromFlightCtrl.Param.Byte[2];
-
 
399
                                FC_Version.Compatible = FromFlightCtrl.Param.Byte[3];
Line -... Line 400...
-
 
400
                                break;
-
 
401
 
-
 
402
                        default:
-
 
403
                        break;
-
 
404
                }
-
 
405
 
-
 
406
                // every time we got new data from the FC via SPI call the navigation routine
-
 
407
                GPS_Navigation();
-
 
408
                ClearMKFlags = 1;
-
 
409
 
-
 
410
                SPI_RxBuffer_Request = 0;
-
 
411
 
-
 
412
                DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
-
 
413
                DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
-
 
414
                DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
340
                                        FC_Poti3         = (s32) FromFlightCtrl.Param.Byte[6];
415
                DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
-
 
416
                DebugOut.Analog[25] = FromFlightCtrl.GyroHeading;
-
 
417
 
-
 
418
        }  // EOF if(SPI_RxBuffer_Request)
-
 
419
}
-
 
420
 
-
 
421
//------------------------------------------------------
-
 
422
void SPI0_GetFlightCtrlVersion(void)
-
 
423
{
-
 
424
        u16 timeout;
341
                                    FC_Poti4     = (s32) FromFlightCtrl.Param.Byte[7];
425
        u8 msg[20];
-
 
426
 
342
                                        SenderOkay       = (s32) FromFlightCtrl.Param.Byte[8];
427
        FC_Version.Major = 0xFF;
Line -... Line 428...
-
 
428
        FC_Version.Minor = 0xFF;