Sample program on how to use the LIS2MDL sensor on the RAKWirelss iTracker module

Committer:
knaresh89
Date:
Mon Feb 12 05:04:29 2018 +0000
Revision:
0:a8bfd25ff975
Sample program on how to use the BME280 sensor on the RAKWirelss iTracker module

Who changed what in which revision?

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