#include #include #include #include "encoding.h" #include "platform.h" #include "net.h" #include "msgq.h" #include "event.h" EOSMsgQ _eos_event_q; static EOSMsgItem event_q_array[EOS_EVT_SIZE_Q]; static eos_evt_fptr_t evt_handler[EOS_EVT_MAX_EVT]; static uint16_t evt_handler_wrapper_acq = 0; static uint16_t evt_handler_flags_buf_acq = 0; void eos_evtq_init(void) { int i; for (i=0; i> 4) > EOS_EVT_MAX_EVT) { eos_evtq_bad_handler(type, buffer, len); } else { unsigned char idx = ((type & EOS_EVT_MASK) >> 4) - 1; uint16_t flag = (uint16_t)1 << idx; if (flag & evt_handler_flags_buf_acq) { evtq_handler_wrapper(type, buffer, len, &evt_handler_wrapper_acq, flag, evt_handler[idx]); } else { evt_handler[idx](type, buffer, len); } } } void eos_evtq_set_handler(unsigned char type, eos_evt_fptr_t handler, uint8_t flags) { if (flags) { uint16_t flag = (uint16_t)1 << (((type & EOS_EVT_MASK) >> 4) - 1); if (flags & EOS_EVT_FLAG_NET_BUF_ACQ) evt_handler_flags_buf_acq |= flag; } evt_handler[((type & EOS_EVT_MASK) >> 4) - 1] = handler; } void eos_evtq_loop(void) { unsigned char type; unsigned char *buffer; uint16_t len; int foo = 1; while(foo) { clear_csr(mstatus, MSTATUS_MIE); eos_msgq_pop(&_eos_event_q, &type, &buffer, &len); if (type) { set_csr(mstatus, MSTATUS_MIE); evtq_handler(type, buffer, len); clear_csr(mstatus, MSTATUS_MIE); } else { // asm volatile ("wfi"); } set_csr(mstatus, MSTATUS_MIE); } }