atmel-asf-projects/avr32/applications/evk11xx-uc3b-usb-hid-qtouch.../qtouch_debug_frame.c

127 lines
4.2 KiB
C

/**************************************************************************
*
* \file
*
* \brief file for QTouch debug frame.
*
* These files contain two functions that are used to decode or encode the QTouch debug message
*
* Copyright (c) 2014-2015 Atmel Corporation. All rights reserved.
*
* \asf_license_start
*
* \page License
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an
* Atmel microcontroller product.
*
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
*
* \asf_license_stop
*
***************************************************************************/
/*
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
*/
#include "qtouch_debug_frame.h"
// RX USB frame and serial buffer
struct hid_frames hid_rx_frame[MAX_TX_PACKET_NUMBER];
char serial_rx_frame[MAX_TX_PACKET_NUMBER*PAYLOAD_SIZE];
unsigned int rx_index =0;
// TX USB frame and serial buffer
struct hid_frames hid_tx_frame[MAX_RX_PACKET_NUMBER];
char serial_tx_frame[MAX_TX_PACKET_NUMBER*PAYLOAD_SIZE];
unsigned int tx_index =0;
//! @brief This function get a messages from USB and rebuild it in a single
// message for USART transfer to the main UC3 device present on the kit.
// /param frame a frame received from USB
//!
int get_message(struct hid_frames frame)
{
int index=0;
int i=0;
int j=0;
// Error Handling
if((frame.protocol_id!=PROTOCOL_ID)||
(frame.packetNumber!=tx_index+1) ||
(frame.packetNumber>frame.packetCount)) {
// Flush Message if PROTOCOL_ID is not correct
tx_index=0;
return MESSAGE_ERROR;
}
// Store incoming packet in tx_frame_structure
hid_tx_frame[tx_index++]=frame;
// if we have a full packet, this can be transmitted the QTouch device
if(frame.packetCount==frame.packetNumber) {
// rebuild and send message to QTouch device
for(i=0;i<frame.packetCount;i++) {
for(j=0;j<PAYLOAD_SIZE;j++) {
serial_tx_frame[index++]=hid_tx_frame[i].payload[j];
}
}
tx_index=0;
return MESSAGE_READY;
}
return MESSAGE_PENDING;
}
//! @brief This function split message received from USART to USB frame messages.
// Then the HID_rx_frame is used to store the split message.
// /param message a pointer to the rx_buffer
// /param size of the message stored in the rx_buffer
//!
void send_message(char *message, unsigned int size)
{
int index=0;
int i=0;
int j=0;
int num_packet;
if(size>PAYLOAD_SIZE*MAX_TX_PACKET_NUMBER)
return;
// Compute num Packet
num_packet=(size/PAYLOAD_SIZE)+1;
for(i = 0;i<num_packet;i++) {
hid_rx_frame[i].protocol_id=PROTOCOL_ID;
hid_rx_frame[i].spare_byte1=0x00;
hid_rx_frame[i].spare_byte2=0x00;
hid_rx_frame[i].packetCount=num_packet;
hid_rx_frame[i].packetNumber=i+1;
for(j=0;j<PAYLOAD_SIZE&&index<size;j++) {
hid_rx_frame[i].payload[j]=message[index++];
}
}
}