The code from https://github.com/vpcola/Nucleo
Diff: Utility.cpp
- Revision:
- 0:5464d5e415e5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utility.cpp Wed Oct 08 11:00:24 2014 +0000 @@ -0,0 +1,144 @@ +#include "Utility.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#include <string> +#include <cctype> +#include <algorithm> + +extern I2C i2c; + +static void DisplayBuffer(Stream * chp, char * buff) +{ + int i = 0; + while(buff[i] != 0) + { + char c = buff[i]; + if (c == '\n') { + chp->printf("\r%c", c); + break; + } + else + chp->printf("%c", c); + + i++; + } +} + + +static int DisplayHeap(void* pBuffer, char const* pFormatString, ...) +{ + char* pStringEnd = (char*)pBuffer + strlen((char*)pBuffer); + va_list valist; + + va_start(valist, pFormatString); + + return vsprintf(pStringEnd, pFormatString, valist); +} + + +void heapinfo(Stream * chp) { + char OutputBuffer[256]; + chp->printf("Build Date/Time: %s %s\r\n", __DATE__, __TIME__); + chp->printf("Current Stack : 0x%08X\r\n", __current_sp()); + chp->printf("Current Heap : 0x%08X\r\n", __current_pc()); + + OutputBuffer[0] = '\0'; + typedef int (*__heapprt)(void *, char const *, ...); + __heapstats( (__heapprt)DisplayHeap, OutputBuffer ) ; + chp->printf("Available Memory: "); + DisplayBuffer(chp, OutputBuffer); +} + +char *_strtok(char *str, const char *delim, char **saveptr) +{ + char *token; + if (str) + *saveptr = str; + token = *saveptr; + + if (!token) + return NULL; + + token += strspn(token, delim); + *saveptr = strpbrk(token, delim); + if (*saveptr) + *(*saveptr)++ = '\0'; + + return *token ? token : NULL; +} + +void split( vector<string> & theStringVector, /* Altered/returned value */ + const string & theString, + const string & theDelimiter) +{ + size_t start = 0, end = 0; + while ( end != string::npos) + { + end = theString.find( theDelimiter, start); + + // If at end, use length=maxLength. Else use length=end-start. + theStringVector.push_back( theString.substr( start, + (end == string::npos) ? string::npos : end - start)); + + // If at end, use start=maxSize. Else use start=end+delimiter. + start = ( ( end > (string::npos - theDelimiter.size()) ) + ? string::npos : end + theDelimiter.size()); + } +} + +std::string trim(const std::string& str, + const std::string& whitespace) +{ + size_t strBegin = str.find_first_not_of(whitespace); + if (strBegin == std::string::npos) + return ""; // no content + + size_t strEnd = str.find_last_not_of(whitespace); + size_t strRange = strEnd - strBegin + 1; + + return str.substr(strBegin, strRange); +} + +static void transform_if_first_of_word( char& c ) +{ + // if the previous character was a space, transform it toupper + if( (*(&c - sizeof(char))) == ' ') + c = toupper( c ); +} + +void capitalize_word_start(std::string & str) +{ + str[ 0 ] = toupper( str[ 0 ]); + + std::for_each( str.begin()+1, str.end(), transform_if_first_of_word ); +} + +void set_ctrl_panel(int paneladdr, uint8_t value) +{ + char cmd[2]; + uint8_t addr; + + switch(paneladdr) + { + case 0: + addr = I2C_CTR_PANEL_ADDR; + cmd[0] = 0x12; + break; + case 1: + addr = I2C_CTR_PANEL_ADDR; + cmd[0] = 0x13; + break; + default: + // don't set anything for non-existing address + return; + } + + cmd[1] = value; + + i2c.write(addr, cmd, 2); +} + + +