Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.
user.c@0:0a841b89d614, 2010-10-11 (annotated)
- Committer:
- AjK
- Date:
- Mon Oct 11 10:34:55 2010 +0000
- Revision:
- 0:0a841b89d614
Totally Alpha quality as this project isn\t completed. Just publishing it as it answers many questions asked in the forums
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AjK | 0:0a841b89d614 | 1 | /**************************************************************************** |
AjK | 0:0a841b89d614 | 2 | * Copyright 2010 Andy Kirkham, Stellar Technologies Ltd |
AjK | 0:0a841b89d614 | 3 | * |
AjK | 0:0a841b89d614 | 4 | * This file is part of the Satellite Observers Workbench (SOWB). |
AjK | 0:0a841b89d614 | 5 | * |
AjK | 0:0a841b89d614 | 6 | * SOWB is free software: you can redistribute it and/or modify |
AjK | 0:0a841b89d614 | 7 | * it under the terms of the GNU General Public License as published by |
AjK | 0:0a841b89d614 | 8 | * the Free Software Foundation, either version 3 of the License, or |
AjK | 0:0a841b89d614 | 9 | * (at your option) any later version. |
AjK | 0:0a841b89d614 | 10 | * |
AjK | 0:0a841b89d614 | 11 | * SOWB is distributed in the hope that it will be useful, |
AjK | 0:0a841b89d614 | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
AjK | 0:0a841b89d614 | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
AjK | 0:0a841b89d614 | 14 | * GNU General Public License for more details. |
AjK | 0:0a841b89d614 | 15 | * |
AjK | 0:0a841b89d614 | 16 | * You should have received a copy of the GNU General Public License |
AjK | 0:0a841b89d614 | 17 | * along with SOWB. If not, see <http://www.gnu.org/licenses/>. |
AjK | 0:0a841b89d614 | 18 | * |
AjK | 0:0a841b89d614 | 19 | * $Id: main.cpp 5 2010-07-12 20:51:11Z ajk $ |
AjK | 0:0a841b89d614 | 20 | * |
AjK | 0:0a841b89d614 | 21 | ***************************************************************************/ |
AjK | 0:0a841b89d614 | 22 | |
AjK | 0:0a841b89d614 | 23 | #include "rit.h" |
AjK | 0:0a841b89d614 | 24 | #include "gpio.h" |
AjK | 0:0a841b89d614 | 25 | #include "user.h" |
AjK | 0:0a841b89d614 | 26 | #include "nexstar.h" |
AjK | 0:0a841b89d614 | 27 | #include "xbox360gamepad.h" |
AjK | 0:0a841b89d614 | 28 | #include "debug.h" |
AjK | 0:0a841b89d614 | 29 | |
AjK | 0:0a841b89d614 | 30 | #define STICK_DIVISOR 4096.0 |
AjK | 0:0a841b89d614 | 31 | |
AjK | 0:0a841b89d614 | 32 | void handle_stick_left(void); |
AjK | 0:0a841b89d614 | 33 | void handle_stick_right(void); |
AjK | 0:0a841b89d614 | 34 | |
AjK | 0:0a841b89d614 | 35 | typedef void (PROCESS_FUNC)(); |
AjK | 0:0a841b89d614 | 36 | |
AjK | 0:0a841b89d614 | 37 | extern PROCESS_FUNC *process_callbacks[]; |
AjK | 0:0a841b89d614 | 38 | |
AjK | 0:0a841b89d614 | 39 | USER_INPUT user_input; |
AjK | 0:0a841b89d614 | 40 | |
AjK | 0:0a841b89d614 | 41 | /** user_get_button |
AjK | 0:0a841b89d614 | 42 | * |
AjK | 0:0a841b89d614 | 43 | * Used to get a "button press" from the user. This is basically |
AjK | 0:0a841b89d614 | 44 | * a read of the XBox360 gamepad interface via the USBEH system. |
AjK | 0:0a841b89d614 | 45 | * However, this function is provided to abstract that so that |
AjK | 0:0a841b89d614 | 46 | * other systems can "inject" button presses into the system. |
AjK | 0:0a841b89d614 | 47 | * The intention here is for a virtual console on a PC to |
AjK | 0:0a841b89d614 | 48 | * control the SOWB system via the (to be done) pccomms.c module. |
AjK | 0:0a841b89d614 | 49 | * This is just a conveinent way to get user IO into the SOWB. |
AjK | 0:0a841b89d614 | 50 | * |
AjK | 0:0a841b89d614 | 51 | * Note, this fnction calls all the module _process() functions |
AjK | 0:0a841b89d614 | 52 | * in it's loop (ie while no user IO is occuring). That gives the |
AjK | 0:0a841b89d614 | 53 | * SOWB modules a chance to get work done outside of time critical |
AjK | 0:0a841b89d614 | 54 | * interrupts. _process() functions should NEVER block and should |
AjK | 0:0a841b89d614 | 55 | * also be "fast" so as to avoid any user IO perseptive delay. |
AjK | 0:0a841b89d614 | 56 | * |
AjK | 0:0a841b89d614 | 57 | * Note, if arg peek is true, we return the next button press in |
AjK | 0:0a841b89d614 | 58 | * the buffer without actually removing that event from the buffer. |
AjK | 0:0a841b89d614 | 59 | * Allows us to look to see if an pending button press is within |
AjK | 0:0a841b89d614 | 60 | * the buffer awaiting being handled. |
AjK | 0:0a841b89d614 | 61 | * |
AjK | 0:0a841b89d614 | 62 | * @param bool peek |
AjK | 0:0a841b89d614 | 63 | * @return char The button pressed. |
AjK | 0:0a841b89d614 | 64 | */ |
AjK | 0:0a841b89d614 | 65 | char user_get_button(bool peek) { |
AjK | 0:0a841b89d614 | 66 | char c; |
AjK | 0:0a841b89d614 | 67 | |
AjK | 0:0a841b89d614 | 68 | if (peek) { |
AjK | 0:0a841b89d614 | 69 | /* Make a call to all _process()'s just in case we find |
AjK | 0:0a841b89d614 | 70 | ourselves stuck in a tight loop waiting for an event. */ |
AjK | 0:0a841b89d614 | 71 | for (c = 0; process_callbacks[c] != NULL; c++) (process_callbacks[c])(); |
AjK | 0:0a841b89d614 | 72 | return xbox360gamepad_get_button_preview(); |
AjK | 0:0a841b89d614 | 73 | } |
AjK | 0:0a841b89d614 | 74 | |
AjK | 0:0a841b89d614 | 75 | do { |
AjK | 0:0a841b89d614 | 76 | /* Call all module _process functions. */ |
AjK | 0:0a841b89d614 | 77 | for (c = 0; process_callbacks[c] != NULL; c++) { |
AjK | 0:0a841b89d614 | 78 | KICK_WATCHDOG; |
AjK | 0:0a841b89d614 | 79 | (process_callbacks[c])(); |
AjK | 0:0a841b89d614 | 80 | } |
AjK | 0:0a841b89d614 | 81 | |
AjK | 0:0a841b89d614 | 82 | handle_stick_left(); |
AjK | 0:0a841b89d614 | 83 | handle_stick_right(); |
AjK | 0:0a841b89d614 | 84 | |
AjK | 0:0a841b89d614 | 85 | /* Get a button press from the user or go round again. */ |
AjK | 0:0a841b89d614 | 86 | c = xbox360gamepad_get_button(); |
AjK | 0:0a841b89d614 | 87 | } |
AjK | 0:0a841b89d614 | 88 | while (c == 0); |
AjK | 0:0a841b89d614 | 89 | |
AjK | 0:0a841b89d614 | 90 | return c; |
AjK | 0:0a841b89d614 | 91 | } |
AjK | 0:0a841b89d614 | 92 | |
AjK | 0:0a841b89d614 | 93 | /* A flag to signify a timeout has occured. */ |
AjK | 0:0a841b89d614 | 94 | volatile int user_wait_ms_flag; |
AjK | 0:0a841b89d614 | 95 | |
AjK | 0:0a841b89d614 | 96 | /** _user_wait_ms_cb |
AjK | 0:0a841b89d614 | 97 | * |
AjK | 0:0a841b89d614 | 98 | * Called by the RIT system to signal a timer timeout. |
AjK | 0:0a841b89d614 | 99 | * |
AjK | 0:0a841b89d614 | 100 | * @param int t_index The timer index value (handle). |
AjK | 0:0a841b89d614 | 101 | */ |
AjK | 0:0a841b89d614 | 102 | void _user_wait_ms_cb(int t_index) { |
AjK | 0:0a841b89d614 | 103 | user_wait_ms_flag = 0; |
AjK | 0:0a841b89d614 | 104 | } |
AjK | 0:0a841b89d614 | 105 | |
AjK | 0:0a841b89d614 | 106 | /** user_wait_ms |
AjK | 0:0a841b89d614 | 107 | * |
AjK | 0:0a841b89d614 | 108 | * Used to "wait" for a specified time interval. |
AjK | 0:0a841b89d614 | 109 | * Note, while "waiting" for the timeout, it will |
AjK | 0:0a841b89d614 | 110 | * call all the modules _process() functions to |
AjK | 0:0a841b89d614 | 111 | * allow modules to perform non-time critical work |
AjK | 0:0a841b89d614 | 112 | * outside of interrupts. |
AjK | 0:0a841b89d614 | 113 | * |
AjK | 0:0a841b89d614 | 114 | * @param uint32_t ms The delay amount. |
AjK | 0:0a841b89d614 | 115 | */ |
AjK | 0:0a841b89d614 | 116 | void user_wait_ms(uint32_t ms) { |
AjK | 0:0a841b89d614 | 117 | rit_timer_set_counter(RIT_TIMER_CB_WAIT, ms); |
AjK | 0:0a841b89d614 | 118 | user_wait_ms_flag = 1; |
AjK | 0:0a841b89d614 | 119 | while (user_wait_ms_flag) |
AjK | 0:0a841b89d614 | 120 | for (int c = 0; process_callbacks[c] != NULL; c++) { |
AjK | 0:0a841b89d614 | 121 | KICK_WATCHDOG; |
AjK | 0:0a841b89d614 | 122 | (process_callbacks[c])(); |
AjK | 0:0a841b89d614 | 123 | } |
AjK | 0:0a841b89d614 | 124 | } |
AjK | 0:0a841b89d614 | 125 | |
AjK | 0:0a841b89d614 | 126 | /** user_wait_ms |
AjK | 0:0a841b89d614 | 127 | * |
AjK | 0:0a841b89d614 | 128 | * Used to "wait" for a specified time interval. |
AjK | 0:0a841b89d614 | 129 | * Note, unlike the function above, NO _process() |
AjK | 0:0a841b89d614 | 130 | * functions are called. This really is a blocking |
AjK | 0:0a841b89d614 | 131 | * delay and should be used with care! |
AjK | 0:0a841b89d614 | 132 | * |
AjK | 0:0a841b89d614 | 133 | * @param uint32_t ms The delay amount. |
AjK | 0:0a841b89d614 | 134 | */ |
AjK | 0:0a841b89d614 | 135 | void user_wait_ms_blocking(uint32_t ms) { |
AjK | 0:0a841b89d614 | 136 | rit_timer_set_counter(RIT_TIMER_CB_WAIT, ms); |
AjK | 0:0a841b89d614 | 137 | user_wait_ms_flag = 1; |
AjK | 0:0a841b89d614 | 138 | while (user_wait_ms_flag) KICK_WATCHDOG; |
AjK | 0:0a841b89d614 | 139 | } |
AjK | 0:0a841b89d614 | 140 | |
AjK | 0:0a841b89d614 | 141 | /** user_call_process |
AjK | 0:0a841b89d614 | 142 | */ |
AjK | 0:0a841b89d614 | 143 | void user_call_process(void) { |
AjK | 0:0a841b89d614 | 144 | for (int c = 0; process_callbacks[c] != NULL; c++) { |
AjK | 0:0a841b89d614 | 145 | KICK_WATCHDOG; |
AjK | 0:0a841b89d614 | 146 | (process_callbacks[c])(); |
AjK | 0:0a841b89d614 | 147 | } |
AjK | 0:0a841b89d614 | 148 | } |
AjK | 0:0a841b89d614 | 149 | |
AjK | 0:0a841b89d614 | 150 | void handle_stick_left(void) { |
AjK | 0:0a841b89d614 | 151 | static XBOX360_STICK stick_left_previous; |
AjK | 0:0a841b89d614 | 152 | XBOX360_STICK *stick; |
AjK | 0:0a841b89d614 | 153 | int x, y; |
AjK | 0:0a841b89d614 | 154 | double rate; |
AjK | 0:0a841b89d614 | 155 | |
AjK | 0:0a841b89d614 | 156 | stick = xbox360gamepad_get_stick_left(); |
AjK | 0:0a841b89d614 | 157 | if (stick->x/STICK_DIVISOR != stick_left_previous.x/STICK_DIVISOR || stick->y/STICK_DIVISOR != stick_left_previous.y/STICK_DIVISOR) { |
AjK | 0:0a841b89d614 | 158 | stick_left_previous.x = stick->x; |
AjK | 0:0a841b89d614 | 159 | stick_left_previous.y = stick->y; |
AjK | 0:0a841b89d614 | 160 | x = stick->x/STICK_DIVISOR; |
AjK | 0:0a841b89d614 | 161 | y = stick->y/STICK_DIVISOR; |
AjK | 0:0a841b89d614 | 162 | |
AjK | 0:0a841b89d614 | 163 | if (x > 2 || x < -2) { |
AjK | 0:0a841b89d614 | 164 | rate = 6.0 * (double)((double)stick->x/STICK_DIVISOR / 16.0); |
AjK | 0:0a841b89d614 | 165 | _nexstar_set_azmith_rate_coarse(rate); |
AjK | 0:0a841b89d614 | 166 | } |
AjK | 0:0a841b89d614 | 167 | else { |
AjK | 0:0a841b89d614 | 168 | _nexstar_set_azmith_rate_coarse(0.0); |
AjK | 0:0a841b89d614 | 169 | } |
AjK | 0:0a841b89d614 | 170 | |
AjK | 0:0a841b89d614 | 171 | if (y > 2 || y < -2) { |
AjK | 0:0a841b89d614 | 172 | rate = 6.0 * (double)((double)stick->y/STICK_DIVISOR / 16.0); |
AjK | 0:0a841b89d614 | 173 | _nexstar_set_elevation_rate_coarse(rate); |
AjK | 0:0a841b89d614 | 174 | } |
AjK | 0:0a841b89d614 | 175 | else { |
AjK | 0:0a841b89d614 | 176 | _nexstar_set_elevation_rate_coarse(0.0); |
AjK | 0:0a841b89d614 | 177 | } |
AjK | 0:0a841b89d614 | 178 | } |
AjK | 0:0a841b89d614 | 179 | } |
AjK | 0:0a841b89d614 | 180 | |
AjK | 0:0a841b89d614 | 181 | void handle_stick_right(void) { |
AjK | 0:0a841b89d614 | 182 | static XBOX360_STICK stick_previous; |
AjK | 0:0a841b89d614 | 183 | XBOX360_STICK *stick; |
AjK | 0:0a841b89d614 | 184 | int x, y; |
AjK | 0:0a841b89d614 | 185 | double rate; |
AjK | 0:0a841b89d614 | 186 | |
AjK | 0:0a841b89d614 | 187 | stick = xbox360gamepad_get_stick_right(); |
AjK | 0:0a841b89d614 | 188 | if (stick->x/STICK_DIVISOR != stick_previous.x/STICK_DIVISOR || stick->y/STICK_DIVISOR != stick_previous.y/STICK_DIVISOR) { |
AjK | 0:0a841b89d614 | 189 | stick_previous.x = stick->x; |
AjK | 0:0a841b89d614 | 190 | stick_previous.y = stick->y; |
AjK | 0:0a841b89d614 | 191 | x = stick->x/STICK_DIVISOR; |
AjK | 0:0a841b89d614 | 192 | y = stick->y/STICK_DIVISOR; |
AjK | 0:0a841b89d614 | 193 | |
AjK | 0:0a841b89d614 | 194 | if (x > 2 || x < -2) { |
AjK | 0:0a841b89d614 | 195 | //debug_printf("New RIGHT stick position x = %d y = %d\r\n", stick->x/STICK_DIVISOR, stick->y/STICK_DIVISOR); |
AjK | 0:0a841b89d614 | 196 | rate = 0.4 * (double)((double)stick->x/STICK_DIVISOR / 16.0); |
AjK | 0:0a841b89d614 | 197 | _nexstar_set_azmith_rate_fine(rate); |
AjK | 0:0a841b89d614 | 198 | } |
AjK | 0:0a841b89d614 | 199 | else { |
AjK | 0:0a841b89d614 | 200 | _nexstar_set_azmith_rate_fine(0.0); |
AjK | 0:0a841b89d614 | 201 | } |
AjK | 0:0a841b89d614 | 202 | |
AjK | 0:0a841b89d614 | 203 | if (y > 2 || y < -2) { |
AjK | 0:0a841b89d614 | 204 | rate = 0.4 * (double)((double)stick->y/STICK_DIVISOR / 16.0); |
AjK | 0:0a841b89d614 | 205 | _nexstar_set_elevation_rate_fine(rate); |
AjK | 0:0a841b89d614 | 206 | } |
AjK | 0:0a841b89d614 | 207 | else { |
AjK | 0:0a841b89d614 | 208 | _nexstar_set_elevation_rate_fine(0.0); |
AjK | 0:0a841b89d614 | 209 | } |
AjK | 0:0a841b89d614 | 210 | } |
AjK | 0:0a841b89d614 | 211 | } |
AjK | 0:0a841b89d614 | 212 | |
AjK | 0:0a841b89d614 | 213 | |
AjK | 0:0a841b89d614 | 214 |