iTracker mbed os sample to show how to user the BLE API to expose sensor values (float and ints)

Committer:
knaresh89
Date:
Mon Feb 12 06:41:24 2018 +0000
Revision:
0:e4fe77192b73
iTracker mbed os sample to show how to user the BLE API to expose sensor values (float and ints)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
knaresh89 0:e4fe77192b73 1 /*********************************************************************
knaresh89 0:e4fe77192b73 2 * SEGGER MICROCONTROLLER GmbH & Co. KG *
knaresh89 0:e4fe77192b73 3 * Solutions for real time microcontroller applications *
knaresh89 0:e4fe77192b73 4 **********************************************************************
knaresh89 0:e4fe77192b73 5 * *
knaresh89 0:e4fe77192b73 6 * (c) 2014 - 2016 SEGGER Microcontroller GmbH & Co. KG *
knaresh89 0:e4fe77192b73 7 * *
knaresh89 0:e4fe77192b73 8 * www.segger.com Support: support@segger.com *
knaresh89 0:e4fe77192b73 9 * *
knaresh89 0:e4fe77192b73 10 **********************************************************************
knaresh89 0:e4fe77192b73 11 * *
knaresh89 0:e4fe77192b73 12 * SEGGER RTT * Real Time Transfer for embedded targets *
knaresh89 0:e4fe77192b73 13 * *
knaresh89 0:e4fe77192b73 14 **********************************************************************
knaresh89 0:e4fe77192b73 15 * *
knaresh89 0:e4fe77192b73 16 * All rights reserved. *
knaresh89 0:e4fe77192b73 17 * *
knaresh89 0:e4fe77192b73 18 * SEGGER strongly recommends to not make any changes *
knaresh89 0:e4fe77192b73 19 * to or modify the source code of this software in order to stay *
knaresh89 0:e4fe77192b73 20 * compatible with the RTT protocol and J-Link. *
knaresh89 0:e4fe77192b73 21 * *
knaresh89 0:e4fe77192b73 22 * Redistribution and use in source and binary forms, with or *
knaresh89 0:e4fe77192b73 23 * without modification, are permitted provided that the following *
knaresh89 0:e4fe77192b73 24 * conditions are met: *
knaresh89 0:e4fe77192b73 25 * *
knaresh89 0:e4fe77192b73 26 * o Redistributions of source code must retain the above copyright *
knaresh89 0:e4fe77192b73 27 * notice, this list of conditions and the following disclaimer. *
knaresh89 0:e4fe77192b73 28 * *
knaresh89 0:e4fe77192b73 29 * o Redistributions in binary form must reproduce the above *
knaresh89 0:e4fe77192b73 30 * copyright notice, this list of conditions and the following *
knaresh89 0:e4fe77192b73 31 * disclaimer in the documentation and/or other materials provided *
knaresh89 0:e4fe77192b73 32 * with the distribution. *
knaresh89 0:e4fe77192b73 33 * *
knaresh89 0:e4fe77192b73 34 * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
knaresh89 0:e4fe77192b73 35 * nor the names of its contributors may be used to endorse or *
knaresh89 0:e4fe77192b73 36 * promote products derived from this software without specific *
knaresh89 0:e4fe77192b73 37 * prior written permission. *
knaresh89 0:e4fe77192b73 38 * *
knaresh89 0:e4fe77192b73 39 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
knaresh89 0:e4fe77192b73 40 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
knaresh89 0:e4fe77192b73 41 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
knaresh89 0:e4fe77192b73 42 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
knaresh89 0:e4fe77192b73 43 * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
knaresh89 0:e4fe77192b73 44 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
knaresh89 0:e4fe77192b73 45 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
knaresh89 0:e4fe77192b73 46 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
knaresh89 0:e4fe77192b73 47 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
knaresh89 0:e4fe77192b73 48 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
knaresh89 0:e4fe77192b73 49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
knaresh89 0:e4fe77192b73 50 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
knaresh89 0:e4fe77192b73 51 * DAMAGE. *
knaresh89 0:e4fe77192b73 52 * *
knaresh89 0:e4fe77192b73 53 **********************************************************************
knaresh89 0:e4fe77192b73 54 ---------------------------END-OF-HEADER------------------------------
knaresh89 0:e4fe77192b73 55 File : SEGGER_RTT_printf.c
knaresh89 0:e4fe77192b73 56 Purpose : Replacement for printf to write formatted data via RTT
knaresh89 0:e4fe77192b73 57 Revision: $Rev: 4351 $
knaresh89 0:e4fe77192b73 58 ----------------------------------------------------------------------
knaresh89 0:e4fe77192b73 59 */
knaresh89 0:e4fe77192b73 60 #include "SEGGER_RTT.h"
knaresh89 0:e4fe77192b73 61 #include "SEGGER_RTT_Conf.h"
knaresh89 0:e4fe77192b73 62
knaresh89 0:e4fe77192b73 63 /*********************************************************************
knaresh89 0:e4fe77192b73 64 *
knaresh89 0:e4fe77192b73 65 * Defines, configurable
knaresh89 0:e4fe77192b73 66 *
knaresh89 0:e4fe77192b73 67 **********************************************************************
knaresh89 0:e4fe77192b73 68 */
knaresh89 0:e4fe77192b73 69
knaresh89 0:e4fe77192b73 70 #ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE
knaresh89 0:e4fe77192b73 71 #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64)
knaresh89 0:e4fe77192b73 72 #endif
knaresh89 0:e4fe77192b73 73
knaresh89 0:e4fe77192b73 74 #include <stdlib.h>
knaresh89 0:e4fe77192b73 75 #include <stdarg.h>
knaresh89 0:e4fe77192b73 76
knaresh89 0:e4fe77192b73 77
knaresh89 0:e4fe77192b73 78 #define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0)
knaresh89 0:e4fe77192b73 79 #define FORMAT_FLAG_PAD_ZERO (1u << 1)
knaresh89 0:e4fe77192b73 80 #define FORMAT_FLAG_PRINT_SIGN (1u << 2)
knaresh89 0:e4fe77192b73 81 #define FORMAT_FLAG_ALTERNATE (1u << 3)
knaresh89 0:e4fe77192b73 82
knaresh89 0:e4fe77192b73 83 /*********************************************************************
knaresh89 0:e4fe77192b73 84 *
knaresh89 0:e4fe77192b73 85 * Types
knaresh89 0:e4fe77192b73 86 *
knaresh89 0:e4fe77192b73 87 **********************************************************************
knaresh89 0:e4fe77192b73 88 */
knaresh89 0:e4fe77192b73 89
knaresh89 0:e4fe77192b73 90 typedef struct {
knaresh89 0:e4fe77192b73 91 char* pBuffer;
knaresh89 0:e4fe77192b73 92 unsigned BufferSize;
knaresh89 0:e4fe77192b73 93 unsigned Cnt;
knaresh89 0:e4fe77192b73 94
knaresh89 0:e4fe77192b73 95 int ReturnValue;
knaresh89 0:e4fe77192b73 96
knaresh89 0:e4fe77192b73 97 unsigned RTTBufferIndex;
knaresh89 0:e4fe77192b73 98 } SEGGER_RTT_PRINTF_DESC;
knaresh89 0:e4fe77192b73 99
knaresh89 0:e4fe77192b73 100 /*********************************************************************
knaresh89 0:e4fe77192b73 101 *
knaresh89 0:e4fe77192b73 102 * Function prototypes
knaresh89 0:e4fe77192b73 103 *
knaresh89 0:e4fe77192b73 104 **********************************************************************
knaresh89 0:e4fe77192b73 105 */
knaresh89 0:e4fe77192b73 106 int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList);
knaresh89 0:e4fe77192b73 107
knaresh89 0:e4fe77192b73 108 /*********************************************************************
knaresh89 0:e4fe77192b73 109 *
knaresh89 0:e4fe77192b73 110 * Static code
knaresh89 0:e4fe77192b73 111 *
knaresh89 0:e4fe77192b73 112 **********************************************************************
knaresh89 0:e4fe77192b73 113 */
knaresh89 0:e4fe77192b73 114 /*********************************************************************
knaresh89 0:e4fe77192b73 115 *
knaresh89 0:e4fe77192b73 116 * _StoreChar
knaresh89 0:e4fe77192b73 117 */
knaresh89 0:e4fe77192b73 118 static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) {
knaresh89 0:e4fe77192b73 119 unsigned Cnt;
knaresh89 0:e4fe77192b73 120
knaresh89 0:e4fe77192b73 121 Cnt = p->Cnt;
knaresh89 0:e4fe77192b73 122 if ((Cnt + 1u) <= p->BufferSize) {
knaresh89 0:e4fe77192b73 123 *(p->pBuffer + Cnt) = c;
knaresh89 0:e4fe77192b73 124 p->Cnt = Cnt + 1u;
knaresh89 0:e4fe77192b73 125 p->ReturnValue++;
knaresh89 0:e4fe77192b73 126 }
knaresh89 0:e4fe77192b73 127 //
knaresh89 0:e4fe77192b73 128 // Write part of string, when the buffer is full
knaresh89 0:e4fe77192b73 129 //
knaresh89 0:e4fe77192b73 130 if (p->Cnt == p->BufferSize) {
knaresh89 0:e4fe77192b73 131 if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) {
knaresh89 0:e4fe77192b73 132 p->ReturnValue = -1;
knaresh89 0:e4fe77192b73 133 } else {
knaresh89 0:e4fe77192b73 134 p->Cnt = 0u;
knaresh89 0:e4fe77192b73 135 }
knaresh89 0:e4fe77192b73 136 }
knaresh89 0:e4fe77192b73 137 }
knaresh89 0:e4fe77192b73 138
knaresh89 0:e4fe77192b73 139 /*********************************************************************
knaresh89 0:e4fe77192b73 140 *
knaresh89 0:e4fe77192b73 141 * _PrintUnsigned
knaresh89 0:e4fe77192b73 142 */
knaresh89 0:e4fe77192b73 143 static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) {
knaresh89 0:e4fe77192b73 144 static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
knaresh89 0:e4fe77192b73 145 unsigned Div;
knaresh89 0:e4fe77192b73 146 unsigned Digit;
knaresh89 0:e4fe77192b73 147 unsigned Number;
knaresh89 0:e4fe77192b73 148 unsigned Width;
knaresh89 0:e4fe77192b73 149 char c;
knaresh89 0:e4fe77192b73 150
knaresh89 0:e4fe77192b73 151 Number = v;
knaresh89 0:e4fe77192b73 152 Digit = 1u;
knaresh89 0:e4fe77192b73 153 //
knaresh89 0:e4fe77192b73 154 // Get actual field width
knaresh89 0:e4fe77192b73 155 //
knaresh89 0:e4fe77192b73 156 Width = 1u;
knaresh89 0:e4fe77192b73 157 while (Number >= Base) {
knaresh89 0:e4fe77192b73 158 Number = (Number / Base);
knaresh89 0:e4fe77192b73 159 Width++;
knaresh89 0:e4fe77192b73 160 }
knaresh89 0:e4fe77192b73 161 if (NumDigits > Width) {
knaresh89 0:e4fe77192b73 162 Width = NumDigits;
knaresh89 0:e4fe77192b73 163 }
knaresh89 0:e4fe77192b73 164 //
knaresh89 0:e4fe77192b73 165 // Print leading chars if necessary
knaresh89 0:e4fe77192b73 166 //
knaresh89 0:e4fe77192b73 167 if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) {
knaresh89 0:e4fe77192b73 168 if (FieldWidth != 0u) {
knaresh89 0:e4fe77192b73 169 if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) {
knaresh89 0:e4fe77192b73 170 c = '0';
knaresh89 0:e4fe77192b73 171 } else {
knaresh89 0:e4fe77192b73 172 c = ' ';
knaresh89 0:e4fe77192b73 173 }
knaresh89 0:e4fe77192b73 174 while ((FieldWidth != 0u) && (Width < FieldWidth)) {
knaresh89 0:e4fe77192b73 175 FieldWidth--;
knaresh89 0:e4fe77192b73 176 _StoreChar(pBufferDesc, c);
knaresh89 0:e4fe77192b73 177 if (pBufferDesc->ReturnValue < 0) {
knaresh89 0:e4fe77192b73 178 break;
knaresh89 0:e4fe77192b73 179 }
knaresh89 0:e4fe77192b73 180 }
knaresh89 0:e4fe77192b73 181 }
knaresh89 0:e4fe77192b73 182 }
knaresh89 0:e4fe77192b73 183 if (pBufferDesc->ReturnValue >= 0) {
knaresh89 0:e4fe77192b73 184 //
knaresh89 0:e4fe77192b73 185 // Compute Digit.
knaresh89 0:e4fe77192b73 186 // Loop until Digit has the value of the highest digit required.
knaresh89 0:e4fe77192b73 187 // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100.
knaresh89 0:e4fe77192b73 188 //
knaresh89 0:e4fe77192b73 189 while (1) {
knaresh89 0:e4fe77192b73 190 if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned)
knaresh89 0:e4fe77192b73 191 NumDigits--;
knaresh89 0:e4fe77192b73 192 } else {
knaresh89 0:e4fe77192b73 193 Div = v / Digit;
knaresh89 0:e4fe77192b73 194 if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done
knaresh89 0:e4fe77192b73 195 break;
knaresh89 0:e4fe77192b73 196 }
knaresh89 0:e4fe77192b73 197 }
knaresh89 0:e4fe77192b73 198 Digit *= Base;
knaresh89 0:e4fe77192b73 199 }
knaresh89 0:e4fe77192b73 200 //
knaresh89 0:e4fe77192b73 201 // Output digits
knaresh89 0:e4fe77192b73 202 //
knaresh89 0:e4fe77192b73 203 do {
knaresh89 0:e4fe77192b73 204 Div = v / Digit;
knaresh89 0:e4fe77192b73 205 v -= Div * Digit;
knaresh89 0:e4fe77192b73 206 _StoreChar(pBufferDesc, _aV2C[Div]);
knaresh89 0:e4fe77192b73 207 if (pBufferDesc->ReturnValue < 0) {
knaresh89 0:e4fe77192b73 208 break;
knaresh89 0:e4fe77192b73 209 }
knaresh89 0:e4fe77192b73 210 Digit /= Base;
knaresh89 0:e4fe77192b73 211 } while (Digit);
knaresh89 0:e4fe77192b73 212 //
knaresh89 0:e4fe77192b73 213 // Print trailing spaces if necessary
knaresh89 0:e4fe77192b73 214 //
knaresh89 0:e4fe77192b73 215 if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) {
knaresh89 0:e4fe77192b73 216 if (FieldWidth != 0u) {
knaresh89 0:e4fe77192b73 217 while ((FieldWidth != 0u) && (Width < FieldWidth)) {
knaresh89 0:e4fe77192b73 218 FieldWidth--;
knaresh89 0:e4fe77192b73 219 _StoreChar(pBufferDesc, ' ');
knaresh89 0:e4fe77192b73 220 if (pBufferDesc->ReturnValue < 0) {
knaresh89 0:e4fe77192b73 221 break;
knaresh89 0:e4fe77192b73 222 }
knaresh89 0:e4fe77192b73 223 }
knaresh89 0:e4fe77192b73 224 }
knaresh89 0:e4fe77192b73 225 }
knaresh89 0:e4fe77192b73 226 }
knaresh89 0:e4fe77192b73 227 }
knaresh89 0:e4fe77192b73 228
knaresh89 0:e4fe77192b73 229 /*********************************************************************
knaresh89 0:e4fe77192b73 230 *
knaresh89 0:e4fe77192b73 231 * _PrintInt
knaresh89 0:e4fe77192b73 232 */
knaresh89 0:e4fe77192b73 233 static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) {
knaresh89 0:e4fe77192b73 234 unsigned Width;
knaresh89 0:e4fe77192b73 235 int Number;
knaresh89 0:e4fe77192b73 236
knaresh89 0:e4fe77192b73 237 Number = (v < 0) ? -v : v;
knaresh89 0:e4fe77192b73 238
knaresh89 0:e4fe77192b73 239 //
knaresh89 0:e4fe77192b73 240 // Get actual field width
knaresh89 0:e4fe77192b73 241 //
knaresh89 0:e4fe77192b73 242 Width = 1u;
knaresh89 0:e4fe77192b73 243 while (Number >= (int)Base) {
knaresh89 0:e4fe77192b73 244 Number = (Number / (int)Base);
knaresh89 0:e4fe77192b73 245 Width++;
knaresh89 0:e4fe77192b73 246 }
knaresh89 0:e4fe77192b73 247 if (NumDigits > Width) {
knaresh89 0:e4fe77192b73 248 Width = NumDigits;
knaresh89 0:e4fe77192b73 249 }
knaresh89 0:e4fe77192b73 250 if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) {
knaresh89 0:e4fe77192b73 251 FieldWidth--;
knaresh89 0:e4fe77192b73 252 }
knaresh89 0:e4fe77192b73 253
knaresh89 0:e4fe77192b73 254 //
knaresh89 0:e4fe77192b73 255 // Print leading spaces if necessary
knaresh89 0:e4fe77192b73 256 //
knaresh89 0:e4fe77192b73 257 if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) {
knaresh89 0:e4fe77192b73 258 if (FieldWidth != 0u) {
knaresh89 0:e4fe77192b73 259 while ((FieldWidth != 0u) && (Width < FieldWidth)) {
knaresh89 0:e4fe77192b73 260 FieldWidth--;
knaresh89 0:e4fe77192b73 261 _StoreChar(pBufferDesc, ' ');
knaresh89 0:e4fe77192b73 262 if (pBufferDesc->ReturnValue < 0) {
knaresh89 0:e4fe77192b73 263 break;
knaresh89 0:e4fe77192b73 264 }
knaresh89 0:e4fe77192b73 265 }
knaresh89 0:e4fe77192b73 266 }
knaresh89 0:e4fe77192b73 267 }
knaresh89 0:e4fe77192b73 268 //
knaresh89 0:e4fe77192b73 269 // Print sign if necessary
knaresh89 0:e4fe77192b73 270 //
knaresh89 0:e4fe77192b73 271 if (pBufferDesc->ReturnValue >= 0) {
knaresh89 0:e4fe77192b73 272 if (v < 0) {
knaresh89 0:e4fe77192b73 273 v = -v;
knaresh89 0:e4fe77192b73 274 _StoreChar(pBufferDesc, '-');
knaresh89 0:e4fe77192b73 275 } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) {
knaresh89 0:e4fe77192b73 276 _StoreChar(pBufferDesc, '+');
knaresh89 0:e4fe77192b73 277 } else {
knaresh89 0:e4fe77192b73 278
knaresh89 0:e4fe77192b73 279 }
knaresh89 0:e4fe77192b73 280 if (pBufferDesc->ReturnValue >= 0) {
knaresh89 0:e4fe77192b73 281 //
knaresh89 0:e4fe77192b73 282 // Print leading zeros if necessary
knaresh89 0:e4fe77192b73 283 //
knaresh89 0:e4fe77192b73 284 if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) {
knaresh89 0:e4fe77192b73 285 if (FieldWidth != 0u) {
knaresh89 0:e4fe77192b73 286 while ((FieldWidth != 0u) && (Width < FieldWidth)) {
knaresh89 0:e4fe77192b73 287 FieldWidth--;
knaresh89 0:e4fe77192b73 288 _StoreChar(pBufferDesc, '0');
knaresh89 0:e4fe77192b73 289 if (pBufferDesc->ReturnValue < 0) {
knaresh89 0:e4fe77192b73 290 break;
knaresh89 0:e4fe77192b73 291 }
knaresh89 0:e4fe77192b73 292 }
knaresh89 0:e4fe77192b73 293 }
knaresh89 0:e4fe77192b73 294 }
knaresh89 0:e4fe77192b73 295 if (pBufferDesc->ReturnValue >= 0) {
knaresh89 0:e4fe77192b73 296 //
knaresh89 0:e4fe77192b73 297 // Print number without sign
knaresh89 0:e4fe77192b73 298 //
knaresh89 0:e4fe77192b73 299 _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags);
knaresh89 0:e4fe77192b73 300 }
knaresh89 0:e4fe77192b73 301 }
knaresh89 0:e4fe77192b73 302 }
knaresh89 0:e4fe77192b73 303 }
knaresh89 0:e4fe77192b73 304
knaresh89 0:e4fe77192b73 305 /*********************************************************************
knaresh89 0:e4fe77192b73 306 *
knaresh89 0:e4fe77192b73 307 * Public code
knaresh89 0:e4fe77192b73 308 *
knaresh89 0:e4fe77192b73 309 **********************************************************************
knaresh89 0:e4fe77192b73 310 */
knaresh89 0:e4fe77192b73 311 /*********************************************************************
knaresh89 0:e4fe77192b73 312 *
knaresh89 0:e4fe77192b73 313 * SEGGER_RTT_vprintf
knaresh89 0:e4fe77192b73 314 *
knaresh89 0:e4fe77192b73 315 * Function description
knaresh89 0:e4fe77192b73 316 * Stores a formatted string in SEGGER RTT control block.
knaresh89 0:e4fe77192b73 317 * This data is read by the host.
knaresh89 0:e4fe77192b73 318 *
knaresh89 0:e4fe77192b73 319 * Parameters
knaresh89 0:e4fe77192b73 320 * BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal")
knaresh89 0:e4fe77192b73 321 * sFormat Pointer to format string
knaresh89 0:e4fe77192b73 322 * pParamList Pointer to the list of arguments for the format string
knaresh89 0:e4fe77192b73 323 *
knaresh89 0:e4fe77192b73 324 * Return values
knaresh89 0:e4fe77192b73 325 * >= 0: Number of bytes which have been stored in the "Up"-buffer.
knaresh89 0:e4fe77192b73 326 * < 0: Error
knaresh89 0:e4fe77192b73 327 */
knaresh89 0:e4fe77192b73 328 int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) {
knaresh89 0:e4fe77192b73 329 char c;
knaresh89 0:e4fe77192b73 330 SEGGER_RTT_PRINTF_DESC BufferDesc;
knaresh89 0:e4fe77192b73 331 int v;
knaresh89 0:e4fe77192b73 332 unsigned NumDigits;
knaresh89 0:e4fe77192b73 333 unsigned FormatFlags;
knaresh89 0:e4fe77192b73 334 unsigned FieldWidth;
knaresh89 0:e4fe77192b73 335 char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE];
knaresh89 0:e4fe77192b73 336
knaresh89 0:e4fe77192b73 337 BufferDesc.pBuffer = acBuffer;
knaresh89 0:e4fe77192b73 338 BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE;
knaresh89 0:e4fe77192b73 339 BufferDesc.Cnt = 0u;
knaresh89 0:e4fe77192b73 340 BufferDesc.RTTBufferIndex = BufferIndex;
knaresh89 0:e4fe77192b73 341 BufferDesc.ReturnValue = 0;
knaresh89 0:e4fe77192b73 342
knaresh89 0:e4fe77192b73 343 do {
knaresh89 0:e4fe77192b73 344 c = *sFormat;
knaresh89 0:e4fe77192b73 345 sFormat++;
knaresh89 0:e4fe77192b73 346 if (c == 0u) {
knaresh89 0:e4fe77192b73 347 break;
knaresh89 0:e4fe77192b73 348 }
knaresh89 0:e4fe77192b73 349 if (c == '%') {
knaresh89 0:e4fe77192b73 350 //
knaresh89 0:e4fe77192b73 351 // Filter out flags
knaresh89 0:e4fe77192b73 352 //
knaresh89 0:e4fe77192b73 353 FormatFlags = 0u;
knaresh89 0:e4fe77192b73 354 v = 1;
knaresh89 0:e4fe77192b73 355 do {
knaresh89 0:e4fe77192b73 356 c = *sFormat;
knaresh89 0:e4fe77192b73 357 switch (c) {
knaresh89 0:e4fe77192b73 358 case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break;
knaresh89 0:e4fe77192b73 359 case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break;
knaresh89 0:e4fe77192b73 360 case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break;
knaresh89 0:e4fe77192b73 361 case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break;
knaresh89 0:e4fe77192b73 362 default: v = 0; break;
knaresh89 0:e4fe77192b73 363 }
knaresh89 0:e4fe77192b73 364 } while (v);
knaresh89 0:e4fe77192b73 365 //
knaresh89 0:e4fe77192b73 366 // filter out field with
knaresh89 0:e4fe77192b73 367 //
knaresh89 0:e4fe77192b73 368 FieldWidth = 0u;
knaresh89 0:e4fe77192b73 369 do {
knaresh89 0:e4fe77192b73 370 c = *sFormat;
knaresh89 0:e4fe77192b73 371 if ((c < '0') || (c > '9')) {
knaresh89 0:e4fe77192b73 372 break;
knaresh89 0:e4fe77192b73 373 }
knaresh89 0:e4fe77192b73 374 sFormat++;
knaresh89 0:e4fe77192b73 375 FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0');
knaresh89 0:e4fe77192b73 376 } while (1);
knaresh89 0:e4fe77192b73 377
knaresh89 0:e4fe77192b73 378 //
knaresh89 0:e4fe77192b73 379 // Filter out precision (number of digits to display)
knaresh89 0:e4fe77192b73 380 //
knaresh89 0:e4fe77192b73 381 NumDigits = 0u;
knaresh89 0:e4fe77192b73 382 c = *sFormat;
knaresh89 0:e4fe77192b73 383 if (c == '.') {
knaresh89 0:e4fe77192b73 384 sFormat++;
knaresh89 0:e4fe77192b73 385 do {
knaresh89 0:e4fe77192b73 386 c = *sFormat;
knaresh89 0:e4fe77192b73 387 if ((c < '0') || (c > '9')) {
knaresh89 0:e4fe77192b73 388 break;
knaresh89 0:e4fe77192b73 389 }
knaresh89 0:e4fe77192b73 390 sFormat++;
knaresh89 0:e4fe77192b73 391 NumDigits = NumDigits * 10u + ((unsigned)c - '0');
knaresh89 0:e4fe77192b73 392 } while (1);
knaresh89 0:e4fe77192b73 393 }
knaresh89 0:e4fe77192b73 394 //
knaresh89 0:e4fe77192b73 395 // Filter out length modifier
knaresh89 0:e4fe77192b73 396 //
knaresh89 0:e4fe77192b73 397 c = *sFormat;
knaresh89 0:e4fe77192b73 398 do {
knaresh89 0:e4fe77192b73 399 if ((c == 'l') || (c == 'h')) {
knaresh89 0:e4fe77192b73 400 sFormat++;
knaresh89 0:e4fe77192b73 401 c = *sFormat;
knaresh89 0:e4fe77192b73 402 } else {
knaresh89 0:e4fe77192b73 403 break;
knaresh89 0:e4fe77192b73 404 }
knaresh89 0:e4fe77192b73 405 } while (1);
knaresh89 0:e4fe77192b73 406 //
knaresh89 0:e4fe77192b73 407 // Handle specifiers
knaresh89 0:e4fe77192b73 408 //
knaresh89 0:e4fe77192b73 409 switch (c) {
knaresh89 0:e4fe77192b73 410 case 'c': {
knaresh89 0:e4fe77192b73 411 char c0;
knaresh89 0:e4fe77192b73 412 v = va_arg(*pParamList, int);
knaresh89 0:e4fe77192b73 413 c0 = (char)v;
knaresh89 0:e4fe77192b73 414 _StoreChar(&BufferDesc, c0);
knaresh89 0:e4fe77192b73 415 break;
knaresh89 0:e4fe77192b73 416 }
knaresh89 0:e4fe77192b73 417 case 'd':
knaresh89 0:e4fe77192b73 418 v = va_arg(*pParamList, int);
knaresh89 0:e4fe77192b73 419 _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);
knaresh89 0:e4fe77192b73 420 break;
knaresh89 0:e4fe77192b73 421 case 'u':
knaresh89 0:e4fe77192b73 422 v = va_arg(*pParamList, int);
knaresh89 0:e4fe77192b73 423 _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags);
knaresh89 0:e4fe77192b73 424 break;
knaresh89 0:e4fe77192b73 425 case 'x':
knaresh89 0:e4fe77192b73 426 case 'X':
knaresh89 0:e4fe77192b73 427 v = va_arg(*pParamList, int);
knaresh89 0:e4fe77192b73 428 _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags);
knaresh89 0:e4fe77192b73 429 break;
knaresh89 0:e4fe77192b73 430 case 's':
knaresh89 0:e4fe77192b73 431 {
knaresh89 0:e4fe77192b73 432 const char * s = va_arg(*pParamList, const char *);
knaresh89 0:e4fe77192b73 433 do {
knaresh89 0:e4fe77192b73 434 c = *s;
knaresh89 0:e4fe77192b73 435 s++;
knaresh89 0:e4fe77192b73 436 if (c == '\0') {
knaresh89 0:e4fe77192b73 437 break;
knaresh89 0:e4fe77192b73 438 }
knaresh89 0:e4fe77192b73 439 _StoreChar(&BufferDesc, c);
knaresh89 0:e4fe77192b73 440 } while (BufferDesc.ReturnValue >= 0);
knaresh89 0:e4fe77192b73 441 }
knaresh89 0:e4fe77192b73 442 break;
knaresh89 0:e4fe77192b73 443 case 'p':
knaresh89 0:e4fe77192b73 444 v = va_arg(*pParamList, int);
knaresh89 0:e4fe77192b73 445 _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u);
knaresh89 0:e4fe77192b73 446 break;
knaresh89 0:e4fe77192b73 447 case '%':
knaresh89 0:e4fe77192b73 448 _StoreChar(&BufferDesc, '%');
knaresh89 0:e4fe77192b73 449 break;
knaresh89 0:e4fe77192b73 450 default:
knaresh89 0:e4fe77192b73 451 break;
knaresh89 0:e4fe77192b73 452 }
knaresh89 0:e4fe77192b73 453 sFormat++;
knaresh89 0:e4fe77192b73 454 } else {
knaresh89 0:e4fe77192b73 455 _StoreChar(&BufferDesc, c);
knaresh89 0:e4fe77192b73 456 }
knaresh89 0:e4fe77192b73 457 } while (BufferDesc.ReturnValue >= 0);
knaresh89 0:e4fe77192b73 458
knaresh89 0:e4fe77192b73 459 if (BufferDesc.ReturnValue > 0) {
knaresh89 0:e4fe77192b73 460 //
knaresh89 0:e4fe77192b73 461 // Write remaining data, if any
knaresh89 0:e4fe77192b73 462 //
knaresh89 0:e4fe77192b73 463 if (BufferDesc.Cnt != 0u) {
knaresh89 0:e4fe77192b73 464 SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt);
knaresh89 0:e4fe77192b73 465 }
knaresh89 0:e4fe77192b73 466 BufferDesc.ReturnValue += (int)BufferDesc.Cnt;
knaresh89 0:e4fe77192b73 467 }
knaresh89 0:e4fe77192b73 468 return BufferDesc.ReturnValue;
knaresh89 0:e4fe77192b73 469 }
knaresh89 0:e4fe77192b73 470
knaresh89 0:e4fe77192b73 471 /*********************************************************************
knaresh89 0:e4fe77192b73 472 *
knaresh89 0:e4fe77192b73 473 * SEGGER_RTT_printf
knaresh89 0:e4fe77192b73 474 *
knaresh89 0:e4fe77192b73 475 * Function description
knaresh89 0:e4fe77192b73 476 * Stores a formatted string in SEGGER RTT control block.
knaresh89 0:e4fe77192b73 477 * This data is read by the host.
knaresh89 0:e4fe77192b73 478 *
knaresh89 0:e4fe77192b73 479 * Parameters
knaresh89 0:e4fe77192b73 480 * BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal")
knaresh89 0:e4fe77192b73 481 * sFormat Pointer to format string, followed by the arguments for conversion
knaresh89 0:e4fe77192b73 482 *
knaresh89 0:e4fe77192b73 483 * Return values
knaresh89 0:e4fe77192b73 484 * >= 0: Number of bytes which have been stored in the "Up"-buffer.
knaresh89 0:e4fe77192b73 485 * < 0: Error
knaresh89 0:e4fe77192b73 486 *
knaresh89 0:e4fe77192b73 487 * Notes
knaresh89 0:e4fe77192b73 488 * (1) Conversion specifications have following syntax:
knaresh89 0:e4fe77192b73 489 * %[flags][FieldWidth][.Precision]ConversionSpecifier
knaresh89 0:e4fe77192b73 490 * (2) Supported flags:
knaresh89 0:e4fe77192b73 491 * -: Left justify within the field width
knaresh89 0:e4fe77192b73 492 * +: Always print sign extension for signed conversions
knaresh89 0:e4fe77192b73 493 * 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision
knaresh89 0:e4fe77192b73 494 * Supported conversion specifiers:
knaresh89 0:e4fe77192b73 495 * c: Print the argument as one char
knaresh89 0:e4fe77192b73 496 * d: Print the argument as a signed integer
knaresh89 0:e4fe77192b73 497 * u: Print the argument as an unsigned integer
knaresh89 0:e4fe77192b73 498 * x: Print the argument as an hexadecimal integer
knaresh89 0:e4fe77192b73 499 * s: Print the string pointed to by the argument
knaresh89 0:e4fe77192b73 500 * p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.)
knaresh89 0:e4fe77192b73 501 */
knaresh89 0:e4fe77192b73 502 int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) {
knaresh89 0:e4fe77192b73 503 int r;
knaresh89 0:e4fe77192b73 504 va_list ParamList;
knaresh89 0:e4fe77192b73 505
knaresh89 0:e4fe77192b73 506 va_start(ParamList, sFormat);
knaresh89 0:e4fe77192b73 507 r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList);
knaresh89 0:e4fe77192b73 508 va_end(ParamList);
knaresh89 0:e4fe77192b73 509 return r;
knaresh89 0:e4fe77192b73 510 }
knaresh89 0:e4fe77192b73 511 /*************************** End of file ****************************/