summaryrefslogtreecommitdiff
path: root/code/fe310/eos/event.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2018-01-16 23:43:07 +0100
committerUros Majstorovic <majstor@majstor.org>2018-01-16 23:43:07 +0100
commit01c3e3af2394f863323b846fa304ff7e0a30e9df (patch)
tree84b499e6ece88e637ed86bbdd87333613e2433c5 /code/fe310/eos/event.c
parent0d0e9facfcea3cf96da3b63285865182fdd5477e (diff)
eos support
Diffstat (limited to 'code/fe310/eos/event.c')
-rw-r--r--code/fe310/eos/event.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/code/fe310/eos/event.c b/code/fe310/eos/event.c
new file mode 100644
index 0000000..25f1fa1
--- /dev/null
+++ b/code/fe310/eos/event.c
@@ -0,0 +1,85 @@
+#include <stdio.h>
+
+#include "encoding.h"
+#include "platform.h"
+
+#include "eos.h"
+#include "msgq.h"
+#include "net.h"
+#include "timer.h"
+#include "event.h"
+
+static EOSMsgQ event_q;
+static EOSMsgItem event_q_array[EOS_EVT_SIZE_Q];
+
+static eos_evt_fptr_t evt_net_handler[EOS_NET_MAX_CMD];
+static eos_evt_fptr_t evt_timer_handler = NULL;
+static eos_evt_fptr_t evt_ui_handler = NULL;
+
+static void bad_handler(unsigned char cmd, unsigned char *buffer, uint16_t len) {
+ printf("bad handler: %d\n", cmd);
+}
+
+void eos_evtq_init(void) {
+ int i;
+
+ for (i=0; i<EOS_NET_MAX_CMD; i++) {
+ evt_net_handler[i] = bad_handler;
+ }
+ evt_timer_handler = bad_handler;
+ evt_ui_handler = bad_handler;
+ eos_msgq_init(&event_q, event_q_array, EOS_EVT_SIZE_Q);
+}
+
+int eos_evtq_push(unsigned char cmd, unsigned char *buffer, uint16_t len) {
+ return eos_msgq_push(&event_q, cmd, buffer, len);
+}
+
+void eos_evtq_pop(unsigned char *cmd, unsigned char **buffer, uint16_t *len) {
+ eos_msgq_pop(&event_q, cmd, buffer, len);
+}
+
+void eos_evtq_handle(unsigned char cmd, unsigned char *buffer, uint16_t len) {
+ if (cmd & EOS_EVT_MASK_NET) {
+ cmd &= ~EOS_EVT_MASK_NET;
+ if (cmd < EOS_NET_MAX_CMD) {
+ evt_net_handler[cmd](cmd, buffer, len);
+ } else {
+ bad_handler(cmd, buffer, len);
+ }
+ } else if (cmd == EOS_EVT_TIMER) {
+ evt_timer_handler(cmd, buffer, len);
+ } else if (cmd == EOS_EVT_UI) {
+ evt_ui_handler(cmd, buffer, len);
+ }
+}
+
+void eos_evtq_loop(void) {
+ unsigned char cmd;
+ unsigned char *buffer;
+ uint16_t len;
+ volatile int foo = 1;
+
+ while(foo) {
+ clear_csr(mstatus, MSTATUS_MIE);
+ eos_evtq_pop(&cmd, &buffer, &len);
+ if (cmd) {
+ set_csr(mstatus, MSTATUS_MIE);
+ eos_evtq_handle(cmd, buffer, len);
+ clear_csr(mstatus, MSTATUS_MIE);
+ } else {
+ // asm volatile ("wfi");
+ }
+ set_csr(mstatus, MSTATUS_MIE);
+ }
+}
+
+void eos_evtq_set_handler(unsigned char cmd, eos_evt_fptr_t handler) {
+ if (cmd & EOS_EVT_MASK_NET) {
+ evt_net_handler[cmd & ~EOS_EVT_MASK_NET] = handler;
+ } else if (cmd == EOS_EVT_TIMER) {
+ evt_timer_handler = handler;
+ } else if (cmd == EOS_EVT_UI) {
+ evt_ui_handler = handler;
+ }
+} \ No newline at end of file