Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SNICInterface by
SNIC/SNIC_Core.cpp
- Committer:
- kishino
- Date:
- 2014-03-27
- Revision:
- 20:dd736d328de6
- Child:
- 22:a9ec0cad4f84
File content as of revision 20:dd736d328de6:
/******************* Murata Manufacturing Co.,Ltd. 2014 *****************
*
* Filename: SNIC_Core.cpp
*
* Purpose: This module has implementation of internal common function for API.
*
* $Author: kishino $
*
* $Date: 2014/03/26 $
*
* $Revision: 0.0.0.1 $
* ***********************************************************************/
#include "mbed.h"
#include "SNIC_Core.h"
#include "SNIC_UartMsgUtil.h"
#include <string>
using namespace murata_wifi;
#define UART_RECVBUF_SIZE 2048
typedef struct
{
unsigned char buf[UART_RECVBUF_SIZE];
unsigned int size;
bool is_receive;
}tagUART_RECVBUF_T;
tagUART_RECVBUF_T gUART_RCVBUF;
unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE];
C_SNIC_Core *C_SNIC_Core::mInstance_p = NULL;
C_SNIC_Core *C_SNIC_Core::getInstance()
{
if( mInstance_p == NULL )
{
mInstance_p = new C_SNIC_Core();
}
return mInstance_p;
}
C_SNIC_Core::C_SNIC_Core()
{
int i;
mUartCommand_p = new C_SNIC_UartCommandManager();
for( i = 0; i < MAX_SOCKET_ID+1; i++ )
{
mConnectInfo[i].recvbuf_p = NULL;
mConnectInfo[i].is_connected = false;
}
mUartRecvThread_p = NULL;
}
int C_SNIC_Core::initUart(PinName tx, PinName rx, int baud)
{
// printf("[C_SNIC_Core::initUart]1\r\n");
mUartRequestSeq = 0;
mUart_p = new RawSerial( tx, rx );
mUart_p->baud( baud );
mUart_p->format(8, SerialBase::None, 1);
// printf("[C_SNIC_Core::initUart]2\r\n");
// Initialize uart
gUART_RCVBUF.is_receive = false;
gUART_RCVBUF.size = 0;
// Create UART recv thread
mUartRecvThread_p = new Thread( C_SNIC_Core::uartRecvThread );
// printf("[C_SNIC_Core::initUart]3\r\n");
if( mUartRecvThread_p == NULL )
{
printf("[C_SNIC_Core::initUart] thread cread failed\r\n");
return -1;
}
return 0;
}
unsigned int C_SNIC_Core::preparationSendCommand( unsigned char cmd_id, unsigned char cmd_sid
, unsigned char *req_buf_p, unsigned int req_buf_len
, unsigned char *response_buf_p, unsigned char *command_p )
{
unsigned char payload_array[UART_REQUEST_PAYLOAD_MAX];
unsigned short payload_len;
unsigned int command_len = 0;
// Make command payload
payload_len = C_SNIC_UartMsgUtil::makePayload( req_buf_len, req_buf_p, payload_array );
// Make all command request
command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, payload_array, payload_len, command_p );
// Set data for response
mUartCommand_p->setCommandID( cmd_id );
mUartCommand_p->setCommandSID( cmd_sid | 0x80 );
mUartCommand_p->setResponseBuf( response_buf_p );
return command_len;
}
int C_SNIC_Core::sendUart( unsigned int len, unsigned char *data )
{
int ret = 0;
mUartMutex.lock();
for( int i = 0; i < len; i++ )
{
// Write to UART
ret = mUart_p->putc( data[i] );
if( ret == -1 )
{
ret = -1;
break;
}
}
mUartMutex.unlock();
return ret;
}
tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf()
{
// Get buffer from MemoryPool
return mMemPoolPayload.alloc();
}
void C_SNIC_Core::freeCmdBuf( tagMEMPOOL_BLOCK_T *buf_p )
{
mMemPoolPayload.free( buf_p );
}
tagCONNECT_INFO_T *C_SNIC_Core::getConnectInfo( int socket_id )
{
if( (socket_id < 0) || (socket_id > MAX_SOCKET_ID) )
{
return NULL;
}
return &mConnectInfo[socket_id];
}
C_SNIC_UartCommandManager *C_SNIC_Core::getUartCommand()
{
return mUartCommand_p;
}
DigitalOut led1(LED1);
void C_SNIC_Core::uartRecvThread (void const *args_p) {
C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
if ( instance_p == NULL )
{
printf("Socket constructor error: no wifly instance available!\r\n");
}
C_SNIC_UartCommandManager *uartCmdMgr_p = instance_p->getUartCommand();
int recvdata = 0;
int i;
/* UART recv thread main loop */
for (;;)
{
while( instance_p->mUart_p->readable() )
{
// Receive data from UART.
instance_p->mUartMutex.lock();
recvdata = instance_p->mUart_p->getc();
instance_p->mUartMutex.unlock();
// Check UART receiving flg
if( gUART_RCVBUF.is_receive )
{
gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
gUART_RCVBUF.size++;
// Check received data is EOM.
if( recvdata == UART_CMD_EOM )
{
led1 = 0;
#if 0
printf("[recv]\r\n");
for( i = 0; i < gUART_RCVBUF.size; i++ )
{
printf("%02x ", gUART_RCVBUF.buf[i]);
}
printf("\r\n");
#endif
unsigned char command_id;
// Get payload from received data from UART.
int payload_len = C_SNIC_UartMsgUtil::getResponsePayload( gUART_RCVBUF.size, gUART_RCVBUF.buf
, &command_id, gUART_TEMP_BUF );
// Check receive a TCP or UDP packet
if( (command_id == UART_CMD_ID_SNIC) && (gUART_TEMP_BUF[0] == UART_CMD_SID_SNIC_CONNECTION_RECV_IND) )
{
// Packet buffering
uartCmdMgr_p->bufferredPacket( gUART_TEMP_BUF, payload_len );
}
// Check scan results indication
else if( (command_id == UART_CMD_ID_WIFI) && (gUART_TEMP_BUF[0] == UART_CMD_SID_WIFI_SCAN_RESULT_IND) )
{
// Scan result indicate
uartCmdMgr_p->scanResultIndicate( gUART_TEMP_BUF, payload_len );
}
// Checks in the command which is waiting.
else if( uartCmdMgr_p->isWaitingCommand(command_id, gUART_TEMP_BUF) )
{
// Get buffer for payload data
unsigned char *payload_buf_p = uartCmdMgr_p->getResponseBuf();
if( payload_buf_p != NULL )
{
memcpy( payload_buf_p, gUART_TEMP_BUF, payload_len );
uartCmdMgr_p->setResponseBuf( NULL );
}
// Set status
uartCmdMgr_p->setCommandStatus( gUART_TEMP_BUF[2] );
// Set signal for command response wait.
uartCmdMgr_p->signal();
}
gUART_RCVBUF.size = 0;
gUART_RCVBUF.is_receive = false;
}
}
else
{
// Check received data is SOM.
if( recvdata == UART_CMD_SOM )
{
led1 = 1;
gUART_RCVBUF.size = 0;
gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
gUART_RCVBUF.size++;
gUART_RCVBUF.is_receive = true;
}
}
// Thread::yield();
}
Thread::yield();
}
}
