Subversion Repositories FlightCtrl

Rev

Rev 1821 | Rev 1868 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1821 Rev 1843
1
#include <inttypes.h>
1
#include <inttypes.h>
2
/*
2
/*
3
 * An attempt to define a generic control. That could be an R/C receiver, an external control
3
 * An attempt to define a generic control. That could be an R/C receiver, an external control
4
 * (serial over Bluetooth, Wi232, XBee, whatever) or the NaviCtrl.
4
 * (serial over Bluetooth, Wi232, XBee, whatever) or the NaviCtrl.
5
 * This resembles somewhat an object-oriented class definition (except that there are no virtuals).
5
 * This resembles somewhat an object-oriented class definition (except that there are no virtuals).
6
 * The idea is that the combination of different control inputs, of the way they superimpose upon
6
 * The idea is that the combination of different control inputs, of the way they superimpose upon
7
 * each other, the priorities between them and the behavior in case that one fails is simplified,
7
 * each other, the priorities between them and the behavior in case that one fails is simplified,
8
 * and all in one place.
8
 * and all in one place.
9
 */
9
 */
10
 
10
 
11
/*
11
/*
12
 * Signal qualities, used to determine the availability of a control.
12
 * Signal qualities, used to determine the availability of a control.
13
 * NO_SIGNAL means there was never a signal. SIGNAL_LOST that there was a signal, but it was lost.
13
 * NO_SIGNAL means there was never a signal. SIGNAL_LOST that there was a signal, but it was lost.
14
 * SIGNAL_BAD is too bad for flight. This is the hysteresis range for deciding whether to engage
14
 * SIGNAL_BAD is too bad for flight. This is the hysteresis range for deciding whether to engage
15
 * or disengage emergency landing.
15
 * or disengage emergency landing.
16
 * SIGNAL_OK means the signal is usable for flight.
16
 * SIGNAL_OK means the signal is usable for flight.
17
 * SIGNAL_GOOD means the signal can also be used for setting parameters.
17
 * SIGNAL_GOOD means the signal can also be used for setting parameters.
18
 */
18
 */
19
#define NO_SIGNAL   0
19
#define NO_SIGNAL   0
20
#define SIGNAL_LOST 1
20
#define SIGNAL_LOST 1
21
#define SIGNAL_BAD  2
21
#define SIGNAL_BAD  2
22
#define SIGNAL_OK   3
22
#define SIGNAL_OK   3
23
#define SIGNAL_GOOD 4
23
#define SIGNAL_GOOD 4
24
 
24
 
25
/*
25
/*
26
 * The PRTY arrays
26
 * The PRTY arrays
27
 */
27
 */
28
#define CONTROL_PITCH    0
28
#define CONTROL_PITCH    0
29
#define CONTROL_ROLL     1
29
#define CONTROL_ROLL     1
30
#define CONTROL_THROTTLE 2
30
#define CONTROL_THROTTLE 2
31
#define CONTROL_YAW      3
31
#define CONTROL_YAW      3
32
 
32
 
33
/*
33
/*
34
 * Looping flags.
34
 * Looping flags.
35
 * LOOPING_UP || LOOPING_DOWN <=> LOOPING_PITCH_AXIS
35
 * LOOPING_UP || LOOPING_DOWN <=> LOOPING_PITCH_AXIS
36
 * LOOPING_LEFT || LOOPING_RIGHT <=> LOOPING_ROLL_AXIS
36
 * LOOPING_LEFT || LOOPING_RIGHT <=> LOOPING_ROLL_AXIS
37
 */
37
 */
38
#define LOOPING_UP         (1<<0)
38
#define LOOPING_UP         (1<<0)
39
#define LOOPING_DOWN       (1<<1)
39
#define LOOPING_DOWN       (1<<1)
40
#define LOOPING_LEFT       (1<<2)
40
#define LOOPING_LEFT       (1<<2)
41
#define LOOPING_RIGHT      (1<<3)
41
#define LOOPING_RIGHT      (1<<3)
42
#define LOOPING_PITCH_AXIS (1<<4)
42
#define LOOPING_PITCH_AXIS (1<<4)
43
#define LOOPING_ROLL_AXIS  (1<<5)
43
#define LOOPING_ROLL_AXIS  (1<<5)
44
 
44
 
45
/*
45
/*
46
 * This is only relevant for "abstract controls" ie. all control sources have the
46
 * This is only relevant for "abstract controls" ie. all control sources have the
47
 * same interface. This struct of code pointers is used like an abstract class
47
 * same interface. This struct of code pointers is used like an abstract class
48
 * definition from object-oriented languages, and all control input implementations
48
 * definition from object-oriented languages, and all control input implementations
49
 * will declare an instance of the stuct (=implementation of the abstract class).
49
 * will declare an instance of the stuct (=implementation of the abstract class).
50
 */
50
 */
51
typedef struct {
51
typedef struct {
52
        /* Get the pitch input in the nominal range [-STICK_RANGE, STICK_RANGE]. */
52
        /* Get the pitch input in the nominal range [-STICK_RANGE, STICK_RANGE]. */
53
        int16_t(*getPitch)(void);
53
        int16_t(*getPitch)(void);
54
 
54
 
55
        /* Get the roll input in the nominal range [-STICK_RANGE, STICK_RANGE]. */
55
        /* Get the roll input in the nominal range [-STICK_RANGE, STICK_RANGE]. */
56
        int16_t(*getRoll)(void);
56
        int16_t(*getRoll)(void);
57
 
57
 
58
        /* Get the yaw input in the nominal range [-STICK_RANGE, STICK_RANGE]. */
58
        /* Get the yaw input in the nominal range [-STICK_RANGE, STICK_RANGE]. */
59
        int16_t(*getYaw)(void);
59
        int16_t(*getYaw)(void);
60
 
60
 
61
        /* Get the throttle input in the nominal range [0, THROTTLE_RANGE]. */
61
        /* Get the throttle input in the nominal range [0, THROTTLE_RANGE]. */
62
        uint16_t(*getThrottle)(void);
62
        uint16_t(*getThrottle)(void);
63
 
63
 
64
        /* Signal quality, by the above SIGNAL_... definitions. */
64
        /* Signal quality, by the above SIGNAL_... definitions. */
65
        uint8_t (*getSignalQuality)(void);
65
        uint8_t (*getSignalQuality)(void);
66
 
66
 
67
        /* Calibrate sticks to their center positions (only relevant for R/C, really) */
67
        /* Calibrate sticks to their center positions (only relevant for R/C, really) */
68
        void (*calibrate)(void);
68
        void (*calibrate)(void);
69
} t_control;
69
} t_control;
70
 
70
 
71
/*
71
/*
72
 * Our output.
72
 * Our output.
73
 */
73
 */
74
extern int16_t control[2];
74
extern int16_t control[2];
75
extern int16_t controlYaw, controlThrottle;
75
extern int16_t controlYaw, controlThrottle;
76
extern uint16_t maxControl[2];
76
extern uint16_t maxControl[2];
77
extern uint8_t looping;
77
extern uint8_t looping;
78
 
78
 
79
extern volatile uint8_t MKFlags;
79
extern volatile uint8_t MKFlags;
80
extern uint16_t isFlying;
80
extern uint16_t isFlying;
81
 
81
 
82
void controlMixer_initVariables(void);
82
void controlMixer_initVariables(void);
83
void controlMixer_updateVariables(void);
83
void controlMixer_updateVariables(void);
84
 
84
 
85
void controlMixer_setNeutral(void);
85
void controlMixer_setNeutral(void);
86
 
86
 
87
/*
87
/*
88
 * Update the exported variables. Called at every flight control cycle.
88
 * Update the exported variables. Called at every flight control cycle.
89
 */
89
 */
90
void controlMixer_update(void);
90
void controlMixer_update(void);
91
 
91
 
92
/*
92
/*
93
 * Get the current command. See the COMMAND_.... define's
93
 * Get the current command. See the COMMAND_.... define's
94
 */
94
 */
95
uint8_t controlMixer_getCommand(void);
95
uint8_t controlMixer_getCommand(void);
96
 
96
 
97
void controlMixer_performCalibrationCommands(uint8_t command);
97
void controlMixer_performCalibrationCommands(uint8_t command);
98
 
98
 
99
uint8_t controlMixer_getSignalQuality(void);
99
uint8_t controlMixer_getSignalQuality(void);
100
 
100
 
101
/*
101
/*
102
 * The controls operate in a [-150 * CONTROL_SCALING, 150 * CONTROL_SCALING] interval
102
 * The controls operate in a [-150 * CONTROL_SCALING, 150 * CONTROL_SCALING] interval
103
 * Throttle is [0..300 * CONTROL_SCALING].
103
 * Throttle is [0..300 * CONTROL_SCALING].
104
 * (just about. No precision needed).
104
 * (just about. No precision needed).
105
 */
105
 */
106
#define CONTROL_SCALING (1024/256)
106
#define CONTROL_SCALING (1024/256)
-
 
107
#define MOTOR_SCALING (1024/256)
107
 
108
 
108
/*
109
/*
109
 * Gets the argument for the current command (a number).
110
 * Gets the argument for the current command (a number).
110
 *
111
 *
111
 * Stick position to argument values (for stick control):
112
 * Stick position to argument values (for stick control):
112
 * 2--3--4
113
 * 2--3--4
113
 * |     |  +
114
 * |     |  +
114
 * 1  9  5  ^ 0
115
 * 1  9  5  ^ 0
115
 * |     |  |  
116
 * |     |  |  
116
 * 8--7--6
117
 * 8--7--6
117
 *    
118
 *    
118
 * + <--
119
 * + <--
119
 *    0
120
 *    0
120
 *
121
 *
121
 * Not in any of these positions: 0
122
 * Not in any of these positions: 0
122
 */
123
 */
123
// void controlMixer_handleCommands(void);
124
// void controlMixer_handleCommands(void);
124
uint8_t controlMixer_getArgument(void);
125
uint8_t controlMixer_getArgument(void);
125
uint8_t controlMixer_isCommandRepeated(void);
126
uint8_t controlMixer_isCommandRepeated(void);
126
// TODO: Abstract away if possible.
127
// TODO: Abstract away if possible.
127
uint8_t controlMixer_testCompassCalState(void);
128
uint8_t controlMixer_testCompassCalState(void);
128
 
129