|
/* --COPYRIGHT--,BSD
|
|
* Copyright (c) 2013, 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--*/
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! TouchProGUI.c
|
|
//
|
|
//! TouchProGUI enables interrupt-driven UART communication
|
|
//! to the Touch Pro GUI platform tool. The protocol is defined in
|
|
//! SLAU486 (The TouchPro GUI User's Guide).
|
|
//! The baud rate is fixed at 9600B.
|
|
//
|
|
//! Resources: UCA0 in UART Mode, USCIAB0TX_VECTOR
|
|
//! - UCA0 BR and MOD settings need to be placed in the header file for the
|
|
//! to provide 9600B with a given input clock.
|
|
//
|
|
//! \author Texas Instruments
|
|
//! \author MSP430 Strategic Applications
|
|
//
|
|
//! \version 1.0 - W. Schnoor, 1/7/14: Initial Release
|
|
//
|
|
//*****************************************************************************
|
|
|
|
#include "TouchProGUI.h"
|
|
|
|
uint8_t g_ui8TouchProGUITXBuffer[TOUCHPROGUI_BUFFER_LENGTH] = { TOUCHPROGUI_SYNC_UPPER, TOUCHPROGUI_SYNC_LOWER };
|
|
uint8_t g_ui8TouchProGUITXLength = 0;
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! TouchProGUI_init()
|
|
//! This API will configure the USCI UCA0 in UART mode based upon the
|
|
//! definitions UART_BR_LOWER, UART_BR_UPPER, and UART_MOD.
|
|
//
|
|
//! /param none.
|
|
//! /return none.
|
|
//
|
|
//*****************************************************************************
|
|
void TouchProGUI_init(void)
|
|
{
|
|
//
|
|
// Configure Pin for UART Transmit Functionality
|
|
//
|
|
P1SEL |= BIT2;
|
|
P1SEL2 |= BIT2;
|
|
|
|
//
|
|
// Configure USCIA0 UART based upon header file definitions
|
|
//
|
|
UCA0CTL1 |= UCSSEL_2;
|
|
UCA0BR0 = UART_BR_LOWER;
|
|
UCA0BR1 = UART_BR_UPPER;
|
|
UCA0MCTL = UART_MOD;
|
|
|
|
//
|
|
// Release State Machine Reset
|
|
//
|
|
UCA0CTL1 &= ~UCSWRST;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! TouchProGUI_sendData(uint16_t *ui16DataBuffer, uint8_t ui8Length)
|
|
//! This API will send a set of data to TouchPro GUI.
|
|
//
|
|
//! /param ui16DataBuffer is a pointer to the data array to send.
|
|
//! /param ui8Length specifies how many words in the ui16DataBuffer array
|
|
//! that there are to be sent.
|
|
//! /return none.
|
|
//
|
|
//*****************************************************************************
|
|
void TouchProGUI_sendData(uint16_t *ui16DataBuffer, uint8_t ui8Length)
|
|
{
|
|
uint8_t *pTxBuffer;
|
|
uint8_t ui8CurrentChannel;
|
|
uint8_t ui8Checksum;
|
|
|
|
//
|
|
// Check to make sure the user is not trying to send more channels
|
|
// than the buffer or TouchPro GUI supprt
|
|
//
|
|
if (ui8Length > TOUCHPROGUI_MAX_CHANNELS)
|
|
{
|
|
ui8Length = TOUCHPROGUI_MAX_CHANNELS;
|
|
}
|
|
|
|
//
|
|
// Start buffer pointer at position 2 (since positions 0 and 1
|
|
// are utilized for the sync word and are not to be altered).
|
|
// NOTE: The check sum includes sync word.
|
|
//
|
|
pTxBuffer = &g_ui8TouchProGUITXBuffer[2];
|
|
ui8Checksum = TOUCHPROGUI_SYNC_UPPER + TOUCHPROGUI_SYNC_LOWER;
|
|
|
|
//
|
|
// Calculate packet length (without sync word) in bytes
|
|
// = (Length * 3) + 1
|
|
//
|
|
g_ui8TouchProGUITXLength = ui8Length * 3 + 1;
|
|
*(pTxBuffer++) = g_ui8TouchProGUITXLength;
|
|
ui8Checksum += g_ui8TouchProGUITXLength;
|
|
|
|
//
|
|
// Fill buffer with each channel's data
|
|
//
|
|
for (ui8CurrentChannel = 0; ui8CurrentChannel < ui8Length; ui8CurrentChannel++)
|
|
{
|
|
//
|
|
// Channel Number
|
|
//
|
|
*pTxBuffer = (uint8_t)ui8CurrentChannel;
|
|
ui8Checksum += *(pTxBuffer++);
|
|
|
|
//
|
|
// Channel Data Upper Byte
|
|
//
|
|
*pTxBuffer = (uint8_t)(ui16DataBuffer[ui8CurrentChannel] >> 8);
|
|
ui8Checksum += *(pTxBuffer++);
|
|
|
|
//
|
|
// Channel Data Lower Byte
|
|
//
|
|
*pTxBuffer = (uint8_t)ui16DataBuffer[ui8CurrentChannel];
|
|
ui8Checksum += *(pTxBuffer++);
|
|
}
|
|
|
|
//
|
|
// Add checksum to buffer
|
|
//
|
|
*pTxBuffer = ui8Checksum;
|
|
|
|
//
|
|
// Increase packet length by three to include the sync word (0x55AA)
|
|
// and length byte
|
|
//
|
|
g_ui8TouchProGUITXLength += 3;
|
|
|
|
//
|
|
// Start USCI_A0 transmit interrupt to
|
|
// send the data via the USCI_A0 peripheral
|
|
//
|
|
IE2 |= UCA0TXIE;
|
|
|
|
//
|
|
// Go to LPM0 for completion of byte transmission
|
|
//
|
|
LPM0;
|
|
|
|
//
|
|
// If revived from LPMx, ensure packet got sent
|
|
// before continuing
|
|
//
|
|
if (g_ui8TouchProGUITXLength != 0)
|
|
{
|
|
LPM0;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! USCIAB0TX_VECTOR
|
|
//
|
|
//*****************************************************************************
|
|
#pragma vector=USCIAB0TX_VECTOR
|
|
__interrupt void USCI_ISR(void)
|
|
{
|
|
static uint8_t g_ui8CurrentByteIndex = 0;
|
|
|
|
//
|
|
// Send the next byte in the transmit buffer
|
|
//
|
|
UCA0TXBUF = g_ui8TouchProGUITXBuffer[g_ui8CurrentByteIndex++];
|
|
|
|
//
|
|
// If sending the last byte, clear interrupt enable, reset byte
|
|
// counters, and wake back to application from LPMx.
|
|
//
|
|
if (g_ui8CurrentByteIndex == g_ui8TouchProGUITXLength)
|
|
{
|
|
g_ui8CurrentByteIndex = 0;
|
|
g_ui8TouchProGUITXLength = 0;
|
|
IE2 &= ~UCA0TXIE;
|
|
LPM3_EXIT;
|
|
}
|
|
}
|