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

Committer:
knaresh89
Date:
Mon Feb 12 05:06:24 2018 +0000
Revision:
0:33cb2fa095df
Sample program on how to use the OPT3001 sensor on the RAKWireless iTracker module

Who changed what in which revision?

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