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

Dependencies:   LIS2MDL

Committer:
knaresh89
Date:
Mon Feb 12 04:58:22 2018 +0000
Revision:
0:10c0e81df4ba
Sample app for the LIS2MDL sensor on the RAKWireless iTracker module

Who changed what in which revision?

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