Thank you to anyone who has already donated - your generous donations helped make three months of treatment possible.
My brother Nate continues to fight stage IV Hodgkin's lymphoma. He's just 31, with a wife and baby girl. They have no active income (since he's been unable to return to work), no insurance, and cannot afford the treatment he needs. Nate and his family need your help. Please consider a donation, every dollar helps. Thanks.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
diff --git a/firmware/target/hosted/ypr0/radio-ypr0.c b/firmware/target/hosted/ypr0/radio-ypr0.c index 9e1d2b6..e61a2f1 100644 int fmradio_i2c_read(unsigned char address, unsigned char* buf, int count) #define STATUSRSSI_RDSR (0x1 << 15) /* Low-level RDS Support */ +static struct event_queue rds_queue; static uint32_t rds_stack[DEFAULT_STACK_SIZE / sizeof(uint32_t)]; static uint16_t rds_data[4]; -/* Captures RDS data and processes it */ -static inline void rds_polling(void) -{ - if (tuner_powered()) { - if ((si4709_read_reg(STATUSRSSI) & STATUSRSSI_RDSR) >> 8) { - if (si4700_rds_read_raw(rds_data) && rds_process(rds_data)) - si4700_rds_set_event(); - } - sleep(1); - } - else { - sleep(HZ*1); - } -} +enum { + Q_POWERUP, +}; static void NORETURN_ATTR rds_thread(void) { - while (true) - rds_polling(); + /* start up frozen */ + int timeout = TIMEOUT_BLOCK; + struct queue_event ev; + + while (true) { + queue_wait_w_tmo(&rds_queue, &ev, timeout); + switch (ev.id) { + case Q_POWERUP: + /* power up: timeout after 1 tick, else block indefinitely */ + timeout = ev.data ? 1 : TIMEOUT_BLOCK; + break; + case SYS_TIMEOUT: + /* Captures RDS data and processes it */ + if ((si4709_read_reg(STATUSRSSI) & STATUSRSSI_RDSR) >> 8) { + if (si4700_rds_read_raw(rds_data) && rds_process(rds_data)) + si4700_rds_set_event(); + } + break; + } + } } /* true after full radio power up, and false before powering down */ void si4700_rds_powerup(bool on) { - (void)on; + queue_post(&rds_queue, Q_POWERUP, on); } /* One-time RDS init at startup */ void si4700_rds_init(void) { rds_init(); + queue_init(&rds_queue, false); create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds" IF_PRIO(, PRIORITY_REALTIME) IF_COP(, CPU)); } -#endif /* HAVE_RDS_CAP */ \ No newline at end of file +#endif /* HAVE_RDS_CAP */ |