Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.
main.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 | #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 |