Log

Dependents:   oldheating gps motorhome heating

Revision:
0:9907e344c82a
Child:
1:4d81afe3859e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/log.cpp	Mon Dec 12 15:44:51 2016 +0000
@@ -0,0 +1,168 @@
+#include "mbed.h"
+#include  "rtc.h"
+#define LOG_FILE "/local/log.txt"
+
+LocalFileSystem local("local");
+
+#define BUFFER_LENGTH 4096
+static char buffer[BUFFER_LENGTH];
+static char* pPush; //Initialised in init
+static char* pPull; //Initialised in init
+static int enable = true;
+static char* incrementPushPullPointer(char* p, char* buffer, int bufferLength)
+{
+    p++; //increment the pointer by one
+    if (p == buffer + bufferLength) p = buffer; //if the pointer is now beyond the end then point it back to the start
+    return p;
+}
+void LogPush(char c)
+{
+    //Only add if allowed
+    if (!enable) return;
+    
+    //Move the pull position if about to run into it
+    char* pNext = incrementPushPullPointer(pPush, buffer, BUFFER_LENGTH);
+    if (pNext == pPull) pPull = incrementPushPullPointer(pPull, buffer, BUFFER_LENGTH);
+    
+    //Add the character at the push position
+    *pPush = c;
+    pPush = incrementPushPullPointer(pPush, buffer, BUFFER_LENGTH);
+}
+static char *pEnumerate;
+static int hadNull;
+void LogEnumerateStart()
+{
+    pEnumerate = pPull;
+    hadNull = false;
+}
+int LogEnumerate()
+{
+    if (hadNull)
+    {
+        hadNull = false;    
+        return '0';
+    }
+    if (pEnumerate == pPush) return EOF;
+    char c = *pEnumerate;
+    pEnumerate = incrementPushPullPointer(pEnumerate, buffer, BUFFER_LENGTH); 
+    if (c)
+    {
+        return c;
+    }
+    else
+    {
+        hadNull = true;
+        return '\\';
+    }
+}
+void LogEnable(int on)
+{
+    enable = on;
+}
+int LogInit()
+{
+    pPush = buffer;
+    pPull = buffer;
+    return 0;
+}
+void LogV(char *fmt, va_list argptr)
+{
+    int size  = vsnprintf(NULL, 0, fmt, argptr);      //Find the size required
+    char snd[size + 1];                               //Allocate enough memory for the size required with an extra byte for the terminating null
+    vsprintf(snd, fmt, argptr);                       //Fill the new buffer
+    for (char* ptr = snd; *ptr; ptr++) LogPush(*ptr); //Send the string to the log buffer
+}
+void LogF(char *fmt, ...)
+{
+    va_list argptr;
+    va_start(argptr, fmt);
+    LogV(fmt, argptr);
+    va_end(argptr);
+}
+void LogCrLf (char * text)
+{
+    LogF("%s\r\n", text);
+}
+static void pushuint4(int value)
+{    
+    if      (value > 9999) { LogPush('+'); LogPush('+'); LogPush('+'); LogPush('+'); }
+    else if (value <    0) { LogPush('-'); LogPush('-'); LogPush('-'); LogPush('-'); }
+    else
+    {
+        div_t divres;
+        int k, c, t, u;
+        divres = div(value      , 10); u = divres.rem;
+        divres = div(divres.quot, 10); t = divres.rem;
+        divres = div(divres.quot, 10); c = divres.rem;
+                                       k = divres.quot;                           
+        LogPush(k + '0'); LogPush(c + '0'); LogPush(t + '0'); LogPush(u + '0');
+    }
+}
+static void pushuint3(int value)
+{
+    if      (value > 999) { LogPush('+'); LogPush('+'); LogPush('+'); }
+    else if (value <   0) { LogPush('-'); LogPush('-'); LogPush('-'); }
+    else
+    {
+        div_t divres;
+        int c, t, u;
+        divres = div(value      , 10); u = divres.rem;
+        divres = div(divres.quot, 10); t = divres.rem;
+                                       c = divres.quot;
+        LogPush(c + '0'); LogPush(t + '0'); LogPush(u + '0');
+    }
+}
+static void pushuint2(int value)
+{
+    if      (value > 99) { LogPush('+'); LogPush('+'); }
+    else if (value <  0) { LogPush('-'); LogPush('-'); }
+    else
+    {
+        div_t divres;
+        int t, u;
+        divres = div(value      , 10); u = divres.rem;
+                                       t = divres.quot;
+        LogPush(t + '0'); LogPush(u + '0');
+    }
+}
+void LogTime()
+{
+    struct tm tm;
+    RtcGetTmUtc(&tm);
+    
+    pushuint4(tm.tm_year + 1900);
+    LogPush('-');
+    pushuint3(tm.tm_yday + 1);
+    LogPush(' ');
+    pushuint2(tm.tm_hour);
+    LogPush(':');
+    pushuint2(tm.tm_min);
+    LogPush(':');
+    pushuint2(tm.tm_sec);
+}
+void LogTimeCrLf(char * text)
+{
+    LogTime();
+    LogF(" %s\r\n", text);
+}
+void LogTimeF(char *fmt, ...)
+{
+    va_list argptr;
+    va_start(argptr, fmt);
+    LogTime();
+    LogPush(' ');
+    LogV(fmt, argptr);
+    va_end(argptr);
+}
+void LogSave()
+{
+    FILE *fp = fopen(LOG_FILE, "w");
+    LogEnumerateStart();
+    while(1)
+    {
+        int c = LogEnumerate();
+        if (c == EOF) break;
+        putc(c, fp);
+    }
+    fclose(fp);
+}