Rev 2109 | Rev 2116 | 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) |