Files @ b113d7d76caf
Branch filter:

Location: FeatherHAB/wsprhab/src/main.c

Ethan Zonca
Implementation of faster baud rate and new message
//
// 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();
    gps_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)
    {
        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;

                // TODO: probably don't power on all the time, just on state transition
//                gps_poweron();
//                HAL_Delay(100);
//                gps_update_position();
                
                // Update fix status every 2 seconds
                if(HAL_GetTick() - fixinfo_timer > 2000)
                {
                	gps_check_lock(&fix_ok, &numsats);
                	fixinfo_timer = HAL_GetTick();
                }

                if(fix_ok > 0)
                {
                    // 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();
        }

    }
}