commit 470cf77cac110ac5cf71f3022e46396f105c3f4f Author: Frederik Beimgraben Date: Wed May 21 14:16:03 2025 +0200 chore![CCS-Setup]: Initial Commit diff --git a/.ccsproject b/.ccsproject new file mode 100644 index 0000000..492a9bd --- /dev/null +++ b/.ccsproject @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..8c4daa2 --- /dev/null +++ b/.clangd @@ -0,0 +1,11 @@ +# This is an auto-generated file - do not add it to source-control + +CompileFlags: + CompilationDatabase: Debug/.clangd + +Diagnostics: + Suppress: '*' + +InlayHints: + Enabled: No + diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..9f0265b --- /dev/null +++ b/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..ec5c800 --- /dev/null +++ b/.project @@ -0,0 +1,20 @@ + + + ESR-G11 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + + diff --git a/.settings/org.eclipse.cdt.codan.core.prefs b/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..f653028 --- /dev/null +++ b/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/Debug/.clangd/compile_commands.json b/Debug/.clangd/compile_commands.json new file mode 100644 index 0000000..313878c --- /dev/null +++ b/Debug/.clangd/compile_commands.json @@ -0,0 +1,47 @@ +[ + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/GUIComm_JSON.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/callbacks_JSON.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/main.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/src/MSP430_GUI/GUI_JSON.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/src/MSP430_GUI/jsmn/jsmn.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/src/MSP430_HAL/HAL_GUIComm_UART_FR235x.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/src/MSP430_HAL/HAL_IO_FR235x.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/src/MSP430_HAL/HAL_System_FR235x.c" + }, + { + "directory" : "/home/frederik/workspace_ccstheia/ESR-G11/Debug", + "command" : "clang++ -I\"/home/frederik/.ti/ccs2010/ccs/ccs_base/msp430/include\" -I\"/home/frederik/workspace_ccstheia/ESR-G11\" -I\"/home/frederik/workspace_ccstheia/ESR-G11/include\" -I\"/home/frederik/.ti/ccs2010/ccs/tools/compiler/ti-cgt-msp430_21.6.1.LTS/include\" -D__MSP430FR2355__ -D_FRWP_ENABLE -D_INFO_FRWP_ENABLE -D__ENABLE_GUI_COMM=1 -DGLOBAL_Q=8", + "file" : "/home/frederik/workspace_ccstheia/ESR-G11/src/MSP430_HAL/HAL_Timer_FR235x.c" + } +] diff --git a/GUIComm_JSON.c b/GUIComm_JSON.c new file mode 100755 index 0000000..8c56074 --- /dev/null +++ b/GUIComm_JSON.c @@ -0,0 +1,277 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2020, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// GUI Communication Layer +// +// API to communicate with GUI using JSON protocol +// Texas Instruments, Inc.** + +#include +#include +#include +#include +#include +#include + +static void itoa(int32_t value, char* result); + +static const char cmdTemplate[] = "{\"\":}\n"; +static char cATXString[20]; + +//These values are used to concatenate the command and data to the command template +// when using the GUIComm_send functions +#define CMD_INDEX 1 +#define DATA_INDEX 3 +#define CMD_TEMPLATE_LENGTH 6 +#define BASE 10 + + +//! \brief Converts a number into a string +//! +//! \return none +void itoa(int32_t value, char* result) +{ + char* ptr = result, *ptr1 = result, tmp_char; + uint32_t tmp_value; + + tmp_value = labs(value); + do { + *ptr++ = "0123456789" [tmp_value%BASE]; + tmp_value /= BASE; + } while (tmp_value); + + // Apply negative sign + if (value < 0) *ptr++ = '-'; + *ptr-- = '\0'; + while(ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } +} + +int GUIComm_sendUInt(char *cmd, uint8_t cmdLength, uint32_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendInt(char *cmd, uint8_t cmdLength, uint32_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendUInt8(char *cmd, uint8_t cmdLength, uint8_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendInt8(char *cmd, uint8_t cmdLength, int8_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendInt16(char *cmd, uint8_t cmdLength, int16_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendUInt16(char *cmd, uint8_t cmdLength, uint16_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendUInt32(char *cmd, uint8_t cmdLength, uint32_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendInt32(char *cmd, uint8_t cmdLength, int32_t val) +{ + uint8_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + itoa(val, cATXString); + GUI_TransmitStringBlocking(cATXString); + } + } + + return 0; +} + +int GUIComm_sendBool(char *cmd, uint8_t cmdLength, bool val) +{ + uint16_t i; + + for (i = 0; i < CMD_TEMPLATE_LENGTH; i++) + { + HAL_GUI_TransmitCharBlocking(cmdTemplate[i]); + if (i == CMD_INDEX) + { + GUI_TransmitStringBlocking(cmd); + } + else if (i == DATA_INDEX) + { + if (val == true) + { + GUI_TransmitStringBlocking("true"); + } + else + { + GUI_TransmitStringBlocking("false"); + } + } + } + + return 0; +} + diff --git a/Include/GUIComm.h b/Include/GUIComm.h new file mode 100755 index 0000000..033b517 --- /dev/null +++ b/Include/GUIComm.h @@ -0,0 +1,101 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2020, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// Generic GUI Demo using MSP430 +// +// API to communicate with GUI and abstract transport layer protocol +// Texas Instruments, Inc. +// ****************************************************************************** + +#ifndef INCLUDE_GUICOMM_H_ +#define INCLUDE_GUICOMM_H_ + +//! ***** Functions to send data to GUI ***** + +//! \brief Sends a 32-bit integer. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendInt(char *cmd, uint8_t cmdLength, uint32_t val); + +//! \brief Sends a 32-bit unsigned integer. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendUInt(char *cmd, uint8_t cmdLength, uint32_t val); + +//! \brief Sends an uint8_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendUInt8(char *cmd, uint8_t cmdLength, uint8_t val); + +//! \brief Sends an int8_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendInt8(char *cmd, uint8_t cmdLength, int8_t val); + +//! \brief Sends an uint16_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendUInt16(char *cmd, uint8_t cmdLength, uint16_t val); + +//! \brief Sends an int16_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendInt16(char *cmd, uint8_t cmdLength, int16_t val); + +//! \brief Sends an uint32_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendUInt32(char *cmd, uint8_t cmdLength, uint32_t val); + +//! \brief Sends an int32_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendInt32(char *cmd, uint8_t cmdLength, int32_t val); + +//! \brief Sends an uint32_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendUInt64(char *cmd, uint8_t cmdLength, uint64_t val); + +//! \brief Sends an int32_t value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendInt64(char *cmd, uint8_t cmdLength, int64_t val); + +//! \brief Sends a bool value to the GUI. +//! +//! \return 0 if success, -1 if failure +extern int GUIComm_sendBool(char *cmd, uint8_t cmdLength, bool val); + + + +#endif /* INCLUDE_GUICOMM_H_ */ diff --git a/Include/HAL.h b/Include/HAL.h new file mode 100755 index 0000000..791cd15 --- /dev/null +++ b/Include/HAL.h @@ -0,0 +1,101 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// MSP430 HAL +// +// Hardware Abstraction Layer for MSP430 +// +// Texas Instruments, Inc. + +#ifndef __HAL_H__ +#define __HAL_H__ + +#include +#include +#include +#include +#include + +//! \brief GUI Comm RX Callback function pointer +//! +//! \param[in] char with Received byte +//! +//! \return true if device wakes-up after ISR, false if not. +typedef bool (*tGUICommRXCharCallback)(char ); + +// ********************* System ************************************************ +//! \brief Initializes I/Os used by the system. +//! Initialization is done to achieve lowest power consumption. +//! +//! +//! \return 0 if OK, -1 if error +extern int8_t HAL_System_Init(void); + +// ********************* I/O *************************************************** +//! \brief Initializes I/Os used by the system. +//! Initialization is done to achieve lowest power consumption. +//! +//! +//! \return none +extern void HAL_IO_Init(void); + +//! \brief Initializes inputs used for push-buttons +//! Pins are initialized with pull-ups and interrupts are enabled. +//! +//! +//! \return none +extern void HAL_IO_InitButtons(void); + +// ********************* Timer *************************************************** +//! \brief Initializes a simple periodic interrupt timer. +//! Timer is initialized using Low-frequency clock and interrupts +//! are enabled. +//! +//! \return none +extern void HAL_Timer_Init(void); + +// ********************* GUI Communication ************************************* +//! \brief Initializes the communication interface for GUI. +//! +//! \param[in] RxByteCallback is the function called when a byte is received. +//! +//! \return none +extern void HAL_GUI_Init(tGUICommRXCharCallback RxByteCallback); + +//! \brief Transmits a character to the GUI in blocking mode. +//! +//! \param[in] character is the character being transmitted to GUI. +//! +//! \return none +extern void HAL_GUI_TransmitCharBlocking(char character); + +#endif //__HAL_H__ diff --git a/Include/IQmathLib.h b/Include/IQmathLib.h new file mode 100755 index 0000000..cfc5b50 --- /dev/null +++ b/Include/IQmathLib.h @@ -0,0 +1,3967 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2015, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +#ifndef __IQMATHLIB_H__ +#define __IQMATHLIB_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The IQ format to be used when the IQ format is not explicitly specified +// (such as _IQcos instead of _IQ16cos). This value must be between 1 and 30, +// inclusive. +// +//***************************************************************************** +#ifndef GLOBAL_IQ +#define GLOBAL_IQ 24 +#endif + +//***************************************************************************** +// +// Include some standard headers. +// +//***************************************************************************** +#include +#include +#include + +//***************************************************************************** +// +// Various Useful Constant Definitions: +// +//***************************************************************************** +#define Q30 30 +#define Q29 29 +#define Q28 28 +#define Q27 27 +#define Q26 26 +#define Q25 25 +#define Q24 24 +#define Q23 23 +#define Q22 22 +#define Q21 21 +#define Q20 20 +#define Q19 19 +#define Q18 18 +#define Q17 17 +#define Q16 16 +#define Q15 15 +#define Q14 14 +#define Q13 13 +#define Q12 12 +#define Q11 11 +#define Q10 10 +#define Q9 9 +#define Q8 8 +#define Q7 7 +#define Q6 6 +#define Q5 5 +#define Q4 4 +#define Q3 3 +#define Q2 2 +#define Q1 1 +#ifndef QG +#define QG GLOBAL_IQ +#endif + +#define MAX_IQ_POS LONG_MAX +#define MAX_IQ_NEG LONG_MIN +#define MIN_IQ_POS 1 +#define MIN_IQ_NEG -1 + +//***************************************************************************** +// +// The types for the various IQ formats. +// +//***************************************************************************** +typedef int32_t _iq30; +typedef int32_t _iq29; +typedef int32_t _iq28; +typedef int32_t _iq27; +typedef int32_t _iq26; +typedef int32_t _iq25; +typedef int32_t _iq24; +typedef int32_t _iq23; +typedef int32_t _iq22; +typedef int32_t _iq21; +typedef int32_t _iq20; +typedef int32_t _iq19; +typedef int32_t _iq18; +typedef int32_t _iq17; +typedef int32_t _iq16; +typedef int32_t _iq15; +typedef int32_t _iq14; +typedef int32_t _iq13; +typedef int32_t _iq12; +typedef int32_t _iq11; +typedef int32_t _iq10; +typedef int32_t _iq9; +typedef int32_t _iq8; +typedef int32_t _iq7; +typedef int32_t _iq6; +typedef int32_t _iq5; +typedef int32_t _iq4; +typedef int32_t _iq3; +typedef int32_t _iq2; +typedef int32_t _iq1; +typedef int32_t _iq; + +//***************************************************************************** +// +// Simple multiplies or divides, which are accomplished with simple shifts. +// +//***************************************************************************** +#define _IQmpy2(A) ((A) << 1) +#define _IQmpy4(A) ((A) << 2) +#define _IQmpy8(A) ((A) << 3) +#define _IQmpy16(A) ((A) << 4) +#define _IQmpy32(A) ((A) << 5) +#define _IQmpy64(A) ((A) << 6) +#define _IQdiv2(A) ((A) >> 1) +#define _IQdiv4(A) ((A) >> 2) +#define _IQdiv8(A) ((A) >> 3) +#define _IQdiv16(A) ((A) >> 4) +#define _IQdiv32(A) ((A) >> 5) +#define _IQdiv64(A) ((A) >> 6) + +//***************************************************************************** +// +// Convert a value into an IQ number. +// +//***************************************************************************** +#define _IQ30(A) ((_iq30)((A) * ((_iq30)1 << 30))) +#define _IQ29(A) ((_iq29)((A) * ((_iq29)1 << 29))) +#define _IQ28(A) ((_iq28)((A) * ((_iq28)1 << 28))) +#define _IQ27(A) ((_iq27)((A) * ((_iq27)1 << 27))) +#define _IQ26(A) ((_iq26)((A) * ((_iq26)1 << 26))) +#define _IQ25(A) ((_iq25)((A) * ((_iq25)1 << 25))) +#define _IQ24(A) ((_iq24)((A) * ((_iq24)1 << 24))) +#define _IQ23(A) ((_iq23)((A) * ((_iq23)1 << 23))) +#define _IQ22(A) ((_iq22)((A) * ((_iq22)1 << 22))) +#define _IQ21(A) ((_iq21)((A) * ((_iq21)1 << 21))) +#define _IQ20(A) ((_iq20)((A) * ((_iq20)1 << 20))) +#define _IQ19(A) ((_iq19)((A) * ((_iq19)1 << 19))) +#define _IQ18(A) ((_iq18)((A) * ((_iq18)1 << 18))) +#define _IQ17(A) ((_iq17)((A) * ((_iq17)1 << 17))) +#define _IQ16(A) ((_iq16)((A) * ((_iq16)1 << 16))) +#define _IQ15(A) ((_iq15)((A) * ((_iq15)1 << 15))) +#define _IQ14(A) ((_iq14)((A) * ((_iq14)1 << 14))) +#define _IQ13(A) ((_iq13)((A) * ((_iq13)1 << 13))) +#define _IQ12(A) ((_iq12)((A) * ((_iq12)1 << 12))) +#define _IQ11(A) ((_iq11)((A) * ((_iq11)1 << 11))) +#define _IQ10(A) ((_iq10)((A) * ((_iq10)1 << 10))) +#define _IQ9(A) ((_iq9)((A) * ((_iq9)1 << 9))) +#define _IQ8(A) ((_iq8)((A) * ((_iq8)1 << 8))) +#define _IQ7(A) ((_iq7)((A) * ((_iq7)1 << 7))) +#define _IQ6(A) ((_iq6)((A) * ((_iq6)1 << 6))) +#define _IQ5(A) ((_iq5)((A) * ((_iq5)1 << 5))) +#define _IQ4(A) ((_iq4)((A) * ((_iq4)1 << 4))) +#define _IQ3(A) ((_iq3)((A) * ((_iq3)1 << 3))) +#define _IQ2(A) ((_iq2)((A) * ((_iq2)1 << 2))) +#define _IQ1(A) ((_iq1)((A) * ((_iq1)1 << 1))) + +#if GLOBAL_IQ == 30 +#define _IQ(A) _IQ30(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQ(A) _IQ29(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQ(A) _IQ28(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQ(A) _IQ27(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQ(A) _IQ26(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQ(A) _IQ25(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQ(A) _IQ24(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQ(A) _IQ23(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQ(A) _IQ22(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQ(A) _IQ21(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQ(A) _IQ20(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQ(A) _IQ19(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQ(A) _IQ18(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQ(A) _IQ17(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQ(A) _IQ16(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQ(A) _IQ15(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQ(A) _IQ14(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQ(A) _IQ13(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQ(A) _IQ12(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQ(A) _IQ11(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQ(A) _IQ10(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQ(A) _IQ9(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQ(A) _IQ8(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQ(A) _IQ7(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQ(A) _IQ6(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQ(A) _IQ5(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQ(A) _IQ4(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQ(A) _IQ3(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQ(A) _IQ2(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQ(A) _IQ1(A) +#endif + +//***************************************************************************** +// +// Convert an IQ number to a floating point value. +// +//***************************************************************************** +extern float _IQ30toF(_iq30 A); +extern float _IQ29toF(_iq29 A); +extern float _IQ28toF(_iq28 A); +extern float _IQ27toF(_iq27 A); +extern float _IQ26toF(_iq26 A); +extern float _IQ25toF(_iq25 A); +extern float _IQ24toF(_iq24 A); +extern float _IQ23toF(_iq23 A); +extern float _IQ22toF(_iq22 A); +extern float _IQ21toF(_iq21 A); +extern float _IQ20toF(_iq20 A); +extern float _IQ19toF(_iq19 A); +extern float _IQ18toF(_iq18 A); +extern float _IQ17toF(_iq17 A); +extern float _IQ16toF(_iq16 A); +extern float _IQ15toF(_iq15 A); +extern float _IQ14toF(_iq14 A); +extern float _IQ13toF(_iq13 A); +extern float _IQ12toF(_iq12 A); +extern float _IQ11toF(_iq11 A); +extern float _IQ10toF(_iq10 A); +extern float _IQ9toF(_iq9 A); +extern float _IQ8toF(_iq8 A); +extern float _IQ7toF(_iq7 A); +extern float _IQ6toF(_iq6 A); +extern float _IQ5toF(_iq5 A); +extern float _IQ4toF(_iq4 A); +extern float _IQ3toF(_iq3 A); +extern float _IQ2toF(_iq2 A); +extern float _IQ1toF(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQtoF(A) _IQ30toF(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQtoF(A) _IQ29toF(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQtoF(A) _IQ28toF(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQtoF(A) _IQ27toF(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQtoF(A) _IQ26toF(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQtoF(A) _IQ25toF(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQtoF(A) _IQ24toF(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQtoF(A) _IQ23toF(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQtoF(A) _IQ22toF(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQtoF(A) _IQ21toF(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQtoF(A) _IQ20toF(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQtoF(A) _IQ19toF(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQtoF(A) _IQ18toF(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQtoF(A) _IQ17toF(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQtoF(A) _IQ16toF(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQtoF(A) _IQ15toF(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQtoF(A) _IQ14toF(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQtoF(A) _IQ13toF(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQtoF(A) _IQ12toF(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQtoF(A) _IQ11toF(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQtoF(A) _IQ10toF(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQtoF(A) _IQ9toF(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQtoF(A) _IQ8toF(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQtoF(A) _IQ7toF(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQtoF(A) _IQ6toF(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQtoF(A) _IQ5toF(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQtoF(A) _IQ4toF(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQtoF(A) _IQ3toF(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQtoF(A) _IQ2toF(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQtoF(A) _IQ1toF(A) +#endif + +//***************************************************************************** +// +// Saturates an IQ number in a given range. +// +//***************************************************************************** +#define _IQsat(A, Pos, Neg) (((A) > (Pos)) ? \ + (Pos) : \ + (((A) < (Neg)) ? (Neg) : (A))) + +//***************************************************************************** +// +// Converts an IQ number between the global IQ format and a specified IQ +// format. +// +//***************************************************************************** +#define _IQtoIQ30(A) ((_iq30)(A) << (30 - GLOBAL_IQ)) +#define _IQ30toIQ(A) ((_iq30)(A) >> (30 - GLOBAL_IQ)) + +#if (GLOBAL_IQ >= 29) +#define _IQtoIQ29(A) ((_iq29)(A) >> (GLOBAL_IQ - 29)) +#define _IQ29toIQ(A) ((_iq29)(A) << (GLOBAL_IQ - 29)) +#else +#define _IQtoIQ29(A) ((_iq29)(A) << (29 - GLOBAL_IQ)) +#define _IQ29toIQ(A) ((_iq29)(A) >> (29 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 28) +#define _IQtoIQ28(A) ((_iq28)(A) >> (GLOBAL_IQ - 28)) +#define _IQ28toIQ(A) ((_iq28)(A) << (GLOBAL_IQ - 28)) +#else +#define _IQtoIQ28(A) ((_iq28)(A) << (28 - GLOBAL_IQ)) +#define _IQ28toIQ(A) ((_iq28)(A) >> (28 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 27) +#define _IQtoIQ27(A) ((_iq27)(A) >> (GLOBAL_IQ - 27)) +#define _IQ27toIQ(A) ((_iq27)(A) << (GLOBAL_IQ - 27)) +#else +#define _IQtoIQ27(A) ((_iq27)(A) << (27 - GLOBAL_IQ)) +#define _IQ27toIQ(A) ((_iq27)(A) >> (27 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 26) +#define _IQtoIQ26(A) ((_iq26)(A) >> (GLOBAL_IQ - 26)) +#define _IQ26toIQ(A) ((_iq26)(A) << (GLOBAL_IQ - 26)) +#else +#define _IQtoIQ26(A) ((_iq26)(A) << (26 - GLOBAL_IQ)) +#define _IQ26toIQ(A) ((_iq26)(A) >> (26 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 25) +#define _IQtoIQ25(A) ((_iq25)(A) >> (GLOBAL_IQ - 25)) +#define _IQ25toIQ(A) ((_iq25)(A) << (GLOBAL_IQ - 25)) +#else +#define _IQtoIQ25(A) ((_iq25)(A) << (25 - GLOBAL_IQ)) +#define _IQ25toIQ(A) ((_iq25)(A) >> (25 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 24) +#define _IQtoIQ24(A) ((_iq24)(A) >> (GLOBAL_IQ - 24)) +#define _IQ24toIQ(A) ((_iq24)(A) << (GLOBAL_IQ - 24)) +#else +#define _IQtoIQ24(A) ((_iq24)(A) << (24 - GLOBAL_IQ)) +#define _IQ24toIQ(A) ((_iq24)(A) >> (24 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 23) +#define _IQtoIQ23(A) ((_iq23)(A) >> (GLOBAL_IQ - 23)) +#define _IQ23toIQ(A) ((_iq23)(A) << (GLOBAL_IQ - 23)) +#else +#define _IQtoIQ23(A) ((_iq23)(A) << (23 - GLOBAL_IQ)) +#define _IQ23toIQ(A) ((_iq23)(A) >> (23 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 22) +#define _IQtoIQ22(A) ((_iq22)(A) >> (GLOBAL_IQ - 22)) +#define _IQ22toIQ(A) ((_iq22)(A) << (GLOBAL_IQ - 22)) +#else +#define _IQtoIQ22(A) ((_iq22)(A) << (22 - GLOBAL_IQ)) +#define _IQ22toIQ(A) ((_iq22)(A) >> (22 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 21) +#define _IQtoIQ21(A) ((_iq21)(A) >> (GLOBAL_IQ - 21)) +#define _IQ21toIQ(A) ((_iq21)(A) << (GLOBAL_IQ - 21)) +#else +#define _IQtoIQ21(A) ((_iq21)(A) << (21 - GLOBAL_IQ)) +#define _IQ21toIQ(A) ((_iq21)(A) >> (21 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 20) +#define _IQtoIQ20(A) ((_iq20)(A) >> (GLOBAL_IQ - 20)) +#define _IQ20toIQ(A) ((_iq20)(A) << (GLOBAL_IQ - 20)) +#else +#define _IQtoIQ20(A) ((_iq20)(A) << (20 - GLOBAL_IQ)) +#define _IQ20toIQ(A) ((_iq20)(A) >> (20 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 19) +#define _IQtoIQ19(A) ((_iq19)(A) >> (GLOBAL_IQ - 19)) +#define _IQ19toIQ(A) ((_iq19)(A) << (GLOBAL_IQ - 19)) +#else +#define _IQtoIQ19(A) ((_iq19)(A) << (19 - GLOBAL_IQ)) +#define _IQ19toIQ(A) ((_iq19)(A) >> (19 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 18) +#define _IQtoIQ18(A) ((_iq18)(A) >> (GLOBAL_IQ - 18)) +#define _IQ18toIQ(A) ((_iq18)(A) << (GLOBAL_IQ - 18)) +#else +#define _IQtoIQ18(A) ((_iq18)(A) << (18 - GLOBAL_IQ)) +#define _IQ18toIQ(A) ((_iq18)(A) >> (18 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 17) +#define _IQtoIQ17(A) ((_iq17)(A) >> (GLOBAL_IQ - 17)) +#define _IQ17toIQ(A) ((_iq17)(A) << (GLOBAL_IQ - 17)) +#else +#define _IQtoIQ17(A) ((_iq17)(A) << (17 - GLOBAL_IQ)) +#define _IQ17toIQ(A) ((_iq17)(A) >> (17 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 16) +#define _IQtoIQ16(A) ((_iq16)(A) >> (GLOBAL_IQ - 16)) +#define _IQ16toIQ(A) ((_iq16)(A) << (GLOBAL_IQ - 16)) +#else +#define _IQtoIQ16(A) ((_iq16)(A) << (16 - GLOBAL_IQ)) +#define _IQ16toIQ(A) ((_iq16)(A) >> (16 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 15) +#define _IQtoIQ15(A) ((_iq15)(A) >> (GLOBAL_IQ - 15)) +#define _IQ15toIQ(A) ((_iq15)(A) << (GLOBAL_IQ - 15)) +#else +#define _IQtoIQ15(A) ((_iq15)(A) << (15 - GLOBAL_IQ)) +#define _IQ15toIQ(A) ((_iq15)(A) >> (15 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 14) +#define _IQtoIQ14(A) ((_iq14)(A) >> (GLOBAL_IQ - 14)) +#define _IQ14toIQ(A) ((_iq14)(A) << (GLOBAL_IQ - 14)) +#else +#define _IQtoIQ14(A) ((_iq14)(A) << (14 - GLOBAL_IQ)) +#define _IQ14toIQ(A) ((_iq14)(A) >> (14 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 13) +#define _IQtoIQ13(A) ((_iq13)(A) >> (GLOBAL_IQ - 13)) +#define _IQ13toIQ(A) ((_iq13)(A) << (GLOBAL_IQ - 13)) +#else +#define _IQtoIQ13(A) ((_iq13)(A) << (13 - GLOBAL_IQ)) +#define _IQ13toIQ(A) ((_iq13)(A) >> (13 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 12) +#define _IQtoIQ12(A) ((_iq12)(A) >> (GLOBAL_IQ - 12)) +#define _IQ12toIQ(A) ((_iq12)(A) << (GLOBAL_IQ - 12)) +#else +#define _IQtoIQ12(A) ((_iq12)(A) << (12 - GLOBAL_IQ)) +#define _IQ12toIQ(A) ((_iq12)(A) >> (12 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 11) +#define _IQtoIQ11(A) ((_iq11)(A) >> (GLOBAL_IQ - 11)) +#define _IQ11toIQ(A) ((_iq11)(A) << (GLOBAL_IQ - 11)) +#else +#define _IQtoIQ11(A) ((_iq11)(A) << (11 - GLOBAL_IQ)) +#define _IQ11toIQ(A) ((_iq11)(A) >> (11 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 10) +#define _IQtoIQ10(A) ((_iq10)(A) >> (GLOBAL_IQ - 10)) +#define _IQ10toIQ(A) ((_iq10)(A) << (GLOBAL_IQ - 10)) +#else +#define _IQtoIQ10(A) ((_iq10)(A) << (10 - GLOBAL_IQ)) +#define _IQ10toIQ(A) ((_iq10)(A) >> (10 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 9) +#define _IQtoIQ9(A) ((_iq9)(A) >> (GLOBAL_IQ - 9)) +#define _IQ9toIQ(A) ((_iq9)(A) << (GLOBAL_IQ - 9)) +#else +#define _IQtoIQ9(A) ((_iq9)(A) << (9 - GLOBAL_IQ)) +#define _IQ9toIQ(A) ((_iq9)(A) >> (9 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 8) +#define _IQtoIQ8(A) ((_iq8)(A) >> (GLOBAL_IQ - 8)) +#define _IQ8toIQ(A) ((_iq8)(A) << (GLOBAL_IQ - 8)) +#else +#define _IQtoIQ8(A) ((_iq8)(A) << (8 - GLOBAL_IQ)) +#define _IQ8toIQ(A) ((_iq8)(A) >> (8 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 7) +#define _IQtoIQ7(A) ((_iq7)(A) >> (GLOBAL_IQ - 7)) +#define _IQ7toIQ(A) ((_iq7)(A) << (GLOBAL_IQ - 7)) +#else +#define _IQtoIQ7(A) ((_iq7)(A) << (7 - GLOBAL_IQ)) +#define _IQ7toIQ(A) ((_iq7)(A) >> (7 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 6) +#define _IQtoIQ6(A) ((_iq6)(A) >> (GLOBAL_IQ - 6)) +#define _IQ6toIQ(A) ((_iq6)(A) << (GLOBAL_IQ - 6)) +#else +#define _IQtoIQ6(A) ((_iq6)(A) << (6 - GLOBAL_IQ)) +#define _IQ6toIQ(A) ((_iq6)(A) >> (6 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 5) +#define _IQtoIQ5(A) ((_iq5)(A) >> (GLOBAL_IQ - 5)) +#define _IQ5toIQ(A) ((_iq5)(A) << (GLOBAL_IQ - 5)) +#else +#define _IQtoIQ5(A) ((_iq5)(A) << (5 - GLOBAL_IQ)) +#define _IQ5toIQ(A) ((_iq5)(A) >> (5 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 4) +#define _IQtoIQ4(A) ((_iq4)(A) >> (GLOBAL_IQ - 4)) +#define _IQ4toIQ(A) ((_iq4)(A) << (GLOBAL_IQ - 4)) +#else +#define _IQtoIQ4(A) ((_iq4)(A) << (4 - GLOBAL_IQ)) +#define _IQ4toIQ(A) ((_iq4)(A) >> (4 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 3) +#define _IQtoIQ3(A) ((_iq3)(A) >> (GLOBAL_IQ - 3)) +#define _IQ3toIQ(A) ((_iq3)(A) << (GLOBAL_IQ - 3)) +#else +#define _IQtoIQ3(A) ((_iq3)(A) << (3 - GLOBAL_IQ)) +#define _IQ3toIQ(A) ((_iq3)(A) >> (3 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 2) +#define _IQtoIQ2(A) ((_iq2)(A) >> (GLOBAL_IQ - 2)) +#define _IQ2toIQ(A) ((_iq2)(A) << (GLOBAL_IQ - 2)) +#else +#define _IQtoIQ2(A) ((_iq2)(A) << (2 - GLOBAL_IQ)) +#define _IQ2toIQ(A) ((_iq2)(A) >> (2 - GLOBAL_IQ)) +#endif + +#define _IQtoIQ1(A) ((_iq1)(A) >> (GLOBAL_IQ - 1)) +#define _IQ1toIQ(A) ((_iq1)(A) << (GLOBAL_IQ - 1)) + +//***************************************************************************** +// +// Converts a number between IQ format and 16-bit Qn format. +// +//***************************************************************************** +#if (GLOBAL_IQ >= 15) +#define _IQtoQ15(A) ((int32_t)(A) >> (GLOBAL_IQ - 15)) +#define _Q15toIQ(A) ((_iq15)(A) << (GLOBAL_IQ - 15)) +#else +#define _IQtoQ15(A) ((int32_t)(A) << (15 - GLOBAL_IQ)) +#define _Q15toIQ(A) ((_iq15)(A) >> (15 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 14) +#define _IQtoQ14(A) ((int32_t)(A) >> (GLOBAL_IQ - 14)) +#define _Q14toIQ(A) ((_iq14)(A) << (GLOBAL_IQ - 14)) +#else +#define _IQtoQ14(A) ((int32_t)(A) << (14 - GLOBAL_IQ)) +#define _Q14toIQ(A) ((_iq14)(A) >> (14 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 13) +#define _IQtoQ13(A) ((int32_t)(A) >> (GLOBAL_IQ - 13)) +#define _Q13toIQ(A) ((_iq13)(A) << (GLOBAL_IQ - 13)) +#else +#define _IQtoQ13(A) ((int32_t)(A) << (13 - GLOBAL_IQ)) +#define _Q13toIQ(A) ((_iq13)(A) >> (13 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 12) +#define _IQtoQ12(A) ((int32_t)(A) >> (GLOBAL_IQ - 12)) +#define _Q12toIQ(A) ((_iq12)(A) << (GLOBAL_IQ - 12)) +#else +#define _IQtoQ12(A) ((int32_t)(A) << (12 - GLOBAL_IQ)) +#define _Q12toIQ(A) ((_iq12)(A) >> (12 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 11) +#define _IQtoQ11(A) ((int32_t)(A) >> (GLOBAL_IQ - 11)) +#define _Q11toIQ(A) ((_iq11)(A) << (GLOBAL_IQ - 11)) +#else +#define _IQtoQ11(A) ((int32_t)(A) << (11 - GLOBAL_IQ)) +#define _Q11toIQ(A) ((_iq11)(A) >> (11 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 10) +#define _IQtoQ10(A) ((int32_t)(A) >> (GLOBAL_IQ - 10)) +#define _Q10toIQ(A) ((_iq10)(A) << (GLOBAL_IQ - 10)) +#else +#define _IQtoQ10(A) ((int32_t)(A) << (10 - GLOBAL_IQ)) +#define _Q10toIQ(A) ((_iq10)(A) >> (10 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 9) +#define _IQtoQ9(A) ((int32_t)(A) >> (GLOBAL_IQ - 9)) +#define _Q9toIQ(A) ((_iq9)(A) << (GLOBAL_IQ - 9)) +#else +#define _IQtoQ9(A) ((int32_t)(A) << (9 - GLOBAL_IQ)) +#define _Q9toIQ(A) ((_iq9)(A) >> (9 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 8) +#define _IQtoQ8(A) ((int32_t)(A) >> (GLOBAL_IQ - 8)) +#define _Q8toIQ(A) ((_iq8)(A) << (GLOBAL_IQ - 8)) +#else +#define _IQtoQ8(A) ((int32_t)(A) << (8 - GLOBAL_IQ)) +#define _Q8toIQ(A) ((_iq8)(A) >> (8 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 7) +#define _IQtoQ7(A) ((int32_t)(A) >> (GLOBAL_IQ - 7)) +#define _Q7toIQ(A) ((_iq7)(A) << (GLOBAL_IQ - 7)) +#else +#define _IQtoQ7(A) ((int32_t)(A) << (7 - GLOBAL_IQ)) +#define _Q7toIQ(A) ((_iq7)(A) >> (7 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 6) +#define _IQtoQ6(A) ((int32_t)(A) >> (GLOBAL_IQ - 6)) +#define _Q6toIQ(A) ((_iq6)(A) << (GLOBAL_IQ - 6)) +#else +#define _IQtoQ6(A) ((int32_t)(A) << (6 - GLOBAL_IQ)) +#define _Q6toIQ(A) ((_iq6)(A) >> (6 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 5) +#define _IQtoQ5(A) ((int32_t)(A) >> (GLOBAL_IQ - 5)) +#define _Q5toIQ(A) ((_iq5)(A) << (GLOBAL_IQ - 5)) +#else +#define _IQtoQ5(A) ((int32_t)(A) << (5 - GLOBAL_IQ)) +#define _Q5toIQ(A) ((_iq5)(A) >> (5 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 4) +#define _IQtoQ4(A) ((int32_t)(A) >> (GLOBAL_IQ - 4)) +#define _Q4toIQ(A) ((_iq4)(A) << (GLOBAL_IQ - 4)) +#else +#define _IQtoQ4(A) ((int32_t)(A) << (4 - GLOBAL_IQ)) +#define _Q4toIQ(A) ((_iq4)(A) >> (4 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 3) +#define _IQtoQ3(A) ((int32_t)(A) >> (GLOBAL_IQ - 3)) +#define _Q3toIQ(A) ((_iq3)(A) << (GLOBAL_IQ - 3)) +#else +#define _IQtoQ3(A) ((int32_t)(A) << (3 - GLOBAL_IQ)) +#define _Q3toIQ(A) ((_iq3)(A) >> (3 - GLOBAL_IQ)) +#endif + +#if (GLOBAL_IQ >= 2) +#define _IQtoQ2(A) ((int32_t)(A) >> (GLOBAL_IQ - 2)) +#define _Q2toIQ(A) ((_iq2)(A) << (GLOBAL_IQ - 2)) +#else +#define _IQtoQ2(A) ((int32_t)(A) << (2 - GLOBAL_IQ)) +#define _Q2toIQ(A) ((_iq2)(A) >> (2 - GLOBAL_IQ)) +#endif + +#define _IQtoQ1(A) ((int32_t)(A) >> (GLOBAL_IQ - 1)) +#define _Q1toIQ(A) ((_iq1)(A) << (GLOBAL_IQ - 1)) + +//***************************************************************************** +// +// Multiplies two IQ numbers. +// +//***************************************************************************** +extern _iq30 _IQ30mpy(_iq30 A, _iq30 B); +extern _iq29 _IQ29mpy(_iq29 A, _iq29 B); +extern _iq28 _IQ28mpy(_iq28 A, _iq28 B); +extern _iq27 _IQ27mpy(_iq27 A, _iq27 B); +extern _iq26 _IQ26mpy(_iq26 A, _iq26 B); +extern _iq25 _IQ25mpy(_iq25 A, _iq25 B); +extern _iq24 _IQ24mpy(_iq24 A, _iq24 B); +extern _iq23 _IQ23mpy(_iq23 A, _iq23 B); +extern _iq22 _IQ22mpy(_iq22 A, _iq22 B); +extern _iq21 _IQ21mpy(_iq21 A, _iq21 B); +extern _iq20 _IQ20mpy(_iq20 A, _iq20 B); +extern _iq19 _IQ19mpy(_iq19 A, _iq19 B); +extern _iq18 _IQ18mpy(_iq18 A, _iq18 B); +extern _iq17 _IQ17mpy(_iq17 A, _iq17 B); +extern _iq16 _IQ16mpy(_iq16 A, _iq16 B); +extern _iq15 _IQ15mpy(_iq15 A, _iq15 B); +extern _iq14 _IQ14mpy(_iq14 A, _iq14 B); +extern _iq13 _IQ13mpy(_iq13 A, _iq13 B); +extern _iq12 _IQ12mpy(_iq12 A, _iq12 B); +extern _iq11 _IQ11mpy(_iq11 A, _iq11 B); +extern _iq10 _IQ10mpy(_iq10 A, _iq10 B); +extern _iq9 _IQ9mpy(_iq9 A, _iq9 B); +extern _iq8 _IQ8mpy(_iq8 A, _iq8 B); +extern _iq7 _IQ7mpy(_iq7 A, _iq7 B); +extern _iq6 _IQ6mpy(_iq6 A, _iq6 B); +extern _iq5 _IQ5mpy(_iq5 A, _iq5 B); +extern _iq4 _IQ4mpy(_iq4 A, _iq4 B); +extern _iq3 _IQ3mpy(_iq3 A, _iq3 B); +extern _iq2 _IQ2mpy(_iq2 A, _iq2 B); +extern _iq1 _IQ1mpy(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 30 +#define _IQmpy(A, B) _IQ30mpy(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQmpy(A, B) _IQ29mpy(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQmpy(A, B) _IQ28mpy(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQmpy(A, B) _IQ27mpy(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQmpy(A, B) _IQ26mpy(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQmpy(A, B) _IQ25mpy(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQmpy(A, B) _IQ24mpy(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQmpy(A, B) _IQ23mpy(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQmpy(A, B) _IQ22mpy(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQmpy(A, B) _IQ21mpy(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQmpy(A, B) _IQ20mpy(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQmpy(A, B) _IQ19mpy(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQmpy(A, B) _IQ18mpy(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQmpy(A, B) _IQ17mpy(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQmpy(A, B) _IQ16mpy(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQmpy(A, B) _IQ15mpy(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQmpy(A, B) _IQ14mpy(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQmpy(A, B) _IQ13mpy(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQmpy(A, B) _IQ12mpy(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQmpy(A, B) _IQ11mpy(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQmpy(A, B) _IQ10mpy(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQmpy(A, B) _IQ9mpy(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQmpy(A, B) _IQ8mpy(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQmpy(A, B) _IQ7mpy(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQmpy(A, B) _IQ6mpy(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQmpy(A, B) _IQ5mpy(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQmpy(A, B) _IQ4mpy(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQmpy(A, B) _IQ3mpy(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQmpy(A, B) _IQ2mpy(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQmpy(A, B) _IQ1mpy(A, B) +#endif + +//***************************************************************************** +// +// Multiplies two IQ numbers, with rounding. +// +//***************************************************************************** +extern _iq30 _IQ30rmpy(_iq30 A, _iq30 B); +extern _iq29 _IQ29rmpy(_iq29 A, _iq29 B); +extern _iq28 _IQ28rmpy(_iq28 A, _iq28 B); +extern _iq27 _IQ27rmpy(_iq27 A, _iq27 B); +extern _iq26 _IQ26rmpy(_iq26 A, _iq26 B); +extern _iq25 _IQ25rmpy(_iq25 A, _iq25 B); +extern _iq24 _IQ24rmpy(_iq24 A, _iq24 B); +extern _iq23 _IQ23rmpy(_iq23 A, _iq23 B); +extern _iq22 _IQ22rmpy(_iq22 A, _iq22 B); +extern _iq21 _IQ21rmpy(_iq21 A, _iq21 B); +extern _iq20 _IQ20rmpy(_iq20 A, _iq20 B); +extern _iq19 _IQ19rmpy(_iq19 A, _iq19 B); +extern _iq18 _IQ18rmpy(_iq18 A, _iq18 B); +extern _iq17 _IQ17rmpy(_iq17 A, _iq17 B); +extern _iq16 _IQ16rmpy(_iq16 A, _iq16 B); +extern _iq15 _IQ15rmpy(_iq15 A, _iq15 B); +extern _iq14 _IQ14rmpy(_iq14 A, _iq14 B); +extern _iq13 _IQ13rmpy(_iq13 A, _iq13 B); +extern _iq12 _IQ12rmpy(_iq12 A, _iq12 B); +extern _iq11 _IQ11rmpy(_iq11 A, _iq11 B); +extern _iq10 _IQ10rmpy(_iq10 A, _iq10 B); +extern _iq9 _IQ9rmpy(_iq9 A, _iq9 B); +extern _iq8 _IQ8rmpy(_iq8 A, _iq8 B); +extern _iq7 _IQ7rmpy(_iq7 A, _iq7 B); +extern _iq6 _IQ6rmpy(_iq6 A, _iq6 B); +extern _iq5 _IQ5rmpy(_iq5 A, _iq5 B); +extern _iq4 _IQ4rmpy(_iq4 A, _iq4 B); +extern _iq3 _IQ3rmpy(_iq3 A, _iq3 B); +extern _iq2 _IQ2rmpy(_iq2 A, _iq2 B); +extern _iq1 _IQ1rmpy(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 30 +#define _IQrmpy(A, B) _IQ30rmpy(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQrmpy(A, B) _IQ29rmpy(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQrmpy(A, B) _IQ28rmpy(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQrmpy(A, B) _IQ27rmpy(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQrmpy(A, B) _IQ26rmpy(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQrmpy(A, B) _IQ25rmpy(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQrmpy(A, B) _IQ24rmpy(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQrmpy(A, B) _IQ23rmpy(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQrmpy(A, B) _IQ22rmpy(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQrmpy(A, B) _IQ21rmpy(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQrmpy(A, B) _IQ20rmpy(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQrmpy(A, B) _IQ19rmpy(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQrmpy(A, B) _IQ18rmpy(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQrmpy(A, B) _IQ17rmpy(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQrmpy(A, B) _IQ16rmpy(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQrmpy(A, B) _IQ15rmpy(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQrmpy(A, B) _IQ14rmpy(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQrmpy(A, B) _IQ13rmpy(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQrmpy(A, B) _IQ12rmpy(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQrmpy(A, B) _IQ11rmpy(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQrmpy(A, B) _IQ10rmpy(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQrmpy(A, B) _IQ9rmpy(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQrmpy(A, B) _IQ8rmpy(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQrmpy(A, B) _IQ7rmpy(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQrmpy(A, B) _IQ6rmpy(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQrmpy(A, B) _IQ5rmpy(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQrmpy(A, B) _IQ4rmpy(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQrmpy(A, B) _IQ3rmpy(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQrmpy(A, B) _IQ2rmpy(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQrmpy(A, B) _IQ1rmpy(A, B) +#endif + +//***************************************************************************** +// +// Multiplies two IQ numbers, with rounding and saturation. +// +//***************************************************************************** +extern _iq30 _IQ30rsmpy(_iq30 A, _iq30 B); +extern _iq29 _IQ29rsmpy(_iq29 A, _iq29 B); +extern _iq28 _IQ28rsmpy(_iq28 A, _iq28 B); +extern _iq27 _IQ27rsmpy(_iq27 A, _iq27 B); +extern _iq26 _IQ26rsmpy(_iq26 A, _iq26 B); +extern _iq25 _IQ25rsmpy(_iq25 A, _iq25 B); +extern _iq24 _IQ24rsmpy(_iq24 A, _iq24 B); +extern _iq23 _IQ23rsmpy(_iq23 A, _iq23 B); +extern _iq22 _IQ22rsmpy(_iq22 A, _iq22 B); +extern _iq21 _IQ21rsmpy(_iq21 A, _iq21 B); +extern _iq20 _IQ20rsmpy(_iq20 A, _iq20 B); +extern _iq19 _IQ19rsmpy(_iq19 A, _iq19 B); +extern _iq18 _IQ18rsmpy(_iq18 A, _iq18 B); +extern _iq17 _IQ17rsmpy(_iq17 A, _iq17 B); +extern _iq16 _IQ16rsmpy(_iq16 A, _iq16 B); +extern _iq15 _IQ15rsmpy(_iq15 A, _iq15 B); +extern _iq14 _IQ14rsmpy(_iq14 A, _iq14 B); +extern _iq13 _IQ13rsmpy(_iq13 A, _iq13 B); +extern _iq12 _IQ12rsmpy(_iq12 A, _iq12 B); +extern _iq11 _IQ11rsmpy(_iq11 A, _iq11 B); +extern _iq10 _IQ10rsmpy(_iq10 A, _iq10 B); +extern _iq9 _IQ9rsmpy(_iq9 A, _iq9 B); +extern _iq8 _IQ8rsmpy(_iq8 A, _iq8 B); +extern _iq7 _IQ7rsmpy(_iq7 A, _iq7 B); +extern _iq6 _IQ6rsmpy(_iq6 A, _iq6 B); +extern _iq5 _IQ5rsmpy(_iq5 A, _iq5 B); +extern _iq4 _IQ4rsmpy(_iq4 A, _iq4 B); +extern _iq3 _IQ3rsmpy(_iq3 A, _iq3 B); +extern _iq2 _IQ2rsmpy(_iq2 A, _iq2 B); +extern _iq1 _IQ1rsmpy(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 30 +#define _IQrsmpy(A, B) _IQ30rsmpy(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQrsmpy(A, B) _IQ29rsmpy(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQrsmpy(A, B) _IQ28rsmpy(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQrsmpy(A, B) _IQ27rsmpy(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQrsmpy(A, B) _IQ26rsmpy(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQrsmpy(A, B) _IQ25rsmpy(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQrsmpy(A, B) _IQ24rsmpy(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQrsmpy(A, B) _IQ23rsmpy(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQrsmpy(A, B) _IQ22rsmpy(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQrsmpy(A, B) _IQ21rsmpy(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQrsmpy(A, B) _IQ20rsmpy(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQrsmpy(A, B) _IQ19rsmpy(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQrsmpy(A, B) _IQ18rsmpy(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQrsmpy(A, B) _IQ17rsmpy(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQrsmpy(A, B) _IQ16rsmpy(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQrsmpy(A, B) _IQ15rsmpy(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQrsmpy(A, B) _IQ14rsmpy(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQrsmpy(A, B) _IQ13rsmpy(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQrsmpy(A, B) _IQ12rsmpy(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQrsmpy(A, B) _IQ11rsmpy(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQrsmpy(A, B) _IQ10rsmpy(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQrsmpy(A, B) _IQ9rsmpy(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQrsmpy(A, B) _IQ8rsmpy(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQrsmpy(A, B) _IQ7rsmpy(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQrsmpy(A, B) _IQ6rsmpy(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQrsmpy(A, B) _IQ5rsmpy(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQrsmpy(A, B) _IQ4rsmpy(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQrsmpy(A, B) _IQ3rsmpy(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQrsmpy(A, B) _IQ2rsmpy(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQrsmpy(A, B) _IQ1rsmpy(A, B) +#endif + +//***************************************************************************** +// +// Divides two IQ numbers. +// +//***************************************************************************** +extern _iq30 _IQ30div(_iq30 A, _iq30 B); +extern _iq29 _IQ29div(_iq29 A, _iq29 B); +extern _iq28 _IQ28div(_iq28 A, _iq28 B); +extern _iq27 _IQ27div(_iq27 A, _iq27 B); +extern _iq26 _IQ26div(_iq26 A, _iq26 B); +extern _iq25 _IQ25div(_iq25 A, _iq25 B); +extern _iq24 _IQ24div(_iq24 A, _iq24 B); +extern _iq23 _IQ23div(_iq23 A, _iq23 B); +extern _iq22 _IQ22div(_iq22 A, _iq22 B); +extern _iq21 _IQ21div(_iq21 A, _iq21 B); +extern _iq20 _IQ20div(_iq20 A, _iq20 B); +extern _iq19 _IQ19div(_iq19 A, _iq19 B); +extern _iq18 _IQ18div(_iq18 A, _iq18 B); +extern _iq17 _IQ17div(_iq17 A, _iq17 B); +extern _iq16 _IQ16div(_iq16 A, _iq16 B); +extern _iq15 _IQ15div(_iq15 A, _iq15 B); +extern _iq14 _IQ14div(_iq14 A, _iq14 B); +extern _iq13 _IQ13div(_iq13 A, _iq13 B); +extern _iq12 _IQ12div(_iq12 A, _iq12 B); +extern _iq11 _IQ11div(_iq11 A, _iq11 B); +extern _iq10 _IQ10div(_iq10 A, _iq10 B); +extern _iq9 _IQ9div(_iq9 A, _iq9 B); +extern _iq8 _IQ8div(_iq8 A, _iq8 B); +extern _iq7 _IQ7div(_iq7 A, _iq7 B); +extern _iq6 _IQ6div(_iq6 A, _iq6 B); +extern _iq5 _IQ5div(_iq5 A, _iq5 B); +extern _iq4 _IQ4div(_iq4 A, _iq4 B); +extern _iq3 _IQ3div(_iq3 A, _iq3 B); +extern _iq2 _IQ2div(_iq2 A, _iq2 B); +extern _iq1 _IQ1div(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 30 +#define _IQdiv(A, B) _IQ30div(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQdiv(A, B) _IQ29div(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQdiv(A, B) _IQ28div(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQdiv(A, B) _IQ27div(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQdiv(A, B) _IQ26div(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQdiv(A, B) _IQ25div(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQdiv(A, B) _IQ24div(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQdiv(A, B) _IQ23div(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQdiv(A, B) _IQ22div(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQdiv(A, B) _IQ21div(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQdiv(A, B) _IQ20div(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQdiv(A, B) _IQ19div(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQdiv(A, B) _IQ18div(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQdiv(A, B) _IQ17div(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQdiv(A, B) _IQ16div(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQdiv(A, B) _IQ15div(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQdiv(A, B) _IQ14div(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQdiv(A, B) _IQ13div(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQdiv(A, B) _IQ12div(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQdiv(A, B) _IQ11div(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQdiv(A, B) _IQ10div(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQdiv(A, B) _IQ9div(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQdiv(A, B) _IQ8div(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQdiv(A, B) _IQ7div(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQdiv(A, B) _IQ6div(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQdiv(A, B) _IQ5div(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQdiv(A, B) _IQ4div(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQdiv(A, B) _IQ3div(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQdiv(A, B) _IQ2div(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQdiv(A, B) _IQ1div(A, B) +#endif + +//***************************************************************************** +// +// Computes the sin of an IQ number. +// +//***************************************************************************** +extern _iq29 _IQ29sin(_iq29 A); +extern _iq28 _IQ28sin(_iq28 A); +extern _iq27 _IQ27sin(_iq27 A); +extern _iq26 _IQ26sin(_iq26 A); +extern _iq25 _IQ25sin(_iq25 A); +extern _iq24 _IQ24sin(_iq24 A); +extern _iq23 _IQ23sin(_iq23 A); +extern _iq22 _IQ22sin(_iq22 A); +extern _iq21 _IQ21sin(_iq21 A); +extern _iq20 _IQ20sin(_iq20 A); +extern _iq19 _IQ19sin(_iq19 A); +extern _iq18 _IQ18sin(_iq18 A); +extern _iq17 _IQ17sin(_iq17 A); +extern _iq16 _IQ16sin(_iq16 A); +extern _iq15 _IQ15sin(_iq15 A); +extern _iq14 _IQ14sin(_iq14 A); +extern _iq13 _IQ13sin(_iq13 A); +extern _iq12 _IQ12sin(_iq12 A); +extern _iq11 _IQ11sin(_iq11 A); +extern _iq10 _IQ10sin(_iq10 A); +extern _iq9 _IQ9sin(_iq9 A); +extern _iq8 _IQ8sin(_iq8 A); +extern _iq7 _IQ7sin(_iq7 A); +extern _iq6 _IQ6sin(_iq6 A); +extern _iq5 _IQ5sin(_iq5 A); +extern _iq4 _IQ4sin(_iq4 A); +extern _iq3 _IQ3sin(_iq3 A); +extern _iq2 _IQ2sin(_iq2 A); +extern _iq1 _IQ1sin(_iq1 A); + +#if GLOBAL_IQ == 29 +#define _IQsin(A) _IQ29sin(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQsin(A) _IQ28sin(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQsin(A) _IQ27sin(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQsin(A) _IQ26sin(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQsin(A) _IQ25sin(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQsin(A) _IQ24sin(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQsin(A) _IQ23sin(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQsin(A) _IQ22sin(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQsin(A) _IQ21sin(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQsin(A) _IQ20sin(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQsin(A) _IQ19sin(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQsin(A) _IQ18sin(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQsin(A) _IQ17sin(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQsin(A) _IQ16sin(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQsin(A) _IQ15sin(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQsin(A) _IQ14sin(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQsin(A) _IQ13sin(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQsin(A) _IQ12sin(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQsin(A) _IQ11sin(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQsin(A) _IQ10sin(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQsin(A) _IQ9sin(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQsin(A) _IQ8sin(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQsin(A) _IQ7sin(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQsin(A) _IQ6sin(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQsin(A) _IQ5sin(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQsin(A) _IQ4sin(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQsin(A) _IQ3sin(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQsin(A) _IQ2sin(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQsin(A) _IQ1sin(A) +#endif + +//***************************************************************************** +// +// Computes the sin of an IQ number, using cycles per unit instead of radians. +// +//***************************************************************************** +extern _iq30 _IQ30sinPU(_iq30 A); +extern _iq29 _IQ29sinPU(_iq29 A); +extern _iq28 _IQ28sinPU(_iq28 A); +extern _iq27 _IQ27sinPU(_iq27 A); +extern _iq26 _IQ26sinPU(_iq26 A); +extern _iq25 _IQ25sinPU(_iq25 A); +extern _iq24 _IQ24sinPU(_iq24 A); +extern _iq23 _IQ23sinPU(_iq23 A); +extern _iq22 _IQ22sinPU(_iq22 A); +extern _iq21 _IQ21sinPU(_iq21 A); +extern _iq20 _IQ20sinPU(_iq20 A); +extern _iq19 _IQ19sinPU(_iq19 A); +extern _iq18 _IQ18sinPU(_iq18 A); +extern _iq17 _IQ17sinPU(_iq17 A); +extern _iq16 _IQ16sinPU(_iq16 A); +extern _iq15 _IQ15sinPU(_iq15 A); +extern _iq14 _IQ14sinPU(_iq14 A); +extern _iq13 _IQ13sinPU(_iq13 A); +extern _iq12 _IQ12sinPU(_iq12 A); +extern _iq11 _IQ11sinPU(_iq11 A); +extern _iq10 _IQ10sinPU(_iq10 A); +extern _iq9 _IQ9sinPU(_iq9 A); +extern _iq8 _IQ8sinPU(_iq8 A); +extern _iq7 _IQ7sinPU(_iq7 A); +extern _iq6 _IQ6sinPU(_iq6 A); +extern _iq5 _IQ5sinPU(_iq5 A); +extern _iq4 _IQ4sinPU(_iq4 A); +extern _iq3 _IQ3sinPU(_iq3 A); +extern _iq2 _IQ2sinPU(_iq2 A); +extern _iq1 _IQ1sinPU(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQsinPU(A) _IQ30sinPU(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQsinPU(A) _IQ29sinPU(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQsinPU(A) _IQ28sinPU(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQsinPU(A) _IQ27sinPU(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQsinPU(A) _IQ26sinPU(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQsinPU(A) _IQ25sinPU(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQsinPU(A) _IQ24sinPU(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQsinPU(A) _IQ23sinPU(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQsinPU(A) _IQ22sinPU(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQsinPU(A) _IQ21sinPU(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQsinPU(A) _IQ20sinPU(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQsinPU(A) _IQ19sinPU(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQsinPU(A) _IQ18sinPU(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQsinPU(A) _IQ17sinPU(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQsinPU(A) _IQ16sinPU(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQsinPU(A) _IQ15sinPU(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQsinPU(A) _IQ14sinPU(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQsinPU(A) _IQ13sinPU(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQsinPU(A) _IQ12sinPU(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQsinPU(A) _IQ11sinPU(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQsinPU(A) _IQ10sinPU(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQsinPU(A) _IQ9sinPU(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQsinPU(A) _IQ8sinPU(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQsinPU(A) _IQ7sinPU(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQsinPU(A) _IQ6sinPU(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQsinPU(A) _IQ5sinPU(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQsinPU(A) _IQ4sinPU(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQsinPU(A) _IQ3sinPU(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQsinPU(A) _IQ2sinPU(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQsinPU(A) _IQ1sinPU(A) +#endif + +//***************************************************************************** +// +// Computes the arcsin of an IQ number. +// +//***************************************************************************** +extern _iq29 _IQ29asin(_iq29 A); +extern _iq28 _IQ28asin(_iq28 A); +extern _iq27 _IQ27asin(_iq27 A); +extern _iq26 _IQ26asin(_iq26 A); +extern _iq25 _IQ25asin(_iq25 A); +extern _iq24 _IQ24asin(_iq24 A); +extern _iq23 _IQ23asin(_iq23 A); +extern _iq22 _IQ22asin(_iq22 A); +extern _iq21 _IQ21asin(_iq21 A); +extern _iq20 _IQ20asin(_iq20 A); +extern _iq19 _IQ19asin(_iq19 A); +extern _iq18 _IQ18asin(_iq18 A); +extern _iq17 _IQ17asin(_iq17 A); +extern _iq16 _IQ16asin(_iq16 A); +extern _iq15 _IQ15asin(_iq15 A); +extern _iq14 _IQ14asin(_iq14 A); +extern _iq13 _IQ13asin(_iq13 A); +extern _iq12 _IQ12asin(_iq12 A); +extern _iq11 _IQ11asin(_iq11 A); +extern _iq10 _IQ10asin(_iq10 A); +extern _iq9 _IQ9asin(_iq9 A); +extern _iq8 _IQ8asin(_iq8 A); +extern _iq7 _IQ7asin(_iq7 A); +extern _iq6 _IQ6asin(_iq6 A); +extern _iq5 _IQ5asin(_iq5 A); +extern _iq4 _IQ4asin(_iq4 A); +extern _iq3 _IQ3asin(_iq3 A); +extern _iq2 _IQ2asin(_iq2 A); +extern _iq1 _IQ1asin(_iq1 A); + +#if GLOBAL_IQ == 29 +#define _IQasin(A) _IQ29asin(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQasin(A) _IQ28asin(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQasin(A) _IQ27asin(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQasin(A) _IQ26asin(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQasin(A) _IQ25asin(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQasin(A) _IQ24asin(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQasin(A) _IQ23asin(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQasin(A) _IQ22asin(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQasin(A) _IQ21asin(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQasin(A) _IQ20asin(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQasin(A) _IQ19asin(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQasin(A) _IQ18asin(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQasin(A) _IQ17asin(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQasin(A) _IQ16asin(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQasin(A) _IQ15asin(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQasin(A) _IQ14asin(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQasin(A) _IQ13asin(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQasin(A) _IQ12asin(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQasin(A) _IQ11asin(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQasin(A) _IQ10asin(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQasin(A) _IQ9asin(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQasin(A) _IQ8asin(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQasin(A) _IQ7asin(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQasin(A) _IQ6asin(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQasin(A) _IQ5asin(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQasin(A) _IQ4asin(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQasin(A) _IQ3asin(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQasin(A) _IQ2asin(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQasin(A) _IQ1asin(A) +#endif + +//***************************************************************************** +// +// Computes the cos of an IQ number. +// +//***************************************************************************** +extern _iq29 _IQ29cos(_iq29 A); +extern _iq28 _IQ28cos(_iq28 A); +extern _iq27 _IQ27cos(_iq27 A); +extern _iq26 _IQ26cos(_iq26 A); +extern _iq25 _IQ25cos(_iq25 A); +extern _iq24 _IQ24cos(_iq24 A); +extern _iq23 _IQ23cos(_iq23 A); +extern _iq22 _IQ22cos(_iq22 A); +extern _iq21 _IQ21cos(_iq21 A); +extern _iq20 _IQ20cos(_iq20 A); +extern _iq19 _IQ19cos(_iq19 A); +extern _iq18 _IQ18cos(_iq18 A); +extern _iq17 _IQ17cos(_iq17 A); +extern _iq16 _IQ16cos(_iq16 A); +extern _iq15 _IQ15cos(_iq15 A); +extern _iq14 _IQ14cos(_iq14 A); +extern _iq13 _IQ13cos(_iq13 A); +extern _iq12 _IQ12cos(_iq12 A); +extern _iq11 _IQ11cos(_iq11 A); +extern _iq10 _IQ10cos(_iq10 A); +extern _iq9 _IQ9cos(_iq9 A); +extern _iq8 _IQ8cos(_iq8 A); +extern _iq7 _IQ7cos(_iq7 A); +extern _iq6 _IQ6cos(_iq6 A); +extern _iq5 _IQ5cos(_iq5 A); +extern _iq4 _IQ4cos(_iq4 A); +extern _iq3 _IQ3cos(_iq3 A); +extern _iq2 _IQ2cos(_iq2 A); +extern _iq1 _IQ1cos(_iq1 A); + +#if GLOBAL_IQ == 29 +#define _IQcos(A) _IQ29cos(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQcos(A) _IQ28cos(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQcos(A) _IQ27cos(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQcos(A) _IQ26cos(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQcos(A) _IQ25cos(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQcos(A) _IQ24cos(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQcos(A) _IQ23cos(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQcos(A) _IQ22cos(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQcos(A) _IQ21cos(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQcos(A) _IQ20cos(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQcos(A) _IQ19cos(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQcos(A) _IQ18cos(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQcos(A) _IQ17cos(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQcos(A) _IQ16cos(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQcos(A) _IQ15cos(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQcos(A) _IQ14cos(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQcos(A) _IQ13cos(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQcos(A) _IQ12cos(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQcos(A) _IQ11cos(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQcos(A) _IQ10cos(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQcos(A) _IQ9cos(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQcos(A) _IQ8cos(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQcos(A) _IQ7cos(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQcos(A) _IQ6cos(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQcos(A) _IQ5cos(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQcos(A) _IQ4cos(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQcos(A) _IQ3cos(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQcos(A) _IQ2cos(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQcos(A) _IQ1cos(A) +#endif + +//***************************************************************************** +// +// Computes the cos of an IQ number, using cycles per unit instead of radians. +// +//***************************************************************************** +extern _iq30 _IQ30cosPU(_iq30 A); +extern _iq29 _IQ29cosPU(_iq29 A); +extern _iq28 _IQ28cosPU(_iq28 A); +extern _iq27 _IQ27cosPU(_iq27 A); +extern _iq26 _IQ26cosPU(_iq26 A); +extern _iq25 _IQ25cosPU(_iq25 A); +extern _iq24 _IQ24cosPU(_iq24 A); +extern _iq23 _IQ23cosPU(_iq23 A); +extern _iq22 _IQ22cosPU(_iq22 A); +extern _iq21 _IQ21cosPU(_iq21 A); +extern _iq20 _IQ20cosPU(_iq20 A); +extern _iq19 _IQ19cosPU(_iq19 A); +extern _iq18 _IQ18cosPU(_iq18 A); +extern _iq17 _IQ17cosPU(_iq17 A); +extern _iq16 _IQ16cosPU(_iq16 A); +extern _iq15 _IQ15cosPU(_iq15 A); +extern _iq14 _IQ14cosPU(_iq14 A); +extern _iq13 _IQ13cosPU(_iq13 A); +extern _iq12 _IQ12cosPU(_iq12 A); +extern _iq11 _IQ11cosPU(_iq11 A); +extern _iq10 _IQ10cosPU(_iq10 A); +extern _iq9 _IQ9cosPU(_iq9 A); +extern _iq8 _IQ8cosPU(_iq8 A); +extern _iq7 _IQ7cosPU(_iq7 A); +extern _iq6 _IQ6cosPU(_iq6 A); +extern _iq5 _IQ5cosPU(_iq5 A); +extern _iq4 _IQ4cosPU(_iq4 A); +extern _iq3 _IQ3cosPU(_iq3 A); +extern _iq2 _IQ2cosPU(_iq2 A); +extern _iq1 _IQ1cosPU(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQcosPU(A) _IQ30cosPU(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQcosPU(A) _IQ29cosPU(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQcosPU(A) _IQ28cosPU(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQcosPU(A) _IQ27cosPU(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQcosPU(A) _IQ26cosPU(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQcosPU(A) _IQ25cosPU(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQcosPU(A) _IQ24cosPU(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQcosPU(A) _IQ23cosPU(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQcosPU(A) _IQ22cosPU(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQcosPU(A) _IQ21cosPU(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQcosPU(A) _IQ20cosPU(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQcosPU(A) _IQ19cosPU(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQcosPU(A) _IQ18cosPU(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQcosPU(A) _IQ17cosPU(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQcosPU(A) _IQ16cosPU(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQcosPU(A) _IQ15cosPU(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQcosPU(A) _IQ14cosPU(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQcosPU(A) _IQ13cosPU(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQcosPU(A) _IQ12cosPU(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQcosPU(A) _IQ11cosPU(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQcosPU(A) _IQ10cosPU(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQcosPU(A) _IQ9cosPU(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQcosPU(A) _IQ8cosPU(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQcosPU(A) _IQ7cosPU(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQcosPU(A) _IQ6cosPU(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQcosPU(A) _IQ5cosPU(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQcosPU(A) _IQ4cosPU(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQcosPU(A) _IQ3cosPU(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQcosPU(A) _IQ2cosPU(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQcosPU(A) _IQ1cosPU(A) +#endif + +//***************************************************************************** +// +// Computes the arccos of an IQ number. +// +//***************************************************************************** +#define _IQ29acos(A) (_IQ29(1.570796327) - _IQ29asin(A)) +#define _IQ28acos(A) (_IQ28(1.570796327) - _IQ28asin(A)) +#define _IQ27acos(A) (_IQ27(1.570796327) - _IQ27asin(A)) +#define _IQ26acos(A) (_IQ26(1.570796327) - _IQ26asin(A)) +#define _IQ25acos(A) (_IQ25(1.570796327) - _IQ25asin(A)) +#define _IQ24acos(A) (_IQ24(1.570796327) - _IQ24asin(A)) +#define _IQ23acos(A) (_IQ23(1.570796327) - _IQ23asin(A)) +#define _IQ22acos(A) (_IQ22(1.570796327) - _IQ22asin(A)) +#define _IQ21acos(A) (_IQ21(1.570796327) - _IQ21asin(A)) +#define _IQ20acos(A) (_IQ20(1.570796327) - _IQ20asin(A)) +#define _IQ19acos(A) (_IQ19(1.570796327) - _IQ19asin(A)) +#define _IQ18acos(A) (_IQ18(1.570796327) - _IQ18asin(A)) +#define _IQ17acos(A) (_IQ17(1.570796327) - _IQ17asin(A)) +#define _IQ16acos(A) (_IQ16(1.570796327) - _IQ16asin(A)) +#define _IQ15acos(A) (_IQ15(1.570796327) - _IQ15asin(A)) +#define _IQ14acos(A) (_IQ14(1.570796327) - _IQ14asin(A)) +#define _IQ13acos(A) (_IQ13(1.570796327) - _IQ13asin(A)) +#define _IQ12acos(A) (_IQ12(1.570796327) - _IQ12asin(A)) +#define _IQ11acos(A) (_IQ11(1.570796327) - _IQ11asin(A)) +#define _IQ10acos(A) (_IQ10(1.570796327) - _IQ10asin(A)) +#define _IQ9acos(A) (_IQ9(1.570796327) - _IQ9asin(A)) +#define _IQ8acos(A) (_IQ8(1.570796327) - _IQ8asin(A)) +#define _IQ7acos(A) (_IQ7(1.570796327) - _IQ7asin(A)) +#define _IQ6acos(A) (_IQ6(1.570796327) - _IQ6asin(A)) +#define _IQ5acos(A) (_IQ5(1.570796327) - _IQ5asin(A)) +#define _IQ4acos(A) (_IQ4(1.570796327) - _IQ4asin(A)) +#define _IQ3acos(A) (_IQ3(1.570796327) - _IQ3asin(A)) +#define _IQ2acos(A) (_IQ2(1.570796327) - _IQ2asin(A)) +#define _IQ1acos(A) (_IQ1(1.570796327) - _IQ1asin(A)) + +#if GLOBAL_IQ == 29 +#define _IQacos(A) _IQ29acos(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQacos(A) _IQ28acos(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQacos(A) _IQ27acos(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQacos(A) _IQ26acos(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQacos(A) _IQ25acos(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQacos(A) _IQ24acos(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQacos(A) _IQ23acos(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQacos(A) _IQ22acos(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQacos(A) _IQ21acos(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQacos(A) _IQ20acos(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQacos(A) _IQ19acos(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQacos(A) _IQ18acos(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQacos(A) _IQ17acos(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQacos(A) _IQ16acos(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQacos(A) _IQ15acos(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQacos(A) _IQ14acos(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQacos(A) _IQ13acos(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQacos(A) _IQ12acos(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQacos(A) _IQ11acos(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQacos(A) _IQ10acos(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQacos(A) _IQ9acos(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQacos(A) _IQ8acos(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQacos(A) _IQ7acos(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQacos(A) _IQ6acos(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQacos(A) _IQ5acos(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQacos(A) _IQ4acos(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQacos(A) _IQ3acos(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQacos(A) _IQ2acos(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQacos(A) _IQ1acos(A) +#endif + +//***************************************************************************** +// +// Computes the arctan of a coordinate specified by two IQ numbers. +// +//***************************************************************************** +extern _iq29 _IQ29atan2(_iq29 A, _iq29 B); +extern _iq28 _IQ28atan2(_iq28 A, _iq28 B); +extern _iq27 _IQ27atan2(_iq27 A, _iq27 B); +extern _iq26 _IQ26atan2(_iq26 A, _iq26 B); +extern _iq25 _IQ25atan2(_iq25 A, _iq25 B); +extern _iq24 _IQ24atan2(_iq24 A, _iq24 B); +extern _iq23 _IQ23atan2(_iq23 A, _iq23 B); +extern _iq22 _IQ22atan2(_iq22 A, _iq22 B); +extern _iq21 _IQ21atan2(_iq21 A, _iq21 B); +extern _iq20 _IQ20atan2(_iq20 A, _iq20 B); +extern _iq19 _IQ19atan2(_iq19 A, _iq19 B); +extern _iq18 _IQ18atan2(_iq18 A, _iq18 B); +extern _iq17 _IQ17atan2(_iq17 A, _iq17 B); +extern _iq16 _IQ16atan2(_iq16 A, _iq16 B); +extern _iq15 _IQ15atan2(_iq15 A, _iq15 B); +extern _iq14 _IQ14atan2(_iq14 A, _iq14 B); +extern _iq13 _IQ13atan2(_iq13 A, _iq13 B); +extern _iq12 _IQ12atan2(_iq12 A, _iq12 B); +extern _iq11 _IQ11atan2(_iq11 A, _iq11 B); +extern _iq10 _IQ10atan2(_iq10 A, _iq10 B); +extern _iq9 _IQ9atan2(_iq9 A, _iq9 B); +extern _iq8 _IQ8atan2(_iq8 A, _iq8 B); +extern _iq7 _IQ7atan2(_iq7 A, _iq7 B); +extern _iq6 _IQ6atan2(_iq6 A, _iq6 B); +extern _iq5 _IQ5atan2(_iq5 A, _iq5 B); +extern _iq4 _IQ4atan2(_iq4 A, _iq4 B); +extern _iq3 _IQ3atan2(_iq3 A, _iq3 B); +extern _iq2 _IQ2atan2(_iq2 A, _iq2 B); +extern _iq1 _IQ1atan2(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 29 +#define _IQatan2(A, B) _IQ29atan2(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQatan2(A, B) _IQ28atan2(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQatan2(A, B) _IQ27atan2(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQatan2(A, B) _IQ26atan2(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQatan2(A, B) _IQ25atan2(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQatan2(A, B) _IQ24atan2(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQatan2(A, B) _IQ23atan2(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQatan2(A, B) _IQ22atan2(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQatan2(A, B) _IQ21atan2(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQatan2(A, B) _IQ20atan2(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQatan2(A, B) _IQ19atan2(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQatan2(A, B) _IQ18atan2(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQatan2(A, B) _IQ17atan2(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQatan2(A, B) _IQ16atan2(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQatan2(A, B) _IQ15atan2(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQatan2(A, B) _IQ14atan2(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQatan2(A, B) _IQ13atan2(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQatan2(A, B) _IQ12atan2(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQatan2(A, B) _IQ11atan2(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQatan2(A, B) _IQ10atan2(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQatan2(A, B) _IQ9atan2(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQatan2(A, B) _IQ8atan2(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQatan2(A, B) _IQ7atan2(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQatan2(A, B) _IQ6atan2(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQatan2(A, B) _IQ5atan2(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQatan2(A, B) _IQ4atan2(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQatan2(A, B) _IQ3atan2(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQatan2(A, B) _IQ2atan2(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQatan2(A, B) _IQ1atan2(A, B) +#endif + +//***************************************************************************** +// +// Computes the arctan of a coordinate specified by two IQ numbers, returning +// the value in cycles per unit instead of radians. +// +//***************************************************************************** +extern _iq30 _IQ30atan2PU(_iq30 A, _iq30 B); +extern _iq29 _IQ29atan2PU(_iq29 A, _iq29 B); +extern _iq28 _IQ28atan2PU(_iq28 A, _iq28 B); +extern _iq27 _IQ27atan2PU(_iq27 A, _iq27 B); +extern _iq26 _IQ26atan2PU(_iq26 A, _iq26 B); +extern _iq25 _IQ25atan2PU(_iq25 A, _iq25 B); +extern _iq24 _IQ24atan2PU(_iq24 A, _iq24 B); +extern _iq23 _IQ23atan2PU(_iq23 A, _iq23 B); +extern _iq22 _IQ22atan2PU(_iq22 A, _iq22 B); +extern _iq21 _IQ21atan2PU(_iq21 A, _iq21 B); +extern _iq20 _IQ20atan2PU(_iq20 A, _iq20 B); +extern _iq19 _IQ19atan2PU(_iq19 A, _iq19 B); +extern _iq18 _IQ18atan2PU(_iq18 A, _iq18 B); +extern _iq17 _IQ17atan2PU(_iq17 A, _iq17 B); +extern _iq16 _IQ16atan2PU(_iq16 A, _iq16 B); +extern _iq15 _IQ15atan2PU(_iq15 A, _iq15 B); +extern _iq14 _IQ14atan2PU(_iq14 A, _iq14 B); +extern _iq13 _IQ13atan2PU(_iq13 A, _iq13 B); +extern _iq12 _IQ12atan2PU(_iq12 A, _iq12 B); +extern _iq11 _IQ11atan2PU(_iq11 A, _iq11 B); +extern _iq10 _IQ10atan2PU(_iq10 A, _iq10 B); +extern _iq9 _IQ9atan2PU(_iq9 A, _iq9 B); +extern _iq8 _IQ8atan2PU(_iq8 A, _iq8 B); +extern _iq7 _IQ7atan2PU(_iq7 A, _iq7 B); +extern _iq6 _IQ6atan2PU(_iq6 A, _iq6 B); +extern _iq5 _IQ5atan2PU(_iq5 A, _iq5 B); +extern _iq4 _IQ4atan2PU(_iq4 A, _iq4 B); +extern _iq3 _IQ3atan2PU(_iq3 A, _iq3 B); +extern _iq2 _IQ2atan2PU(_iq2 A, _iq2 B); +extern _iq1 _IQ1atan2PU(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 30 +#define _IQatan2PU(A, B) _IQ30atan2PU(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQatan2PU(A, B) _IQ29atan2PU(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQatan2PU(A, B) _IQ28atan2PU(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQatan2PU(A, B) _IQ27atan2PU(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQatan2PU(A, B) _IQ26atan2PU(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQatan2PU(A, B) _IQ25atan2PU(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQatan2PU(A, B) _IQ24atan2PU(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQatan2PU(A, B) _IQ23atan2PU(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQatan2PU(A, B) _IQ22atan2PU(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQatan2PU(A, B) _IQ21atan2PU(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQatan2PU(A, B) _IQ20atan2PU(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQatan2PU(A, B) _IQ19atan2PU(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQatan2PU(A, B) _IQ18atan2PU(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQatan2PU(A, B) _IQ17atan2PU(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQatan2PU(A, B) _IQ16atan2PU(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQatan2PU(A, B) _IQ15atan2PU(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQatan2PU(A, B) _IQ14atan2PU(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQatan2PU(A, B) _IQ13atan2PU(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQatan2PU(A, B) _IQ12atan2PU(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQatan2PU(A, B) _IQ11atan2PU(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQatan2PU(A, B) _IQ10atan2PU(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQatan2PU(A, B) _IQ9atan2PU(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQatan2PU(A, B) _IQ8atan2PU(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQatan2PU(A, B) _IQ7atan2PU(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQatan2PU(A, B) _IQ6atan2PU(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQatan2PU(A, B) _IQ5atan2PU(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQatan2PU(A, B) _IQ4atan2PU(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQatan2PU(A, B) _IQ3atan2PU(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQatan2PU(A, B) _IQ2atan2PU(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQatan2PU(A, B) _IQ1atan2PU(A, B) +#endif + +//***************************************************************************** +// +// Computes the arctan of an IQ number. +// +//***************************************************************************** +#define _IQ29atan(A) _IQ29atan2(A, _IQ29(1.0)) +#define _IQ28atan(A) _IQ28atan2(A, _IQ28(1.0)) +#define _IQ27atan(A) _IQ27atan2(A, _IQ27(1.0)) +#define _IQ26atan(A) _IQ26atan2(A, _IQ26(1.0)) +#define _IQ25atan(A) _IQ25atan2(A, _IQ25(1.0)) +#define _IQ24atan(A) _IQ24atan2(A, _IQ24(1.0)) +#define _IQ23atan(A) _IQ23atan2(A, _IQ23(1.0)) +#define _IQ22atan(A) _IQ22atan2(A, _IQ22(1.0)) +#define _IQ21atan(A) _IQ21atan2(A, _IQ21(1.0)) +#define _IQ20atan(A) _IQ20atan2(A, _IQ20(1.0)) +#define _IQ19atan(A) _IQ19atan2(A, _IQ19(1.0)) +#define _IQ18atan(A) _IQ18atan2(A, _IQ18(1.0)) +#define _IQ17atan(A) _IQ17atan2(A, _IQ17(1.0)) +#define _IQ16atan(A) _IQ16atan2(A, _IQ16(1.0)) +#define _IQ15atan(A) _IQ15atan2(A, _IQ15(1.0)) +#define _IQ14atan(A) _IQ14atan2(A, _IQ14(1.0)) +#define _IQ13atan(A) _IQ13atan2(A, _IQ13(1.0)) +#define _IQ12atan(A) _IQ12atan2(A, _IQ12(1.0)) +#define _IQ11atan(A) _IQ11atan2(A, _IQ11(1.0)) +#define _IQ10atan(A) _IQ10atan2(A, _IQ10(1.0)) +#define _IQ9atan(A) _IQ9atan2(A, _IQ9(1.0)) +#define _IQ8atan(A) _IQ8atan2(A, _IQ8(1.0)) +#define _IQ7atan(A) _IQ7atan2(A, _IQ7(1.0)) +#define _IQ6atan(A) _IQ6atan2(A, _IQ6(1.0)) +#define _IQ5atan(A) _IQ5atan2(A, _IQ5(1.0)) +#define _IQ4atan(A) _IQ4atan2(A, _IQ4(1.0)) +#define _IQ3atan(A) _IQ3atan2(A, _IQ3(1.0)) +#define _IQ2atan(A) _IQ2atan2(A, _IQ2(1.0)) +#define _IQ1atan(A) _IQ1atan2(A, _IQ1(1.0)) + +#if GLOBAL_IQ == 29 +#define _IQatan(A) _IQ29atan2(A, _IQ29(1.0)) +#endif +#if GLOBAL_IQ == 28 +#define _IQatan(A) _IQ28atan2(A, _IQ28(1.0)) +#endif +#if GLOBAL_IQ == 27 +#define _IQatan(A) _IQ27atan2(A, _IQ27(1.0)) +#endif +#if GLOBAL_IQ == 26 +#define _IQatan(A) _IQ26atan2(A, _IQ26(1.0)) +#endif +#if GLOBAL_IQ == 25 +#define _IQatan(A) _IQ25atan2(A, _IQ25(1.0)) +#endif +#if GLOBAL_IQ == 24 +#define _IQatan(A) _IQ24atan2(A, _IQ24(1.0)) +#endif +#if GLOBAL_IQ == 23 +#define _IQatan(A) _IQ23atan2(A, _IQ23(1.0)) +#endif +#if GLOBAL_IQ == 22 +#define _IQatan(A) _IQ22atan2(A, _IQ22(1.0)) +#endif +#if GLOBAL_IQ == 21 +#define _IQatan(A) _IQ21atan2(A, _IQ21(1.0)) +#endif +#if GLOBAL_IQ == 20 +#define _IQatan(A) _IQ20atan2(A, _IQ20(1.0)) +#endif +#if GLOBAL_IQ == 19 +#define _IQatan(A) _IQ19atan2(A, _IQ19(1.0)) +#endif +#if GLOBAL_IQ == 18 +#define _IQatan(A) _IQ18atan2(A, _IQ18(1.0)) +#endif +#if GLOBAL_IQ == 17 +#define _IQatan(A) _IQ17atan2(A, _IQ17(1.0)) +#endif +#if GLOBAL_IQ == 16 +#define _IQatan(A) _IQ16atan2(A, _IQ16(1.0)) +#endif +#if GLOBAL_IQ == 15 +#define _IQatan(A) _IQ15atan2(A, _IQ15(1.0)) +#endif +#if GLOBAL_IQ == 14 +#define _IQatan(A) _IQ14atan2(A, _IQ14(1.0)) +#endif +#if GLOBAL_IQ == 13 +#define _IQatan(A) _IQ13atan2(A, _IQ13(1.0)) +#endif +#if GLOBAL_IQ == 12 +#define _IQatan(A) _IQ12atan2(A, _IQ12(1.0)) +#endif +#if GLOBAL_IQ == 11 +#define _IQatan(A) _IQ11atan2(A, _IQ11(1.0)) +#endif +#if GLOBAL_IQ == 10 +#define _IQatan(A) _IQ10atan2(A, _IQ10(1.0)) +#endif +#if GLOBAL_IQ == 9 +#define _IQatan(A) _IQ9atan2(A, _IQ9(1.0)) +#endif +#if GLOBAL_IQ == 8 +#define _IQatan(A) _IQ8atan2(A, _IQ8(1.0)) +#endif +#if GLOBAL_IQ == 7 +#define _IQatan(A) _IQ7atan2(A, _IQ7(1.0)) +#endif +#if GLOBAL_IQ == 6 +#define _IQatan(A) _IQ6atan2(A, _IQ6(1.0)) +#endif +#if GLOBAL_IQ == 5 +#define _IQatan(A) _IQ5atan2(A, _IQ5(1.0)) +#endif +#if GLOBAL_IQ == 4 +#define _IQatan(A) _IQ4atan2(A, _IQ4(1.0)) +#endif +#if GLOBAL_IQ == 3 +#define _IQatan(A) _IQ3atan2(A, _IQ3(1.0)) +#endif +#if GLOBAL_IQ == 2 +#define _IQatan(A) _IQ2atan2(A, _IQ2(1.0)) +#endif +#if GLOBAL_IQ == 1 +#define _IQatan(A) _IQ1atan2(A, _IQ1(1.0)) +#endif + +//***************************************************************************** +// +// Computes the square root of an IQ number. +// +//***************************************************************************** +extern _iq30 _IQ30sqrt(_iq30 A); +extern _iq29 _IQ29sqrt(_iq29 A); +extern _iq28 _IQ28sqrt(_iq28 A); +extern _iq27 _IQ27sqrt(_iq27 A); +extern _iq26 _IQ26sqrt(_iq26 A); +extern _iq25 _IQ25sqrt(_iq25 A); +extern _iq24 _IQ24sqrt(_iq24 A); +extern _iq23 _IQ23sqrt(_iq23 A); +extern _iq22 _IQ22sqrt(_iq22 A); +extern _iq21 _IQ21sqrt(_iq21 A); +extern _iq20 _IQ20sqrt(_iq20 A); +extern _iq19 _IQ19sqrt(_iq19 A); +extern _iq18 _IQ18sqrt(_iq18 A); +extern _iq17 _IQ17sqrt(_iq17 A); +extern _iq16 _IQ16sqrt(_iq16 A); +extern _iq15 _IQ15sqrt(_iq15 A); +extern _iq14 _IQ14sqrt(_iq14 A); +extern _iq13 _IQ13sqrt(_iq13 A); +extern _iq12 _IQ12sqrt(_iq12 A); +extern _iq11 _IQ11sqrt(_iq11 A); +extern _iq10 _IQ10sqrt(_iq10 A); +extern _iq9 _IQ9sqrt(_iq9 A); +extern _iq8 _IQ8sqrt(_iq8 A); +extern _iq7 _IQ7sqrt(_iq7 A); +extern _iq6 _IQ6sqrt(_iq6 A); +extern _iq5 _IQ5sqrt(_iq5 A); +extern _iq4 _IQ4sqrt(_iq4 A); +extern _iq3 _IQ3sqrt(_iq3 A); +extern _iq2 _IQ2sqrt(_iq2 A); +extern _iq1 _IQ1sqrt(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQsqrt(A) _IQ30sqrt(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQsqrt(A) _IQ29sqrt(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQsqrt(A) _IQ28sqrt(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQsqrt(A) _IQ27sqrt(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQsqrt(A) _IQ26sqrt(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQsqrt(A) _IQ25sqrt(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQsqrt(A) _IQ24sqrt(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQsqrt(A) _IQ23sqrt(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQsqrt(A) _IQ22sqrt(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQsqrt(A) _IQ21sqrt(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQsqrt(A) _IQ20sqrt(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQsqrt(A) _IQ19sqrt(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQsqrt(A) _IQ18sqrt(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQsqrt(A) _IQ17sqrt(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQsqrt(A) _IQ16sqrt(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQsqrt(A) _IQ15sqrt(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQsqrt(A) _IQ14sqrt(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQsqrt(A) _IQ13sqrt(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQsqrt(A) _IQ12sqrt(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQsqrt(A) _IQ11sqrt(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQsqrt(A) _IQ10sqrt(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQsqrt(A) _IQ9sqrt(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQsqrt(A) _IQ8sqrt(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQsqrt(A) _IQ7sqrt(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQsqrt(A) _IQ6sqrt(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQsqrt(A) _IQ5sqrt(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQsqrt(A) _IQ4sqrt(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQsqrt(A) _IQ3sqrt(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQsqrt(A) _IQ2sqrt(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQsqrt(A) _IQ1sqrt(A) +#endif + +//***************************************************************************** +// +// Computes 1 over the square root of an IQ number. +// +//***************************************************************************** +extern _iq30 _IQ30isqrt(_iq30 A); +extern _iq29 _IQ29isqrt(_iq29 A); +extern _iq28 _IQ28isqrt(_iq28 A); +extern _iq27 _IQ27isqrt(_iq27 A); +extern _iq26 _IQ26isqrt(_iq26 A); +extern _iq25 _IQ25isqrt(_iq25 A); +extern _iq24 _IQ24isqrt(_iq24 A); +extern _iq23 _IQ23isqrt(_iq23 A); +extern _iq22 _IQ22isqrt(_iq22 A); +extern _iq21 _IQ21isqrt(_iq21 A); +extern _iq20 _IQ20isqrt(_iq20 A); +extern _iq19 _IQ19isqrt(_iq19 A); +extern _iq18 _IQ18isqrt(_iq18 A); +extern _iq17 _IQ17isqrt(_iq17 A); +extern _iq16 _IQ16isqrt(_iq16 A); +extern _iq15 _IQ15isqrt(_iq15 A); +extern _iq14 _IQ14isqrt(_iq14 A); +extern _iq13 _IQ13isqrt(_iq13 A); +extern _iq12 _IQ12isqrt(_iq12 A); +extern _iq11 _IQ11isqrt(_iq11 A); +extern _iq10 _IQ10isqrt(_iq10 A); +extern _iq9 _IQ9isqrt(_iq9 A); +extern _iq8 _IQ8isqrt(_iq8 A); +extern _iq7 _IQ7isqrt(_iq7 A); +extern _iq6 _IQ6isqrt(_iq6 A); +extern _iq5 _IQ5isqrt(_iq5 A); +extern _iq4 _IQ4isqrt(_iq4 A); +extern _iq3 _IQ3isqrt(_iq3 A); +extern _iq2 _IQ2isqrt(_iq2 A); +extern _iq1 _IQ1isqrt(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQisqrt(A) _IQ30isqrt(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQisqrt(A) _IQ29isqrt(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQisqrt(A) _IQ28isqrt(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQisqrt(A) _IQ27isqrt(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQisqrt(A) _IQ26isqrt(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQisqrt(A) _IQ25isqrt(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQisqrt(A) _IQ24isqrt(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQisqrt(A) _IQ23isqrt(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQisqrt(A) _IQ22isqrt(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQisqrt(A) _IQ21isqrt(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQisqrt(A) _IQ20isqrt(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQisqrt(A) _IQ19isqrt(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQisqrt(A) _IQ18isqrt(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQisqrt(A) _IQ17isqrt(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQisqrt(A) _IQ16isqrt(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQisqrt(A) _IQ15isqrt(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQisqrt(A) _IQ14isqrt(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQisqrt(A) _IQ13isqrt(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQisqrt(A) _IQ12isqrt(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQisqrt(A) _IQ11isqrt(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQisqrt(A) _IQ10isqrt(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQisqrt(A) _IQ9isqrt(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQisqrt(A) _IQ8isqrt(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQisqrt(A) _IQ7isqrt(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQisqrt(A) _IQ6isqrt(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQisqrt(A) _IQ5isqrt(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQisqrt(A) _IQ4isqrt(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQisqrt(A) _IQ3isqrt(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQisqrt(A) _IQ2isqrt(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQisqrt(A) _IQ1isqrt(A) +#endif + +//***************************************************************************** +// +// Computes e^x of an IQ number. +// +//***************************************************************************** +extern _iq30 _IQ30exp(_iq30 A); +extern _iq29 _IQ29exp(_iq29 A); +extern _iq28 _IQ28exp(_iq28 A); +extern _iq27 _IQ27exp(_iq27 A); +extern _iq26 _IQ26exp(_iq26 A); +extern _iq25 _IQ25exp(_iq25 A); +extern _iq24 _IQ24exp(_iq24 A); +extern _iq23 _IQ23exp(_iq23 A); +extern _iq22 _IQ22exp(_iq22 A); +extern _iq21 _IQ21exp(_iq21 A); +extern _iq20 _IQ20exp(_iq20 A); +extern _iq19 _IQ19exp(_iq19 A); +extern _iq18 _IQ18exp(_iq18 A); +extern _iq17 _IQ17exp(_iq17 A); +extern _iq16 _IQ16exp(_iq16 A); +extern _iq15 _IQ15exp(_iq15 A); +extern _iq14 _IQ14exp(_iq14 A); +extern _iq13 _IQ13exp(_iq13 A); +extern _iq12 _IQ12exp(_iq12 A); +extern _iq11 _IQ11exp(_iq11 A); +extern _iq10 _IQ10exp(_iq10 A); +extern _iq9 _IQ9exp(_iq9 A); +extern _iq8 _IQ8exp(_iq8 A); +extern _iq7 _IQ7exp(_iq7 A); +extern _iq6 _IQ6exp(_iq6 A); +extern _iq5 _IQ5exp(_iq5 A); +extern _iq4 _IQ4exp(_iq4 A); +extern _iq3 _IQ3exp(_iq3 A); +extern _iq2 _IQ2exp(_iq2 A); +extern _iq1 _IQ1exp(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQexp(A) _IQ30exp(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQexp(A) _IQ29exp(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQexp(A) _IQ28exp(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQexp(A) _IQ27exp(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQexp(A) _IQ26exp(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQexp(A) _IQ25exp(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQexp(A) _IQ24exp(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQexp(A) _IQ23exp(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQexp(A) _IQ22exp(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQexp(A) _IQ21exp(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQexp(A) _IQ20exp(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQexp(A) _IQ19exp(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQexp(A) _IQ18exp(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQexp(A) _IQ17exp(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQexp(A) _IQ16exp(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQexp(A) _IQ15exp(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQexp(A) _IQ14exp(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQexp(A) _IQ13exp(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQexp(A) _IQ12exp(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQexp(A) _IQ11exp(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQexp(A) _IQ10exp(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQexp(A) _IQ9exp(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQexp(A) _IQ8exp(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQexp(A) _IQ7exp(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQexp(A) _IQ6exp(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQexp(A) _IQ5exp(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQexp(A) _IQ4exp(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQexp(A) _IQ3exp(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQexp(A) _IQ2exp(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQexp(A) _IQ1exp(A) +#endif + +//***************************************************************************** +// +// Computes log(x) of an IQ number. +// +//***************************************************************************** +extern _iq30 _IQ30log(_iq30 A); +extern _iq29 _IQ29log(_iq29 A); +extern _iq28 _IQ28log(_iq28 A); +extern _iq27 _IQ27log(_iq27 A); +extern _iq26 _IQ26log(_iq26 A); +extern _iq25 _IQ25log(_iq25 A); +extern _iq24 _IQ24log(_iq24 A); +extern _iq23 _IQ23log(_iq23 A); +extern _iq22 _IQ22log(_iq22 A); +extern _iq21 _IQ21log(_iq21 A); +extern _iq20 _IQ20log(_iq20 A); +extern _iq19 _IQ19log(_iq19 A); +extern _iq18 _IQ18log(_iq18 A); +extern _iq17 _IQ17log(_iq17 A); +extern _iq16 _IQ16log(_iq16 A); +extern _iq15 _IQ15log(_iq15 A); +extern _iq14 _IQ14log(_iq14 A); +extern _iq13 _IQ13log(_iq13 A); +extern _iq12 _IQ12log(_iq12 A); +extern _iq11 _IQ11log(_iq11 A); +extern _iq10 _IQ10log(_iq10 A); +extern _iq9 _IQ9log(_iq9 A); +extern _iq8 _IQ8log(_iq8 A); +extern _iq7 _IQ7log(_iq7 A); +extern _iq6 _IQ6log(_iq6 A); +extern _iq5 _IQ5log(_iq5 A); +extern _iq4 _IQ4log(_iq4 A); +extern _iq3 _IQ3log(_iq3 A); +extern _iq2 _IQ2log(_iq2 A); +extern _iq1 _IQ1log(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQlog(A) _IQ30log(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQlog(A) _IQ29log(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQlog(A) _IQ28log(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQlog(A) _IQ27log(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQlog(A) _IQ26log(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQlog(A) _IQ25log(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQlog(A) _IQ24log(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQlog(A) _IQ23log(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQlog(A) _IQ22log(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQlog(A) _IQ21log(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQlog(A) _IQ20log(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQlog(A) _IQ19log(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQlog(A) _IQ18log(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQlog(A) _IQ17log(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQlog(A) _IQ16log(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQlog(A) _IQ15log(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQlog(A) _IQ14log(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQlog(A) _IQ13log(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQlog(A) _IQ12log(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQlog(A) _IQ11log(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQlog(A) _IQ10log(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQlog(A) _IQ9log(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQlog(A) _IQ8log(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQlog(A) _IQ7log(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQlog(A) _IQ6log(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQlog(A) _IQ5log(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQlog(A) _IQ4log(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQlog(A) _IQ3log(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQlog(A) _IQ2log(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQlog(A) _IQ1log(A) +#endif + +//***************************************************************************** +// +// Returns the integer portion of an IQ number. +// +//***************************************************************************** +#define _IQ30int(A) ((A) >> 30) +#define _IQ29int(A) ((A) >> 29) +#define _IQ28int(A) ((A) >> 28) +#define _IQ27int(A) ((A) >> 27) +#define _IQ26int(A) ((A) >> 26) +#define _IQ25int(A) ((A) >> 25) +#define _IQ24int(A) ((A) >> 24) +#define _IQ23int(A) ((A) >> 23) +#define _IQ22int(A) ((A) >> 22) +#define _IQ21int(A) ((A) >> 21) +#define _IQ20int(A) ((A) >> 20) +#define _IQ19int(A) ((A) >> 19) +#define _IQ18int(A) ((A) >> 18) +#define _IQ17int(A) ((A) >> 17) +#define _IQ16int(A) ((A) >> 16) +#define _IQ15int(A) ((A) >> 15) +#define _IQ14int(A) ((A) >> 14) +#define _IQ13int(A) ((A) >> 13) +#define _IQ12int(A) ((A) >> 12) +#define _IQ11int(A) ((A) >> 11) +#define _IQ10int(A) ((A) >> 10) +#define _IQ9int(A) ((A) >> 9) +#define _IQ8int(A) ((A) >> 8) +#define _IQ7int(A) ((A) >> 7) +#define _IQ6int(A) ((A) >> 6) +#define _IQ5int(A) ((A) >> 5) +#define _IQ4int(A) ((A) >> 4) +#define _IQ3int(A) ((A) >> 3) +#define _IQ2int(A) ((A) >> 2) +#define _IQ1int(A) ((A) >> 1) +#define _IQint(A) ((A) >> GLOBAL_IQ) + +//***************************************************************************** +// +// Computes the fractional portion of an IQ number. +// +//***************************************************************************** +extern _iq30 _IQ30frac(_iq30 A); +extern _iq29 _IQ29frac(_iq29 A); +extern _iq28 _IQ28frac(_iq28 A); +extern _iq27 _IQ27frac(_iq27 A); +extern _iq26 _IQ26frac(_iq26 A); +extern _iq25 _IQ25frac(_iq25 A); +extern _iq24 _IQ24frac(_iq24 A); +extern _iq23 _IQ23frac(_iq23 A); +extern _iq22 _IQ22frac(_iq22 A); +extern _iq21 _IQ21frac(_iq21 A); +extern _iq20 _IQ20frac(_iq20 A); +extern _iq19 _IQ19frac(_iq19 A); +extern _iq18 _IQ18frac(_iq18 A); +extern _iq17 _IQ17frac(_iq17 A); +extern _iq16 _IQ16frac(_iq16 A); +extern _iq15 _IQ15frac(_iq15 A); +extern _iq14 _IQ14frac(_iq14 A); +extern _iq13 _IQ13frac(_iq13 A); +extern _iq12 _IQ12frac(_iq12 A); +extern _iq11 _IQ11frac(_iq11 A); +extern _iq10 _IQ10frac(_iq10 A); +extern _iq9 _IQ9frac(_iq9 A); +extern _iq8 _IQ8frac(_iq8 A); +extern _iq7 _IQ7frac(_iq7 A); +extern _iq6 _IQ6frac(_iq6 A); +extern _iq5 _IQ5frac(_iq5 A); +extern _iq4 _IQ4frac(_iq4 A); +extern _iq3 _IQ3frac(_iq3 A); +extern _iq2 _IQ2frac(_iq2 A); +extern _iq1 _IQ1frac(_iq1 A); + +#if GLOBAL_IQ == 30 +#define _IQfrac(A) _IQ30frac(A) +#endif +#if GLOBAL_IQ == 29 +#define _IQfrac(A) _IQ29frac(A) +#endif +#if GLOBAL_IQ == 28 +#define _IQfrac(A) _IQ28frac(A) +#endif +#if GLOBAL_IQ == 27 +#define _IQfrac(A) _IQ27frac(A) +#endif +#if GLOBAL_IQ == 26 +#define _IQfrac(A) _IQ26frac(A) +#endif +#if GLOBAL_IQ == 25 +#define _IQfrac(A) _IQ25frac(A) +#endif +#if GLOBAL_IQ == 24 +#define _IQfrac(A) _IQ24frac(A) +#endif +#if GLOBAL_IQ == 23 +#define _IQfrac(A) _IQ23frac(A) +#endif +#if GLOBAL_IQ == 22 +#define _IQfrac(A) _IQ22frac(A) +#endif +#if GLOBAL_IQ == 21 +#define _IQfrac(A) _IQ21frac(A) +#endif +#if GLOBAL_IQ == 20 +#define _IQfrac(A) _IQ20frac(A) +#endif +#if GLOBAL_IQ == 19 +#define _IQfrac(A) _IQ19frac(A) +#endif +#if GLOBAL_IQ == 18 +#define _IQfrac(A) _IQ18frac(A) +#endif +#if GLOBAL_IQ == 17 +#define _IQfrac(A) _IQ17frac(A) +#endif +#if GLOBAL_IQ == 16 +#define _IQfrac(A) _IQ16frac(A) +#endif +#if GLOBAL_IQ == 15 +#define _IQfrac(A) _IQ15frac(A) +#endif +#if GLOBAL_IQ == 14 +#define _IQfrac(A) _IQ14frac(A) +#endif +#if GLOBAL_IQ == 13 +#define _IQfrac(A) _IQ13frac(A) +#endif +#if GLOBAL_IQ == 12 +#define _IQfrac(A) _IQ12frac(A) +#endif +#if GLOBAL_IQ == 11 +#define _IQfrac(A) _IQ11frac(A) +#endif +#if GLOBAL_IQ == 10 +#define _IQfrac(A) _IQ10frac(A) +#endif +#if GLOBAL_IQ == 9 +#define _IQfrac(A) _IQ9frac(A) +#endif +#if GLOBAL_IQ == 8 +#define _IQfrac(A) _IQ8frac(A) +#endif +#if GLOBAL_IQ == 7 +#define _IQfrac(A) _IQ7frac(A) +#endif +#if GLOBAL_IQ == 6 +#define _IQfrac(A) _IQ6frac(A) +#endif +#if GLOBAL_IQ == 5 +#define _IQfrac(A) _IQ5frac(A) +#endif +#if GLOBAL_IQ == 4 +#define _IQfrac(A) _IQ4frac(A) +#endif +#if GLOBAL_IQ == 3 +#define _IQfrac(A) _IQ3frac(A) +#endif +#if GLOBAL_IQ == 2 +#define _IQfrac(A) _IQ2frac(A) +#endif +#if GLOBAL_IQ == 1 +#define _IQfrac(A) _IQ1frac(A) +#endif + +//***************************************************************************** +// +// Multiplies two IQ numbers in the specified iQ formats, returning the result +// in another IQ format. +// +//***************************************************************************** +extern int32_t _IQ30mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ29mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ28mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ27mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ26mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ25mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ24mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ23mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ22mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ21mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ20mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ19mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ18mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ17mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ16mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ15mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ14mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ13mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ12mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ11mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ10mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ9mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ8mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ7mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ6mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ5mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ4mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ3mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ2mpyIQX(int32_t A, int n1, int32_t B, int n2); +extern int32_t _IQ1mpyIQX(int32_t A, int n1, int32_t B, int n2); + +#if GLOBAL_IQ == 30 +#define _IQmpyIQX(A, n1, B, n2) _IQ30mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 29 +#define _IQmpyIQX(A, n1, B, n2) _IQ29mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 28 +#define _IQmpyIQX(A, n1, B, n2) _IQ28mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 27 +#define _IQmpyIQX(A, n1, B, n2) _IQ27mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 26 +#define _IQmpyIQX(A, n1, B, n2) _IQ26mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 25 +#define _IQmpyIQX(A, n1, B, n2) _IQ25mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 24 +#define _IQmpyIQX(A, n1, B, n2) _IQ24mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 23 +#define _IQmpyIQX(A, n1, B, n2) _IQ23mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 22 +#define _IQmpyIQX(A, n1, B, n2) _IQ22mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 21 +#define _IQmpyIQX(A, n1, B, n2) _IQ21mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 20 +#define _IQmpyIQX(A, n1, B, n2) _IQ20mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 19 +#define _IQmpyIQX(A, n1, B, n2) _IQ19mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 18 +#define _IQmpyIQX(A, n1, B, n2) _IQ18mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 17 +#define _IQmpyIQX(A, n1, B, n2) _IQ17mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 16 +#define _IQmpyIQX(A, n1, B, n2) _IQ16mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 15 +#define _IQmpyIQX(A, n1, B, n2) _IQ15mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 14 +#define _IQmpyIQX(A, n1, B, n2) _IQ14mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 13 +#define _IQmpyIQX(A, n1, B, n2) _IQ13mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 12 +#define _IQmpyIQX(A, n1, B, n2) _IQ12mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 11 +#define _IQmpyIQX(A, n1, B, n2) _IQ11mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 10 +#define _IQmpyIQX(A, n1, B, n2) _IQ10mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 9 +#define _IQmpyIQX(A, n1, B, n2) _IQ9mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 8 +#define _IQmpyIQX(A, n1, B, n2) _IQ8mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 7 +#define _IQmpyIQX(A, n1, B, n2) _IQ7mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 6 +#define _IQmpyIQX(A, n1, B, n2) _IQ6mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 5 +#define _IQmpyIQX(A, n1, B, n2) _IQ5mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 4 +#define _IQmpyIQX(A, n1, B, n2) _IQ4mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 3 +#define _IQmpyIQX(A, n1, B, n2) _IQ3mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 2 +#define _IQmpyIQX(A, n1, B, n2) _IQ2mpyIQX(A, n1, B, n2) +#endif +#if GLOBAL_IQ == 1 +#define _IQmpyIQX(A, n1, B, n2) _IQ1mpyIQX(A, n1, B, n2) +#endif + +//***************************************************************************** +// +// Multiplies an IQ number by an integer. +// +//***************************************************************************** +#define _IQ30mpyI32(A, B) ((A) * (B)) +#define _IQ29mpyI32(A, B) ((A) * (B)) +#define _IQ28mpyI32(A, B) ((A) * (B)) +#define _IQ27mpyI32(A, B) ((A) * (B)) +#define _IQ26mpyI32(A, B) ((A) * (B)) +#define _IQ25mpyI32(A, B) ((A) * (B)) +#define _IQ24mpyI32(A, B) ((A) * (B)) +#define _IQ23mpyI32(A, B) ((A) * (B)) +#define _IQ22mpyI32(A, B) ((A) * (B)) +#define _IQ21mpyI32(A, B) ((A) * (B)) +#define _IQ20mpyI32(A, B) ((A) * (B)) +#define _IQ19mpyI32(A, B) ((A) * (B)) +#define _IQ18mpyI32(A, B) ((A) * (B)) +#define _IQ17mpyI32(A, B) ((A) * (B)) +#define _IQ16mpyI32(A, B) ((A) * (B)) +#define _IQ15mpyI32(A, B) ((A) * (B)) +#define _IQ14mpyI32(A, B) ((A) * (B)) +#define _IQ13mpyI32(A, B) ((A) * (B)) +#define _IQ12mpyI32(A, B) ((A) * (B)) +#define _IQ11mpyI32(A, B) ((A) * (B)) +#define _IQ10mpyI32(A, B) ((A) * (B)) +#define _IQ9mpyI32(A, B) ((A) * (B)) +#define _IQ8mpyI32(A, B) ((A) * (B)) +#define _IQ7mpyI32(A, B) ((A) * (B)) +#define _IQ6mpyI32(A, B) ((A) * (B)) +#define _IQ5mpyI32(A, B) ((A) * (B)) +#define _IQ4mpyI32(A, B) ((A) * (B)) +#define _IQ3mpyI32(A, B) ((A) * (B)) +#define _IQ2mpyI32(A, B) ((A) * (B)) +#define _IQ1mpyI32(A, B) ((A) * (B)) +#define _IQmpyI32(A, B) ((A) * (B)) + +//***************************************************************************** +// +// Multiplies an IQ number by an integer, and returns the integer portion. +// +//***************************************************************************** +#define _IQ30mpyI32int(A, B) _IQ30int(_IQ30mpyI32(A, B)) +#define _IQ29mpyI32int(A, B) _IQ29int(_IQ29mpyI32(A, B)) +#define _IQ28mpyI32int(A, B) _IQ28int(_IQ28mpyI32(A, B)) +#define _IQ27mpyI32int(A, B) _IQ27int(_IQ27mpyI32(A, B)) +#define _IQ26mpyI32int(A, B) _IQ26int(_IQ26mpyI32(A, B)) +#define _IQ25mpyI32int(A, B) _IQ25int(_IQ25mpyI32(A, B)) +#define _IQ24mpyI32int(A, B) _IQ24int(_IQ24mpyI32(A, B)) +#define _IQ23mpyI32int(A, B) _IQ23int(_IQ23mpyI32(A, B)) +#define _IQ22mpyI32int(A, B) _IQ22int(_IQ22mpyI32(A, B)) +#define _IQ21mpyI32int(A, B) _IQ21int(_IQ21mpyI32(A, B)) +#define _IQ20mpyI32int(A, B) _IQ20int(_IQ20mpyI32(A, B)) +#define _IQ19mpyI32int(A, B) _IQ19int(_IQ19mpyI32(A, B)) +#define _IQ18mpyI32int(A, B) _IQ18int(_IQ18mpyI32(A, B)) +#define _IQ17mpyI32int(A, B) _IQ17int(_IQ17mpyI32(A, B)) +#define _IQ16mpyI32int(A, B) _IQ16int(_IQ16mpyI32(A, B)) +#define _IQ15mpyI32int(A, B) _IQ15int(_IQ15mpyI32(A, B)) +#define _IQ14mpyI32int(A, B) _IQ14int(_IQ14mpyI32(A, B)) +#define _IQ13mpyI32int(A, B) _IQ13int(_IQ13mpyI32(A, B)) +#define _IQ12mpyI32int(A, B) _IQ12int(_IQ12mpyI32(A, B)) +#define _IQ11mpyI32int(A, B) _IQ11int(_IQ11mpyI32(A, B)) +#define _IQ10mpyI32int(A, B) _IQ10int(_IQ10mpyI32(A, B)) +#define _IQ9mpyI32int(A, B) _IQ9int(_IQ9mpyI32(A, B)) +#define _IQ8mpyI32int(A, B) _IQ8int(_IQ8mpyI32(A, B)) +#define _IQ7mpyI32int(A, B) _IQ7int(_IQ7mpyI32(A, B)) +#define _IQ6mpyI32int(A, B) _IQ6int(_IQ6mpyI32(A, B)) +#define _IQ5mpyI32int(A, B) _IQ5int(_IQ5mpyI32(A, B)) +#define _IQ4mpyI32int(A, B) _IQ4int(_IQ4mpyI32(A, B)) +#define _IQ3mpyI32int(A, B) _IQ3int(_IQ3mpyI32(A, B)) +#define _IQ2mpyI32int(A, B) _IQ2int(_IQ2mpyI32(A, B)) +#define _IQ1mpyI32int(A, B) _IQ1int(_IQ1mpyI32(A, B)) + +#if GLOBAL_IQ == 30 +#define _IQmpyI32int(A, B) _IQ30mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQmpyI32int(A, B) _IQ29mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQmpyI32int(A, B) _IQ28mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQmpyI32int(A, B) _IQ27mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQmpyI32int(A, B) _IQ26mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQmpyI32int(A, B) _IQ25mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQmpyI32int(A, B) _IQ24mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQmpyI32int(A, B) _IQ23mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQmpyI32int(A, B) _IQ22mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQmpyI32int(A, B) _IQ21mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQmpyI32int(A, B) _IQ20mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQmpyI32int(A, B) _IQ19mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQmpyI32int(A, B) _IQ18mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQmpyI32int(A, B) _IQ17mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQmpyI32int(A, B) _IQ16mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQmpyI32int(A, B) _IQ15mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQmpyI32int(A, B) _IQ14mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQmpyI32int(A, B) _IQ13mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQmpyI32int(A, B) _IQ12mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQmpyI32int(A, B) _IQ11mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQmpyI32int(A, B) _IQ10mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQmpyI32int(A, B) _IQ9mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQmpyI32int(A, B) _IQ8mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQmpyI32int(A, B) _IQ7mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQmpyI32int(A, B) _IQ6mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQmpyI32int(A, B) _IQ5mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQmpyI32int(A, B) _IQ4mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQmpyI32int(A, B) _IQ3mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQmpyI32int(A, B) _IQ2mpyI32int(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQmpyI32int(A, B) _IQ1mpyI32int(A, B) +#endif + +//***************************************************************************** +// +// Multiplies an IQ number by an integer, and returns the fractional portion. +// +//***************************************************************************** +#define _IQ30mpyI32frac(A, B) _IQ30frac(_IQ30mpyI32(A, B)) +#define _IQ29mpyI32frac(A, B) _IQ29frac(_IQ29mpyI32(A, B)) +#define _IQ28mpyI32frac(A, B) _IQ28frac(_IQ28mpyI32(A, B)) +#define _IQ27mpyI32frac(A, B) _IQ27frac(_IQ27mpyI32(A, B)) +#define _IQ26mpyI32frac(A, B) _IQ26frac(_IQ26mpyI32(A, B)) +#define _IQ25mpyI32frac(A, B) _IQ25frac(_IQ25mpyI32(A, B)) +#define _IQ24mpyI32frac(A, B) _IQ24frac(_IQ24mpyI32(A, B)) +#define _IQ23mpyI32frac(A, B) _IQ23frac(_IQ23mpyI32(A, B)) +#define _IQ22mpyI32frac(A, B) _IQ22frac(_IQ22mpyI32(A, B)) +#define _IQ21mpyI32frac(A, B) _IQ21frac(_IQ21mpyI32(A, B)) +#define _IQ20mpyI32frac(A, B) _IQ20frac(_IQ20mpyI32(A, B)) +#define _IQ19mpyI32frac(A, B) _IQ19frac(_IQ19mpyI32(A, B)) +#define _IQ18mpyI32frac(A, B) _IQ18frac(_IQ18mpyI32(A, B)) +#define _IQ17mpyI32frac(A, B) _IQ17frac(_IQ17mpyI32(A, B)) +#define _IQ16mpyI32frac(A, B) _IQ16frac(_IQ16mpyI32(A, B)) +#define _IQ15mpyI32frac(A, B) _IQ15frac(_IQ15mpyI32(A, B)) +#define _IQ14mpyI32frac(A, B) _IQ14frac(_IQ14mpyI32(A, B)) +#define _IQ13mpyI32frac(A, B) _IQ13frac(_IQ13mpyI32(A, B)) +#define _IQ12mpyI32frac(A, B) _IQ12frac(_IQ12mpyI32(A, B)) +#define _IQ11mpyI32frac(A, B) _IQ11frac(_IQ11mpyI32(A, B)) +#define _IQ10mpyI32frac(A, B) _IQ10frac(_IQ10mpyI32(A, B)) +#define _IQ9mpyI32frac(A, B) _IQ9frac(_IQ9mpyI32(A, B)) +#define _IQ8mpyI32frac(A, B) _IQ8frac(_IQ8mpyI32(A, B)) +#define _IQ7mpyI32frac(A, B) _IQ7frac(_IQ7mpyI32(A, B)) +#define _IQ6mpyI32frac(A, B) _IQ6frac(_IQ6mpyI32(A, B)) +#define _IQ5mpyI32frac(A, B) _IQ5frac(_IQ5mpyI32(A, B)) +#define _IQ4mpyI32frac(A, B) _IQ4frac(_IQ4mpyI32(A, B)) +#define _IQ3mpyI32frac(A, B) _IQ3frac(_IQ3mpyI32(A, B)) +#define _IQ2mpyI32frac(A, B) _IQ2frac(_IQ2mpyI32(A, B)) +#define _IQ1mpyI32frac(A, B) _IQ1frac(_IQ1mpyI32(A, B)) + +#if GLOBAL_IQ == 30 +#define _IQmpyI32frac(A, B) _IQ30mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQmpyI32frac(A, B) _IQ29mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQmpyI32frac(A, B) _IQ28mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQmpyI32frac(A, B) _IQ27mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQmpyI32frac(A, B) _IQ26mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQmpyI32frac(A, B) _IQ25mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQmpyI32frac(A, B) _IQ24mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQmpyI32frac(A, B) _IQ23mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQmpyI32frac(A, B) _IQ22mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQmpyI32frac(A, B) _IQ21mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQmpyI32frac(A, B) _IQ20mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQmpyI32frac(A, B) _IQ19mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQmpyI32frac(A, B) _IQ18mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQmpyI32frac(A, B) _IQ17mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQmpyI32frac(A, B) _IQ16mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQmpyI32frac(A, B) _IQ15mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQmpyI32frac(A, B) _IQ14mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQmpyI32frac(A, B) _IQ13mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQmpyI32frac(A, B) _IQ12mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQmpyI32frac(A, B) _IQ11mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQmpyI32frac(A, B) _IQ10mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQmpyI32frac(A, B) _IQ9mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQmpyI32frac(A, B) _IQ8mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQmpyI32frac(A, B) _IQ7mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQmpyI32frac(A, B) _IQ6mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQmpyI32frac(A, B) _IQ5mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQmpyI32frac(A, B) _IQ4mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQmpyI32frac(A, B) _IQ3mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQmpyI32frac(A, B) _IQ2mpyI32frac(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQmpyI32frac(A, B) _IQ1mpyI32frac(A, B) +#endif + +//***************************************************************************** +// +// Computes the square root of A^2 + B^2 using IQ numbers. +// +//***************************************************************************** +extern int32_t _IQmag(int32_t A, int32_t B); +#define _IQ30mag(A, B) _IQmag(A, B) +#define _IQ29mag(A, B) _IQmag(A, B) +#define _IQ28mag(A, B) _IQmag(A, B) +#define _IQ27mag(A, B) _IQmag(A, B) +#define _IQ26mag(A, B) _IQmag(A, B) +#define _IQ25mag(A, B) _IQmag(A, B) +#define _IQ24mag(A, B) _IQmag(A, B) +#define _IQ23mag(A, B) _IQmag(A, B) +#define _IQ22mag(A, B) _IQmag(A, B) +#define _IQ21mag(A, B) _IQmag(A, B) +#define _IQ20mag(A, B) _IQmag(A, B) +#define _IQ19mag(A, B) _IQmag(A, B) +#define _IQ18mag(A, B) _IQmag(A, B) +#define _IQ17mag(A, B) _IQmag(A, B) +#define _IQ16mag(A, B) _IQmag(A, B) +#define _IQ15mag(A, B) _IQmag(A, B) +#define _IQ14mag(A, B) _IQmag(A, B) +#define _IQ13mag(A, B) _IQmag(A, B) +#define _IQ12mag(A, B) _IQmag(A, B) +#define _IQ11mag(A, B) _IQmag(A, B) +#define _IQ10mag(A, B) _IQmag(A, B) +#define _IQ9mag(A, B) _IQmag(A, B) +#define _IQ8mag(A, B) _IQmag(A, B) +#define _IQ7mag(A, B) _IQmag(A, B) +#define _IQ6mag(A, B) _IQmag(A, B) +#define _IQ5mag(A, B) _IQmag(A, B) +#define _IQ4mag(A, B) _IQmag(A, B) +#define _IQ3mag(A, B) _IQmag(A, B) +#define _IQ2mag(A, B) _IQmag(A, B) +#define _IQ1mag(A, B) _IQmag(A, B) + +//***************************************************************************** +// +// Computes the inverse square root of A^2 + B^2 using IQ numbers. +// +//***************************************************************************** +extern _iq29 _IQ30imag(_iq30 A, _iq30 B); +extern _iq29 _IQ29imag(_iq29 A, _iq29 B); +extern _iq28 _IQ28imag(_iq28 A, _iq28 B); +extern _iq27 _IQ27imag(_iq27 A, _iq27 B); +extern _iq26 _IQ26imag(_iq26 A, _iq26 B); +extern _iq25 _IQ25imag(_iq25 A, _iq25 B); +extern _iq24 _IQ24imag(_iq24 A, _iq24 B); +extern _iq23 _IQ23imag(_iq23 A, _iq23 B); +extern _iq22 _IQ22imag(_iq22 A, _iq22 B); +extern _iq21 _IQ21imag(_iq21 A, _iq21 B); +extern _iq20 _IQ20imag(_iq20 A, _iq20 B); +extern _iq19 _IQ19imag(_iq19 A, _iq19 B); +extern _iq18 _IQ18imag(_iq18 A, _iq18 B); +extern _iq17 _IQ17imag(_iq17 A, _iq17 B); +extern _iq16 _IQ16imag(_iq16 A, _iq16 B); +extern _iq15 _IQ15imag(_iq15 A, _iq15 B); +extern _iq14 _IQ14imag(_iq14 A, _iq14 B); +extern _iq13 _IQ13imag(_iq13 A, _iq13 B); +extern _iq12 _IQ12imag(_iq12 A, _iq12 B); +extern _iq11 _IQ11imag(_iq11 A, _iq11 B); +extern _iq10 _IQ10imag(_iq10 A, _iq10 B); +extern _iq9 _IQ9imag(_iq9 A, _iq9 B); +extern _iq8 _IQ8imag(_iq8 A, _iq8 B); +extern _iq7 _IQ7imag(_iq7 A, _iq7 B); +extern _iq6 _IQ6imag(_iq6 A, _iq6 B); +extern _iq5 _IQ5imag(_iq5 A, _iq5 B); +extern _iq4 _IQ4imag(_iq4 A, _iq4 B); +extern _iq3 _IQ3imag(_iq3 A, _iq3 B); +extern _iq2 _IQ2imag(_iq2 A, _iq2 B); +extern _iq1 _IQ1imag(_iq1 A, _iq1 B); + +#if GLOBAL_IQ == 30 +#define _IQimag(A, B) _IQ30imag(A, B) +#endif +#if GLOBAL_IQ == 29 +#define _IQimag(A, B) _IQ29imag(A, B) +#endif +#if GLOBAL_IQ == 28 +#define _IQimag(A, B) _IQ28imag(A, B) +#endif +#if GLOBAL_IQ == 27 +#define _IQimag(A, B) _IQ27imag(A, B) +#endif +#if GLOBAL_IQ == 26 +#define _IQimag(A, B) _IQ26imag(A, B) +#endif +#if GLOBAL_IQ == 25 +#define _IQimag(A, B) _IQ25imag(A, B) +#endif +#if GLOBAL_IQ == 24 +#define _IQimag(A, B) _IQ24imag(A, B) +#endif +#if GLOBAL_IQ == 23 +#define _IQimag(A, B) _IQ23imag(A, B) +#endif +#if GLOBAL_IQ == 22 +#define _IQimag(A, B) _IQ22imag(A, B) +#endif +#if GLOBAL_IQ == 21 +#define _IQimag(A, B) _IQ21imag(A, B) +#endif +#if GLOBAL_IQ == 20 +#define _IQimag(A, B) _IQ20imag(A, B) +#endif +#if GLOBAL_IQ == 19 +#define _IQimag(A, B) _IQ19imag(A, B) +#endif +#if GLOBAL_IQ == 18 +#define _IQimag(A, B) _IQ18imag(A, B) +#endif +#if GLOBAL_IQ == 17 +#define _IQimag(A, B) _IQ17imag(A, B) +#endif +#if GLOBAL_IQ == 16 +#define _IQimag(A, B) _IQ16imag(A, B) +#endif +#if GLOBAL_IQ == 15 +#define _IQimag(A, B) _IQ15imag(A, B) +#endif +#if GLOBAL_IQ == 14 +#define _IQimag(A, B) _IQ14imag(A, B) +#endif +#if GLOBAL_IQ == 13 +#define _IQimag(A, B) _IQ13imag(A, B) +#endif +#if GLOBAL_IQ == 12 +#define _IQimag(A, B) _IQ12imag(A, B) +#endif +#if GLOBAL_IQ == 11 +#define _IQimag(A, B) _IQ11imag(A, B) +#endif +#if GLOBAL_IQ == 10 +#define _IQimag(A, B) _IQ10imag(A, B) +#endif +#if GLOBAL_IQ == 9 +#define _IQimag(A, B) _IQ9imag(A, B) +#endif +#if GLOBAL_IQ == 8 +#define _IQimag(A, B) _IQ8imag(A, B) +#endif +#if GLOBAL_IQ == 7 +#define _IQimag(A, B) _IQ7imag(A, B) +#endif +#if GLOBAL_IQ == 6 +#define _IQimag(A, B) _IQ6imag(A, B) +#endif +#if GLOBAL_IQ == 5 +#define _IQimag(A, B) _IQ5imag(A, B) +#endif +#if GLOBAL_IQ == 4 +#define _IQimag(A, B) _IQ4imag(A, B) +#endif +#if GLOBAL_IQ == 3 +#define _IQimag(A, B) _IQ3imag(A, B) +#endif +#if GLOBAL_IQ == 2 +#define _IQimag(A, B) _IQ2imag(A, B) +#endif +#if GLOBAL_IQ == 1 +#define _IQimag(A, B) _IQ1imag(A, B) +#endif + +//***************************************************************************** +// +// Converts a string into an IQ number. +// +//***************************************************************************** +extern _iq30 _atoIQ30(const char *A); +extern _iq29 _atoIQ29(const char *A); +extern _iq28 _atoIQ28(const char *A); +extern _iq27 _atoIQ27(const char *A); +extern _iq26 _atoIQ26(const char *A); +extern _iq25 _atoIQ25(const char *A); +extern _iq24 _atoIQ24(const char *A); +extern _iq23 _atoIQ23(const char *A); +extern _iq22 _atoIQ22(const char *A); +extern _iq21 _atoIQ21(const char *A); +extern _iq20 _atoIQ20(const char *A); +extern _iq19 _atoIQ19(const char *A); +extern _iq18 _atoIQ18(const char *A); +extern _iq17 _atoIQ17(const char *A); +extern _iq16 _atoIQ16(const char *A); +extern _iq15 _atoIQ15(const char *A); +extern _iq14 _atoIQ14(const char *A); +extern _iq13 _atoIQ13(const char *A); +extern _iq12 _atoIQ12(const char *A); +extern _iq11 _atoIQ11(const char *A); +extern _iq10 _atoIQ10(const char *A); +extern _iq9 _atoIQ9(const char *A); +extern _iq8 _atoIQ8(const char *A); +extern _iq7 _atoIQ7(const char *A); +extern _iq6 _atoIQ6(const char *A); +extern _iq5 _atoIQ5(const char *A); +extern _iq4 _atoIQ4(const char *A); +extern _iq3 _atoIQ3(const char *A); +extern _iq2 _atoIQ2(const char *A); +extern _iq1 _atoIQ1(const char *A); + +#if GLOBAL_IQ == 30 +#define _atoIQ(A) _atoIQ30(A) +#endif +#if GLOBAL_IQ == 29 +#define _atoIQ(A) _atoIQ29(A) +#endif +#if GLOBAL_IQ == 28 +#define _atoIQ(A) _atoIQ28(A) +#endif +#if GLOBAL_IQ == 27 +#define _atoIQ(A) _atoIQ27(A) +#endif +#if GLOBAL_IQ == 26 +#define _atoIQ(A) _atoIQ26(A) +#endif +#if GLOBAL_IQ == 25 +#define _atoIQ(A) _atoIQ25(A) +#endif +#if GLOBAL_IQ == 24 +#define _atoIQ(A) _atoIQ24(A) +#endif +#if GLOBAL_IQ == 23 +#define _atoIQ(A) _atoIQ23(A) +#endif +#if GLOBAL_IQ == 22 +#define _atoIQ(A) _atoIQ22(A) +#endif +#if GLOBAL_IQ == 21 +#define _atoIQ(A) _atoIQ21(A) +#endif +#if GLOBAL_IQ == 20 +#define _atoIQ(A) _atoIQ20(A) +#endif +#if GLOBAL_IQ == 19 +#define _atoIQ(A) _atoIQ19(A) +#endif +#if GLOBAL_IQ == 18 +#define _atoIQ(A) _atoIQ18(A) +#endif +#if GLOBAL_IQ == 17 +#define _atoIQ(A) _atoIQ17(A) +#endif +#if GLOBAL_IQ == 16 +#define _atoIQ(A) _atoIQ16(A) +#endif +#if GLOBAL_IQ == 15 +#define _atoIQ(A) _atoIQ15(A) +#endif +#if GLOBAL_IQ == 14 +#define _atoIQ(A) _atoIQ14(A) +#endif +#if GLOBAL_IQ == 13 +#define _atoIQ(A) _atoIQ13(A) +#endif +#if GLOBAL_IQ == 12 +#define _atoIQ(A) _atoIQ12(A) +#endif +#if GLOBAL_IQ == 11 +#define _atoIQ(A) _atoIQ11(A) +#endif +#if GLOBAL_IQ == 10 +#define _atoIQ(A) _atoIQ10(A) +#endif +#if GLOBAL_IQ == 9 +#define _atoIQ(A) _atoIQ9(A) +#endif +#if GLOBAL_IQ == 8 +#define _atoIQ(A) _atoIQ8(A) +#endif +#if GLOBAL_IQ == 7 +#define _atoIQ(A) _atoIQ7(A) +#endif +#if GLOBAL_IQ == 6 +#define _atoIQ(A) _atoIQ6(A) +#endif +#if GLOBAL_IQ == 5 +#define _atoIQ(A) _atoIQ5(A) +#endif +#if GLOBAL_IQ == 4 +#define _atoIQ(A) _atoIQ4(A) +#endif +#if GLOBAL_IQ == 3 +#define _atoIQ(A) _atoIQ3(A) +#endif +#if GLOBAL_IQ == 2 +#define _atoIQ(A) _atoIQ2(A) +#endif +#if GLOBAL_IQ == 1 +#define _atoIQ(A) _atoIQ1(A) +#endif + +//***************************************************************************** +// +// Converts an IQ number into a string. +// +//***************************************************************************** +extern int16_t _IQ30toa(char *string, const char *format, _iq30 input); +extern int16_t _IQ29toa(char *string, const char *format, _iq29 input); +extern int16_t _IQ28toa(char *string, const char *format, _iq28 input); +extern int16_t _IQ27toa(char *string, const char *format, _iq27 input); +extern int16_t _IQ26toa(char *string, const char *format, _iq26 input); +extern int16_t _IQ25toa(char *string, const char *format, _iq25 input); +extern int16_t _IQ24toa(char *string, const char *format, _iq24 input); +extern int16_t _IQ23toa(char *string, const char *format, _iq23 input); +extern int16_t _IQ22toa(char *string, const char *format, _iq22 input); +extern int16_t _IQ21toa(char *string, const char *format, _iq21 input); +extern int16_t _IQ20toa(char *string, const char *format, _iq20 input); +extern int16_t _IQ19toa(char *string, const char *format, _iq19 input); +extern int16_t _IQ18toa(char *string, const char *format, _iq18 input); +extern int16_t _IQ17toa(char *string, const char *format, _iq17 input); +extern int16_t _IQ16toa(char *string, const char *format, _iq16 input); +extern int16_t _IQ15toa(char *string, const char *format, _iq15 input); +extern int16_t _IQ14toa(char *string, const char *format, _iq14 input); +extern int16_t _IQ13toa(char *string, const char *format, _iq13 input); +extern int16_t _IQ12toa(char *string, const char *format, _iq12 input); +extern int16_t _IQ11toa(char *string, const char *format, _iq11 input); +extern int16_t _IQ10toa(char *string, const char *format, _iq10 input); +extern int16_t _IQ9toa(char *string, const char *format, _iq9 input); +extern int16_t _IQ8toa(char *string, const char *format, _iq8 input); +extern int16_t _IQ7toa(char *string, const char *format, _iq7 input); +extern int16_t _IQ6toa(char *string, const char *format, _iq6 input); +extern int16_t _IQ5toa(char *string, const char *format, _iq5 input); +extern int16_t _IQ4toa(char *string, const char *format, _iq4 input); +extern int16_t _IQ3toa(char *string, const char *format, _iq3 input); +extern int16_t _IQ2toa(char *string, const char *format, _iq2 input); +extern int16_t _IQ1toa(char *string, const char *format, _iq1 input); + +#if GLOBAL_IQ == 30 +#define _IQtoa(A, B, C) _IQ30toa(A, B, C) +#endif +#if GLOBAL_IQ == 29 +#define _IQtoa(A, B, C) _IQ29toa(A, B, C) +#endif +#if GLOBAL_IQ == 28 +#define _IQtoa(A, B, C) _IQ28toa(A, B, C) +#endif +#if GLOBAL_IQ == 27 +#define _IQtoa(A, B, C) _IQ27toa(A, B, C) +#endif +#if GLOBAL_IQ == 26 +#define _IQtoa(A, B, C) _IQ26toa(A, B, C) +#endif +#if GLOBAL_IQ == 25 +#define _IQtoa(A, B, C) _IQ25toa(A, B, C) +#endif +#if GLOBAL_IQ == 24 +#define _IQtoa(A, B, C) _IQ24toa(A, B, C) +#endif +#if GLOBAL_IQ == 23 +#define _IQtoa(A, B, C) _IQ23toa(A, B, C) +#endif +#if GLOBAL_IQ == 22 +#define _IQtoa(A, B, C) _IQ22toa(A, B, C) +#endif +#if GLOBAL_IQ == 21 +#define _IQtoa(A, B, C) _IQ21toa(A, B, C) +#endif +#if GLOBAL_IQ == 20 +#define _IQtoa(A, B, C) _IQ20toa(A, B, C) +#endif +#if GLOBAL_IQ == 19 +#define _IQtoa(A, B, C) _IQ19toa(A, B, C) +#endif +#if GLOBAL_IQ == 18 +#define _IQtoa(A, B, C) _IQ18toa(A, B, C) +#endif +#if GLOBAL_IQ == 17 +#define _IQtoa(A, B, C) _IQ17toa(A, B, C) +#endif +#if GLOBAL_IQ == 16 +#define _IQtoa(A, B, C) _IQ16toa(A, B, C) +#endif +#if GLOBAL_IQ == 15 +#define _IQtoa(A, B, C) _IQ15toa(A, B, C) +#endif +#if GLOBAL_IQ == 14 +#define _IQtoa(A, B, C) _IQ14toa(A, B, C) +#endif +#if GLOBAL_IQ == 13 +#define _IQtoa(A, B, C) _IQ13toa(A, B, C) +#endif +#if GLOBAL_IQ == 12 +#define _IQtoa(A, B, C) _IQ12toa(A, B, C) +#endif +#if GLOBAL_IQ == 11 +#define _IQtoa(A, B, C) _IQ11toa(A, B, C) +#endif +#if GLOBAL_IQ == 10 +#define _IQtoa(A, B, C) _IQ10toa(A, B, C) +#endif +#if GLOBAL_IQ == 9 +#define _IQtoa(A, B, C) _IQ9toa(A, B, C) +#endif +#if GLOBAL_IQ == 8 +#define _IQtoa(A, B, C) _IQ8toa(A, B, C) +#endif +#if GLOBAL_IQ == 7 +#define _IQtoa(A, B, C) _IQ7toa(A, B, C) +#endif +#if GLOBAL_IQ == 6 +#define _IQtoa(A, B, C) _IQ6toa(A, B, C) +#endif +#if GLOBAL_IQ == 5 +#define _IQtoa(A, B, C) _IQ5toa(A, B, C) +#endif +#if GLOBAL_IQ == 4 +#define _IQtoa(A, B, C) _IQ4toa(A, B, C) +#endif +#if GLOBAL_IQ == 3 +#define _IQtoa(A, B, C) _IQ3toa(A, B, C) +#endif +#if GLOBAL_IQ == 2 +#define _IQtoa(A, B, C) _IQ2toa(A, B, C) +#endif +#if GLOBAL_IQ == 1 +#define _IQtoa(A, B, C) _IQ1toa(A, B, C) +#endif + +//***************************************************************************** +// +// Computes the absolute value of an IQ number. +// +//***************************************************************************** +#define _IQ30abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ29abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ28abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ27abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ26abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ25abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ24abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ23abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ22abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ21abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ20abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ19abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ18abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ17abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ16abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ15abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ14abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ13abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ12abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ11abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ10abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ9abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ8abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ7abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ6abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ5abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ4abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ3abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ2abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQ1abs(A) (((A) < 0) ? - (A) : (A)) +#define _IQabs(A) (((A) < 0) ? - (A) : (A)) + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __IQMATHLIB_H__ diff --git a/Include/QmathLib.h b/Include/QmathLib.h new file mode 100755 index 0000000..21c5cb1 --- /dev/null +++ b/Include/QmathLib.h @@ -0,0 +1,2100 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2015, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +#ifndef __QMATHLIB_H__ +#define __QMATHLIB_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The IQ format to be used when the IQ format is not explicitly specified +// (such as _IQcos instead of _IQ16cos). This value must be between 1 and 30, +// inclusive. +// +//***************************************************************************** +#ifndef GLOBAL_Q +#define GLOBAL_Q 3 +#endif + +//***************************************************************************** +// +// Include some standard headers. +// +//***************************************************************************** +#include +#include +#include + +//***************************************************************************** +// +// Various Useful Constant Definitions: +// +//***************************************************************************** +#define Q15 15 +#define Q14 14 +#define Q13 13 +#define Q12 12 +#define Q11 11 +#define Q10 10 +#define Q9 9 +#define Q8 8 +#define Q7 7 +#define Q6 6 +#define Q5 5 +#define Q4 4 +#define Q3 3 +#define Q2 2 +#define Q1 1 +#ifndef QG +#define QG GLOBAL_Q +#endif + +#define MAX_Q_POS INT16_MAX +#define MAX_Q_NEG INT16_MIN +#define MIN_Q_POS 1 +#define MIN_Q_NEG -1 + +//***************************************************************************** +// +// The types for the various Q formats. +// +//***************************************************************************** +typedef int16_t _q15; +typedef int16_t _q14; +typedef int16_t _q13; +typedef int16_t _q12; +typedef int16_t _q11; +typedef int16_t _q10; +typedef int16_t _q9; +typedef int16_t _q8; +typedef int16_t _q7; +typedef int16_t _q6; +typedef int16_t _q5; +typedef int16_t _q4; +typedef int16_t _q3; +typedef int16_t _q2; +typedef int16_t _q1; +typedef int16_t _q; + +//***************************************************************************** +// +// Simple multiplies or divides, which are accomplished with simple shifts. +// +//***************************************************************************** +#define _Qmpy2(A) ((A) << 1) +#define _Qmpy4(A) ((A) << 2) +#define _Qmpy8(A) ((A) << 3) +#define _Qmpy16(A) ((A) << 4) +#define _Qmpy32(A) ((A) << 5) +#define _Qmpy64(A) ((A) << 6) +#define _Qdiv2(A) ((A) >> 1) +#define _Qdiv4(A) ((A) >> 2) +#define _Qdiv8(A) ((A) >> 3) +#define _Qdiv16(A) ((A) >> 4) +#define _Qdiv32(A) ((A) >> 5) +#define _Qdiv64(A) ((A) >> 6) + +//***************************************************************************** +// +// Convert a value into an Q number. +// +//***************************************************************************** +#define _Q15(A) ((_q15)((A) * ((int32_t)1 << 15))) +#define _Q14(A) ((_q14)((A) * ((_q14)1 << 14))) +#define _Q13(A) ((_q13)((A) * ((_q13)1 << 13))) +#define _Q12(A) ((_q12)((A) * ((_q12)1 << 12))) +#define _Q11(A) ((_q11)((A) * ((_q11)1 << 11))) +#define _Q10(A) ((_q10)((A) * ((_q10)1 << 10))) +#define _Q9(A) ((_q9)((A) * ((_q9)1 << 9))) +#define _Q8(A) ((_q8)((A) * ((_q8)1 << 8))) +#define _Q7(A) ((_q7)((A) * ((_q7)1 << 7))) +#define _Q6(A) ((_q6)((A) * ((_q6)1 << 6))) +#define _Q5(A) ((_q5)((A) * ((_q5)1 << 5))) +#define _Q4(A) ((_q4)((A) * ((_q4)1 << 4))) +#define _Q3(A) ((_q3)((A) * ((_q3)1 << 3))) +#define _Q2(A) ((_q2)((A) * ((_q2)1 << 2))) +#define _Q1(A) ((_q1)((A) * ((_q1)1 << 1))) + +#if GLOBAL_Q == 15 +#define _Q(A) _Q15(A) +#endif +#if GLOBAL_Q == 14 +#define _Q(A) _Q14(A) +#endif +#if GLOBAL_Q == 13 +#define _Q(A) _Q13(A) +#endif +#if GLOBAL_Q == 12 +#define _Q(A) _Q12(A) +#endif +#if GLOBAL_Q == 11 +#define _Q(A) _Q11(A) +#endif +#if GLOBAL_Q == 10 +#define _Q(A) _Q10(A) +#endif +#if GLOBAL_Q == 9 +#define _Q(A) _Q9(A) +#endif +#if GLOBAL_Q == 8 +#define _Q(A) _Q8(A) +#endif +#if GLOBAL_Q == 7 +#define _Q(A) _Q7(A) +#endif +#if GLOBAL_Q == 6 +#define _Q(A) _Q6(A) +#endif +#if GLOBAL_Q == 5 +#define _Q(A) _Q5(A) +#endif +#if GLOBAL_Q == 4 +#define _Q(A) _Q4(A) +#endif +#if GLOBAL_Q == 3 +#define _Q(A) _Q3(A) +#endif +#if GLOBAL_Q == 2 +#define _Q(A) _Q2(A) +#endif +#if GLOBAL_Q == 1 +#define _Q(A) _Q1(A) +#endif + +//***************************************************************************** +// +// Convert an Q number to a floating point value. +// +//***************************************************************************** +extern float _Q15toF(_q15 A); +extern float _Q14toF(_q14 A); +extern float _Q13toF(_q13 A); +extern float _Q12toF(_q12 A); +extern float _Q11toF(_q11 A); +extern float _Q10toF(_q10 A); +extern float _Q9toF(_q9 A); +extern float _Q8toF(_q8 A); +extern float _Q7toF(_q7 A); +extern float _Q6toF(_q6 A); +extern float _Q5toF(_q5 A); +extern float _Q4toF(_q4 A); +extern float _Q3toF(_q3 A); +extern float _Q2toF(_q2 A); +extern float _Q1toF(_q1 A); + +#if GLOBAL_Q == 15 +#define _QtoF(A) _Q15toF(A) +#endif +#if GLOBAL_Q == 14 +#define _QtoF(A) _Q14toF(A) +#endif +#if GLOBAL_Q == 13 +#define _QtoF(A) _Q13toF(A) +#endif +#if GLOBAL_Q == 12 +#define _QtoF(A) _Q12toF(A) +#endif +#if GLOBAL_Q == 11 +#define _QtoF(A) _Q11toF(A) +#endif +#if GLOBAL_Q == 10 +#define _QtoF(A) _Q10toF(A) +#endif +#if GLOBAL_Q == 9 +#define _QtoF(A) _Q9toF(A) +#endif +#if GLOBAL_Q == 8 +#define _QtoF(A) _Q8toF(A) +#endif +#if GLOBAL_Q == 7 +#define _QtoF(A) _Q7toF(A) +#endif +#if GLOBAL_Q == 6 +#define _QtoF(A) _Q6toF(A) +#endif +#if GLOBAL_Q == 5 +#define _QtoF(A) _Q5toF(A) +#endif +#if GLOBAL_Q == 4 +#define _QtoF(A) _Q4toF(A) +#endif +#if GLOBAL_Q == 3 +#define _QtoF(A) _Q3toF(A) +#endif +#if GLOBAL_Q == 2 +#define _QtoF(A) _Q2toF(A) +#endif +#if GLOBAL_Q == 1 +#define _QtoF(A) _Q1toF(A) +#endif + +//***************************************************************************** +// +// Saturates an Q number in a given range. +// +//***************************************************************************** +#define _Qsat(A, Pos, Neg) (((A) > (Pos)) ? \ + (Pos) : \ + (((A) < (Neg)) ? (Neg) : (A))) + +//***************************************************************************** +// +// Converts an Q number between the global Q format and a specified Q +// format. +// +//***************************************************************************** + +#if (GLOBAL_Q >= 15) +#define _QtoQ15(A) ((_q15)(A) >> (GLOBAL_Q - 15)) +#define _Q15toQ(A) ((_q15)(A) << (GLOBAL_Q - 15)) +#else +#define _QtoQ15(A) ((_q15)(A) << (15 - GLOBAL_Q)) +#define _Q15toQ(A) ((_q15)(A) >> (15 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 14) +#define _QtoQ14(A) ((_q14)(A) >> (GLOBAL_Q - 14)) +#define _Q14toQ(A) ((_q14)(A) << (GLOBAL_Q - 14)) +#else +#define _QtoQ14(A) ((_q14)(A) << (14 - GLOBAL_Q)) +#define _Q14toQ(A) ((_q14)(A) >> (14 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 13) +#define _QtoQ13(A) ((_q13)(A) >> (GLOBAL_Q - 13)) +#define _Q13toQ(A) ((_q13)(A) << (GLOBAL_Q - 13)) +#else +#define _QtoQ13(A) ((_q13)(A) << (13 - GLOBAL_Q)) +#define _Q13toQ(A) ((_q13)(A) >> (13 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 12) +#define _QtoQ12(A) ((_q12)(A) >> (GLOBAL_Q - 12)) +#define _Q12toQ(A) ((_q12)(A) << (GLOBAL_Q - 12)) +#else +#define _QtoQ12(A) ((_q12)(A) << (12 - GLOBAL_Q)) +#define _Q12toQ(A) ((_q12)(A) >> (12 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 11) +#define _QtoQ11(A) ((_q11)(A) >> (GLOBAL_Q - 11)) +#define _Q11toQ(A) ((_q11)(A) << (GLOBAL_Q - 11)) +#else +#define _QtoQ11(A) ((_q11)(A) << (11 - GLOBAL_Q)) +#define _Q11toQ(A) ((_q11)(A) >> (11 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 10) +#define _QtoQ10(A) ((_q10)(A) >> (GLOBAL_Q - 10)) +#define _Q10toQ(A) ((_q10)(A) << (GLOBAL_Q - 10)) +#else +#define _QtoQ10(A) ((_q10)(A) << (10 - GLOBAL_Q)) +#define _Q10toQ(A) ((_q10)(A) >> (10 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 9) +#define _QtoQ9(A) ((_q9)(A) >> (GLOBAL_Q - 9)) +#define _Q9toQ(A) ((_q9)(A) << (GLOBAL_Q - 9)) +#else +#define _QtoQ9(A) ((_q9)(A) << (9 - GLOBAL_Q)) +#define _Q9toQ(A) ((_q9)(A) >> (9 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 8) +#define _QtoQ8(A) ((_q8)(A) >> (GLOBAL_Q - 8)) +#define _Q8toQ(A) ((_q8)(A) << (GLOBAL_Q - 8)) +#else +#define _QtoQ8(A) ((_q8)(A) << (8 - GLOBAL_Q)) +#define _Q8toQ(A) ((_q8)(A) >> (8 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 7) +#define _QtoQ7(A) ((_q7)(A) >> (GLOBAL_Q - 7)) +#define _Q7toQ(A) ((_q7)(A) << (GLOBAL_Q - 7)) +#else +#define _QtoQ7(A) ((_q7)(A) << (7 - GLOBAL_Q)) +#define _Q7toQ(A) ((_q7)(A) >> (7 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 6) +#define _QtoQ6(A) ((_q6)(A) >> (GLOBAL_Q - 6)) +#define _Q6toQ(A) ((_q6)(A) << (GLOBAL_Q - 6)) +#else +#define _QtoQ6(A) ((_q6)(A) << (6 - GLOBAL_Q)) +#define _Q6toQ(A) ((_q6)(A) >> (6 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 5) +#define _QtoQ5(A) ((_q5)(A) >> (GLOBAL_Q - 5)) +#define _Q5toQ(A) ((_q5)(A) << (GLOBAL_Q - 5)) +#else +#define _QtoQ5(A) ((_q5)(A) << (5 - GLOBAL_Q)) +#define _Q5toQ(A) ((_q5)(A) >> (5 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 4) +#define _QtoQ4(A) ((_q4)(A) >> (GLOBAL_Q - 4)) +#define _Q4toQ(A) ((_q4)(A) << (GLOBAL_Q - 4)) +#else +#define _QtoQ4(A) ((_q4)(A) << (4 - GLOBAL_Q)) +#define _Q4toQ(A) ((_q4)(A) >> (4 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 3) +#define _QtoQ3(A) ((_q3)(A) >> (GLOBAL_Q - 3)) +#define _Q3toQ(A) ((_q3)(A) << (GLOBAL_Q - 3)) +#else +#define _QtoQ3(A) ((_q3)(A) << (3 - GLOBAL_Q)) +#define _Q3toQ(A) ((_q3)(A) >> (3 - GLOBAL_Q)) +#endif + +#if (GLOBAL_Q >= 2) +#define _QtoQ2(A) ((_q2)(A) >> (GLOBAL_Q - 2)) +#define _Q2toQ(A) ((_q2)(A) << (GLOBAL_Q - 2)) +#else +#define _QtoQ2(A) ((_q2)(A) << (2 - GLOBAL_Q)) +#define _Q2toQ(A) ((_q2)(A) >> (2 - GLOBAL_Q)) +#endif + +#define _QtoQ1(A) ((_q1)(A) >> (GLOBAL_Q - 1)) +#define _Q1toQ(A) ((_q1)(A) << (GLOBAL_Q - 1)) + + +//***************************************************************************** +// +// Multiplies two Q numbers. +// +//***************************************************************************** +extern _q15 _Q15mpy(_q15 A, _q15 B); +extern _q14 _Q14mpy(_q14 A, _q14 B); +extern _q13 _Q13mpy(_q13 A, _q13 B); +extern _q12 _Q12mpy(_q12 A, _q12 B); +extern _q11 _Q11mpy(_q11 A, _q11 B); +extern _q10 _Q10mpy(_q10 A, _q10 B); +extern _q9 _Q9mpy(_q9 A, _q9 B); +extern _q8 _Q8mpy(_q8 A, _q8 B); +extern _q7 _Q7mpy(_q7 A, _q7 B); +extern _q6 _Q6mpy(_q6 A, _q6 B); +extern _q5 _Q5mpy(_q5 A, _q5 B); +extern _q4 _Q4mpy(_q4 A, _q4 B); +extern _q3 _Q3mpy(_q3 A, _q3 B); +extern _q2 _Q2mpy(_q2 A, _q2 B); +extern _q1 _Q1mpy(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qmpy(A, B) _Q15mpy(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qmpy(A, B) _Q14mpy(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qmpy(A, B) _Q13mpy(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qmpy(A, B) _Q12mpy(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qmpy(A, B) _Q11mpy(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qmpy(A, B) _Q10mpy(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qmpy(A, B) _Q9mpy(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qmpy(A, B) _Q8mpy(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qmpy(A, B) _Q7mpy(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qmpy(A, B) _Q6mpy(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qmpy(A, B) _Q5mpy(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qmpy(A, B) _Q4mpy(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qmpy(A, B) _Q3mpy(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qmpy(A, B) _Q2mpy(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qmpy(A, B) _Q1mpy(A, B) +#endif + +//***************************************************************************** +// +// Multiplies two Q numbers, with rounding. +// +//***************************************************************************** +extern _q15 _Q15rmpy(_q15 A, _q15 B); +extern _q14 _Q14rmpy(_q14 A, _q14 B); +extern _q13 _Q13rmpy(_q13 A, _q13 B); +extern _q12 _Q12rmpy(_q12 A, _q12 B); +extern _q11 _Q11rmpy(_q11 A, _q11 B); +extern _q10 _Q10rmpy(_q10 A, _q10 B); +extern _q9 _Q9rmpy(_q9 A, _q9 B); +extern _q8 _Q8rmpy(_q8 A, _q8 B); +extern _q7 _Q7rmpy(_q7 A, _q7 B); +extern _q6 _Q6rmpy(_q6 A, _q6 B); +extern _q5 _Q5rmpy(_q5 A, _q5 B); +extern _q4 _Q4rmpy(_q4 A, _q4 B); +extern _q3 _Q3rmpy(_q3 A, _q3 B); +extern _q2 _Q2rmpy(_q2 A, _q2 B); +extern _q1 _Q1rmpy(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qrmpy(A, B) _Q15rmpy(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qrmpy(A, B) _Q14rmpy(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qrmpy(A, B) _Q13rmpy(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qrmpy(A, B) _Q12rmpy(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qrmpy(A, B) _Q11rmpy(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qrmpy(A, B) _Q10rmpy(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qrmpy(A, B) _Q9rmpy(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qrmpy(A, B) _Q8rmpy(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qrmpy(A, B) _Q7rmpy(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qrmpy(A, B) _Q6rmpy(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qrmpy(A, B) _Q5rmpy(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qrmpy(A, B) _Q4rmpy(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qrmpy(A, B) _Q3rmpy(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qrmpy(A, B) _Q2rmpy(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qrmpy(A, B) _Q1rmpy(A, B) +#endif + +//***************************************************************************** +// +// Multiplies two Q numbers, with rounding and saturation. +// +//***************************************************************************** +extern _q15 _Q15rsmpy(_q15 A, _q15 B); +extern _q14 _Q14rsmpy(_q14 A, _q14 B); +extern _q13 _Q13rsmpy(_q13 A, _q13 B); +extern _q12 _Q12rsmpy(_q12 A, _q12 B); +extern _q11 _Q11rsmpy(_q11 A, _q11 B); +extern _q10 _Q10rsmpy(_q10 A, _q10 B); +extern _q9 _Q9rsmpy(_q9 A, _q9 B); +extern _q8 _Q8rsmpy(_q8 A, _q8 B); +extern _q7 _Q7rsmpy(_q7 A, _q7 B); +extern _q6 _Q6rsmpy(_q6 A, _q6 B); +extern _q5 _Q5rsmpy(_q5 A, _q5 B); +extern _q4 _Q4rsmpy(_q4 A, _q4 B); +extern _q3 _Q3rsmpy(_q3 A, _q3 B); +extern _q2 _Q2rsmpy(_q2 A, _q2 B); +extern _q1 _Q1rsmpy(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qrsmpy(A, B) _Q15rsmpy(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qrsmpy(A, B) _Q14rsmpy(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qrsmpy(A, B) _Q13rsmpy(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qrsmpy(A, B) _Q12rsmpy(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qrsmpy(A, B) _Q11rsmpy(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qrsmpy(A, B) _Q10rsmpy(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qrsmpy(A, B) _Q9rsmpy(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qrsmpy(A, B) _Q8rsmpy(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qrsmpy(A, B) _Q7rsmpy(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qrsmpy(A, B) _Q6rsmpy(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qrsmpy(A, B) _Q5rsmpy(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qrsmpy(A, B) _Q4rsmpy(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qrsmpy(A, B) _Q3rsmpy(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qrsmpy(A, B) _Q2rsmpy(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qrsmpy(A, B) _Q1rsmpy(A, B) +#endif + +//***************************************************************************** +// +// Divides two Q numbers. +// +//***************************************************************************** +extern _q15 _Q15div(_q15 A, _q15 B); +extern _q14 _Q14div(_q14 A, _q14 B); +extern _q13 _Q13div(_q13 A, _q13 B); +extern _q12 _Q12div(_q12 A, _q12 B); +extern _q11 _Q11div(_q11 A, _q11 B); +extern _q10 _Q10div(_q10 A, _q10 B); +extern _q9 _Q9div(_q9 A, _q9 B); +extern _q8 _Q8div(_q8 A, _q8 B); +extern _q7 _Q7div(_q7 A, _q7 B); +extern _q6 _Q6div(_q6 A, _q6 B); +extern _q5 _Q5div(_q5 A, _q5 B); +extern _q4 _Q4div(_q4 A, _q4 B); +extern _q3 _Q3div(_q3 A, _q3 B); +extern _q2 _Q2div(_q2 A, _q2 B); +extern _q1 _Q1div(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qdiv(A, B) _Q15div(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qdiv(A, B) _Q14div(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qdiv(A, B) _Q13div(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qdiv(A, B) _Q12div(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qdiv(A, B) _Q11div(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qdiv(A, B) _Q10div(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qdiv(A, B) _Q9div(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qdiv(A, B) _Q8div(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qdiv(A, B) _Q7div(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qdiv(A, B) _Q6div(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qdiv(A, B) _Q5div(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qdiv(A, B) _Q4div(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qdiv(A, B) _Q3div(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qdiv(A, B) _Q2div(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qdiv(A, B) _Q1div(A, B) +#endif + +//***************************************************************************** +// +// Computes the sin of an Q number. +// +//***************************************************************************** +extern _q15 _Q15sin(_q15 A); +extern _q14 _Q14sin(_q14 A); +extern _q13 _Q13sin(_q13 A); +extern _q12 _Q12sin(_q12 A); +extern _q11 _Q11sin(_q11 A); +extern _q10 _Q10sin(_q10 A); +extern _q9 _Q9sin(_q9 A); +extern _q8 _Q8sin(_q8 A); +extern _q7 _Q7sin(_q7 A); +extern _q6 _Q6sin(_q6 A); +extern _q5 _Q5sin(_q5 A); +extern _q4 _Q4sin(_q4 A); +extern _q3 _Q3sin(_q3 A); +extern _q2 _Q2sin(_q2 A); +extern _q1 _Q1sin(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qsin(A) _Q15sin(A) +#endif +#if GLOBAL_Q == 14 +#define _Qsin(A) _Q14sin(A) +#endif +#if GLOBAL_Q == 13 +#define _Qsin(A) _Q13sin(A) +#endif +#if GLOBAL_Q == 12 +#define _Qsin(A) _Q12sin(A) +#endif +#if GLOBAL_Q == 11 +#define _Qsin(A) _Q11sin(A) +#endif +#if GLOBAL_Q == 10 +#define _Qsin(A) _Q10sin(A) +#endif +#if GLOBAL_Q == 9 +#define _Qsin(A) _Q9sin(A) +#endif +#if GLOBAL_Q == 8 +#define _Qsin(A) _Q8sin(A) +#endif +#if GLOBAL_Q == 7 +#define _Qsin(A) _Q7sin(A) +#endif +#if GLOBAL_Q == 6 +#define _Qsin(A) _Q6sin(A) +#endif +#if GLOBAL_Q == 5 +#define _Qsin(A) _Q5sin(A) +#endif +#if GLOBAL_Q == 4 +#define _Qsin(A) _Q4sin(A) +#endif +#if GLOBAL_Q == 3 +#define _Qsin(A) _Q3sin(A) +#endif +#if GLOBAL_Q == 2 +#define _Qsin(A) _Q2sin(A) +#endif +#if GLOBAL_Q == 1 +#define _Qsin(A) _Q1sin(A) +#endif + +//***************************************************************************** +// +// Computes the sin of an Q number, using cycles per unit instead of radians. +// +//***************************************************************************** +extern _q15 _Q15sinPU(_q15 A); +extern _q14 _Q14sinPU(_q14 A); +extern _q13 _Q13sinPU(_q13 A); +extern _q12 _Q12sinPU(_q12 A); +extern _q11 _Q11sinPU(_q11 A); +extern _q10 _Q10sinPU(_q10 A); +extern _q9 _Q9sinPU(_q9 A); +extern _q8 _Q8sinPU(_q8 A); +extern _q7 _Q7sinPU(_q7 A); +extern _q6 _Q6sinPU(_q6 A); +extern _q5 _Q5sinPU(_q5 A); +extern _q4 _Q4sinPU(_q4 A); +extern _q3 _Q3sinPU(_q3 A); +extern _q2 _Q2sinPU(_q2 A); +extern _q1 _Q1sinPU(_q1 A); + +#if GLOBAL_Q == 15 +#define _QsinPU(A) _Q15sinPU(A) +#endif +#if GLOBAL_Q == 14 +#define _QsinPU(A) _Q14sinPU(A) +#endif +#if GLOBAL_Q == 13 +#define _QsinPU(A) _Q13sinPU(A) +#endif +#if GLOBAL_Q == 12 +#define _QsinPU(A) _Q12sinPU(A) +#endif +#if GLOBAL_Q == 11 +#define _QsinPU(A) _Q11sinPU(A) +#endif +#if GLOBAL_Q == 10 +#define _QsinPU(A) _Q10sinPU(A) +#endif +#if GLOBAL_Q == 9 +#define _QsinPU(A) _Q9sinPU(A) +#endif +#if GLOBAL_Q == 8 +#define _QsinPU(A) _Q8sinPU(A) +#endif +#if GLOBAL_Q == 7 +#define _QsinPU(A) _Q7sinPU(A) +#endif +#if GLOBAL_Q == 6 +#define _QsinPU(A) _Q6sinPU(A) +#endif +#if GLOBAL_Q == 5 +#define _QsinPU(A) _Q5sinPU(A) +#endif +#if GLOBAL_Q == 4 +#define _QsinPU(A) _Q4sinPU(A) +#endif +#if GLOBAL_Q == 3 +#define _QsinPU(A) _Q3sinPU(A) +#endif +#if GLOBAL_Q == 2 +#define _QsinPU(A) _Q2sinPU(A) +#endif +#if GLOBAL_Q == 1 +#define _QsinPU(A) _Q1sinPU(A) +#endif + +//***************************************************************************** +// +// Computes the arcsin of an Q number. +// +//***************************************************************************** +extern _q14 _Q14asin(_q14 A); +extern _q13 _Q13asin(_q13 A); +extern _q12 _Q12asin(_q12 A); +extern _q11 _Q11asin(_q11 A); +extern _q10 _Q10asin(_q10 A); +extern _q9 _Q9asin(_q9 A); +extern _q8 _Q8asin(_q8 A); +extern _q7 _Q7asin(_q7 A); +extern _q6 _Q6asin(_q6 A); +extern _q5 _Q5asin(_q5 A); +extern _q4 _Q4asin(_q4 A); +extern _q3 _Q3asin(_q3 A); +extern _q2 _Q2asin(_q2 A); +extern _q1 _Q1asin(_q1 A); + +#if GLOBAL_Q == 14 +#define _Qasin(A) _Q14asin(A) +#endif +#if GLOBAL_Q == 13 +#define _Qasin(A) _Q13asin(A) +#endif +#if GLOBAL_Q == 12 +#define _Qasin(A) _Q12asin(A) +#endif +#if GLOBAL_Q == 11 +#define _Qasin(A) _Q11asin(A) +#endif +#if GLOBAL_Q == 10 +#define _Qasin(A) _Q10asin(A) +#endif +#if GLOBAL_Q == 9 +#define _Qasin(A) _Q9asin(A) +#endif +#if GLOBAL_Q == 8 +#define _Qasin(A) _Q8asin(A) +#endif +#if GLOBAL_Q == 7 +#define _Qasin(A) _Q7asin(A) +#endif +#if GLOBAL_Q == 6 +#define _Qasin(A) _Q6asin(A) +#endif +#if GLOBAL_Q == 5 +#define _Qasin(A) _Q5asin(A) +#endif +#if GLOBAL_Q == 4 +#define _Qasin(A) _Q4asin(A) +#endif +#if GLOBAL_Q == 3 +#define _Qasin(A) _Q3asin(A) +#endif +#if GLOBAL_Q == 2 +#define _Qasin(A) _Q2asin(A) +#endif +#if GLOBAL_Q == 1 +#define _Qasin(A) _Q1asin(A) +#endif + +//***************************************************************************** +// +// Computes the cos of an Q number. +// +//***************************************************************************** +extern _q15 _Q15cos(_q15 A); +extern _q14 _Q14cos(_q14 A); +extern _q13 _Q13cos(_q13 A); +extern _q12 _Q12cos(_q12 A); +extern _q11 _Q11cos(_q11 A); +extern _q10 _Q10cos(_q10 A); +extern _q9 _Q9cos(_q9 A); +extern _q8 _Q8cos(_q8 A); +extern _q7 _Q7cos(_q7 A); +extern _q6 _Q6cos(_q6 A); +extern _q5 _Q5cos(_q5 A); +extern _q4 _Q4cos(_q4 A); +extern _q3 _Q3cos(_q3 A); +extern _q2 _Q2cos(_q2 A); +extern _q1 _Q1cos(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qcos(A) _Q15cos(A) +#endif +#if GLOBAL_Q == 14 +#define _Qcos(A) _Q14cos(A) +#endif +#if GLOBAL_Q == 13 +#define _Qcos(A) _Q13cos(A) +#endif +#if GLOBAL_Q == 12 +#define _Qcos(A) _Q12cos(A) +#endif +#if GLOBAL_Q == 11 +#define _Qcos(A) _Q11cos(A) +#endif +#if GLOBAL_Q == 10 +#define _Qcos(A) _Q10cos(A) +#endif +#if GLOBAL_Q == 9 +#define _Qcos(A) _Q9cos(A) +#endif +#if GLOBAL_Q == 8 +#define _Qcos(A) _Q8cos(A) +#endif +#if GLOBAL_Q == 7 +#define _Qcos(A) _Q7cos(A) +#endif +#if GLOBAL_Q == 6 +#define _Qcos(A) _Q6cos(A) +#endif +#if GLOBAL_Q == 5 +#define _Qcos(A) _Q5cos(A) +#endif +#if GLOBAL_Q == 4 +#define _Qcos(A) _Q4cos(A) +#endif +#if GLOBAL_Q == 3 +#define _Qcos(A) _Q3cos(A) +#endif +#if GLOBAL_Q == 2 +#define _Qcos(A) _Q2cos(A) +#endif +#if GLOBAL_Q == 1 +#define _Qcos(A) _Q1cos(A) +#endif + +//***************************************************************************** +// +// Computes the cos of an Q number, using cycles per unit instead of radians. +// +//***************************************************************************** +extern _q15 _Q15cosPU(_q15 A); +extern _q14 _Q14cosPU(_q14 A); +extern _q13 _Q13cosPU(_q13 A); +extern _q12 _Q12cosPU(_q12 A); +extern _q11 _Q11cosPU(_q11 A); +extern _q10 _Q10cosPU(_q10 A); +extern _q9 _Q9cosPU(_q9 A); +extern _q8 _Q8cosPU(_q8 A); +extern _q7 _Q7cosPU(_q7 A); +extern _q6 _Q6cosPU(_q6 A); +extern _q5 _Q5cosPU(_q5 A); +extern _q4 _Q4cosPU(_q4 A); +extern _q3 _Q3cosPU(_q3 A); +extern _q2 _Q2cosPU(_q2 A); +extern _q1 _Q1cosPU(_q1 A); + +#if GLOBAL_Q == 15 +#define _QcosPU(A) _Q15cosPU(A) +#endif +#if GLOBAL_Q == 14 +#define _QcosPU(A) _Q14cosPU(A) +#endif +#if GLOBAL_Q == 13 +#define _QcosPU(A) _Q13cosPU(A) +#endif +#if GLOBAL_Q == 12 +#define _QcosPU(A) _Q12cosPU(A) +#endif +#if GLOBAL_Q == 11 +#define _QcosPU(A) _Q11cosPU(A) +#endif +#if GLOBAL_Q == 10 +#define _QcosPU(A) _Q10cosPU(A) +#endif +#if GLOBAL_Q == 9 +#define _QcosPU(A) _Q9cosPU(A) +#endif +#if GLOBAL_Q == 8 +#define _QcosPU(A) _Q8cosPU(A) +#endif +#if GLOBAL_Q == 7 +#define _QcosPU(A) _Q7cosPU(A) +#endif +#if GLOBAL_Q == 6 +#define _QcosPU(A) _Q6cosPU(A) +#endif +#if GLOBAL_Q == 5 +#define _QcosPU(A) _Q5cosPU(A) +#endif +#if GLOBAL_Q == 4 +#define _QcosPU(A) _Q4cosPU(A) +#endif +#if GLOBAL_Q == 3 +#define _QcosPU(A) _Q3cosPU(A) +#endif +#if GLOBAL_Q == 2 +#define _QcosPU(A) _Q2cosPU(A) +#endif +#if GLOBAL_Q == 1 +#define _QcosPU(A) _Q1cosPU(A) +#endif + +//***************************************************************************** +// +// Computes the arccos of an Q number. +// +//***************************************************************************** +#define _Q14acos(A) (_Q14(1.570796327) - _Q14asin(A)) +#define _Q13acos(A) (_Q13(1.570796327) - _Q13asin(A)) +#define _Q12acos(A) (_Q12(1.570796327) - _Q12asin(A)) +#define _Q11acos(A) (_Q11(1.570796327) - _Q11asin(A)) +#define _Q10acos(A) (_Q10(1.570796327) - _Q10asin(A)) +#define _Q9acos(A) (_Q9(1.570796327) - _Q9asin(A)) +#define _Q8acos(A) (_Q8(1.570796327) - _Q8asin(A)) +#define _Q7acos(A) (_Q7(1.570796327) - _Q7asin(A)) +#define _Q6acos(A) (_Q6(1.570796327) - _Q6asin(A)) +#define _Q5acos(A) (_Q5(1.570796327) - _Q5asin(A)) +#define _Q4acos(A) (_Q4(1.570796327) - _Q4asin(A)) +#define _Q3acos(A) (_Q3(1.570796327) - _Q3asin(A)) +#define _Q2acos(A) (_Q2(1.570796327) - _Q2asin(A)) +#define _Q1acos(A) (_Q1(1.570796327) - _Q1asin(A)) + +#if GLOBAL_Q == 14 +#define _Qacos(A) _Q14acos(A) +#endif +#if GLOBAL_Q == 13 +#define _Qacos(A) _Q13acos(A) +#endif +#if GLOBAL_Q == 12 +#define _Qacos(A) _Q12acos(A) +#endif +#if GLOBAL_Q == 11 +#define _Qacos(A) _Q11acos(A) +#endif +#if GLOBAL_Q == 10 +#define _Qacos(A) _Q10acos(A) +#endif +#if GLOBAL_Q == 9 +#define _Qacos(A) _Q9acos(A) +#endif +#if GLOBAL_Q == 8 +#define _Qacos(A) _Q8acos(A) +#endif +#if GLOBAL_Q == 7 +#define _Qacos(A) _Q7acos(A) +#endif +#if GLOBAL_Q == 6 +#define _Qacos(A) _Q6acos(A) +#endif +#if GLOBAL_Q == 5 +#define _Qacos(A) _Q5acos(A) +#endif +#if GLOBAL_Q == 4 +#define _Qacos(A) _Q4acos(A) +#endif +#if GLOBAL_Q == 3 +#define _Qacos(A) _Q3acos(A) +#endif +#if GLOBAL_Q == 2 +#define _Qacos(A) _Q2acos(A) +#endif +#if GLOBAL_Q == 1 +#define _Qacos(A) _Q1acos(A) +#endif + +//***************************************************************************** +// +// Computes the arctan of a coordinate specified by two Q numbers. +// +//***************************************************************************** +extern _q15 _Q15atan2(_q15 A, _q15 B); +extern _q14 _Q14atan2(_q14 A, _q14 B); +extern _q13 _Q13atan2(_q13 A, _q13 B); +extern _q12 _Q12atan2(_q12 A, _q12 B); +extern _q11 _Q11atan2(_q11 A, _q11 B); +extern _q10 _Q10atan2(_q10 A, _q10 B); +extern _q9 _Q9atan2(_q9 A, _q9 B); +extern _q8 _Q8atan2(_q8 A, _q8 B); +extern _q7 _Q7atan2(_q7 A, _q7 B); +extern _q6 _Q6atan2(_q6 A, _q6 B); +extern _q5 _Q5atan2(_q5 A, _q5 B); +extern _q4 _Q4atan2(_q4 A, _q4 B); +extern _q3 _Q3atan2(_q3 A, _q3 B); +extern _q2 _Q2atan2(_q2 A, _q2 B); +extern _q1 _Q1atan2(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qatan2(A, B) _Q15atan2(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qatan2(A, B) _Q14atan2(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qatan2(A, B) _Q13atan2(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qatan2(A, B) _Q12atan2(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qatan2(A, B) _Q11atan2(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qatan2(A, B) _Q10atan2(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qatan2(A, B) _Q9atan2(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qatan2(A, B) _Q8atan2(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qatan2(A, B) _Q7atan2(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qatan2(A, B) _Q6atan2(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qatan2(A, B) _Q5atan2(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qatan2(A, B) _Q4atan2(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qatan2(A, B) _Q3atan2(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qatan2(A, B) _Q2atan2(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qatan2(A, B) _Q1atan2(A, B) +#endif + +//***************************************************************************** +// +// Computes the arctan of a coordinate specified by two Q numbers, returning +// the value in cycles per unit instead of radians. +// +//***************************************************************************** +extern _q15 _Q15atan2PU(_q15 A, _q15 B); +extern _q14 _Q14atan2PU(_q14 A, _q14 B); +extern _q13 _Q13atan2PU(_q13 A, _q13 B); +extern _q12 _Q12atan2PU(_q12 A, _q12 B); +extern _q11 _Q11atan2PU(_q11 A, _q11 B); +extern _q10 _Q10atan2PU(_q10 A, _q10 B); +extern _q9 _Q9atan2PU(_q9 A, _q9 B); +extern _q8 _Q8atan2PU(_q8 A, _q8 B); +extern _q7 _Q7atan2PU(_q7 A, _q7 B); +extern _q6 _Q6atan2PU(_q6 A, _q6 B); +extern _q5 _Q5atan2PU(_q5 A, _q5 B); +extern _q4 _Q4atan2PU(_q4 A, _q4 B); +extern _q3 _Q3atan2PU(_q3 A, _q3 B); +extern _q2 _Q2atan2PU(_q2 A, _q2 B); +extern _q1 _Q1atan2PU(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qatan2PU(A, B) _Q15atan2PU(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qatan2PU(A, B) _Q14atan2PU(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qatan2PU(A, B) _Q13atan2PU(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qatan2PU(A, B) _Q12atan2PU(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qatan2PU(A, B) _Q11atan2PU(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qatan2PU(A, B) _Q10atan2PU(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qatan2PU(A, B) _Q9atan2PU(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qatan2PU(A, B) _Q8atan2PU(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qatan2PU(A, B) _Q7atan2PU(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qatan2PU(A, B) _Q6atan2PU(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qatan2PU(A, B) _Q5atan2PU(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qatan2PU(A, B) _Q4atan2PU(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qatan2PU(A, B) _Q3atan2PU(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qatan2PU(A, B) _Q2atan2PU(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qatan2PU(A, B) _Q1atan2PU(A, B) +#endif + +//***************************************************************************** +// +// Computes the arctan of an Q number. +// +//***************************************************************************** +#define _Q14atan(A) _Q14atan2(A, _Q14(1.0)) +#define _Q13atan(A) _Q13atan2(A, _Q13(1.0)) +#define _Q12atan(A) _Q12atan2(A, _Q12(1.0)) +#define _Q11atan(A) _Q11atan2(A, _Q11(1.0)) +#define _Q10atan(A) _Q10atan2(A, _Q10(1.0)) +#define _Q9atan(A) _Q9atan2(A, _Q9(1.0)) +#define _Q8atan(A) _Q8atan2(A, _Q8(1.0)) +#define _Q7atan(A) _Q7atan2(A, _Q7(1.0)) +#define _Q6atan(A) _Q6atan2(A, _Q6(1.0)) +#define _Q5atan(A) _Q5atan2(A, _Q5(1.0)) +#define _Q4atan(A) _Q4atan2(A, _Q4(1.0)) +#define _Q3atan(A) _Q3atan2(A, _Q3(1.0)) +#define _Q2atan(A) _Q2atan2(A, _Q2(1.0)) +#define _Q1atan(A) _Q1atan2(A, _Q1(1.0)) + +#if GLOBAL_Q == 15 +#define _Qatan(A) _Q15atan2(A, _Q15(1.0)) +#endif +#if GLOBAL_Q == 14 +#define _Qatan(A) _Q14atan2(A, _Q14(1.0)) +#endif +#if GLOBAL_Q == 13 +#define _Qatan(A) _Q13atan2(A, _Q13(1.0)) +#endif +#if GLOBAL_Q == 12 +#define _Qatan(A) _Q12atan2(A, _Q12(1.0)) +#endif +#if GLOBAL_Q == 11 +#define _Qatan(A) _Q11atan2(A, _Q11(1.0)) +#endif +#if GLOBAL_Q == 10 +#define _Qatan(A) _Q10atan2(A, _Q10(1.0)) +#endif +#if GLOBAL_Q == 9 +#define _Qatan(A) _Q9atan2(A, _Q9(1.0)) +#endif +#if GLOBAL_Q == 8 +#define _Qatan(A) _Q8atan2(A, _Q8(1.0)) +#endif +#if GLOBAL_Q == 7 +#define _Qatan(A) _Q7atan2(A, _Q7(1.0)) +#endif +#if GLOBAL_Q == 6 +#define _Qatan(A) _Q6atan2(A, _Q6(1.0)) +#endif +#if GLOBAL_Q == 5 +#define _Qatan(A) _Q5atan2(A, _Q5(1.0)) +#endif +#if GLOBAL_Q == 4 +#define _Qatan(A) _Q4atan2(A, _Q4(1.0)) +#endif +#if GLOBAL_Q == 3 +#define _Qatan(A) _Q3atan2(A, _Q3(1.0)) +#endif +#if GLOBAL_Q == 2 +#define _Qatan(A) _Q2atan2(A, _Q2(1.0)) +#endif +#if GLOBAL_Q == 1 +#define _Qatan(A) _Q1atan2(A, _Q1(1.0)) +#endif + +//***************************************************************************** +// +// Computes the square root of an Q number. +// +//***************************************************************************** +extern _q15 _Q15sqrt(_q15 A); +extern _q14 _Q14sqrt(_q14 A); +extern _q13 _Q13sqrt(_q13 A); +extern _q12 _Q12sqrt(_q12 A); +extern _q11 _Q11sqrt(_q11 A); +extern _q10 _Q10sqrt(_q10 A); +extern _q9 _Q9sqrt(_q9 A); +extern _q8 _Q8sqrt(_q8 A); +extern _q7 _Q7sqrt(_q7 A); +extern _q6 _Q6sqrt(_q6 A); +extern _q5 _Q5sqrt(_q5 A); +extern _q4 _Q4sqrt(_q4 A); +extern _q3 _Q3sqrt(_q3 A); +extern _q2 _Q2sqrt(_q2 A); +extern _q1 _Q1sqrt(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qsqrt(A) _Q15sqrt(A) +#endif +#if GLOBAL_Q == 14 +#define _Qsqrt(A) _Q14sqrt(A) +#endif +#if GLOBAL_Q == 13 +#define _Qsqrt(A) _Q13sqrt(A) +#endif +#if GLOBAL_Q == 12 +#define _Qsqrt(A) _Q12sqrt(A) +#endif +#if GLOBAL_Q == 11 +#define _Qsqrt(A) _Q11sqrt(A) +#endif +#if GLOBAL_Q == 10 +#define _Qsqrt(A) _Q10sqrt(A) +#endif +#if GLOBAL_Q == 9 +#define _Qsqrt(A) _Q9sqrt(A) +#endif +#if GLOBAL_Q == 8 +#define _Qsqrt(A) _Q8sqrt(A) +#endif +#if GLOBAL_Q == 7 +#define _Qsqrt(A) _Q7sqrt(A) +#endif +#if GLOBAL_Q == 6 +#define _Qsqrt(A) _Q6sqrt(A) +#endif +#if GLOBAL_Q == 5 +#define _Qsqrt(A) _Q5sqrt(A) +#endif +#if GLOBAL_Q == 4 +#define _Qsqrt(A) _Q4sqrt(A) +#endif +#if GLOBAL_Q == 3 +#define _Qsqrt(A) _Q3sqrt(A) +#endif +#if GLOBAL_Q == 2 +#define _Qsqrt(A) _Q2sqrt(A) +#endif +#if GLOBAL_Q == 1 +#define _Qsqrt(A) _Q1sqrt(A) +#endif + +//***************************************************************************** +// +// Computes 1 over the square root of an Q number. +// +//***************************************************************************** +extern _q15 _Q15isqrt(_q15 A); +extern _q14 _Q14isqrt(_q14 A); +extern _q13 _Q13isqrt(_q13 A); +extern _q12 _Q12isqrt(_q12 A); +extern _q11 _Q11isqrt(_q11 A); +extern _q10 _Q10isqrt(_q10 A); +extern _q9 _Q9isqrt(_q9 A); +extern _q8 _Q8isqrt(_q8 A); +extern _q7 _Q7isqrt(_q7 A); +extern _q6 _Q6isqrt(_q6 A); +extern _q5 _Q5isqrt(_q5 A); +extern _q4 _Q4isqrt(_q4 A); +extern _q3 _Q3isqrt(_q3 A); +extern _q2 _Q2isqrt(_q2 A); +extern _q1 _Q1isqrt(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qisqrt(A) _Q15isqrt(A) +#endif +#if GLOBAL_Q == 14 +#define _Qisqrt(A) _Q14isqrt(A) +#endif +#if GLOBAL_Q == 13 +#define _Qisqrt(A) _Q13isqrt(A) +#endif +#if GLOBAL_Q == 12 +#define _Qisqrt(A) _Q12isqrt(A) +#endif +#if GLOBAL_Q == 11 +#define _Qisqrt(A) _Q11isqrt(A) +#endif +#if GLOBAL_Q == 10 +#define _Qisqrt(A) _Q10isqrt(A) +#endif +#if GLOBAL_Q == 9 +#define _Qisqrt(A) _Q9isqrt(A) +#endif +#if GLOBAL_Q == 8 +#define _Qisqrt(A) _Q8isqrt(A) +#endif +#if GLOBAL_Q == 7 +#define _Qisqrt(A) _Q7isqrt(A) +#endif +#if GLOBAL_Q == 6 +#define _Qisqrt(A) _Q6isqrt(A) +#endif +#if GLOBAL_Q == 5 +#define _Qisqrt(A) _Q5isqrt(A) +#endif +#if GLOBAL_Q == 4 +#define _Qisqrt(A) _Q4isqrt(A) +#endif +#if GLOBAL_Q == 3 +#define _Qisqrt(A) _Q3isqrt(A) +#endif +#if GLOBAL_Q == 2 +#define _Qisqrt(A) _Q2isqrt(A) +#endif +#if GLOBAL_Q == 1 +#define _Qisqrt(A) _Q1isqrt(A) +#endif + +//***************************************************************************** +// +// Computes e^x of an Q number. +// +//***************************************************************************** +extern _q15 _Q15exp(_q15 A); +extern _q14 _Q14exp(_q14 A); +extern _q13 _Q13exp(_q13 A); +extern _q12 _Q12exp(_q12 A); +extern _q11 _Q11exp(_q11 A); +extern _q10 _Q10exp(_q10 A); +extern _q9 _Q9exp(_q9 A); +extern _q8 _Q8exp(_q8 A); +extern _q7 _Q7exp(_q7 A); +extern _q6 _Q6exp(_q6 A); +extern _q5 _Q5exp(_q5 A); +extern _q4 _Q4exp(_q4 A); +extern _q3 _Q3exp(_q3 A); +extern _q2 _Q2exp(_q2 A); +extern _q1 _Q1exp(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qexp(A) _Q15exp(A) +#endif +#if GLOBAL_Q == 14 +#define _Qexp(A) _Q14exp(A) +#endif +#if GLOBAL_Q == 13 +#define _Qexp(A) _Q13exp(A) +#endif +#if GLOBAL_Q == 12 +#define _Qexp(A) _Q12exp(A) +#endif +#if GLOBAL_Q == 11 +#define _Qexp(A) _Q11exp(A) +#endif +#if GLOBAL_Q == 10 +#define _Qexp(A) _Q10exp(A) +#endif +#if GLOBAL_Q == 9 +#define _Qexp(A) _Q9exp(A) +#endif +#if GLOBAL_Q == 8 +#define _Qexp(A) _Q8exp(A) +#endif +#if GLOBAL_Q == 7 +#define _Qexp(A) _Q7exp(A) +#endif +#if GLOBAL_Q == 6 +#define _Qexp(A) _Q6exp(A) +#endif +#if GLOBAL_Q == 5 +#define _Qexp(A) _Q5exp(A) +#endif +#if GLOBAL_Q == 4 +#define _Qexp(A) _Q4exp(A) +#endif +#if GLOBAL_Q == 3 +#define _Qexp(A) _Q3exp(A) +#endif +#if GLOBAL_Q == 2 +#define _Qexp(A) _Q2exp(A) +#endif +#if GLOBAL_Q == 1 +#define _Qexp(A) _Q1exp(A) +#endif + +//***************************************************************************** +// +// Computes log(x) of an Q number. +// +//***************************************************************************** +extern _q15 _Q15log(_q15 A); +extern _q14 _Q14log(_q14 A); +extern _q13 _Q13log(_q13 A); +extern _q12 _Q12log(_q12 A); +extern _q11 _Q11log(_q11 A); +extern _q10 _Q10log(_q10 A); +extern _q9 _Q9log(_q9 A); +extern _q8 _Q8log(_q8 A); +extern _q7 _Q7log(_q7 A); +extern _q6 _Q6log(_q6 A); +extern _q5 _Q5log(_q5 A); +extern _q4 _Q4log(_q4 A); +extern _q3 _Q3log(_q3 A); +extern _q2 _Q2log(_q2 A); +extern _q1 _Q1log(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qlog(A) _Q15log(A) +#endif +#if GLOBAL_Q == 14 +#define _Qlog(A) _Q14log(A) +#endif +#if GLOBAL_Q == 13 +#define _Qlog(A) _Q13log(A) +#endif +#if GLOBAL_Q == 12 +#define _Qlog(A) _Q12log(A) +#endif +#if GLOBAL_Q == 11 +#define _Qlog(A) _Q11log(A) +#endif +#if GLOBAL_Q == 10 +#define _Qlog(A) _Q10log(A) +#endif +#if GLOBAL_Q == 9 +#define _Qlog(A) _Q9log(A) +#endif +#if GLOBAL_Q == 8 +#define _Qlog(A) _Q8log(A) +#endif +#if GLOBAL_Q == 7 +#define _Qlog(A) _Q7log(A) +#endif +#if GLOBAL_Q == 6 +#define _Qlog(A) _Q6log(A) +#endif +#if GLOBAL_Q == 5 +#define _Qlog(A) _Q5log(A) +#endif +#if GLOBAL_Q == 4 +#define _Qlog(A) _Q4log(A) +#endif +#if GLOBAL_Q == 3 +#define _Qlog(A) _Q3log(A) +#endif +#if GLOBAL_Q == 2 +#define _Qlog(A) _Q2log(A) +#endif +#if GLOBAL_Q == 1 +#define _Qlog(A) _Q1log(A) +#endif + +//***************************************************************************** +// +// Returns the integer portion of an Q number. +// +//***************************************************************************** +#define _Q15int(A) ((A) >> 15) +#define _Q14int(A) ((A) >> 14) +#define _Q13int(A) ((A) >> 13) +#define _Q12int(A) ((A) >> 12) +#define _Q11int(A) ((A) >> 11) +#define _Q10int(A) ((A) >> 10) +#define _Q9int(A) ((A) >> 9) +#define _Q8int(A) ((A) >> 8) +#define _Q7int(A) ((A) >> 7) +#define _Q6int(A) ((A) >> 6) +#define _Q5int(A) ((A) >> 5) +#define _Q4int(A) ((A) >> 4) +#define _Q3int(A) ((A) >> 3) +#define _Q2int(A) ((A) >> 2) +#define _Q1int(A) ((A) >> 1) +#define _Qint(A) ((A) >> GLOBAL_Q) + +//***************************************************************************** +// +// Computes the fractional portion of an Q number. +// +//***************************************************************************** +extern _q15 _Q15frac(_q15 A); +extern _q14 _Q14frac(_q14 A); +extern _q13 _Q13frac(_q13 A); +extern _q12 _Q12frac(_q12 A); +extern _q11 _Q11frac(_q11 A); +extern _q10 _Q10frac(_q10 A); +extern _q9 _Q9frac(_q9 A); +extern _q8 _Q8frac(_q8 A); +extern _q7 _Q7frac(_q7 A); +extern _q6 _Q6frac(_q6 A); +extern _q5 _Q5frac(_q5 A); +extern _q4 _Q4frac(_q4 A); +extern _q3 _Q3frac(_q3 A); +extern _q2 _Q2frac(_q2 A); +extern _q1 _Q1frac(_q1 A); + +#if GLOBAL_Q == 15 +#define _Qfrac(A) _Q15frac(A) +#endif +#if GLOBAL_Q == 14 +#define _Qfrac(A) _Q14frac(A) +#endif +#if GLOBAL_Q == 13 +#define _Qfrac(A) _Q13frac(A) +#endif +#if GLOBAL_Q == 12 +#define _Qfrac(A) _Q12frac(A) +#endif +#if GLOBAL_Q == 11 +#define _Qfrac(A) _Q11frac(A) +#endif +#if GLOBAL_Q == 10 +#define _Qfrac(A) _Q10frac(A) +#endif +#if GLOBAL_Q == 9 +#define _Qfrac(A) _Q9frac(A) +#endif +#if GLOBAL_Q == 8 +#define _Qfrac(A) _Q8frac(A) +#endif +#if GLOBAL_Q == 7 +#define _Qfrac(A) _Q7frac(A) +#endif +#if GLOBAL_Q == 6 +#define _Qfrac(A) _Q6frac(A) +#endif +#if GLOBAL_Q == 5 +#define _Qfrac(A) _Q5frac(A) +#endif +#if GLOBAL_Q == 4 +#define _Qfrac(A) _Q4frac(A) +#endif +#if GLOBAL_Q == 3 +#define _Qfrac(A) _Q3frac(A) +#endif +#if GLOBAL_Q == 2 +#define _Qfrac(A) _Q2frac(A) +#endif +#if GLOBAL_Q == 1 +#define _Qfrac(A) _Q1frac(A) +#endif + +//***************************************************************************** +// +// Multiplies two Q numbers in the specified iQ formats, returning the result +// in another Q format. +// +//***************************************************************************** +extern int16_t _Q15mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q14mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q13mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q12mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q11mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q10mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q9mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q8mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q7mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q6mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q5mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q4mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q3mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q2mpyQX(int16_t A, int n1, int16_t B, int n2); +extern int16_t _Q1mpyQX(int16_t A, int n1, int16_t B, int n2); + +#if GLOBAL_Q == 15 +#define _QmpyQX(A, n1, B, n2) _Q15mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 14 +#define _QmpyQX(A, n1, B, n2) _Q14mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 13 +#define _QmpyQX(A, n1, B, n2) _Q13mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 12 +#define _QmpyQX(A, n1, B, n2) _Q12mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 11 +#define _QmpyQX(A, n1, B, n2) _Q11mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 10 +#define _QmpyQX(A, n1, B, n2) _Q10mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 9 +#define _QmpyQX(A, n1, B, n2) _Q9mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 8 +#define _QmpyQX(A, n1, B, n2) _Q8mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 7 +#define _QmpyQX(A, n1, B, n2) _Q7mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 6 +#define _QmpyQX(A, n1, B, n2) _Q6mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 5 +#define _QmpyQX(A, n1, B, n2) _Q5mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 4 +#define _QmpyQX(A, n1, B, n2) _Q4mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 3 +#define _QmpyQX(A, n1, B, n2) _Q3mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 2 +#define _QmpyQX(A, n1, B, n2) _Q2mpyQX(A, n1, B, n2) +#endif +#if GLOBAL_Q == 1 +#define _QmpyQX(A, n1, B, n2) _Q1mpyQX(A, n1, B, n2) +#endif + + +//***************************************************************************** +// +// Multiplies a Q number by an integer. +// +//***************************************************************************** +#define _Q15mpyI16(A, B) ((A) * (B)) +#define _Q14mpyI16(A, B) ((A) * (B)) +#define _Q13mpyI16(A, B) ((A) * (B)) +#define _Q12mpyI16(A, B) ((A) * (B)) +#define _Q11mpyI16(A, B) ((A) * (B)) +#define _Q10mpyI16(A, B) ((A) * (B)) +#define _Q9mpyI16(A, B) ((A) * (B)) +#define _Q8mpyI16(A, B) ((A) * (B)) +#define _Q7mpyI16(A, B) ((A) * (B)) +#define _Q6mpyI16(A, B) ((A) * (B)) +#define _Q5mpyI16(A, B) ((A) * (B)) +#define _Q4mpyI16(A, B) ((A) * (B)) +#define _Q3mpyI16(A, B) ((A) * (B)) +#define _Q2mpyI16(A, B) ((A) * (B)) +#define _Q1mpyI16(A, B) ((A) * (B)) +#define _QmpyI16(A, B) ((A) * (B)) + +//***************************************************************************** +// +// Multiplies a Q number by an integer, and returns the integer portion. +// +//***************************************************************************** +#define _Q15mpyI16int(A, B) _Q15int(_Q15mpyI16(A, B)) +#define _Q14mpyI16int(A, B) _Q14int(_Q14mpyI16(A, B)) +#define _Q13mpyI16int(A, B) _Q13int(_Q13mpyI16(A, B)) +#define _Q12mpyI16int(A, B) _Q12int(_Q12mpyI16(A, B)) +#define _Q11mpyI16int(A, B) _Q11int(_Q11mpyI16(A, B)) +#define _Q10mpyI16int(A, B) _Q10int(_Q10mpyI16(A, B)) +#define _Q9mpyI16int(A, B) _Q9int(_Q9mpyI16(A, B)) +#define _Q8mpyI16int(A, B) _Q8int(_Q8mpyI16(A, B)) +#define _Q7mpyI16int(A, B) _Q7int(_Q7mpyI16(A, B)) +#define _Q6mpyI16int(A, B) _Q6int(_Q6mpyI16(A, B)) +#define _Q5mpyI16int(A, B) _Q5int(_Q5mpyI16(A, B)) +#define _Q4mpyI16int(A, B) _Q4int(_Q4mpyI16(A, B)) +#define _Q3mpyI16int(A, B) _Q3int(_Q3mpyI16(A, B)) +#define _Q2mpyI16int(A, B) _Q2int(_Q2mpyI16(A, B)) +#define _Q1mpyI16int(A, B) _Q1int(_Q1mpyI16(A, B)) + +#if GLOBAL_Q == 15 +#define _QmpyI16int(A, B) _Q15mpyI16int(A, B) +#endif +#if GLOBAL_Q == 14 +#define _QmpyI16int(A, B) _Q14mpyI16int(A, B) +#endif +#if GLOBAL_Q == 13 +#define _QmpyI16int(A, B) _Q13mpyI16int(A, B) +#endif +#if GLOBAL_Q == 12 +#define _QmpyI16int(A, B) _Q12mpyI16int(A, B) +#endif +#if GLOBAL_Q == 11 +#define _QmpyI16int(A, B) _Q11mpyI16int(A, B) +#endif +#if GLOBAL_Q == 10 +#define _QmpyI16int(A, B) _Q10mpyI16int(A, B) +#endif +#if GLOBAL_Q == 9 +#define _QmpyI16int(A, B) _Q9mpyI16int(A, B) +#endif +#if GLOBAL_Q == 8 +#define _QmpyI16int(A, B) _Q8mpyI16int(A, B) +#endif +#if GLOBAL_Q == 7 +#define _QmpyI16int(A, B) _Q7mpyI16int(A, B) +#endif +#if GLOBAL_Q == 6 +#define _QmpyI16int(A, B) _Q6mpyI16int(A, B) +#endif +#if GLOBAL_Q == 5 +#define _QmpyI16int(A, B) _Q5mpyI16int(A, B) +#endif +#if GLOBAL_Q == 4 +#define _QmpyI16int(A, B) _Q4mpyI16int(A, B) +#endif +#if GLOBAL_Q == 3 +#define _QmpyI16int(A, B) _Q3mpyI16int(A, B) +#endif +#if GLOBAL_Q == 2 +#define _QmpyI16int(A, B) _Q2mpyI16int(A, B) +#endif +#if GLOBAL_Q == 1 +#define _QmpyI16int(A, B) _Q1mpyI16int(A, B) +#endif + +//***************************************************************************** +// +// Multiplies a Q number by an integer, and returns the fractional portion. +// +//***************************************************************************** +#define _Q15mpyI16frac(A, B) _Q15frac(_Q15mpyI16(A, B)) +#define _Q14mpyI16frac(A, B) _Q14frac(_Q14mpyI16(A, B)) +#define _Q13mpyI16frac(A, B) _Q13frac(_Q13mpyI16(A, B)) +#define _Q12mpyI16frac(A, B) _Q12frac(_Q12mpyI16(A, B)) +#define _Q11mpyI16frac(A, B) _Q11frac(_Q11mpyI16(A, B)) +#define _Q10mpyI16frac(A, B) _Q10frac(_Q10mpyI16(A, B)) +#define _Q9mpyI16frac(A, B) _Q9frac(_Q9mpyI16(A, B)) +#define _Q8mpyI16frac(A, B) _Q8frac(_Q8mpyI16(A, B)) +#define _Q7mpyI16frac(A, B) _Q7frac(_Q7mpyI16(A, B)) +#define _Q6mpyI16frac(A, B) _Q6frac(_Q6mpyI16(A, B)) +#define _Q5mpyI16frac(A, B) _Q5frac(_Q5mpyI16(A, B)) +#define _Q4mpyI16frac(A, B) _Q4frac(_Q4mpyI16(A, B)) +#define _Q3mpyI16frac(A, B) _Q3frac(_Q3mpyI16(A, B)) +#define _Q2mpyI16frac(A, B) _Q2frac(_Q2mpyI16(A, B)) +#define _Q1mpyI16frac(A, B) _Q1frac(_Q1mpyI16(A, B)) + +#if GLOBAL_Q == 15 +#define _QmpyI16frac(A, B) _Q15mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 14 +#define _QmpyI16frac(A, B) _Q14mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 13 +#define _QmpyI16frac(A, B) _Q13mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 12 +#define _QmpyI16frac(A, B) _Q12mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 11 +#define _QmpyI16frac(A, B) _Q11mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 10 +#define _QmpyI16frac(A, B) _Q10mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 9 +#define _QmpyI16frac(A, B) _Q9mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 8 +#define _QmpyI16frac(A, B) _Q8mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 7 +#define _QmpyI16frac(A, B) _Q7mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 6 +#define _QmpyI16frac(A, B) _Q6mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 5 +#define _QmpyI16frac(A, B) _Q5mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 4 +#define _QmpyI16frac(A, B) _Q4mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 3 +#define _QmpyI16frac(A, B) _Q3mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 2 +#define _QmpyI16frac(A, B) _Q2mpyI16frac(A, B) +#endif +#if GLOBAL_Q == 1 +#define _QmpyI16frac(A, B) _Q1mpyI16frac(A, B) +#endif + +//***************************************************************************** +// +// Computes the square root of A^2 + B^2 using Q numbers. +// +//***************************************************************************** +extern int16_t _Qmag(int16_t A, int16_t B); +#define _Q15mag(A, B) _Qmag(A, B) +#define _Q14mag(A, B) _Qmag(A, B) +#define _Q13mag(A, B) _Qmag(A, B) +#define _Q12mag(A, B) _Qmag(A, B) +#define _Q11mag(A, B) _Qmag(A, B) +#define _Q10mag(A, B) _Qmag(A, B) +#define _Q9mag(A, B) _Qmag(A, B) +#define _Q8mag(A, B) _Qmag(A, B) +#define _Q7mag(A, B) _Qmag(A, B) +#define _Q6mag(A, B) _Qmag(A, B) +#define _Q5mag(A, B) _Qmag(A, B) +#define _Q4mag(A, B) _Qmag(A, B) +#define _Q3mag(A, B) _Qmag(A, B) +#define _Q2mag(A, B) _Qmag(A, B) +#define _Q1mag(A, B) _Qmag(A, B) + +//***************************************************************************** +// +// Computes the inverse square root of A^2 + B^2 using Q numbers. +// +//***************************************************************************** +extern _q15 _Q15imag(_q15 A, _q15 B); +extern _q14 _Q14imag(_q14 A, _q14 B); +extern _q13 _Q13imag(_q13 A, _q13 B); +extern _q12 _Q12imag(_q12 A, _q12 B); +extern _q11 _Q11imag(_q11 A, _q11 B); +extern _q10 _Q10imag(_q10 A, _q10 B); +extern _q9 _Q9imag(_q9 A, _q9 B); +extern _q8 _Q8imag(_q8 A, _q8 B); +extern _q7 _Q7imag(_q7 A, _q7 B); +extern _q6 _Q6imag(_q6 A, _q6 B); +extern _q5 _Q5imag(_q5 A, _q5 B); +extern _q4 _Q4imag(_q4 A, _q4 B); +extern _q3 _Q3imag(_q3 A, _q3 B); +extern _q2 _Q2imag(_q2 A, _q2 B); +extern _q1 _Q1imag(_q1 A, _q1 B); + +#if GLOBAL_Q == 15 +#define _Qimag(A, B) _Q15imag(A, B) +#endif +#if GLOBAL_Q == 14 +#define _Qimag(A, B) _Q14imag(A, B) +#endif +#if GLOBAL_Q == 13 +#define _Qimag(A, B) _Q13imag(A, B) +#endif +#if GLOBAL_Q == 12 +#define _Qimag(A, B) _Q12imag(A, B) +#endif +#if GLOBAL_Q == 11 +#define _Qimag(A, B) _Q11imag(A, B) +#endif +#if GLOBAL_Q == 10 +#define _Qimag(A, B) _Q10imag(A, B) +#endif +#if GLOBAL_Q == 9 +#define _Qimag(A, B) _Q9imag(A, B) +#endif +#if GLOBAL_Q == 8 +#define _Qimag(A, B) _Q8imag(A, B) +#endif +#if GLOBAL_Q == 7 +#define _Qimag(A, B) _Q7imag(A, B) +#endif +#if GLOBAL_Q == 6 +#define _Qimag(A, B) _Q6imag(A, B) +#endif +#if GLOBAL_Q == 5 +#define _Qimag(A, B) _Q5imag(A, B) +#endif +#if GLOBAL_Q == 4 +#define _Qimag(A, B) _Q4imag(A, B) +#endif +#if GLOBAL_Q == 3 +#define _Qimag(A, B) _Q3imag(A, B) +#endif +#if GLOBAL_Q == 2 +#define _Qimag(A, B) _Q2imag(A, B) +#endif +#if GLOBAL_Q == 1 +#define _Qimag(A, B) _Q1imag(A, B) +#endif + +//***************************************************************************** +// +// Converts a string into an Q number. +// +//***************************************************************************** +extern _q15 _atoQ15(const char *A); +extern _q14 _atoQ14(const char *A); +extern _q13 _atoQ13(const char *A); +extern _q12 _atoQ12(const char *A); +extern _q11 _atoQ11(const char *A); +extern _q10 _atoQ10(const char *A); +extern _q9 _atoQ9(const char *A); +extern _q8 _atoQ8(const char *A); +extern _q7 _atoQ7(const char *A); +extern _q6 _atoQ6(const char *A); +extern _q5 _atoQ5(const char *A); +extern _q4 _atoQ4(const char *A); +extern _q3 _atoQ3(const char *A); +extern _q2 _atoQ2(const char *A); +extern _q1 _atoQ1(const char *A); + +#if GLOBAL_Q == 15 +#define _atoQ(A) _atoQ15(A) +#endif +#if GLOBAL_Q == 14 +#define _atoQ(A) _atoQ14(A) +#endif +#if GLOBAL_Q == 13 +#define _atoQ(A) _atoQ13(A) +#endif +#if GLOBAL_Q == 12 +#define _atoQ(A) _atoQ12(A) +#endif +#if GLOBAL_Q == 11 +#define _atoQ(A) _atoQ11(A) +#endif +#if GLOBAL_Q == 10 +#define _atoQ(A) _atoQ10(A) +#endif +#if GLOBAL_Q == 9 +#define _atoQ(A) _atoQ9(A) +#endif +#if GLOBAL_Q == 8 +#define _atoQ(A) _atoQ8(A) +#endif +#if GLOBAL_Q == 7 +#define _atoQ(A) _atoQ7(A) +#endif +#if GLOBAL_Q == 6 +#define _atoQ(A) _atoQ6(A) +#endif +#if GLOBAL_Q == 5 +#define _atoQ(A) _atoQ5(A) +#endif +#if GLOBAL_Q == 4 +#define _atoQ(A) _atoQ4(A) +#endif +#if GLOBAL_Q == 3 +#define _atoQ(A) _atoQ3(A) +#endif +#if GLOBAL_Q == 2 +#define _atoQ(A) _atoQ2(A) +#endif +#if GLOBAL_Q == 1 +#define _atoQ(A) _atoQ1(A) +#endif + +//***************************************************************************** +// +// Converts an Q number into a string. +// +//***************************************************************************** +extern int16_t _Q15toa(char *string, const char *format, _q15 input); +extern int16_t _Q14toa(char *string, const char *format, _q14 input); +extern int16_t _Q13toa(char *string, const char *format, _q13 input); +extern int16_t _Q12toa(char *string, const char *format, _q12 input); +extern int16_t _Q11toa(char *string, const char *format, _q11 input); +extern int16_t _Q10toa(char *string, const char *format, _q10 input); +extern int16_t _Q9toa(char *string, const char *format, _q9 input); +extern int16_t _Q8toa(char *string, const char *format, _q8 input); +extern int16_t _Q7toa(char *string, const char *format, _q7 input); +extern int16_t _Q6toa(char *string, const char *format, _q6 input); +extern int16_t _Q5toa(char *string, const char *format, _q5 input); +extern int16_t _Q4toa(char *string, const char *format, _q4 input); +extern int16_t _Q3toa(char *string, const char *format, _q3 input); +extern int16_t _Q2toa(char *string, const char *format, _q2 input); +extern int16_t _Q1toa(char *string, const char *format, _q1 input); + +#if GLOBAL_Q == 15 +#define _Qtoa(A, B, C) _Q15toa(A, B, C) +#endif +#if GLOBAL_Q == 14 +#define _Qtoa(A, B, C) _Q14toa(A, B, C) +#endif +#if GLOBAL_Q == 13 +#define _Qtoa(A, B, C) _Q13toa(A, B, C) +#endif +#if GLOBAL_Q == 12 +#define _Qtoa(A, B, C) _Q12toa(A, B, C) +#endif +#if GLOBAL_Q == 11 +#define _Qtoa(A, B, C) _Q11toa(A, B, C) +#endif +#if GLOBAL_Q == 10 +#define _Qtoa(A, B, C) _Q10toa(A, B, C) +#endif +#if GLOBAL_Q == 9 +#define _Qtoa(A, B, C) _Q9toa(A, B, C) +#endif +#if GLOBAL_Q == 8 +#define _Qtoa(A, B, C) _Q8toa(A, B, C) +#endif +#if GLOBAL_Q == 7 +#define _Qtoa(A, B, C) _Q7toa(A, B, C) +#endif +#if GLOBAL_Q == 6 +#define _Qtoa(A, B, C) _Q6toa(A, B, C) +#endif +#if GLOBAL_Q == 5 +#define _Qtoa(A, B, C) _Q5toa(A, B, C) +#endif +#if GLOBAL_Q == 4 +#define _Qtoa(A, B, C) _Q4toa(A, B, C) +#endif +#if GLOBAL_Q == 3 +#define _Qtoa(A, B, C) _Q3toa(A, B, C) +#endif +#if GLOBAL_Q == 2 +#define _Qtoa(A, B, C) _Q2toa(A, B, C) +#endif +#if GLOBAL_Q == 1 +#define _Qtoa(A, B, C) _Q1toa(A, B, C) +#endif + +//***************************************************************************** +// +// Computes the absolute value of an Q number. +// +//***************************************************************************** +#define _Q15abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q14abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q13abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q12abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q11abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q10abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q9abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q8abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q7abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q6abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q5abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q4abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q3abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q2abs(A) (((A) < 0) ? - (A) : (A)) +#define _Q1abs(A) (((A) < 0) ? - (A) : (A)) +#define _Qabs(A) (((A) < 0) ? - (A) : (A)) + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __QMATHLIB_H__ diff --git a/README.html b/README.html new file mode 100755 index 0000000..bc4e49c --- /dev/null +++ b/README.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + +
+
+ +
+ +
+
+

+

Table of Contents

+ +
+

gc_simple_json

+
+

Example Summary

+

This example demonstrates basic usage of how to send data using JSON formatted strings. In addition, it showcases how to connect target objects with GUI widgets. For details about the architecture of the example or about implementation, please view the User’s Guide.

+

Example Usage

+
    +
  • Please read the Quick Start Guide on how to flash your LaunchPad with the code example, and how to import the provided GUI zip into GUI Composer.

  • +
  • This example uses the MSP430_SimpleGUI_JSON.zip GUI. This can be found: +
  • +
  • Run the example and the GUI.

  • +
+

The demo should start running with the following functionality:

+
    +
  • “Counters” plot shows an 8-bit, 16-bits and 32-bits counters

    + +
      +
    • The 8-bit counter corresponds to variable u8Counter and it’s bound to JSON token “c1”. It increments by 50 when switch S1 is pressed.
    • +
    • The 16-bit counter corresponds to variable u16Counter and it’s bound to JSON token “c2”. It increments by 5,000 when switch S2 is pressed.
    • +
    • The 32-bit counter corresponds to variable u32Counter and it’s bound to JSON token “c3”. It increments by 10,000 periodically on TB0 interrupt
    • +
  • +
  • The gauge shows a floating point number, which in this case is sent as fractional (QMath/IQMath)

    + +
      +
    • The counter corresponds to variable qCounter and it’s bound to JSON token “c4”. It increments by qIncrement on TB0 interrupt and only when bEnableSwitch==true.
    • +
  • +
  • The increment for the gauge is set by the horizontal slider

    + +
      +
    • The increments corresponds to variable qIncrement and it’s bound to JSON token “u16Data”. The value is sent by the GUI to the device when the slider changes.
    • +
  • +
  • The “Enable Float” switch enables incrementing the gauge increments

    + +
      +
    • The switch corresponds to variable bEnableSwitch and it’s bound to JSON token “bEnable”. The switch is sent by the GUI to the device when the value changes.
    • +
  • +
+

Notes:

+
    +
  • This example does not implement push-button debounce, so you might see multiple increments when pressing the button.
  • +
  • The increments (50, 5000, 10000) are only meant to show the difference between variable type sizes.
  • +
  • The example is sending ALL variables every time it wakes up due to button press or timer interrupt.
  • +
  • It’s recommended to keep the JSON tokens short, especially when sending them often. Longer tokens will result in longer transmission times.
  • +
+

Additional Information

+

For more information on modifying the GUI and serial communication, please view the GUI Composer User’s Guide.

+ +
+ + + diff --git a/callbacks_JSON.c b/callbacks_JSON.c new file mode 100755 index 0000000..8f86595 --- /dev/null +++ b/callbacks_JSON.c @@ -0,0 +1,64 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2020, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// callbacks_JSON.c +// +// Application level callbacks using JSON +// Texas Instruments, Inc. + +#include + +static bool getBoolFromString(char * string); + +// ***** Application Callback Functions to Process data ***** +void GUICallback_boolEnable(char * string) +{ + // Example to receive a boolean + bEnableSwitch = getBoolFromString(string); +} + +void GUICallback_QMathData(char * string) +{ + qIncrement = strtol(string, NULL, 10); +} + +static bool getBoolFromString(char * string) +{ + if (strncmp(string, "true", 4) == 0) + { + return true; + } + else + { + return false; + } +} diff --git a/include/Config_Common.h b/include/Config_Common.h new file mode 100755 index 0000000..b619e18 --- /dev/null +++ b/include/Config_Common.h @@ -0,0 +1,71 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// Config_Common.h +// +// Configuration definitions +// Texas Instruments, Inc. +#ifndef __CONFIG_COMMON_H__ +#define __CONFIG_COMMON_H__ + +#include +#include +#include + +#if defined(__TI_COMPILER_VERSION__) +#define __persistent +#define __no_init +#elif defined (__IAR_SYSTEMS_ICC__) +#else +#error Compiler not supported! +#endif + +//! \brief CPU Active Frequency in Hz. +//! +#define CPU_FREQ_HZ (8000000) +//! \brief CPU Active Frequency in MHz. +//! +#define CPU_FREQ_MHZ (CPU_FREQ_HZ/1000000) +//! \brief High Speed Bus Frequency in Hz. +//! Used by High Speed peripherals such as UART. +//! +#define HSBUS_FREQ_HZ (8000000) +//! \brief High Speed Bus Frequency in MHz. +//! Used by High Speed peripherals such as UART. +//! +#define HSBUS_FREQ_MHZ (HSBUS_FREQ_HZ/1000000) +//! \brief Low Speed Bus Frequency in Hz. +//! Used by Low Speed peripherals such as LPM timers. +//! +#define LSBUS_FREQ_HZ (32768) + +#endif //__CONFIG_COMMON_H__ diff --git a/include/GUI_JSON.h b/include/GUI_JSON.h new file mode 100755 index 0000000..3f22d1e --- /dev/null +++ b/include/GUI_JSON.h @@ -0,0 +1,112 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// GUI Interface +// +// API to send and receive data from GUI using GUI Composer +// Texas Instruments, Inc. +// ****************************************************************************** + +#ifndef __GUI_H__ +#define __GUI_H__ +#include +#include +#include +#include +#include + +//! \brief Maximum string for RX +#ifndef MAX_STR_LEN +#define MAX_STR_LEN 64 +#endif + +//! \brief Enable GUI Reception of commands +#define GUI_RXCMD_ENABLE (1) + +#if (GUI_RXCMD_ENABLE) +//! \brief Callback for RX Commands (called when command is received from GUI) +typedef void (*tGUI_RxCmdCallback)(char *); + +//! \brief Structure for RX commands. +typedef struct +{ + //!< RX Command (received from GUI) + char *stringCMD; + //!< Function executed if command is detected. + tGUI_RxCmdCallback callback; +} tGUI_RxCmd; +#endif + +//! \brief Structure for TX commands. +typedef struct +{ + //!< TX Command including sprintf formatting. + char *formattingStringCMD; + //!< Parameter sent with TX command. + void **param; +} tGUI_TxCmd; + +//! \brief Initializes the GUI communication and protocol. +//! +//! \return none +extern void GUI_Init(void); + +#if (GUI_RXCMD_ENABLE) +//! \brief Initializes structure to receive and process commands +//! +//! \param[in] RxCmdArray is a pointer to the array of RX Commands. +//! These commands will execute a callback function when received. +//! \param[in] size is the size of RxCmdArray. +//! +//! \return none +extern void GUI_InitRxCmd(const tGUI_RxCmd *RxCmdArray, + uint16_t size); +#endif + +//! \brief Transmits an array of TX commands. +//! +//! \param[in] TXACmdrray is a pointer to the array of TX commands. +//! These commands will be sent with corresponding formatted data. +//! \param[in] size is the size of TxCmdArray. +//! +//! \return none +extern void GUI_TransmitData(const tGUI_TxCmd *TXCmdrray, + uint16_t size); + +//! \brief Transmits a string to GUI. +//! +//! \param[in] str is the string to be sent. +//! +//! \return none +extern void GUI_TransmitStringBlocking(char *str); + +#endif // __GUI_H__ diff --git a/include/callbacks_JSON.h b/include/callbacks_JSON.h new file mode 100755 index 0000000..72be882 --- /dev/null +++ b/include/callbacks_JSON.h @@ -0,0 +1,58 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2020, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// callbacks_JSON.h +// +// Application level callbacks using JSON +// Texas Instruments, Inc. + +#include +#include +#include +#include +#include +#include +#include + + +#ifndef INCLUDE_CALLBACKS_H_ +#define INCLUDE_CALLBACKS_H_ + +// Global variables for the callbacks +volatile bool bEnableSwitch; +volatile _q qIncrement; + +// Functions to receive data from GUI +extern void GUICallback_QMathData(char * string); +extern void GUICallback_boolEnable(char * string); + +#endif /* INCLUDE_CALLBACKS_H_ */ diff --git a/lnk_msp430fr2355.cmd b/lnk_msp430fr2355.cmd new file mode 100644 index 0000000..d27b01b --- /dev/null +++ b/lnk_msp430fr2355.cmd @@ -0,0 +1,250 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2021 Texas Instruments Incorporated - http://www.ti.com/ +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 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. +* +* Neither the name of Texas Instruments Incorporated nor the names of +* its contributors may 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 +* OWNER 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. +* +* Default linker command file for Texas Instruments MSP430FR2355 +* +*****************************************************************************/ + +/******************************************************************************/ +/* */ +/* Usage: lnk430 -o -m lnk.cmd */ +/* cl430 -z -o -m lnk.cmd */ +/* */ +/*----------------------------------------------------------------------------*/ +/* These linker options are for command line linking only. For IDE linking, */ +/* you should set your linker options in Project Properties */ +/* -c LINK USING C CONVENTIONS */ +/* -stack 0x0100 SOFTWARE STACK SIZE */ +/* -heap 0x0100 HEAP AREA SIZE */ +/* */ +/*----------------------------------------------------------------------------*/ +/* 1.213 */ +/*----------------------------------------------------------------------------*/ + +/****************************************************************************/ +/* SPECIFY THE SYSTEM MEMORY MAP */ +/****************************************************************************/ + +MEMORY +{ + TINYRAM : origin = 0x6, length = 0x1A + BSL0 : origin = 0x1000, length = 0x800 + INFO : origin = 0x1800, length = 0x200 + TLVMEM : origin = 0x1A00, length = 0x200 + BOOTCODE : origin = 0x1C00, length = 0x400 + RAM : origin = 0x2000, length = 0x1000 + FRAM : origin = 0x8000, length = 0x7F80 + ROMLIB : origin = 0xFAC00, length = 0x5000 + BSL1 : origin = 0xFFC00, length = 0x400 + JTAGSIGNATURE : origin = 0xFF80, length = 0x0004, fill = 0xFFFF + BSLSIGNATURE : origin = 0xFF84, length = 0x0004, fill = 0xFFFF + BSLCONFIGURATIONSIGNATURE: origin = 0xFF88, length = 0x0002, fill = 0xFFFF + BSLCONFIGURATION : origin = 0xFF8A, length = 0x0002, fill = 0xFFFF + BSLI2CADDRESS : origin = 0xFFA0, length = 0x0002, fill = 0xFFFF + INT00 : origin = 0xFFA2, length = 0x0002 + INT01 : origin = 0xFFA4, length = 0x0002 + INT02 : origin = 0xFFA6, length = 0x0002 + INT03 : origin = 0xFFA8, length = 0x0002 + INT04 : origin = 0xFFAA, length = 0x0002 + INT05 : origin = 0xFFAC, length = 0x0002 + INT06 : origin = 0xFFAE, length = 0x0002 + INT07 : origin = 0xFFB0, length = 0x0002 + INT08 : origin = 0xFFB2, length = 0x0002 + INT09 : origin = 0xFFB4, length = 0x0002 + INT10 : origin = 0xFFB6, length = 0x0002 + INT11 : origin = 0xFFB8, length = 0x0002 + INT12 : origin = 0xFFBA, length = 0x0002 + INT13 : origin = 0xFFBC, length = 0x0002 + INT14 : origin = 0xFFBE, length = 0x0002 + INT15 : origin = 0xFFC0, length = 0x0002 + INT16 : origin = 0xFFC2, length = 0x0002 + INT17 : origin = 0xFFC4, length = 0x0002 + INT18 : origin = 0xFFC6, length = 0x0002 + INT19 : origin = 0xFFC8, length = 0x0002 + INT20 : origin = 0xFFCA, length = 0x0002 + INT21 : origin = 0xFFCC, length = 0x0002 + INT22 : origin = 0xFFCE, length = 0x0002 + INT23 : origin = 0xFFD0, length = 0x0002 + INT24 : origin = 0xFFD2, length = 0x0002 + INT25 : origin = 0xFFD4, length = 0x0002 + INT26 : origin = 0xFFD6, length = 0x0002 + INT27 : origin = 0xFFD8, length = 0x0002 + INT28 : origin = 0xFFDA, length = 0x0002 + INT29 : origin = 0xFFDC, length = 0x0002 + INT30 : origin = 0xFFDE, length = 0x0002 + INT31 : origin = 0xFFE0, length = 0x0002 + INT32 : origin = 0xFFE2, length = 0x0002 + INT33 : origin = 0xFFE4, length = 0x0002 + INT34 : origin = 0xFFE6, length = 0x0002 + INT35 : origin = 0xFFE8, length = 0x0002 + INT36 : origin = 0xFFEA, length = 0x0002 + INT37 : origin = 0xFFEC, length = 0x0002 + INT38 : origin = 0xFFEE, length = 0x0002 + INT39 : origin = 0xFFF0, length = 0x0002 + INT40 : origin = 0xFFF2, length = 0x0002 + INT41 : origin = 0xFFF4, length = 0x0002 + INT42 : origin = 0xFFF6, length = 0x0002 + INT43 : origin = 0xFFF8, length = 0x0002 + INT44 : origin = 0xFFFA, length = 0x0002 + INT45 : origin = 0xFFFC, length = 0x0002 + RESET : origin = 0xFFFE, length = 0x0002 +} + +/****************************************************************************/ +/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */ +/****************************************************************************/ + +SECTIONS +{ + GROUP(ALL_FRAM) + { + GROUP(READ_WRITE_MEMORY) + { + .TI.persistent : {} /* For #pragma persistent */ + .cio : {} /* C I/O Buffer */ + .sysmem : {} /* Dynamic memory allocation area */ + } PALIGN(0x0400), RUN_START(fram_rw_start) RUN_END(fram_rx_start) + + GROUP(READ_ONLY_MEMORY) + { + .cinit : {} /* Initialization tables */ + .pinit : {} /* C++ constructor tables */ + .binit : {} /* Boot-time Initialization tables */ + .init_array : {} /* C++ constructor tables */ + .mspabi.exidx : {} /* C++ constructor tables */ + .mspabi.extab : {} /* C++ constructor tables */ + .const : {} /* Constant data */ + } + + GROUP(EXECUTABLE_MEMORY) + { + .text : {} /* Code */ + .text:_isr : {} /* Code ISRs */ + } + } > FRAM + + #ifdef __TI_COMPILER_VERSION__ + #if __TI_COMPILER_VERSION__ >= 15009000 + .TI.ramfunc : {} load=FRAM, run=RAM, table(BINIT) + #endif + #endif + + .jtagsignature : {} > JTAGSIGNATURE + .bslsignature : {} > BSLSIGNATURE + .bslconfigsignature : {} > BSLCONFIGURATIONSIGNATURE + .bslconfig : {} > BSLCONFIGURATION + .bsli2caddress : {} > BSLI2CADDRESS + + .bss : {} > RAM /* Global & static vars */ + .data : {} > RAM /* Global & static vars */ + .TI.noinit : {} > RAM /* For #pragma noinit */ + .stack : {} > RAM (HIGH) /* Software system stack */ + + .tinyram : {} > TINYRAM /* Tiny RAM */ + + /* MSP430 INFO memory segments */ + .info : type = NOINIT{} > INFO + + + /* MSP430 interrupt vectors */ + + .int00 : {} > INT00 + .int01 : {} > INT01 + .int02 : {} > INT02 + .int03 : {} > INT03 + .int04 : {} > INT04 + .int05 : {} > INT05 + .int06 : {} > INT06 + .int07 : {} > INT07 + .int08 : {} > INT08 + .int09 : {} > INT09 + .int10 : {} > INT10 + .int11 : {} > INT11 + .int12 : {} > INT12 + .int13 : {} > INT13 + .int14 : {} > INT14 + .int15 : {} > INT15 + .int16 : {} > INT16 + .int17 : {} > INT17 + .int18 : {} > INT18 + .int19 : {} > INT19 + .int20 : {} > INT20 + .int21 : {} > INT21 + PORT4 : { * ( .int22 ) } > INT22 type = VECT_INIT + PORT3 : { * ( .int23 ) } > INT23 type = VECT_INIT + PORT2 : { * ( .int24 ) } > INT24 type = VECT_INIT + PORT1 : { * ( .int25 ) } > INT25 type = VECT_INIT + SAC1_SAC3 : { * ( .int26 ) } > INT26 type = VECT_INIT + SAC0_SAC2 : { * ( .int27 ) } > INT27 type = VECT_INIT + ECOMP0_ECOMP1: { * ( .int28 ) } > INT28 type = VECT_INIT + ADC : { * ( .int29 ) } > INT29 type = VECT_INIT + EUSCI_B1 : { * ( .int30 ) } > INT30 type = VECT_INIT + EUSCI_B0 : { * ( .int31 ) } > INT31 type = VECT_INIT + EUSCI_A1 : { * ( .int32 ) } > INT32 type = VECT_INIT + EUSCI_A0 : { * ( .int33 ) } > INT33 type = VECT_INIT + WDT : { * ( .int34 ) } > INT34 type = VECT_INIT + RTC : { * ( .int35 ) } > INT35 type = VECT_INIT + TIMER3_B1 : { * ( .int36 ) } > INT36 type = VECT_INIT + TIMER3_B0 : { * ( .int37 ) } > INT37 type = VECT_INIT + TIMER2_B1 : { * ( .int38 ) } > INT38 type = VECT_INIT + TIMER2_B0 : { * ( .int39 ) } > INT39 type = VECT_INIT + TIMER1_B1 : { * ( .int40 ) } > INT40 type = VECT_INIT + TIMER1_B0 : { * ( .int41 ) } > INT41 type = VECT_INIT + TIMER0_B1 : { * ( .int42 ) } > INT42 type = VECT_INIT + TIMER0_B0 : { * ( .int43 ) } > INT43 type = VECT_INIT + UNMI : { * ( .int44 ) } > INT44 type = VECT_INIT + SYSNMI : { * ( .int45 ) } > INT45 type = VECT_INIT + .reset : {} > RESET /* MSP430 reset vector */ + +} +/****************************************************************************/ +/* FRAM WRITE PROTECTION SEGMENT DEFINITONS */ +/****************************************************************************/ + +#ifdef _FRWP_ENABLE + __mpu_enable=1; + start_protection_offset_address = (fram_rx_start - fram_rw_start) >> 10; + program_fram_protection = 0x1; + #ifdef _INFO_FRWP_ENABLE + info_fram_protection = 0x1; + #else + info_fram_protection = 0x0; + #endif +#endif + +/****************************************************************************/ +/* INCLUDE PERIPHERALS MEMORY MAP */ +/****************************************************************************/ + +-l msp430fr2355.cmd + + diff --git a/main.c b/main.c new file mode 100755 index 0000000..1c2d80e --- /dev/null +++ b/main.c @@ -0,0 +1,168 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2020, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// GUI Composer Simple JSON Demo using MSP430 +// +// Texas Instruments, Inc. +// ****************************************************************************** + +#include +#include +#include +#include +#include +#include +#include +#include + +// Q8 is used in this demo because the variable qCounter ranges 0.0-100.0 + +#define STR_LEN_TWO 2 +#define STR_LEN_SEVEN 7 + +// Global variable use to track the of state of GUI and counter values +volatile uint8_t u8Counter; +volatile uint16_t u16Counter; +volatile uint32_t u32Counter; +volatile _q qCounter; +volatile bool bUpdateGUI; + +//! \brief RX Command structure. +//! The corresponding callback will be called when the command is +//! received from GUI. +//! Note: shorter command names take less time to process +const tGUI_RxCmd GUI_RXCommands[] = +{ + {"bEnable", GUICallback_boolEnable}, + {"u16Data", GUICallback_QMathData}, +}; + +//! \brief Increments counters using MSP430 and sends data to GUI. +//! +//! \return none +void main(void) +{ + WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer + + // Initialize clock, GPIOs + HAL_System_Init(); + + // Initialize GUI layer + GUI_Init(); + GUI_InitRxCmd( &GUI_RXCommands[0], + (sizeof(GUI_RXCommands)/sizeof(GUI_RXCommands[0])) ); + + // Initialize variables + bUpdateGUI = false; // Update GUI first time + u8Counter = 50; // Counter8 will be updated on SW1 press in increments of 50 + u16Counter = 5000; // Counter16 will be updated on button press in increments of 5000 + u32Counter = 10000; // Counter32 will be updated on timer in increments of 10000 + bEnableSwitch = true; // Switch enables updating QMath + qCounter = _Q(0.5); // QMath counter updated on timer based on boolean in increments of qIncrement + qIncrement = _Q(0.5); + + // Configure SW1 and SW2 for interrupts (pins set as input with pull-up during GPIO initialization) + HAL_IO_InitButtons(); + + // Initialize a timer to update the counter + HAL_Timer_Init(); + + // Send default value of variables + GUIComm_sendUInt8("c1", STR_LEN_TWO, u8Counter); + GUIComm_sendUInt16("c2", STR_LEN_TWO, u16Counter); + GUIComm_sendUInt32("c3", STR_LEN_TWO, u32Counter); + GUIComm_sendInt16("c4", STR_LEN_TWO, (int16_t) qCounter); + GUIComm_sendInt16("u16Data", STR_LEN_SEVEN, (int16_t) qIncrement); + GUIComm_sendBool("bEnable", STR_LEN_SEVEN, bEnableSwitch); + + __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 w/interrupt + __enable_interrupt(); + + while (1) + { + while (bUpdateGUI == true) + { + GUIComm_sendUInt8("c1", STR_LEN_TWO, u8Counter); + GUIComm_sendUInt16("c2", STR_LEN_TWO, u16Counter); + GUIComm_sendUInt32("c3", STR_LEN_TWO, u32Counter); + if (bEnableSwitch == true) + { + GUIComm_sendInt16("c4", STR_LEN_TWO, (int16_t) qCounter); + } + + bUpdateGUI = false; + } + + __disable_interrupt(); + if (bUpdateGUI == false) + { + __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 w/interrupt + __no_operation(); // For debug + } + } +} + +//! \brief Function called by HAL when there is a periodic timer interrupt +//! +//! \return none +void TimerCallback(void) +{ + // Update 32-bit counter + u32Counter += 10000; + bUpdateGUI = true; + if (bEnableSwitch == true) + { + qCounter += qIncrement; + + if (qCounter > _Q(100.0)) + { + qCounter = 0; + } + } +} + +//! \brief Function called by HAL when SW1 is pressed +//! +//! \return none +void ButtonCallback_SW1(void) +{ + u8Counter += 50; +} + +//! \brief Function called by HAL when SW2 is pressed +//! +//! \return none +void ButtonCallback_SW2(void) +{ + u16Counter += 5000; +} + diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib.a b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib.a new file mode 100755 index 0000000..2df7a17 Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib.a differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_large_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_large_data.lib new file mode 100755 index 0000000..3f0d92c Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_large_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_restricted_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_restricted_data.lib new file mode 100755 index 0000000..7416cab Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_restricted_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_small_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_small_data.lib new file mode 100755 index 0000000..f226c10 Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_small_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_small_code_small_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_small_code_small_data.lib new file mode 100755 index 0000000..1f9934a Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/IQmathLib_CCS_MPY32_5xx_6xx_CPUX_small_code_small_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib.a b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib.a new file mode 100755 index 0000000..bde48fe Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib.a differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_large_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_large_data.lib new file mode 100755 index 0000000..0a195fb Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_large_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_restricted_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_restricted_data.lib new file mode 100755 index 0000000..0120b91 Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_restricted_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_small_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_small_data.lib new file mode 100755 index 0000000..1701a88 Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_large_code_small_data.lib differ diff --git a/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_small_code_small_data.lib b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_small_code_small_data.lib new file mode 100755 index 0000000..65b8467 Binary files /dev/null and b/src/IQMathLib/CCS/MPY32/5xx_6xx/QmathLib_CCS_MPY32_5xx_6xx_CPUX_small_code_small_data.lib differ diff --git a/src/MSP430_GUI/GUI_JSON.c b/src/MSP430_GUI/GUI_JSON.c new file mode 100755 index 0000000..92cf70a --- /dev/null +++ b/src/MSP430_GUI/GUI_JSON.c @@ -0,0 +1,201 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// GUI Interface +// +// API to send and receive data from GUI using JSON protocol +// +// Texas Instruments, Inc. + +#include +#include +#include "./jsmn/jsmn.h" + +/**** Local Variables *********************************************************/ +static char txString[MAX_STR_LEN]; // String to transmit data +#if (GUI_RXCMD_ENABLE) +static char rxString[MAX_STR_LEN]; // String to receive data +static jsmn_parser p; // parses JSON data +static jsmntok_t t[64]; // We expect no more than 64 tokens +static const tGUI_RxCmd *RxCmdsArray; // Pointer to array of + // RX commands +static uint16_t RxCmdsArraySize; // Size of RX commands +#endif + +/**** Local Function Prototypes************************************************/ +#if (GUI_RXCMD_ENABLE) +static bool GUI_ParseString(void); +static int jsoneq(const char *json, jsmntok_t *tok, const char *s); +#endif +static bool GUI_RxCharHALCallback(char data); + +/**** Functions ***************************************************************/ +void GUI_Init(void) +{ + HAL_GUI_Init(GUI_RxCharHALCallback); + RxCmdsArraySize= 0; + RxCmdsArray = NULL; +} + +#if (GUI_RXCMD_ENABLE) +void GUI_InitRxCmd(const tGUI_RxCmd *CommandArray, + uint16_t size) +{ + RxCmdsArray = CommandArray; + RxCmdsArraySize = size; +} +#endif + + +void GUI_TransmitStringBlocking(char *str) +{ + uint16_t i; + + for(i = 0; i < strlen(str); i++) + { + if (str[i] != 0) + { + HAL_GUI_TransmitCharBlocking(str[i]); + } + } +} + +void GUI_TransmitData(const tGUI_TxCmd *TXCmdrray, + uint16_t size) +{ + uint16_t i; + + for (i=0; i < size; i++) + { + sprintf(txString, TXCmdrray[i].formattingStringCMD, + *TXCmdrray[i].param); + GUI_TransmitStringBlocking(txString); + } +} + + +/**** Local Functions**********************************************************/ +//! \brief Callback function for GUI HAL. Called when byte is received. +//! +//! \param[in] data is the byte received from GUI Comm interface. +//! +//! \return true to wake-up MCU, false to stay in LPM +static bool GUI_RxCharHALCallback(char data) +{ +#if (GUI_RXCMD_ENABLE) + static bool rxInProgress = false; + static uint16_t charCnt = 0; + bool ret = false; + + if(!rxInProgress){ + if ((data != '\n') ){ + rxInProgress = true; + charCnt = 0; + rxString[charCnt] = data; + } + }else{ // in progress + charCnt++; + if((data != '\n')){ + if (charCnt >= MAX_STR_LEN){ + rxInProgress = false; + }else{ + rxString[charCnt] = data; + } + }else{ + rxInProgress = false; + rxString[charCnt] = '\0'; + // String receive complete + if (GUI_ParseString() == true) + { + ret = true; // wake-up MCU + } + } + } + return ret; +#else + return true; +#endif +} + +#if (GUI_RXCMD_ENABLE) +//! \brief Parses a string looking for JSON objects +//! +//! \return true to wake-up MCU when a command is received, false to stay in LPM +static bool GUI_ParseString(void) +{ + int i; + int r; + int j; + bool ret = false; + + jsmn_init(&p); + + r = jsmn_parse(&p, rxString, strlen(rxString), t, sizeof(t)/sizeof(t[0])); + + // Loop over keys of JSON object + if (RxCmdsArray != NULL) + { + for (i = 1; i < r; i++) { + for (j=0; j < RxCmdsArraySize; j++) + { + if (jsoneq(rxString, &t[i], RxCmdsArray[j].stringCMD) == 0) + { + if (RxCmdsArray[j].callback != NULL) + { + RxCmdsArray[j].callback(rxString+t[i+1].start); + } + i++; + ret = true; + } + } + } + } + + return ret; +} + + +//! \brief Compare JSON keys +//! +//! \param[in] json is the JSON string. +//! \param[in] tok is the JSON token. +//! \param[in] s is the string to check for equality. +//! +//! \return 0 if string found. -1 if not. +static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { + if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && + strncmp(json + tok->start, s, tok->end - tok->start) == 0) { + return 0; + } + return -1; +} +#endif diff --git a/src/MSP430_GUI/jsmn/jsmn.c b/src/MSP430_GUI/jsmn/jsmn.c new file mode 100755 index 0000000..1d540ba --- /dev/null +++ b/src/MSP430_GUI/jsmn/jsmn.c @@ -0,0 +1,335 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2010 Serge A. Zaitsev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * --/COPYRIGHT--*/ + +#include "jsmn.h" + +/** + * Allocates a fresh unused token from the token pull. + */ +static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, + jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *tok; + if (parser->toknext >= num_tokens) { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; +#ifdef JSMN_PARENT_LINKS + tok->parent = -1; +#endif + return tok; +} + +/** + * Fills token type and boundaries. + */ +static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, + int start, int end) { + token->type = type; + token->start = start; + token->end = end; + token->size = 0; +} + +/** + * Fills next available token with JSON primitive. + */ +static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, + size_t len, jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *token; + int start; + + start = parser->pos; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { +#ifndef JSMN_STRICT + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': +#endif + case '\t' : case '\r' : case '\n' : case ' ' : + case ',' : case ']' : case '}' : + goto found; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) { + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } +#ifdef JSMN_STRICT + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; +#endif + +found: + if (tokens == NULL) { + parser->pos--; + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; +} + +/** + * Fills next token with JSON string. + */ +static int jsmn_parse_string(jsmn_parser *parser, const char *js, + size_t len, jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *token; + + int start = parser->pos; + + parser->pos++; + + /* Skip starting quote */ + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c = js[parser->pos]; + + /* Quote: end of string */ + if (c == '\"') { + if (tokens == NULL) { + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) { + int i; + parser->pos++; + switch (js[parser->pos]) { + /* Allowed escaped symbols */ + case '\"': case '/' : case '\\' : case 'b' : + case 'f' : case 'r' : case 'n' : case 't' : + break; + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { + /* If it isn't a hex character we have an error */ + if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; + } + parser->pos--; + break; + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } + } + parser->pos = start; + return JSMN_ERROR_PART; +} + +/** + * Parse JSON string and fill tokens. + */ +int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens) { + int r; + int i; + jsmntok_t *token; + int count = parser->toknext; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c; + jsmntype_t type; + + c = js[parser->pos]; + switch (c) { + case '{': case '[': + count++; + if (tokens == NULL) { + break; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) + return JSMN_ERROR_NOMEM; + if (parser->toksuper != -1) { + tokens[parser->toksuper].size++; +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + break; + case '}': case ']': + if (tokens == NULL) + break; + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); +#ifdef JSMN_PARENT_LINKS + if (parser->toknext < 1) { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) { + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) { + if(token->type != type || parser->toksuper == -1) { + return JSMN_ERROR_INVAL; + } + break; + } + token = &tokens[token->parent]; + } +#else + for (i = parser->toknext - 1; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) return JSMN_ERROR_INVAL; + for (; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + parser->toksuper = i; + break; + } + } +#endif + break; + case '\"': + r = jsmn_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + case '\t' : case '\r' : case '\n' : case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && parser->toksuper != -1 && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) { +#ifdef JSMN_PARENT_LINKS + parser->toksuper = tokens[parser->toksuper].parent; +#else + for (i = parser->toknext - 1; i >= 0; i--) { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { + if (tokens[i].start != -1 && tokens[i].end == -1) { + parser->toksuper = i; + break; + } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': case '0': case '1' : case '2': case '3' : case '4': + case '5': case '6': case '7' : case '8': case '9': + case 't': case 'f': case 'n' : + /* And they must not be keys of the object */ + if (tokens != NULL && parser->toksuper != -1) { + jsmntok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) { + return JSMN_ERROR_INVAL; + } + } +#else + /* In non-strict mode every unquoted value is a primitive */ + default: +#endif + r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + +#ifdef JSMN_STRICT + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; +#endif + } + } + + if (tokens != NULL) { + for (i = parser->toknext - 1; i >= 0; i--) { + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) { + return JSMN_ERROR_PART; + } + } + } + + return count; +} + +/** + * Creates a new parser based over a given buffer with an array of tokens + * available. + */ +void jsmn_init(jsmn_parser *parser) { + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; +} diff --git a/src/MSP430_GUI/jsmn/jsmn.h b/src/MSP430_GUI/jsmn/jsmn.h new file mode 100755 index 0000000..5332e16 --- /dev/null +++ b/src/MSP430_GUI/jsmn/jsmn.h @@ -0,0 +1,98 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2010 Serge A. Zaitsev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * --/COPYRIGHT--*/ + +#ifndef __JSMN_H_ +#define __JSMN_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1, + JSMN_ARRAY = 2, + JSMN_STRING = 3, + JSMN_PRIMITIVE = 4 +} jsmntype_t; + +enum jsmnerr { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +}; + +/** + * JSON token description. + * type type (object, array, string etc.) + * start start position in JSON data string + * end end position in JSON data string + */ +typedef struct { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string + */ +typedef struct { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each describing + * a single JSON object. + */ +int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens); + +#ifdef __cplusplus +} +#endif + +#endif /* __JSMN_H_ */ diff --git a/src/MSP430_HAL/HAL_Config_Private.h b/src/MSP430_HAL/HAL_Config_Private.h new file mode 100755 index 0000000..a18f7df --- /dev/null +++ b/src/MSP430_HAL/HAL_Config_Private.h @@ -0,0 +1,84 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// MSP430 HAL Configuration +// +// Static and default configuration of Library +// Texas Instruments, Inc. +#ifndef __CONFIG_PRIVATE_H__ +#define __CONFIG_PRIVATE_H__ + +#include "Config_Common.h" + +//*********** GUI Communication ************************************************ +//! \brief baudrate of GUI Communication port +//! i.e. 19200 = 19,200bps +//! +#define HAL_GUICOMM_BAUDRATE (9600) + +//! \brief Select which eUSCI to use with UART +#define GUI_COMM_UART_EUSCI (1) + +#if (GUI_COMM_UART_EUSCI == 0) +#define UCAnBR0 (UCA0BR0) +#define UCAnBR1 (UCA0BR1) +#define UCAnCTLW0 (UCA0CTLW0) +#define UCAnIE (UCA0IE) +#define UCAnIFG (UCA0IFG) +#define UCAnIV (UCA0IV) +#define UCAnMCTLW (UCA0MCTLW) +#define UCAnSTATW (UCA0STATW) +#define UCAnTXBUF (UCA0TXBUF) +#define UCAnRXBUF (UCA0RXBUF) + +#define USCI_An_VECTOR (USCI_A0_VECTOR) +#define USCI_An_ISR (USCI_A0_ISR) +#elif (GUI_COMM_UART_EUSCI == 1) + +#define UCAnBR0 (UCA1BR0) +#define UCAnBR1 (UCA1BR1) +#define UCAnCTLW0 (UCA1CTLW0) +#define UCAnIE (UCA1IE) +#define UCAnIFG (UCA1IFG) +#define UCAnIV (UCA1IV) +#define UCAnMCTLW (UCA1MCTLW) +#define UCAnSTATW (UCA1STATW) +#define UCAnTXBUF (UCA1TXBUF) +#define UCAnRXBUF (UCA1RXBUF) + +#define USCI_An_VECTOR (USCI_A1_VECTOR) +#define USCI_An_ISR (USCI_A1_ISR) +#else +#error "eUSCI is not defined. Modify HAL layer" +#endif + +#endif //__CONFIG_PRIVATE_H__ diff --git a/src/MSP430_HAL/HAL_GUIComm_UART_FR235x.c b/src/MSP430_HAL/HAL_GUIComm_UART_FR235x.c new file mode 100755 index 0000000..83dca4d --- /dev/null +++ b/src/MSP430_HAL/HAL_GUIComm_UART_FR235x.c @@ -0,0 +1,145 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2020, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// GUI HAL for MSP430FR2xxx using UART +// +// Driver to send and receive data from GUI using FR2xxx UART +// Texas Instruments, Inc. +// ***************************************************************************** +#include "HAL_Config_Private.h" +#include "HAL.h" + +tGUICommRXCharCallback RxByteISRCallback; + +void HAL_GUI_Init(tGUICommRXCharCallback RxByteCallback) +{ + // Store callback for ISR RX Byte + RxByteISRCallback = RxByteCallback; + + // Configure UART for FR2xxx + UCAnCTLW0 |= UCSWRST; + UCAnCTLW0 |= UCSSEL__SMCLK; + +#if ((HAL_GUICOMM_BAUDRATE == 9600) && (HSBUS_FREQ_MHZ == 1)) + // Baud Rate calculation + // 1000000/(16*9600) = 6.51 + // Fractional portion = 0.51 + // User's Guide Table 17-4: UCBRSx = 0x20 + // UCBRFx = 8 + UCAnBR0 = 6; + UCAnBR1 = 0x00; + UCAnMCTLW = 0x2000 | UCOS16 | UCBRF_8; +#elif ((HAL_GUICOMM_BAUDRATE == 28800) && (HSBUS_FREQ_MHZ == 8)) + // Baud Rate calculation + // 8E6/(16*28800) = 17.36 + // Fractional portion = 0.36 + // From eUSCI Calculator: UCBRSx = 221 (0xDD) + // UCBRFx = 5 + UCAnBR0 = 17; + UCAnBR1 = 0x00; + UCAnMCTLW = (0xDD<<8) | UCOS16 | UCBRF_5; +#elif ((HAL_GUICOMM_BAUDRATE == 19200) && (HSBUS_FREQ_MHZ == 8)) + // Baud Rate calculation + // 8E6/(16*19200) = 26.04 + // Fractional portion = 0.04 + // User's Guide Table 17-4: UCBRSx = 0xB6 + // UCBRFx = 0 + UCAnBR0 = 26; + UCAnBR1 = 0x00; + UCAnMCTLW = (0xB6<<8) | UCOS16 | UCBRF_0; +#elif ((HAL_GUICOMM_BAUDRATE == 115200) && (HSBUS_FREQ_MHZ == 8)) + // Baud Rate calculation + // 8E6/(16*115200) = 4.34 + // Fractional portion = 0.34 + // User's Guide Table 22-5: UCBRSx = 0x55 + // UCBRFx = 5 + UCAnBR0 = 4; + UCAnBR1 = 0x00; + UCAnMCTLW = (0x55<<8) | UCOS16 | UCBRF_5; +#elif ((HAL_GUICOMM_BAUDRATE == 9600) && (HSBUS_FREQ_MHZ == 8)) + // Baud Rate calculation + // 8E6/(16*9600) = 52.0833 + // Fractional portion = 0.33 + // User's Guide Table 17-4: UCBRSx = 0x49 + // UCBRFx = 1 + UCAnBR0 = 52; + UCAnBR1 = 0x00; + UCAnMCTLW = (0x49<<8) | UCOS16 | UCBRF_1; +#else +#error "Define UART baudrate registers based on desired frequency" +#endif + + UCAnCTLW0 &= ~UCSWRST; // Initialize eUSCI + UCAnIE |= UCRXIE; +} + +void HAL_GUI_TransmitCharBlocking(char character) +{ + // Transmit Character + while (UCAnSTATW & UCBUSY) + ; + while (!(UCAnIFG & UCTXIFG)) + ; + UCAnTXBUF = character; + while (UCAnSTATW & UCBUSY) + ; +} + +// EUSCI interrupt service routine +#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) +#pragma vector=USCI_An_VECTOR +__interrupt void USCI_An_ISR(void) +#elif defined(__GNUC__) +void __attribute__ ((interrupt(USCI_An_VECTOR))) USCI_An_ISR (void) +#else +#error Compiler not supported! +#endif +{ + switch(__even_in_range(UCAnIV,USCI_UART_UCTXCPTIFG)) + { + case USCI_NONE: break; + case USCI_UART_UCRXIFG: + if (RxByteISRCallback != NULL) + { + if (RxByteISRCallback(UCAnRXBUF) == true) + { + __bic_SR_register_on_exit(LPM4_bits); // Exit LPM + } + } + break; + case USCI_UART_UCTXIFG: break; + case USCI_UART_UCSTTIFG: break; + case USCI_UART_UCTXCPTIFG: break; + default: break; + } +} + diff --git a/src/MSP430_HAL/HAL_IO_FR235x.c b/src/MSP430_HAL/HAL_IO_FR235x.c new file mode 100755 index 0000000..39aac17 --- /dev/null +++ b/src/MSP430_HAL/HAL_IO_FR235x.c @@ -0,0 +1,169 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// HAL IO functions +// +// Texas Instruments, Inc. +// ***************************************************************************** +#include +#include +#include +#include +#include "HAL_Config_Private.h" + +// Simple callbacks to functions in main +extern void ButtonCallback_SW1(void); +extern void ButtonCallback_SW2(void); + + +/**** Functions **************************************************************/ +void HAL_IO_Init(void) +{ + + // Port output low to save power consumption + // P1.0 = RED LED, Output Low + // P1.1 = Unused, Output Low + // P1.2 = Unused, Output Low + // P1.3 = Unused, Output Low + // P1.4 = Unused, Output Low + // P1.5 = Unused, Output Low + // P1.6 = Unused, Output Low + // P1.7 = Unused, Output Low + P1OUT = (0x00); + P1DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7); + + // P2.0 = Unused, Output Low + // P2.1 = Unused, Output Low + // P2.2 = Unused, Output Low + // P2.3 = SW2, Input Pull-up + // P2.4 = Unused, Output Low + // P2.5 = Unused, Output Low + // P2.6 = Unused, Output Low + // P2.7 = Unused, Output Low + P2OUT = (BIT3); + P2DIR = (BIT0 | BIT1 | BIT2 | BIT4 | BIT5 | BIT6 | BIT7); + P2REN |= (BIT3); + + // P3.0 = Unused, Output Low + // P3.1 = Unused, Output Low + // P3.2 = Unused, Output Low + // P3.3 = Unused, Output Low + // P3.4 = Unused, Output Low + // P3.5 = Unused, Output Low + // P3.6 = Unused, Output Low + // P3.7 = Unused, Output Low + P3OUT = (0x00); + P3DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7); + + // P4.0 = Unused, Output Low + // P4.1 = SW1, Input pull-up + // P4.2 = LP UART RXD, Input pull-up or UART + // P4.3 = LP UART TXD, Input pull-up or UART + // P4.4 = NC, Output Low + // P4.5 = NC, Output Low + // P4.6 = NC, Output Low + // P4.7 = NC, Output Low + P4OUT = (BIT1); + P4DIR = (BIT0 | BIT4 | BIT5 | BIT6 | BIT7); + P4REN |= (BIT1); + P4SEL0 |= (BIT2 | BIT3); + P4SEL1 &= ~(BIT2 | BIT3); + + // P5.0 = Unused, Output Low + // P5.1 = Unused, Output Low + // P5.2 = Unused, Output Low + // P5.3 = Unused, Output Low + // P5.4 = Unused, Output Low + // P5.5 = N/A, Output Low + // P5.6 = N/A, Output Low + // P5.7 = N/A, Output Low + P5OUT = (0x00); + P5DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7); + + // P6.0 = Unused, Output Low + // P6.1 = Unused, Output Low + // P6.2 = Unused, Output Low + // P6.3 = Unused, Output Low + // P6.4 = Unused, Output Low + // P6.5 = Unused, Output Low + // P6.6 = Unused, Output Low + // P6.7 = N/A, Output Low + P6OUT = (0x00); + P6DIR = (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7); + + PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode + // to activate previously configured port settings + + +} + +void HAL_IO_InitButtons(void) +{ + // Configure SW1 and SW2 for interrupts (pins set as input-pullup during GPIO initialization) + P4IES = BIT1; // Hi/Low edge + P4IFG = 0; // Clear flags + P4IE = BIT1; // interrupt enabled + P2IES = BIT3; // Hi/Low edge + P2IFG = 0; // Clear flags + P2IE = BIT3; // interrupt enabled +} +// Port 4 interrupt service routine +#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) +#pragma vector=PORT4_VECTOR +__interrupt void Port_4(void) +#elif defined(__GNUC__) +void __attribute__ ((interrupt(PORT1_VECTOR))) Port_3 (void) +#else +#error Compiler not supported! +#endif +{ + ButtonCallback_SW1(); + P4IFG &= ~BIT1; // Clear IFG + __bic_SR_register_on_exit(LPM3_bits); // Exit LPM3 +} + +// Port 2 interrupt service routine +#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) +#pragma vector=PORT2_VECTOR +__interrupt void Port_2(void) +#elif defined(__GNUC__) +void __attribute__ ((interrupt(PORT1_VECTOR))) Port_2 (void) +#else +#error Compiler not supported! +#endif +{ + ButtonCallback_SW2(); + P2IFG &= ~BIT3; // Clear IFG + __bic_SR_register_on_exit(LPM3_bits); // Exit LPM3 +} + + diff --git a/src/MSP430_HAL/HAL_System_FR235x.c b/src/MSP430_HAL/HAL_System_FR235x.c new file mode 100755 index 0000000..8c4fc08 --- /dev/null +++ b/src/MSP430_HAL/HAL_System_FR235x.c @@ -0,0 +1,147 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// HAL functions to initialize the system +// +// Texas Instruments, Inc. +// ****************************************************************************** + +#include +#include "HAL.h" + +/**** Local Function Prototypes ***********************************************/ +static void HAL_System_Clock_Init(void); +static void Clock_Software_Trim(void); + +/**** Functions ***************************************************************/ +int8_t HAL_System_Init(void) +{ + HAL_IO_Init(); + HAL_System_Clock_Init(); + + return 0; // OK +} + +/**** Local Functions *********************************************************/ +//! \brief Initializes the system clock +//! +//! \return none +static void HAL_System_Clock_Init(void) +{ +#if ( (CPU_FREQ_HZ == 8000000) && (LSBUS_FREQ_HZ == 32768) ) + __bis_SR_register(SCG0); // disable FLL + CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source + CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM=3, DCO Range = 8MHz + CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz + __delay_cycles(3); + __bic_SR_register(SCG0); // enable FLL + Clock_Software_Trim(); // Software Trim to get the best DCOFTRIM value + + CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz + // default DCODIV as MCLK and SMCLK source +#else +#error "Clock configuration is not supported. Modify DualRaySmoke_HAL_System.c" +#endif +} + +//! \brief Software trim for DCO+FLL to lock target frequency +//! +//! \return none +static void Clock_Software_Trim(void) +{ + unsigned int oldDcoTap = 0xffff; + unsigned int newDcoTap = 0xffff; + unsigned int newDcoDelta = 0xffff; + unsigned int bestDcoDelta = 0xffff; + unsigned int csCtl0Copy = 0; + unsigned int csCtl1Copy = 0; + unsigned int csCtl0Read = 0; + unsigned int csCtl1Read = 0; + unsigned int dcoFreqTrim = 3; + unsigned char endLoop = 0; + + do + { + CSCTL0 = 0x100; // DCO Tap = 256 + do + { + CSCTL7 &= ~DCOFFG; // Clear DCO fault flag + }while (CSCTL7 & DCOFFG); // Test DCO fault flag + + __delay_cycles((unsigned long)3000 * CPU_FREQ_MHZ);// Wait FLL lock status (FLLUNLOCK) to be stable + // Suggest to wait 24 cycles of divided FLL reference clock + while((CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)) && ((CSCTL7 & DCOFFG) == 0)); + + csCtl0Read = CSCTL0; // Read CSCTL0 + csCtl1Read = CSCTL1; // Read CSCTL1 + + oldDcoTap = newDcoTap; // Record DCOTAP value of last time + newDcoTap = csCtl0Read & 0x01ff; // Get DCOTAP value of this time + dcoFreqTrim = (csCtl1Read & 0x0070)>>4;// Get DCOFTRIM value + + if(newDcoTap < 256) // DCOTAP < 256 + { + newDcoDelta = 256 - newDcoTap; // Delta value between DCPTAP and 256 + if((oldDcoTap != 0xffff) && (oldDcoTap >= 256)) // DCOTAP cross 256 + endLoop = 1; // Stop while loop + else + { + dcoFreqTrim--; + CSCTL1 = (csCtl1Read & (~DCOFTRIM)) | (dcoFreqTrim<<4); + } + } + else // DCOTAP >= 256 + { + newDcoDelta = newDcoTap - 256; // Delta value between DCPTAP and 256 + if(oldDcoTap < 256) // DCOTAP cross 256 + endLoop = 1; // Stop while loop + else + { + dcoFreqTrim++; + CSCTL1 = (csCtl1Read & (~DCOFTRIM)) | (dcoFreqTrim<<4); + } + } + + if(newDcoDelta < bestDcoDelta) // Record DCOTAP closest to 256 + { + csCtl0Copy = csCtl0Read; + csCtl1Copy = csCtl1Read; + bestDcoDelta = newDcoDelta; + } + + }while(endLoop == 0); // Poll until endLoop == 1 + + CSCTL0 = csCtl0Copy; // Reload locked DCOTAP + CSCTL1 = csCtl1Copy; // Reload locked DCOFTRIM + while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked +} + diff --git a/src/MSP430_HAL/HAL_Timer_FR235x.c b/src/MSP430_HAL/HAL_Timer_FR235x.c new file mode 100755 index 0000000..e3270b1 --- /dev/null +++ b/src/MSP430_HAL/HAL_Timer_FR235x.c @@ -0,0 +1,71 @@ +/* --COPYRIGHT--,BSD + * Copyright (c) 2019, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * 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. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may 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 OWNER 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. + * --/COPYRIGHT--*/ +//***************************************************************************** +// HAL Timer functions +// +// Texas Instruments, Inc. +// ***************************************************************************** +#include +#include +#include +#include +#include "HAL_Config_Private.h" + +// Simple callbacks to main function +extern void TimerCallback(void); + +/**** Functions **************************************************************/ +void HAL_Timer_Init(void) +{ + // Initialize a timer to update the counter + // Configure Timer + TB0CCR0 = LSBUS_FREQ_HZ / 2; // 0.5sec + TB0CCTL0 = CCIE; // TBCCR0 interrupt enabled + TB0CTL = TBSSEL__ACLK | // Use ACLK + MC__UP | // Up Mode + TBCLR; // Clear counter +} + + +// Timer B0 interrupt service routine +#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) +#pragma vector = TIMER0_B0_VECTOR +__interrupt void Timer(void) +#elif defined(__GNUC__) +void __attribute__ ((interrupt(TIMER0_B0_VECTOR))) Timer_B0 (void) +#else +#error Compiler not supported! +#endif +{ + TimerCallback(); + __bic_SR_register_on_exit(LPM3_bits); // Exit LPM3 +} diff --git a/targetConfigs/MSP430FR2355.ccxml b/targetConfigs/MSP430FR2355.ccxml new file mode 100644 index 0000000..12c07e4 --- /dev/null +++ b/targetConfigs/MSP430FR2355.ccxml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/targetConfigs/readme.txt b/targetConfigs/readme.txt new file mode 100644 index 0000000..af97b62 --- /dev/null +++ b/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file