Exportable version of WizziLab's modem driver.
Diff: include/kal_codec.h
- Revision:
- 41:6f83174ffed4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/kal_codec.h Mon Nov 26 16:42:16 2018 +0000 @@ -0,0 +1,243 @@ +/// @copyright +/// ========================================================================={{{ +/// Copyright (c) 20XX / +/// All rights reserved / +/// / +/// IMPORTANT: This Software may not be modified, copied or distributed unless / +/// embedded on a WizziLab product. Other than for the foregoing purpose, this / +/// Software and/or its documentation may not be used, reproduced, copied, / +/// prepared derivative works of, modified, performed, distributed, displayed / +/// or sold for any purpose. For the sole purpose of embedding this Software / +/// on a WizziLab product, copy, modification and distribution of this / +/// Software is granted provided that the following conditions are respected: / +/// / +/// * Redistributions of source code must retain the above copyright notice, / +/// this list of conditions and the following disclaimer / +/// / +/// * Redistributions in binary form must reproduce the above copyright / +/// notice, this list of conditions and the following disclaimer in the / +/// documentation and/or other materials provided with the distribution. / +/// / +/// * The name of WizziLab can not be used to endorse or promote products / +/// derived from this software without specific prior written permission. / +/// / +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS / +/// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED / +/// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR / +/// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR / +/// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, / +/// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, / +/// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, / +/// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY / +/// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING / +/// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS / +/// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. / +/// WIZZILAB HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, / +/// ENHANCEMENTS OR MODIFICATIONS. / +/// / +/// Should you have any questions regarding your right to use this Software, / +/// contact WizziLab at www.wizzilab.com. / +/// / +/// =========================================================================}}} +/// @endcopyright + +// ======================================================================= +/// @file kal_codec.h +/// @brief KAL utilities s +// ======================================================================= + +#ifndef _KAL_CODEC_H_ +#define _KAL_CODEC_H_ + +#include "hal_types.h" + +// ====================================================================== +// +// +// ASCII to Binary Codec Toolkits +// +// +// ====================================================================== + +//====================================================================== +// hex2ascii +//---------------------------------------------------------------------- +/// @brief Convert hexadecimal number to ascii +/// @param char* in input buffer (hex) +/// @param char* out output buffer (ascii) +/// @param u16 len length of inoput buffer in bytes +//====================================================================== +void hex2ascii( char* in, char* out, u16 length); + +//====================================================================== +// itoa +//---------------------------------------------------------------------- +/// @brief Converts an integer value to a null-terminated string using the specified base and stores the result +/// in the array given by result parameter. +/// @param int value integer to convert +/// @param char* result converted string +/// @param int base base used for conversion 2, 8, 10, 16 +/// @return A pointer to the resulting null-terminated string, same as parameter result +//====================================================================== +char* itoa(int value, char* result, int base); + +//====================================================================== +// atoitok +//---------------------------------------------------------------------- +/// @brief Extracts from a ASCII string a value (decimal or hex) and +/// convert it to an integer value. +/// - Blank characters are skipped +/// - hexa values must begin with '0x' or '0X' +/// - '-' sign is handled +/// - returns after one value has been parsed or null character +/// or CR character has been found. +/// @param p pointer to pointer to the string to be parsed. The pointer +/// to string is modified: at the end of the call it points to +/// the character following the last parsed one. +//====================================================================== +int atoitok(u8 **p); + +//====================================================================== +// kal_atoi +//---------------------------------------------------------------------- +/// @brief Extracts from a ASCII string a decimal value and +/// convert it to an integer value. +/// '-' sign is handled +/// @param s char* string to convert +/// @retval s32 integer value +//====================================================================== +s32 kal_atoi(u8* s); + +//====================================================================== +// kal_atoi_float +//---------------------------------------------------------------------- +/// @brief Extracts from a ASCII string a float value and +/// convert it to an integer value * 10^number_of_decimals. +/// '-' and '+' signs are handled +/// @param s char* string to convert +/// @param d u8 Number of decimals +/// @retval s32 integer value +//====================================================================== +s32 kal_atoi_float(u8* s, u8 d); + +//====================================================================== +// kal_atoi_hex +//---------------------------------------------------------------------- +/// @brief Extracts from a ASCII string a hex value and +/// convert it to an integer value. +/// @param s char* string to convert +/// @retval u32 integer value +//====================================================================== +u32 kal_atoi_hex(u8* s); + +/// Length of the Base64-encoded string based on the input binary length. +#define KAL_BASE64_ENCODE_LEN(l) (((((l) + 2) / 3) * 4) + 1) + +/// Length of the binary based on the real Base64-encoded string length. +#define KAL_BASE64_DECODE_LEN(l) ((l) * 3 / 4) + +//====================================================================== +// kal_base64_strlen +//---------------------------------------------------------------------- +/// @brief Real length (excluding padding) of Base64-encoded string +/// Note : the input string always has 4x chars, if not return 0 +/// @param in char* string to decode +/// @retval u16 string length +//====================================================================== +u16 kal_base64_strlen(const char* in); + +//====================================================================== +// kal_base64_encode +//---------------------------------------------------------------------- +/// @brief Encode Base64-encoded buffer. The output buffer is supposed to have enough space +/// Beware, the stream encoding is Big Endian. +/// @param out char* string result +/// @param in u8* binary buffer to encode +/// @param len u16 length of the binary buffer in bytes +/// @retval void +//====================================================================== +void kal_base64_encode(char *out, u8* in, u16 len); + +//====================================================================== +// kal_base64_decode +//---------------------------------------------------------------------- +/// @brief Decode Base64-encoded buffer. The output buffer is supposed to have enough space +/// @param out u8* binary buffer result +/// @param in char* string to decode +/// @param len u16 string length, excluding padding +/// @retval void +//====================================================================== +void kal_base64_decode(u8 *out, const char* in, u16 len); + +//====================================================================== +// kal_tolower +//---------------------------------------------------------------------- +/// @brief Changes inplace to lower character a non-constant string +/// @param s u8* String to transform +/// @retval void +//====================================================================== +void kal_tolower(u8* s); + +//====================================================================== +// kal_toupper +//---------------------------------------------------------------------- +/// @brief Changes inplace to upper character a non-constant string +/// @param s u8* String to transform +/// @retval void +//====================================================================== +void kal_toupper(u8* s); + +//====================================================================== +// kal_crc8 +//---------------------------------------------------------------------- +/// @brief Generate crc8 +/// @param in u8* input buffer +/// @param len u32 input buffer length in bytes +/// @retval void +//====================================================================== +u8 kal_crc8(u8* in, u32 len); + +// ======================================================================= +// kal_ctf_t +// ----------------------------------------------------------------------- +/// D7A compressed time format +// ======================================================================= +typedef union +{ + // bit access fields + struct { + /// Mantissa + u8 mant : 5; + /// Exponent + u8 exp : 3; + } bf; + + // byte access + u8 byte; + +} kal_ctf_t; + +//====================================================================== +// kal_ctf_encode +//---------------------------------------------------------------------- +/// @brief Compress u32 to D7A Compressed Time format (CTF). +/// The ceil flag is used to define rounding, so that +/// kal_ctf_decode(kal_ctf_encode(val, FALSE) <= val (floor) +/// kal_ctf_decode(kal_ctf_encode(val, TRUE) >= val (ceiling) +/// @param val u32 value to encode +/// @param ceil u8 ceil value when TRUE +/// @retval kal_ctf_t compressed value +//====================================================================== +kal_ctf_t kal_ctf_encode(u32 val, u8 ceil); + +// ======================================================================= +// kal_ctf_decode +// ----------------------------------------------------------------------- +/// @brief Decompress from Compressed Time Format to u32 +/// @param ctf kal_ctf_t compressed value in CTF +/// @retval u32 decode result +// ======================================================================= +u32 kal_ctf_decode(kal_ctf_t ctf); + +#endif // _KAL_CODEC_H_ +