Subversion Repositories FlightCtrl

Rev

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

Rev 2109 Rev 2110
Line 13... Line 13...
13
volatile uint8_t RCQuality;
13
volatile uint8_t RCQuality;
Line 14... Line 14...
14
 
14
 
15
uint8_t lastRCCommand = COMMAND_NONE;
15
uint8_t lastRCCommand = COMMAND_NONE;
Line -... Line 16...
-
 
16
uint8_t lastFlightMode = FLIGHT_MODE_NONE;
16
uint8_t lastFlightMode = FLIGHT_MODE_NONE;
17
 
17
 
18
#define TIME(s) ((int16_t)(((long)F_CPU/(long)8000)*(float)s))
18
/***************************************************************
19
/***************************************************************
19
 *  16bit timer 1 is used to decode the PPM-Signal            
20
 *  16bit timer 1 is used to decode the PPM-Signal            
20
 ***************************************************************/
21
 ***************************************************************/
Line 101... Line 102...
101
  // implicit handles a timer overflow 65535 -> 0 the right way.
102
  // implicit handles a timer overflow 65535 -> 0 the right way.
102
  signal = (uint16_t) ICR1 - oldICR1;
103
  signal = (uint16_t) ICR1 - oldICR1;
103
  oldICR1 = ICR1;
104
  oldICR1 = ICR1;
Line 104... Line 105...
104
 
105
 
105
  //sync gap? (3.5 ms < signal < 25.6 ms)
106
  //sync gap? (3.5 ms < signal < 25.6 ms)
106
  if (signal > 8750) {
107
  if (signal > TIME(3.5)) {
107
    index = 0;
108
    index = 0;
108
  } else { // within the PPM frame
109
  } else { // within the PPM frame
109
    if (index < MAX_CHANNELS) { // PPM24 supports 12 channels
110
    if (index < MAX_CHANNELS) { // PPM24 supports 12 channels
110
      // check for valid signal length (0.8 ms < signal < 2.2 ms)
111
      // check for valid signal length (0.8 ms < signal < 2.2 ms)
111
      if ((signal >= 2000) && (signal < 5500)) {
112
      if ((signal >= TIME(0.8)) && (signal < TIME(2.2))) {
112
        // shift signal to zero symmetric range  -154 to 159
113
        // shift signal to zero symmetric range  -154 to 159
113
        //signal -= 3750; // theoretical value
114
        //signal -= 3750; // theoretical value
114
        signal -= (3750+56); // best value with my Futaba in zero trim.
115
        signal -= (TIME(1.5) + RC_TRIM); // best value with my Futaba in zero trim.
115
        // check for stable signal
116
        // check for stable signal
116
        if (abs(signal - PPM_in[index]) < 50) {
117
        if (abs(signal - PPM_in[index]) < TIME(0.05)) {
117
          if (RCQuality < 200)
118
          if (RCQuality < 200)
118
            RCQuality += 10;
119
            RCQuality += 10;
119
          else
120
          else
120
            RCQuality = 200;
121
            RCQuality = 200;
Line 147... Line 148...
147
 
148
 
148
#define RCChannel(dimension) PPM_in[channelMap.channels[dimension]]
149
#define RCChannel(dimension) PPM_in[channelMap.channels[dimension]]
149
#define COMMAND_CHANNEL_VERTICAL CH_THROTTLE
150
#define COMMAND_CHANNEL_VERTICAL CH_THROTTLE
Line 150... Line -...
150
#define COMMAND_CHANNEL_HORIZONTAL CH_YAW
-
 
151
 
-
 
152
#define RC_SCALING 2
151
#define COMMAND_CHANNEL_HORIZONTAL CH_YAW
153
 
152
 
154
uint8_t getControlModeSwitch(void) {
153
uint8_t getControlModeSwitch(void) {
155
        int16_t channel = RCChannel(CH_MODESWITCH);
154
        int16_t channel = RCChannel(CH_MODESWITCH);
156
        uint8_t flightMode = channel < -330 ? FLIGHT_MODE_MANUAL : (channel > 330 ? FLIGHT_MODE_ANGLES : FLIGHT_MODE_RATE);
155
        uint8_t flightMode = channel < -TIME(0.17) ? FLIGHT_MODE_MANUAL : (channel > TIME(0.17) ? FLIGHT_MODE_ANGLES : FLIGHT_MODE_RATE);
Line 157... Line 156...
157
        return flightMode;
156
        return flightMode;
158
}
157
}
Line 171... Line 170...
171
                return lastRCCommand;
170
                return lastRCCommand;
172
        }
171
        }
Line 173... Line 172...
173
 
172
 
Line 174... Line 173...
174
        int16_t channel = RCChannel(CH_THROTTLE);
173
        int16_t channel = RCChannel(CH_THROTTLE);
175
 
174
 
176
        if (channel <= -1400) {
175
        if (channel <= -TIME(0.55)) {
177
          lastRCCommand = COMMAND_GYROCAL;
176
          lastRCCommand = COMMAND_GYROCAL;
178
        } else {
177
        } else {
179
          lastRCCommand = COMMAND_NONE;
178
          lastRCCommand = COMMAND_NONE;
Line 208... Line 207...
208
 * Get other channel value
207
 * Get other channel value
209
 */
208
 */
210
int16_t RC_getVariable(uint8_t varNum) {
209
int16_t RC_getVariable(uint8_t varNum) {
211
  if (varNum < 4)
210
  if (varNum < 4)
212
    // 0th variable is 5th channel (1-based) etc.
211
    // 0th variable is 5th channel (1-based) etc.
213
    return (RCChannel(varNum + CH_POTS) >> 3) + POT_OFFSET;
212
    return (RCChannel(varNum + CH_POTS) >> 3) + VARIABLE_OFFSET;
214
  /*
213
  /*
215
   * Let's just say:
214
   * Let's just say:
216
   * The RC variable i is hardwired to channel i, i>=4
215
   * The RC variable i is hardwired to channel i, i>=4
217
   */
216
   */
218
  return (PPM_in[varNum] >> 3) + POT_OFFSET;
217
  return (PPM_in[varNum] >> 3) + VARIABLE_OFFSET;
219
}
218
}
Line 220... Line 219...
220
 
219
 
221
uint8_t RC_getSignalQuality(void) {
220
uint8_t RC_getSignalQuality(void) {
222
  if (RCQuality >= 160)
221
  if (RCQuality >= 160)