static void handle_nap_exti(void) { u32 irq = nap_irq_rd_blocking(); if (irq & NAP_IRQ_ACQ_DONE) acq_service_irq(); if (irq & NAP_IRQ_ACQ_LOAD_DONE) acq_service_load_done(); if (irq & NAP_IRQ_TIMING_STROBE) { chBSemReset(&timing_strobe_sem, TRUE); } if (irq & NAP_IRQ_EXT_EVENT) ext_event_service(); /* Mask off everything but tracking irqs. */ irq &= NAP_IRQ_TRACK_MASK; tracking_channels_update(irq); u32 err = nap_error_rd_blocking(); if (err) { log_error("SwiftNAP Error: 0x%08X", (unsigned int)err); tracking_channels_missed_update_error(err); } watchdog_notify(WD_NOTIFY_NAP_ISR); nap_exti_count++; }
static msg_t system_monitor_thread(void *arg) { (void)arg; chRegSetThreadName("system monitor"); while (TRUE) { chThdSleepMilliseconds(heartbeat_period_milliseconds); u32 status_flags = 0; sbp_send_msg(SBP_HEARTBEAT, sizeof(status_flags), (u8 *)&status_flags); /* If we are in base station mode then broadcast our known location. */ if (base_station_mode) { sbp_send_msg(MSG_BASE_POS, sizeof(msg_base_pos_t), (u8 *)&base_llh); } msg_iar_state_t iar_state; if (simulation_enabled_for(SIMULATION_MODE_RTK)) { iar_state.num_hyps = 1; } else { iar_state.num_hyps = dgnss_iar_num_hyps(); } sbp_send_msg(MSG_IAR_STATE, sizeof(msg_iar_state_t), (u8 *)&iar_state); send_thread_states(); u32 err = nap_error_rd_blocking(); if (err) printf("Error: 0x%08X\n", (unsigned int)err); } return 0; }