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 #ifndef MAIN_CPP
AjK 0:0a841b89d614 24 #define MAIN_CPP
AjK 0:0a841b89d614 25 #endif
AjK 0:0a841b89d614 26
AjK 0:0a841b89d614 27 #include "sowb.h"
AjK 0:0a841b89d614 28 #include "gpioirq.h"
AjK 0:0a841b89d614 29 #include "gpio.h"
AjK 0:0a841b89d614 30 #include "rit.h"
AjK 0:0a841b89d614 31 #include "usbeh.h"
AjK 0:0a841b89d614 32 #include "usbeh_endpoint.h"
AjK 0:0a841b89d614 33 #include "usbeh_device.h"
AjK 0:0a841b89d614 34 #include "usbeh_controller.h"
AjK 0:0a841b89d614 35 #include "usbeh_api.h"
AjK 0:0a841b89d614 36 #include "xbox360gamepad.h"
AjK 0:0a841b89d614 37 #include "th_xbox360gamepad.h"
AjK 0:0a841b89d614 38 #include "gps.h"
AjK 0:0a841b89d614 39 #include "MAX7456.h"
AjK 0:0a841b89d614 40 #include "osd.h"
AjK 0:0a841b89d614 41 #include "nexstar.h"
AjK 0:0a841b89d614 42 #include "utils.h"
AjK 0:0a841b89d614 43 #include "user.h"
AjK 0:0a841b89d614 44 #include "dma.h"
AjK 0:0a841b89d614 45 #include "flash.h"
AjK 0:0a841b89d614 46 #include "sdcard.h"
AjK 0:0a841b89d614 47 #include "config.h"
AjK 0:0a841b89d614 48 #include "ff.h"
AjK 0:0a841b89d614 49 #include "sgp4sdp4.h"
AjK 0:0a841b89d614 50 #include "satapi.h"
AjK 0:0a841b89d614 51 #include "star.h"
AjK 0:0a841b89d614 52
AjK 0:0a841b89d614 53 #include "main.h"
AjK 0:0a841b89d614 54 #include "debug.h"
AjK 0:0a841b89d614 55 #include "predict_th.h"
AjK 0:0a841b89d614 56
AjK 0:0a841b89d614 57 int test_flash_page;
AjK 0:0a841b89d614 58
AjK 0:0a841b89d614 59 /* Create an array of _process function pointers
AjK 0:0a841b89d614 60 to call while user_io is waiting. */
AjK 0:0a841b89d614 61 typedef void (PROCESS_FUNC)();
AjK 0:0a841b89d614 62
AjK 0:0a841b89d614 63 PROCESS_FUNC *process_callbacks[] = {
AjK 0:0a841b89d614 64 usbeh_api_process,
AjK 0:0a841b89d614 65 xbox360gamepad_process,
AjK 0:0a841b89d614 66 gps_process,
AjK 0:0a841b89d614 67 gpioirq_process,
AjK 0:0a841b89d614 68 nexstar_process,
AjK 0:0a841b89d614 69 sdcard_process,
AjK 0:0a841b89d614 70 config_process,
AjK 0:0a841b89d614 71 NULL
AjK 0:0a841b89d614 72 };
AjK 0:0a841b89d614 73
AjK 0:0a841b89d614 74 int main_test_flag;
AjK 0:0a841b89d614 75
AjK 0:0a841b89d614 76 void _main_test_callback(int index) {
AjK 0:0a841b89d614 77 main_test_flag = 0;
AjK 0:0a841b89d614 78 }
AjK 0:0a841b89d614 79
AjK 0:0a841b89d614 80
AjK 0:0a841b89d614 81
AjK 0:0a841b89d614 82 int main() {
AjK 0:0a841b89d614 83 int counter = 0;
AjK 0:0a841b89d614 84 char test_buffer[256];
AjK 0:0a841b89d614 85 DIR fDir;
AjK 0:0a841b89d614 86 FILINFO fInfo;
AjK 0:0a841b89d614 87 int f_return;
AjK 0:0a841b89d614 88 GPS_LOCATION_RAW location;
AjK 0:0a841b89d614 89
AjK 0:0a841b89d614 90 /* Carry out module start-up _init() functions.
AjK 0:0a841b89d614 91 Note, the order is important, do not change. */
AjK 0:0a841b89d614 92 debug_init();
AjK 0:0a841b89d614 93 gpio_init();
AjK 0:0a841b89d614 94 rit_init();
AjK 0:0a841b89d614 95 xbox360gamepad_init();
AjK 0:0a841b89d614 96 usbeh_api_init();
AjK 0:0a841b89d614 97 MAX7456_init();
AjK 0:0a841b89d614 98 osd_init();
AjK 0:0a841b89d614 99 gps_init();
AjK 0:0a841b89d614 100 gpioirq_init();
AjK 0:0a841b89d614 101
AjK 0:0a841b89d614 102 /* We use raw MAX7456 calls to display the splash screen because
AjK 0:0a841b89d614 103 at this point not all interrupts are active and the OSD system
AjK 0:0a841b89d614 104 will not yet be fully operational even though we've _init() it. */
AjK 0:0a841b89d614 105 MAX7456_cursor(0, 5); MAX7456_string((unsigned char *)" Satellite Observers ");
AjK 0:0a841b89d614 106 MAX7456_cursor(0, 6); MAX7456_string((unsigned char *)" Workbench V0.1 ");
AjK 0:0a841b89d614 107 MAX7456_cursor(0, 7); MAX7456_string((unsigned char *)" (c) Copyright 2010 ");
AjK 0:0a841b89d614 108 MAX7456_cursor(0, 8); MAX7456_string((unsigned char *)" Stellar Technologies Ltd");
AjK 0:0a841b89d614 109 if (LPC_WDT->WDMOD & 0x4) { MAX7456_cursor(0, 14); MAX7456_string((unsigned char *)" WDT Error detected"); }
AjK 0:0a841b89d614 110 user_wait_ms_blocking(2000); /* Simple splash screen delay. */
AjK 0:0a841b89d614 111 MAX7456_cursor(0, 11); MAX7456_string((unsigned char *)" Press A to continue");
AjK 0:0a841b89d614 112 while (user_get_button(false) != BUTT_A_PRESS) ;
AjK 0:0a841b89d614 113 while (user_get_button(false) != BUTT_A_RELEASE) ;
AjK 0:0a841b89d614 114
AjK 0:0a841b89d614 115 /* Complete the module _init() stage. */
AjK 0:0a841b89d614 116 nexstar_init();
AjK 0:0a841b89d614 117 DMA_init();
AjK 0:0a841b89d614 118 flash_init();
AjK 0:0a841b89d614 119 sdcard_init();
AjK 0:0a841b89d614 120 config_init();
AjK 0:0a841b89d614 121 th_xbox360gamepad_init();
AjK 0:0a841b89d614 122
AjK 0:0a841b89d614 123 if (!_nexstar_is_aligned()) {
AjK 0:0a841b89d614 124 debug_printf("Nexstar not aligned, forcing user to align.\r\n");
AjK 0:0a841b89d614 125 nexstar_force_align();
AjK 0:0a841b89d614 126 }
AjK 0:0a841b89d614 127
AjK 0:0a841b89d614 128 MAX7456_cursor(0, 11); MAX7456_string((unsigned char *)" Waiting for GPS....");
AjK 0:0a841b89d614 129 do {
AjK 0:0a841b89d614 130 gps_get_location_raw(&location);
AjK 0:0a841b89d614 131 WHILE_WAITING_DO_PROCESS_FUNCTIONS;
AjK 0:0a841b89d614 132 } while (location.is_valid == '0');
AjK 0:0a841b89d614 133 osd_clear(); osd_set_mode_l01(L01_MODE_A);
AjK 0:0a841b89d614 134
AjK 0:0a841b89d614 135 /* Tell the Nexstar the real time and place. */
AjK 0:0a841b89d614 136 _nexstar_set_time(NULL);
AjK 0:0a841b89d614 137 _nexstar_set_location(NULL);
AjK 0:0a841b89d614 138
AjK 0:0a841b89d614 139 /* Init the watchdog and then go into the main loop. */
AjK 0:0a841b89d614 140 LPC_SC->PCLKSEL0 |= 0x3;
AjK 0:0a841b89d614 141 LPC_WDT->WDCLKSEL = 1;
AjK 0:0a841b89d614 142 LPC_WDT->WDTC = 6000000;
AjK 0:0a841b89d614 143 LPC_WDT->WDMOD = 3;
AjK 0:0a841b89d614 144 KICK_WATCHDOG;
AjK 0:0a841b89d614 145
AjK 0:0a841b89d614 146 while(1) {
AjK 0:0a841b89d614 147
AjK 0:0a841b89d614 148 char c = user_get_button(false);
AjK 0:0a841b89d614 149 switch (c) {
AjK 0:0a841b89d614 150 case BUTT_START_PRESS:
AjK 0:0a841b89d614 151 if (!sdcard_is_mounted()) {
AjK 0:0a841b89d614 152 osd_string_xy(1, 14, "No SD card inserted");
AjK 0:0a841b89d614 153 }
AjK 0:0a841b89d614 154 break;
AjK 0:0a841b89d614 155
AjK 0:0a841b89d614 156 case BUTT_XBOX_PRESS:
AjK 0:0a841b89d614 157 SAT_POS_DATA q;
AjK 0:0a841b89d614 158 satapi_aos(&q, true);
AjK 0:0a841b89d614 159 break;
AjK 0:0a841b89d614 160
AjK 0:0a841b89d614 161 case BUTT_LS_PRESS:
AjK 0:0a841b89d614 162 osd_l01_next_mode();
AjK 0:0a841b89d614 163 break;
AjK 0:0a841b89d614 164 case BUTT_RS_PRESS:
AjK 0:0a841b89d614 165 osd_crosshair_toggle();
AjK 0:0a841b89d614 166 break;
AjK 0:0a841b89d614 167 case BUTT_B_PRESS:
AjK 0:0a841b89d614 168 //_nexstar_goto_azm_fast(0x238F);
AjK 0:0a841b89d614 169 //_nexstar_goto(0x238F, 0x238F);
AjK 0:0a841b89d614 170 _nexstar_goto(0x0, 0x0);
AjK 0:0a841b89d614 171 break;
AjK 0:0a841b89d614 172 case BUTT_X_PRESS:
AjK 0:0a841b89d614 173 /*
AjK 0:0a841b89d614 174 _nexstar_set_elevation_rate_auto(1.0);
AjK 0:0a841b89d614 175 main_test_flag = 1;
AjK 0:0a841b89d614 176 rit_timer_set_counter(MAIN_TEST_CB, 5000);
AjK 0:0a841b89d614 177 P22_ASSERT;
AjK 0:0a841b89d614 178 while (main_test_flag == 1) {
AjK 0:0a841b89d614 179 user_call_process();
AjK 0:0a841b89d614 180 }
AjK 0:0a841b89d614 181 _nexstar_set_elevation_rate_auto(0);
AjK 0:0a841b89d614 182 P22_DEASSERT;
AjK 0:0a841b89d614 183 */
AjK 0:0a841b89d614 184
AjK 0:0a841b89d614 185 for (int i = 0; i < 256; i++) {
AjK 0:0a841b89d614 186 test_buffer[i] = 255 - i;
AjK 0:0a841b89d614 187 }
AjK 0:0a841b89d614 188 debug_printf("Test buffer before:-\r\n");
AjK 0:0a841b89d614 189 printBuffer(test_buffer, 256);
AjK 0:0a841b89d614 190 flash_page_write(1, test_buffer);
AjK 0:0a841b89d614 191 LED1_ON;
AjK 0:0a841b89d614 192 while(flash_write_in_progress());
AjK 0:0a841b89d614 193 LED1_OFF;
AjK 0:0a841b89d614 194 flash_read_page(1, test_buffer, true);
AjK 0:0a841b89d614 195 debug_printf("Test buffer after:-\r\n");
AjK 0:0a841b89d614 196 printBuffer(test_buffer, 256);
AjK 0:0a841b89d614 197 break;
AjK 0:0a841b89d614 198
AjK 0:0a841b89d614 199 case BUTT_Y_PRESS:
AjK 0:0a841b89d614 200 memset(test_buffer, 0xAA, 256);
AjK 0:0a841b89d614 201 flash_read_page(0, test_buffer, true);
AjK 0:0a841b89d614 202 debug_printf("Page 0\r\n");
AjK 0:0a841b89d614 203 printBuffer(test_buffer, 256);
AjK 0:0a841b89d614 204 memset(test_buffer, 0xAA, 256);
AjK 0:0a841b89d614 205 flash_read_page(1, test_buffer, true);
AjK 0:0a841b89d614 206 debug_printf("Page 1\r\n");
AjK 0:0a841b89d614 207 printBuffer(test_buffer, 256);
AjK 0:0a841b89d614 208 memset(test_buffer, 0xAA, 256);
AjK 0:0a841b89d614 209 flash_read_page(2, test_buffer, true);
AjK 0:0a841b89d614 210 debug_printf("Page 2\r\n");
AjK 0:0a841b89d614 211 printBuffer(test_buffer, 256);
AjK 0:0a841b89d614 212 memset(test_buffer, 0xAA, 256);
AjK 0:0a841b89d614 213 flash_read_page(3, test_buffer, true);
AjK 0:0a841b89d614 214 debug_printf("Page 3\r\n");
AjK 0:0a841b89d614 215 printBuffer(test_buffer, 256);
AjK 0:0a841b89d614 216 break;
AjK 0:0a841b89d614 217 case BUTT_DPAD_DOWN_PRESS:
AjK 0:0a841b89d614 218 flash_erase_sector(0);
AjK 0:0a841b89d614 219 break;
AjK 0:0a841b89d614 220 case BUTT_DPAD_UP_PRESS:
AjK 0:0a841b89d614 221 flash_erase_bulk();
AjK 0:0a841b89d614 222 break;
AjK 0:0a841b89d614 223 case BUTT_DPAD_LEFT_PRESS:
AjK 0:0a841b89d614 224 {
AjK 0:0a841b89d614 225 AltAz y;
AjK 0:0a841b89d614 226 RaDec x;
AjK 0:0a841b89d614 227 GPS_LOCATION_AVERAGE loc;
AjK 0:0a841b89d614 228 GPS_TIME t;
AjK 0:0a841b89d614 229 memset(&t, 0, sizeof(GPS_TIME));
AjK 0:0a841b89d614 230 t.year = 2010; t.month = 10; t.day = 7; t.hour = 21; t.minute = 15; t.second = 21;
AjK 0:0a841b89d614 231
AjK 0:0a841b89d614 232 double jd = gps_julian_date(&t);
AjK 0:0a841b89d614 233 sprintf(test_buffer, "\n\n\rJD = %f\r\n", jd);
AjK 0:0a841b89d614 234 debug_printf(test_buffer);
AjK 0:0a841b89d614 235
AjK 0:0a841b89d614 236 gps_get_location_average(&loc);
AjK 0:0a841b89d614 237 double siderealDegrees = gps_siderealDegrees_by_time(&t);
AjK 0:0a841b89d614 238 sprintf(test_buffer, "SR by time = %f\r\n", siderealDegrees);
AjK 0:0a841b89d614 239 debug_printf(test_buffer);
AjK 0:0a841b89d614 240
AjK 0:0a841b89d614 241 x.dec = 28.026111;
AjK 0:0a841b89d614 242 x.ra = 116.32875;
AjK 0:0a841b89d614 243
AjK 0:0a841b89d614 244 sprintf(test_buffer, "Staring with Dec = %f, RA = %f\r\n", x.dec, x.ra);
AjK 0:0a841b89d614 245 debug_printf(test_buffer);
AjK 0:0a841b89d614 246
AjK 0:0a841b89d614 247 radec2altaz(siderealDegrees, &loc, &x, &y);
AjK 0:0a841b89d614 248 sprintf(test_buffer, "Alt = %f, Azm = %f\r\n", y.alt, y.azm);
AjK 0:0a841b89d614 249 debug_printf(test_buffer);
AjK 0:0a841b89d614 250
AjK 0:0a841b89d614 251 altaz2radec(siderealDegrees, &loc, &y, &x);
AjK 0:0a841b89d614 252 sprintf(test_buffer, "Dec = %f, RA = %f\r\n", x.dec, x.ra);
AjK 0:0a841b89d614 253 debug_printf(test_buffer);
AjK 0:0a841b89d614 254
AjK 0:0a841b89d614 255 // Lets look for the brightest star near Sirius.
AjK 0:0a841b89d614 256 // It should return HR2491, Sirius it's self.
AjK 0:0a841b89d614 257 // RA 6 45 8.9 101.2606833
AjK 0:0a841b89d614 258 // Dec -16 42, 58 -16.716111
AjK 0:0a841b89d614 259 x.ra = 101.2606833; x.dec = -16.716111;
AjK 0:0a841b89d614 260 char test_buffer2[32];
AjK 0:0a841b89d614 261 basicStarData star, *p;
AjK 0:0a841b89d614 262 p = star_closest(&x, &star);
AjK 0:0a841b89d614 263 if (!p) {
AjK 0:0a841b89d614 264 debug_printf("No star found\r\n");
AjK 0:0a841b89d614 265 }
AjK 0:0a841b89d614 266 else {
AjK 0:0a841b89d614 267 sprintf(test_buffer, "HR%d %f %f %f\r\n", star.hr, star.ra, star.dec, star.mag);
AjK 0:0a841b89d614 268 debug_printf(test_buffer);
AjK 0:0a841b89d614 269 }
AjK 0:0a841b89d614 270
AjK 0:0a841b89d614 271
AjK 0:0a841b89d614 272 }
AjK 0:0a841b89d614 273
AjK 0:0a841b89d614 274
AjK 0:0a841b89d614 275 break;
AjK 0:0a841b89d614 276 }
AjK 0:0a841b89d614 277
AjK 0:0a841b89d614 278 //sgp4sdp4_th_init();
AjK 0:0a841b89d614 279
AjK 0:0a841b89d614 280 /*
AjK 0:0a841b89d614 281 for(int i = 0; process_callbacks[i] != NULL; i++) {
AjK 0:0a841b89d614 282 (process_callbacks[i])();
AjK 0:0a841b89d614 283 }
AjK 0:0a841b89d614 284
AjK 0:0a841b89d614 285 th_xbox360gamepad();
AjK 0:0a841b89d614 286 */
AjK 0:0a841b89d614 287 }
AjK 0:0a841b89d614 288 }
AjK 0:0a841b89d614 289