Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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