Logger library enables you to use unified interface to send out or receive data using one function with different parameters. You leave buffer overflows to this library as it handles it all.

Logger library howto guide.

Below is a simple program that outlines the usage of the logger library, The whole function was head-written so there might be some errors, but it is more for a live representation of usage than anything else. If someone would write a nice example program feel free to link it here.

simple usage of logger library

#include "mbed.h"
#include "logger.h"
#include "errno.h"

Ticker printout;
/**
 * \def STASH_BUFFER_LEN
 * size of stash buffer that can be used to store logged data
 */
#define STASH_BUFFER_LEN 70000
/// stash_buffer size
static char stash_buffer[STASH_BUFFER_LEN];

/**
 * Log_pop_periodic is periodically printing the messages until the buffer is empty. 
 * Once the buffer is empty it detaches and waits for another command.
*/
void log_pop_periodic(void)
{
    if( log_pop(L_BTSERIAL,stash_buffer,STASH_BUFFER_LEN) == 1 )
    {
        printout.detach();
    }
}

static int i=0;
static char read_buffer[20];
/**
 * read data from BT serial
*/
void read_from_BT()
{

    if (BTSerial.readable()) {
        read_buffer[i++] = BTSerial.getc();
        // if we read the desired character
        if (read_buffer[i-1] == 'p')
        {
            // start the printout process which will log_pop logged data
            printout.attach(&log_pop_periodic,0.5);
        }
    }    
}

int main()
{
    log_init(L_SERIAL);
    log_init(L_BTSERIAL);
    BTSerial.attach(&read_from_BT);

    // while loop to fill in loads of stinky data
    while (1) {
            // read something, then stash it
            log_stash(L_INFO,print_buffer,strlen(print_buffer),stash_buffer,STASH_BUFFER_LEN);
    }
}
Committer:
Letme
Date:
Mon Sep 08 20:40:27 2014 +0000
Revision:
2:9d04753a3ad2
Parent:
1:8837abc3f763
Child:
3:e1ed8ae7691e
Switched serial port

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Letme 0:272c70e2366c 1 #include "mbed.h"
Letme 0:272c70e2366c 2 #include "logger.h"
Letme 0:272c70e2366c 3 #include "errno.h"
Letme 0:272c70e2366c 4
Letme 2:9d04753a3ad2 5 /**
Letme 2:9d04753a3ad2 6 * @defgroup logger_lib Logger library
Letme 2:9d04753a3ad2 7 * @{
Letme 2:9d04753a3ad2 8 * @author Crt Lukancic Mori (crt@tech-review.net)
Letme 2:9d04753a3ad2 9 * @short Logging library provides more standard re-routing of output.
Letme 2:9d04753a3ad2 10 * @details While data logger needs an input to define where it output should go, we
Letme 2:9d04753a3ad2 11 * could also override the output using a global variable, which would be read
Letme 2:9d04753a3ad2 12 * before the entry into plc switch to override the local output request.
Letme 2:9d04753a3ad2 13 *
Letme 2:9d04753a3ad2 14 */
Letme 0:272c70e2366c 15
Letme 2:9d04753a3ad2 16 //Serial logSerial(PA_2, PA_3);
Letme 2:9d04753a3ad2 17 Serial logSerial(PA_9, PA_10);
Letme 1:8837abc3f763 18 char endline[]="\r\n";
Letme 1:8837abc3f763 19
Letme 0:272c70e2366c 20 /**
Letme 0:272c70e2366c 21 * Log_init initializes place where messages will be storred
Letme 0:272c70e2366c 22 * @param plc Place id to initialize
Letme 0:272c70e2366c 23 *
Letme 0:272c70e2366c 24 * @retval 1 when succcess
Letme 1:8837abc3f763 25 * @retval -ERR linux errno.h error message
Letme 0:272c70e2366c 26 */
Letme 1:8837abc3f763 27 int32_t log_init(uint8_t plc) {
Letme 0:272c70e2366c 28 switch(plc) {
Letme 0:272c70e2366c 29 case L_SERIAL:
Letme 1:8837abc3f763 30 /// initialize baudrate
Letme 1:8837abc3f763 31 logSerial.baud(115700);
Letme 1:8837abc3f763 32 logSerial.printf("Serial port initialized\r\n");
Letme 0:272c70e2366c 33 break;
Letme 0:272c70e2366c 34 case L_FILE:
Letme 0:272c70e2366c 35 break;
Letme 0:272c70e2366c 36 case L_LED:
Letme 0:272c70e2366c 37 // find out what we want here -morse code would be fun ;)
Letme 0:272c70e2366c 38 break;
Letme 0:272c70e2366c 39 default:
Letme 0:272c70e2366c 40 return -EINVAL;
Letme 0:272c70e2366c 41 }
Letme 0:272c70e2366c 42
Letme 0:272c70e2366c 43 return 1;
Letme 0:272c70e2366c 44 }
Letme 0:272c70e2366c 45
Letme 0:272c70e2366c 46 /**
Letme 0:272c70e2366c 47 * Log_msg determines where to save message.
Letme 0:272c70e2366c 48 * @param plc Place id, where to store message(check logger.h for more infos)
Letme 0:272c70e2366c 49 * @param lvl Debug level (ERROR,WARNING,DEBUG)
Letme 0:272c70e2366c 50 * @param msg pointer to message
Letme 0:272c70e2366c 51 * @param length length of message
Letme 0:272c70e2366c 52 *
Letme 0:272c70e2366c 53 * @retval 1 when succcess
Letme 0:272c70e2366c 54 * @retval -ERR linux errno error message
Letme 0:272c70e2366c 55 */
Letme 1:8837abc3f763 56 int32_t log_msg(uint8_t plc, uint8_t lvl, char *msg, uint32_t length) {
Letme 0:272c70e2366c 57 char send_message[length+5]; // add as much as you need to get all chars in (dont forget the \n on end)
Letme 0:272c70e2366c 58
Letme 0:272c70e2366c 59 switch(lvl) {
Letme 0:272c70e2366c 60 case L_CRIT_ERROR:
Letme 1:8837abc3f763 61 snprintf(send_message,length+7,"CE: %s %s",msg,endline);
Letme 0:272c70e2366c 62 break;
Letme 0:272c70e2366c 63 case L_ERROR:
Letme 1:8837abc3f763 64 snprintf(send_message,length+6,"E: %s %s",msg,endline);
Letme 0:272c70e2366c 65 break;
Letme 0:272c70e2366c 66 case L_WARNING:
Letme 1:8837abc3f763 67 snprintf(send_message,length+6,"W: %s %s",msg,endline);
Letme 0:272c70e2366c 68 break;
Letme 0:272c70e2366c 69 case L_DEBUG:
Letme 1:8837abc3f763 70 snprintf(send_message,length+6,"D: %s %s",msg,endline);
Letme 0:272c70e2366c 71 break;
Letme 0:272c70e2366c 72 case L_INFO:
Letme 1:8837abc3f763 73 snprintf(send_message,length+6,"I: %s %s",msg,endline);
Letme 0:272c70e2366c 74 break;
Letme 0:272c70e2366c 75 default:
Letme 0:272c70e2366c 76 return -EINVAL;
Letme 0:272c70e2366c 77 }
Letme 0:272c70e2366c 78
Letme 0:272c70e2366c 79 switch(plc) {
Letme 0:272c70e2366c 80 case L_SERIAL:
Letme 1:8837abc3f763 81 if(logSerial.writeable()) {
Letme 1:8837abc3f763 82 logSerial.printf(send_message);
Letme 1:8837abc3f763 83 } else {
Letme 1:8837abc3f763 84 return -EBUSY;
Letme 1:8837abc3f763 85 }
Letme 0:272c70e2366c 86 break;
Letme 0:272c70e2366c 87 case L_FILE:
Letme 0:272c70e2366c 88 break;
Letme 0:272c70e2366c 89 case L_LED:
Letme 0:272c70e2366c 90 // find out what we want here -morse code would be fun ;)
Letme 0:272c70e2366c 91 break;
Letme 0:272c70e2366c 92 default:
Letme 0:272c70e2366c 93 return -EINVAL;
Letme 0:272c70e2366c 94
Letme 0:272c70e2366c 95 }
Letme 0:272c70e2366c 96
Letme 0:272c70e2366c 97 return 1;
Letme 0:272c70e2366c 98 }
Letme 0:272c70e2366c 99
Letme 1:8837abc3f763 100 /// stash_buffer size
Letme 1:8837abc3f763 101 char stash_buffer[STASH_BUFFER_LEN];
Letme 0:272c70e2366c 102 /**
Letme 0:272c70e2366c 103 * Log_stash is meant to stash logs until they are ready to be sent, using log_pop function
Letme 0:272c70e2366c 104 * Remember that this function can return also buffer full as result, which means you have to keep
Letme 0:272c70e2366c 105 * deciding what you want to do - it just stashes files, but it keeps them in in case of buffer overflow.
Letme 0:272c70e2366c 106 * @param lvl Debug level (ERROR,WARNING,DEBUG)
Letme 0:272c70e2366c 107 * @param msg pointer to message
Letme 0:272c70e2366c 108 * @param length length of message
Letme 0:272c70e2366c 109 *
Letme 0:272c70e2366c 110 * @retval 1 success
Letme 0:272c70e2366c 111 * @retval -ERR linux errno error message - also includes buffer full!
Letme 0:272c70e2366c 112 *
Letme 0:272c70e2366c 113 * @warning STASH_BUFFER_LEN sets the size of stash buffer - in case you are lacking space consider making the buffer smaller
Letme 0:272c70e2366c 114 */
Letme 1:8837abc3f763 115 int32_t log_stash(uint8_t lvl, char *msg, uint32_t length) {
Letme 1:8837abc3f763 116 char stash_buffer_tmp[length+8];
Letme 0:272c70e2366c 117 // check if buffer is full and set starting point
Letme 1:8837abc3f763 118 if(strlen(stash_buffer)>STASH_BUFFER_LEN) {
Letme 1:8837abc3f763 119 return -EFBIG;
Letme 1:8837abc3f763 120 }
Letme 0:272c70e2366c 121
Letme 0:272c70e2366c 122 // now fill it
Letme 0:272c70e2366c 123 switch(lvl) {
Letme 0:272c70e2366c 124 case L_CRIT_ERROR:
Letme 1:8837abc3f763 125 snprintf(stash_buffer_tmp,length+7,"CE: %s %s",msg,endline);
Letme 0:272c70e2366c 126 break;
Letme 0:272c70e2366c 127 case L_ERROR:
Letme 1:8837abc3f763 128 snprintf(stash_buffer_tmp,length+6,"E: %s %s",msg,endline);
Letme 0:272c70e2366c 129 break;
Letme 0:272c70e2366c 130 case L_WARNING:
Letme 1:8837abc3f763 131 snprintf(stash_buffer_tmp,length+6,"W: %s %s",msg,endline);
Letme 0:272c70e2366c 132 break;
Letme 0:272c70e2366c 133 case L_DEBUG:
Letme 1:8837abc3f763 134 snprintf(stash_buffer_tmp,length+6,"D: %s %s",msg,endline);
Letme 0:272c70e2366c 135 break;
Letme 0:272c70e2366c 136 case L_INFO:
Letme 1:8837abc3f763 137 snprintf(stash_buffer_tmp,length+6,"I: %s %s",msg,endline);
Letme 0:272c70e2366c 138 break;
Letme 0:272c70e2366c 139 default:
Letme 0:272c70e2366c 140 return -EINVAL;
Letme 0:272c70e2366c 141 }
Letme 1:8837abc3f763 142 strcat(stash_buffer,stash_buffer_tmp);
Letme 0:272c70e2366c 143 return 1;
Letme 0:272c70e2366c 144 }
Letme 0:272c70e2366c 145
Letme 0:272c70e2366c 146 /**
Letme 0:272c70e2366c 147 * Log_pop function sends everything log_stash stashed
Letme 0:272c70e2366c 148 * @param plc Place to where you pop stashed messages
Letme 1:8837abc3f763 149 *
Letme 1:8837abc3f763 150 * @retval 1 for sucess
Letme 1:8837abc3f763 151 * @retval -ERR errno.h error message
Letme 0:272c70e2366c 152 */
Letme 1:8837abc3f763 153 int32_t log_pop(uint8_t plc) {
Letme 1:8837abc3f763 154 switch(plc) {
Letme 1:8837abc3f763 155 case L_SERIAL:
Letme 1:8837abc3f763 156 if(logSerial.writeable()) {
Letme 1:8837abc3f763 157 logSerial.printf(stash_buffer);
Letme 1:8837abc3f763 158 } else {
Letme 1:8837abc3f763 159 return -EBUSY;
Letme 1:8837abc3f763 160 }
Letme 1:8837abc3f763 161 break;
Letme 1:8837abc3f763 162 case L_FILE:
Letme 1:8837abc3f763 163 break;
Letme 1:8837abc3f763 164 case L_LED:
Letme 1:8837abc3f763 165 // find out what we want here -morse code would be fun ;)
Letme 1:8837abc3f763 166 break;
Letme 1:8837abc3f763 167 default:
Letme 1:8837abc3f763 168 return -EINVAL;
Letme 0:272c70e2366c 169
Letme 1:8837abc3f763 170 }
Letme 1:8837abc3f763 171
Letme 1:8837abc3f763 172 //clear stash buffer
Letme 1:8837abc3f763 173 int i;
Letme 1:8837abc3f763 174 for(i=0;i<STASH_BUFFER_LEN;++i) {
Letme 1:8837abc3f763 175 stash_buffer[i]=0;
Letme 1:8837abc3f763 176 }
Letme 1:8837abc3f763 177 return 1;
Letme 2:9d04753a3ad2 178 }
Letme 2:9d04753a3ad2 179 /**
Letme 2:9d04753a3ad2 180 * @}
Letme 2:9d04753a3ad2 181 */