#include #include #include #include #include "encoding.h" #include "platform.h" #include "msgq.h" #include "event.h" EOSMsgQ _eos_event_q; static EOSMsgItem event_q_array[EOS_EVT_SIZE_Q]; static eos_evt_handler_t evt_handler[EOS_EVT_MAX_EVT + 1]; static void evtq_handler(unsigned char type, unsigned char *buffer, uint16_t len) { unsigned char idx = (type & EOS_EVT_MASK) >> 4; if (idx && (idx <= EOS_EVT_MAX_EVT)) { evt_handler[idx](type, buffer, len); } else { eos_evtq_bad_handler(type, buffer, len); } } void eos_evtq_init(void) { int i; evt_handler[0] = evtq_handler; for (i=0; i> 4; if (idx <= EOS_EVT_MAX_EVT) evt_handler[idx] = handler; } eos_evt_handler_t eos_evtq_get_handler(unsigned char type) { unsigned char idx = (type & EOS_EVT_MASK) >> 4; if (idx <= EOS_EVT_MAX_EVT) return evt_handler[idx]; return NULL; } void eos_evtq_get(unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len) { int rv = 0; while(!rv) { clear_csr(mstatus, MSTATUS_MIE); rv = eos_msgq_get(&_eos_event_q, type, selector, sel_len, buffer, len); if (!rv) { unsigned char _type; unsigned char *_buffer; uint16_t _len; eos_msgq_pop(&_eos_event_q, &_type, &_buffer, &_len); if (_type) { set_csr(mstatus, MSTATUS_MIE); evt_handler[0](_type, _buffer, _len); } else { asm volatile ("wfi"); set_csr(mstatus, MSTATUS_MIE); } } else { set_csr(mstatus, MSTATUS_MIE); } } } 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); evt_handler[0](type, buffer, len); } else { asm volatile ("wfi"); set_csr(mstatus, MSTATUS_MIE); } } }