Library for Modtronix NZ32 STM32 boards, like the NZ32-SC151, NZ32-SB072, NZ32-SE411 and others
mx_helpers.cpp
- Committer:
- modtronix
- Date:
- 2015-08-30
- Revision:
- 3:99cb87ee1792
File content as of revision 3:99cb87ee1792:
/** * File: mx_helpers.cpp * * Author: Modtronix Engineering - www.modtronix.com * * Description: * * Software License Agreement: * This software has been written or modified by Modtronix Engineering. The code * may be modified and can be used free of charge for commercial and non commercial * applications. If this is modified software, any license conditions from original * software also apply. Any redistribution must include reference to 'Modtronix * Engineering' and web link(www.modtronix.com) in the file header. * * THIS SOFTWARE IS PROVIDED IN AN 'AS IS' CONDITION. NO WARRANTIES, WHETHER EXPRESS, * IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE * COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. */ #include "mbed.h" #define DEBUG_ENABLE 1 #include "mx_default_debug.h" //Includes that use debugging - Include AFTER debug defines/includes above! It uses them for debugging! #include "mx_helpers.h" uint8_t MxHelpers::ascii_hex_to_byte(WORD_VAL asciiChars) { // Convert lowercase to uppercase if (asciiChars.v[1] > 'F') asciiChars.v[1] -= 'a' - 'A'; if (asciiChars.v[0] > 'F') asciiChars.v[0] -= 'a' - 'A'; // Convert 0-9, A-F to 0x0-0xF if (asciiChars.v[1] > '9') asciiChars.v[1] -= 'A' - 10; else asciiChars.v[1] -= '0'; if (asciiChars.v[0] > '9') asciiChars.v[0] -= 'A' - 10; else asciiChars.v[0] -= '0'; // Concatenate return (asciiChars.v[1] << 4) | asciiChars.v[0]; } uint8_t MxHelpers::ascii_hex_nibble_to_byte(uint8_t c) { if ((c <= '9') && (c >= '0')) return (c - '0'); else if ((c <= 'F') && (c >= 'A')) return (c - 55); else if ((c <= 'f') && (c >= 'a')) return (c - 87); return 0xff; //Indicate given byte was NOT alpha numerical } uint16_t MxHelpers::cvt_ascii_dec_to_uint16(const char* str, uint8_t* retFlags) { uint16_t val = 0; //Returned value uint8_t ret = 0; //Return retFlags value bool isHex = 0; const char* savedStrPtr; savedStrPtr = str; //MX_DEBUG("\nparseHexDecWord()"); //Does the string contain a Upper Case Hex value if (*str == 'x') { str++; isHex = true; //MX_DEBUG(" -d"); } //Parse all '0'-'9', and 'A'-'F' bytes while ((((*str >= '0') && (*str <= '9')) || ((*str >= 'A') && (*str <= 'F')))) { if (isHex) { val = (val << 4) + ((*str <= '9') ? (*str - '0') : (*str - 'A' + 10)); } else { val = (val * 10) + ((*str) - '0'); } str++; } //Get the number of bytes parsed ret = str - savedStrPtr; if (retFlags != NULL) { *retFlags = ret; } return val; } uint16_t MxHelpers::cvt_ascii_hex_to_uint16(const char* str, uint8_t* retFlags) { uint16_t retVal = 0; //Returned value uint8_t ret = 0; //Return retFlags value bool isDecimal = 0; const char* savedStrPtr; savedStrPtr = str; //MX_DEBUG("\nparseHexDecWord()"); //Does the string contain a decimal value if (*str == 'd') { str++; isDecimal = true; //MX_DEBUG(" -d"); } //Parse all '0'-'9', and 'A'-'F' bytes while ((((*str >= '0') && (*str <= '9')) || ((*str >= 'A') && (*str <= 'F')))) { if (isDecimal) { retVal = (retVal * 10) + ((*str) - '0'); } else { retVal = (retVal << 4) + ((*str <= '9') ? (*str - '0') : (*str - 'A' + 10)); } str++; } //Get the number of bytes parsed ret = str - savedStrPtr; if (retFlags != NULL) { *retFlags = ret; } return retVal; } uint8_t MxHelpers::cvt_uint16_to_ascii_str(uint16_t val, uint8_t* buf) { uint8_t i; uint8_t retVal = 0; uint16_t digit; uint16_t divisor; bool printed = false; //const uint16_t NZ_UITOA_DIV[4] = { 1, 10, 100, 1000 }; //static const uint16_t NZ_UITOA_DIV[4] = { 1, 10, 100, 1000 }; if (val) { divisor = 10000; for (i = 5; i != 0; i--) { digit = val / divisor; if ((digit!=0) || printed) { *buf++ = '0' + digit; val -= digit * divisor; printed = true; retVal++; } divisor = divisor / 10; //Alternative method //divisor = NZ_UITOA_DIV[i - 2]; //Alternative method //if (i==5) // divisor = 1000; //else if (i==4) // divisor = 100; //else if (i==3) // divisor = 10; //else // divisor = 1; } } else { *buf++ = '0'; retVal++; } *buf = '\0'; return retVal; }