The code from https://github.com/vpcola/Nucleo
Utility.cpp@0:5464d5e415e5, 2014-10-08 (annotated)
- Committer:
- sinrab
- Date:
- Wed Oct 08 11:00:24 2014 +0000
- Revision:
- 0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sinrab | 0:5464d5e415e5 | 1 | #include "Utility.h" |
sinrab | 0:5464d5e415e5 | 2 | #include <stdlib.h> |
sinrab | 0:5464d5e415e5 | 3 | #include <stdio.h> |
sinrab | 0:5464d5e415e5 | 4 | #include <string.h> |
sinrab | 0:5464d5e415e5 | 5 | #include <stdarg.h> |
sinrab | 0:5464d5e415e5 | 6 | #include <string> |
sinrab | 0:5464d5e415e5 | 7 | #include <cctype> |
sinrab | 0:5464d5e415e5 | 8 | #include <algorithm> |
sinrab | 0:5464d5e415e5 | 9 | |
sinrab | 0:5464d5e415e5 | 10 | extern I2C i2c; |
sinrab | 0:5464d5e415e5 | 11 | |
sinrab | 0:5464d5e415e5 | 12 | static void DisplayBuffer(Stream * chp, char * buff) |
sinrab | 0:5464d5e415e5 | 13 | { |
sinrab | 0:5464d5e415e5 | 14 | int i = 0; |
sinrab | 0:5464d5e415e5 | 15 | while(buff[i] != 0) |
sinrab | 0:5464d5e415e5 | 16 | { |
sinrab | 0:5464d5e415e5 | 17 | char c = buff[i]; |
sinrab | 0:5464d5e415e5 | 18 | if (c == '\n') { |
sinrab | 0:5464d5e415e5 | 19 | chp->printf("\r%c", c); |
sinrab | 0:5464d5e415e5 | 20 | break; |
sinrab | 0:5464d5e415e5 | 21 | } |
sinrab | 0:5464d5e415e5 | 22 | else |
sinrab | 0:5464d5e415e5 | 23 | chp->printf("%c", c); |
sinrab | 0:5464d5e415e5 | 24 | |
sinrab | 0:5464d5e415e5 | 25 | i++; |
sinrab | 0:5464d5e415e5 | 26 | } |
sinrab | 0:5464d5e415e5 | 27 | } |
sinrab | 0:5464d5e415e5 | 28 | |
sinrab | 0:5464d5e415e5 | 29 | |
sinrab | 0:5464d5e415e5 | 30 | static int DisplayHeap(void* pBuffer, char const* pFormatString, ...) |
sinrab | 0:5464d5e415e5 | 31 | { |
sinrab | 0:5464d5e415e5 | 32 | char* pStringEnd = (char*)pBuffer + strlen((char*)pBuffer); |
sinrab | 0:5464d5e415e5 | 33 | va_list valist; |
sinrab | 0:5464d5e415e5 | 34 | |
sinrab | 0:5464d5e415e5 | 35 | va_start(valist, pFormatString); |
sinrab | 0:5464d5e415e5 | 36 | |
sinrab | 0:5464d5e415e5 | 37 | return vsprintf(pStringEnd, pFormatString, valist); |
sinrab | 0:5464d5e415e5 | 38 | } |
sinrab | 0:5464d5e415e5 | 39 | |
sinrab | 0:5464d5e415e5 | 40 | |
sinrab | 0:5464d5e415e5 | 41 | void heapinfo(Stream * chp) { |
sinrab | 0:5464d5e415e5 | 42 | char OutputBuffer[256]; |
sinrab | 0:5464d5e415e5 | 43 | chp->printf("Build Date/Time: %s %s\r\n", __DATE__, __TIME__); |
sinrab | 0:5464d5e415e5 | 44 | chp->printf("Current Stack : 0x%08X\r\n", __current_sp()); |
sinrab | 0:5464d5e415e5 | 45 | chp->printf("Current Heap : 0x%08X\r\n", __current_pc()); |
sinrab | 0:5464d5e415e5 | 46 | |
sinrab | 0:5464d5e415e5 | 47 | OutputBuffer[0] = '\0'; |
sinrab | 0:5464d5e415e5 | 48 | typedef int (*__heapprt)(void *, char const *, ...); |
sinrab | 0:5464d5e415e5 | 49 | __heapstats( (__heapprt)DisplayHeap, OutputBuffer ) ; |
sinrab | 0:5464d5e415e5 | 50 | chp->printf("Available Memory: "); |
sinrab | 0:5464d5e415e5 | 51 | DisplayBuffer(chp, OutputBuffer); |
sinrab | 0:5464d5e415e5 | 52 | } |
sinrab | 0:5464d5e415e5 | 53 | |
sinrab | 0:5464d5e415e5 | 54 | char *_strtok(char *str, const char *delim, char **saveptr) |
sinrab | 0:5464d5e415e5 | 55 | { |
sinrab | 0:5464d5e415e5 | 56 | char *token; |
sinrab | 0:5464d5e415e5 | 57 | if (str) |
sinrab | 0:5464d5e415e5 | 58 | *saveptr = str; |
sinrab | 0:5464d5e415e5 | 59 | token = *saveptr; |
sinrab | 0:5464d5e415e5 | 60 | |
sinrab | 0:5464d5e415e5 | 61 | if (!token) |
sinrab | 0:5464d5e415e5 | 62 | return NULL; |
sinrab | 0:5464d5e415e5 | 63 | |
sinrab | 0:5464d5e415e5 | 64 | token += strspn(token, delim); |
sinrab | 0:5464d5e415e5 | 65 | *saveptr = strpbrk(token, delim); |
sinrab | 0:5464d5e415e5 | 66 | if (*saveptr) |
sinrab | 0:5464d5e415e5 | 67 | *(*saveptr)++ = '\0'; |
sinrab | 0:5464d5e415e5 | 68 | |
sinrab | 0:5464d5e415e5 | 69 | return *token ? token : NULL; |
sinrab | 0:5464d5e415e5 | 70 | } |
sinrab | 0:5464d5e415e5 | 71 | |
sinrab | 0:5464d5e415e5 | 72 | void split( vector<string> & theStringVector, /* Altered/returned value */ |
sinrab | 0:5464d5e415e5 | 73 | const string & theString, |
sinrab | 0:5464d5e415e5 | 74 | const string & theDelimiter) |
sinrab | 0:5464d5e415e5 | 75 | { |
sinrab | 0:5464d5e415e5 | 76 | size_t start = 0, end = 0; |
sinrab | 0:5464d5e415e5 | 77 | while ( end != string::npos) |
sinrab | 0:5464d5e415e5 | 78 | { |
sinrab | 0:5464d5e415e5 | 79 | end = theString.find( theDelimiter, start); |
sinrab | 0:5464d5e415e5 | 80 | |
sinrab | 0:5464d5e415e5 | 81 | // If at end, use length=maxLength. Else use length=end-start. |
sinrab | 0:5464d5e415e5 | 82 | theStringVector.push_back( theString.substr( start, |
sinrab | 0:5464d5e415e5 | 83 | (end == string::npos) ? string::npos : end - start)); |
sinrab | 0:5464d5e415e5 | 84 | |
sinrab | 0:5464d5e415e5 | 85 | // If at end, use start=maxSize. Else use start=end+delimiter. |
sinrab | 0:5464d5e415e5 | 86 | start = ( ( end > (string::npos - theDelimiter.size()) ) |
sinrab | 0:5464d5e415e5 | 87 | ? string::npos : end + theDelimiter.size()); |
sinrab | 0:5464d5e415e5 | 88 | } |
sinrab | 0:5464d5e415e5 | 89 | } |
sinrab | 0:5464d5e415e5 | 90 | |
sinrab | 0:5464d5e415e5 | 91 | std::string trim(const std::string& str, |
sinrab | 0:5464d5e415e5 | 92 | const std::string& whitespace) |
sinrab | 0:5464d5e415e5 | 93 | { |
sinrab | 0:5464d5e415e5 | 94 | size_t strBegin = str.find_first_not_of(whitespace); |
sinrab | 0:5464d5e415e5 | 95 | if (strBegin == std::string::npos) |
sinrab | 0:5464d5e415e5 | 96 | return ""; // no content |
sinrab | 0:5464d5e415e5 | 97 | |
sinrab | 0:5464d5e415e5 | 98 | size_t strEnd = str.find_last_not_of(whitespace); |
sinrab | 0:5464d5e415e5 | 99 | size_t strRange = strEnd - strBegin + 1; |
sinrab | 0:5464d5e415e5 | 100 | |
sinrab | 0:5464d5e415e5 | 101 | return str.substr(strBegin, strRange); |
sinrab | 0:5464d5e415e5 | 102 | } |
sinrab | 0:5464d5e415e5 | 103 | |
sinrab | 0:5464d5e415e5 | 104 | static void transform_if_first_of_word( char& c ) |
sinrab | 0:5464d5e415e5 | 105 | { |
sinrab | 0:5464d5e415e5 | 106 | // if the previous character was a space, transform it toupper |
sinrab | 0:5464d5e415e5 | 107 | if( (*(&c - sizeof(char))) == ' ') |
sinrab | 0:5464d5e415e5 | 108 | c = toupper( c ); |
sinrab | 0:5464d5e415e5 | 109 | } |
sinrab | 0:5464d5e415e5 | 110 | |
sinrab | 0:5464d5e415e5 | 111 | void capitalize_word_start(std::string & str) |
sinrab | 0:5464d5e415e5 | 112 | { |
sinrab | 0:5464d5e415e5 | 113 | str[ 0 ] = toupper( str[ 0 ]); |
sinrab | 0:5464d5e415e5 | 114 | |
sinrab | 0:5464d5e415e5 | 115 | std::for_each( str.begin()+1, str.end(), transform_if_first_of_word ); |
sinrab | 0:5464d5e415e5 | 116 | } |
sinrab | 0:5464d5e415e5 | 117 | |
sinrab | 0:5464d5e415e5 | 118 | void set_ctrl_panel(int paneladdr, uint8_t value) |
sinrab | 0:5464d5e415e5 | 119 | { |
sinrab | 0:5464d5e415e5 | 120 | char cmd[2]; |
sinrab | 0:5464d5e415e5 | 121 | uint8_t addr; |
sinrab | 0:5464d5e415e5 | 122 | |
sinrab | 0:5464d5e415e5 | 123 | switch(paneladdr) |
sinrab | 0:5464d5e415e5 | 124 | { |
sinrab | 0:5464d5e415e5 | 125 | case 0: |
sinrab | 0:5464d5e415e5 | 126 | addr = I2C_CTR_PANEL_ADDR; |
sinrab | 0:5464d5e415e5 | 127 | cmd[0] = 0x12; |
sinrab | 0:5464d5e415e5 | 128 | break; |
sinrab | 0:5464d5e415e5 | 129 | case 1: |
sinrab | 0:5464d5e415e5 | 130 | addr = I2C_CTR_PANEL_ADDR; |
sinrab | 0:5464d5e415e5 | 131 | cmd[0] = 0x13; |
sinrab | 0:5464d5e415e5 | 132 | break; |
sinrab | 0:5464d5e415e5 | 133 | default: |
sinrab | 0:5464d5e415e5 | 134 | // don't set anything for non-existing address |
sinrab | 0:5464d5e415e5 | 135 | return; |
sinrab | 0:5464d5e415e5 | 136 | } |
sinrab | 0:5464d5e415e5 | 137 | |
sinrab | 0:5464d5e415e5 | 138 | cmd[1] = value; |
sinrab | 0:5464d5e415e5 | 139 | |
sinrab | 0:5464d5e415e5 | 140 | i2c.write(addr, cmd, 2); |
sinrab | 0:5464d5e415e5 | 141 | } |
sinrab | 0:5464d5e415e5 | 142 | |
sinrab | 0:5464d5e415e5 | 143 | |
sinrab | 0:5464d5e415e5 | 144 |