summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/buffer/ringbuffer.c96
-rw-r--r--lib/logger/log.c1
2 files changed, 96 insertions, 1 deletions
diff --git a/lib/buffer/ringbuffer.c b/lib/buffer/ringbuffer.c
new file mode 100644
index 0000000..cdb5fed
--- /dev/null
+++ b/lib/buffer/ringbuffer.c
@@ -0,0 +1,96 @@
+// can handle one buffer for a start.
+// later make it reentrant and manage multiple buffers!
+// todo: syncing access to buffer.
+
+#define FOOLOS_MODULE_NAME "ringbuffer"
+#include "lib/bool/bool.h"
+#include "lib/logger/log.h"
+
+static volatile int front;
+static volatile int back;
+static volatile int size;
+
+#define RINGBUFFER_SIZE 10
+static volatile char buf[RINGBUFFER_SIZE];
+
+bool ringbuffer_selftest();
+
+void ringbuffer_init()
+{
+ size=RINGBUFFER_SIZE;
+ front=size-1;
+ back=size-1;
+
+// ringbuffer_selftest();
+// while(1);
+}
+
+bool ringbuffer_put(char c)
+{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put wants lock)");
+ lock_spin(3);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"locked by put)");
+ if((back-1+size)%size==front)
+ {
+ lock_release(3);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put)");
+ return false;
+ }
+ buf[back]=c;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put %d %d (%c)", back, front,c);
+ back--;
+ back+=size;
+ back%=size;
+ lock_release(3);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put)");
+
+ return true;
+}
+
+bool ringbuffer_get(char *c)
+{
+
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get wants lock)");
+ lock_spin(3);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"locked by get)");
+ if(front==back)
+ {
+ lock_release(3);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get)");
+ return false;
+ }
+
+ *c=buf[front];
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get %d %d (%c)", back, front,*c);
+
+ front--;
+ front+=size;
+ front%=size;
+
+ lock_release(3);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get)");
+
+ return true;
+}
+
+bool ringbuffer_selftest()
+{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ringbuffer selftest");
+ char c;
+
+ ringbuffer_put('a');
+ ringbuffer_put('b');
+ ringbuffer_put('c');
+ ringbuffer_put('d');
+ ringbuffer_put('e');
+
+ ringbuffer_get(&c);
+ ringbuffer_get(&c);
+ ringbuffer_get(&c);
+ ringbuffer_get(&c);
+ ringbuffer_get(&c);
+ ringbuffer_get(&c);
+ ringbuffer_get(&c);
+
+}
diff --git a/lib/logger/log.c b/lib/logger/log.c
index 331726f..6d107f8 100644
--- a/lib/logger/log.c
+++ b/lib/logger/log.c
@@ -21,7 +21,6 @@ void log(char *module_name, int log_level, char *format_string, ...)
if(log_level<FOOLOS_LOG_INFO)return;
-
char buf_info[256];
char buf_log[256];
char buf_time[20];