Files @ 779c7da65f38
Branch filter:

Location: FeatherHAB/wsprhab/src/main.c - annotation

Ethan Zonca
Fix deinitting things that aren't initted
4202475a7575
4202475a7575
4202475a7575
4202475a7575
0d9900312165
0d9900312165
c1b1dfc6c2f4
0d9900312165
c1b1dfc6c2f4
0d9900312165
a127e9133034
0d9900312165
0d9900312165
23ecc15c694d
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
50cc79d449a4
659774b354b1
659774b354b1
0d9900312165
0d9900312165
0d9900312165
0d9900312165
0d9900312165
0dd5c923fdea
4202475a7575
0d9900312165
659774b354b1
23ecc15c694d
0d9900312165
21759af9d2ad
21759af9d2ad
4ffdc5eab0ff
659774b354b1
659774b354b1
4ffdc5eab0ff
b113d7d76caf
b113d7d76caf
b113d7d76caf
dd3b59fcb7a7
0d9900312165
0d9900312165
677c51754ccf
677c51754ccf
677c51754ccf
677c51754ccf
9ba4d6855ba4
9ba4d6855ba4
677c51754ccf
677c51754ccf
677c51754ccf
677c51754ccf
677c51754ccf
659774b354b1
f76c13fc8299
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
50cc79d449a4
659774b354b1
659774b354b1
659774b354b1
b113d7d76caf
659774b354b1
659774b354b1
659774b354b1
659774b354b1
659774b354b1
e1db5d4a8be4
659774b354b1
659774b354b1
9ba4d6855ba4
9ba4d6855ba4
50cc79d449a4
659774b354b1
9ba4d6855ba4
659774b354b1
659774b354b1
9ba4d6855ba4
659774b354b1
659774b354b1
659774b354b1
659774b354b1
b295af18d965
659774b354b1
659774b354b1
659774b354b1
50cc79d449a4
50cc79d449a4
50cc79d449a4
50cc79d449a4
659774b354b1
659774b354b1
a127e9133034
659774b354b1
659774b354b1
659774b354b1
659774b354b1
b113d7d76caf
659774b354b1
50cc79d449a4
50cc79d449a4
50cc79d449a4
50cc79d449a4
21759af9d2ad
659774b354b1
659774b354b1
659774b354b1
b113d7d76caf
659774b354b1
659774b354b1
659774b354b1
f76c13fc8299
aa624684a65e
659774b354b1
e1db5d4a8be4
0d9900312165
a127e9133034
0d9900312165
0d9900312165
4ffdc5eab0ff
0d9900312165
0d9900312165
0d9900312165
0d9900312165
4ffdc5eab0ff
4ffdc5eab0ff
//
// WSPRHAB: Minimal high-altitude balloon tracker with WSPR telemetry
//

#include "stm32f0xx_hal.h"
#include "adc.h"
#include "system.h"
#include "i2c.h"
#include "uart.h"
#include "gpio.h"
#include "wspr.h"
#include "gps.h"


// We have access to the 1PPS pin of the gps... could have trim routine for internal oscillator based on this when we have a fix
// Probabl wake up 1 minute early -- 0.45min possible +/- on wakeup time with 15min sync intervals


enum _state
{
    SYSTEM_POWERUP_SYNC = 0, // on powerup, get a GPS fix and set the RTC
    SYSTEM_IDLE, // awaiting RTC interrupt for wakeup TODO wake up before scheduled time to get fix?
    SYSTEM_GPSACQ, // RTC interrupted
    SYSTEM_WSPRTX, // Wait for timeslot and actually transmit the message
};


int main(void)
{
    HAL_Init();

    sysclk_init();
    gpio_init();
    adc_init();
    i2c_init();
    wspr_init();

    uint32_t led_timer = HAL_GetTick();

    led_blink(4);

    uint16_t blink_rate = BLINK_FAST;
    uint8_t state = SYSTEM_GPSACQ;

    uint32_t fixinfo_timer = 0;
    uint8_t fix_ok = 0;
    uint8_t numsats = 0;

    while (1)
    {

        // Update fix status every 2 seconds
        if(HAL_GetTick() - fixinfo_timer > 2000)
        {
            if(gps_ison())
                gps_update_data();
        	fixinfo_timer = HAL_GetTick();
        }



        switch(state)
        {

            // Idling: sleep and wait for RTC timeslot trigger
            case SYSTEM_IDLE:
            {
                blink_rate = BLINK_SLOW;
                // Wait for RTC wakeup interrupt
                //wfi();
                //enter_sleep();

                // Somehow go to another state when we get an interrupt
//                state = SYSTEM_GPSACQ;
            } break;


            // Attempt to acquire GPS fix
            case SYSTEM_GPSACQ:
            {
                blink_rate = BLINK_FAST;

                if(!gps_ison())
                    gps_poweron(); // power on and initialize GPS module
                

                if(gps_getdata()->fixtype > 0 && gps_getdata()->pdop < 5)
                {
                    // Disable GPS module
                    gps_poweroff();

                    // TODO: Set RTC from GPS time

                    // TODO: Set RTC for countdown to next transmission timeslot!

                    // TODO: Set wspr countdown timer for this transmission!
                    state = SYSTEM_WSPRTX;
                }
//                else if(fix_timeout)
 //               {
  //                  // Flash error code and go to idle probably? or just try forever?
   //             }

            } break;

            
            // Wait for wspr timeslot and start transmitting
            case SYSTEM_WSPRTX:
            {
            	blink_rate = BLINK_SLOW;
                // Wait for wspr countdown timer to expire and go to tx
//                if(timeout_expired)
//                {
//                    wspr_transmit();
//                }

                // Schedule next wakeup (maybe 2mins prior ot timeslot if no osc trim)
                // Next wakeup should enter SYSTEM_GPSACQ state...

//                state = SYSTEM_IDLE;

            } break;

        }


        if(HAL_GetTick() - led_timer > blink_rate)
        {
            HAL_GPIO_TogglePin(LED_BLUE);
            led_timer = HAL_GetTick();
        }

    }
}