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.
Dependents: MurataTypeYD_RPC_Sample
Fork of SNICInterface_mod by
Diff: SNIC/SNIC_Core.cpp
- Revision:
- 29:6a0ba999597d
- Parent:
- 26:f2e1030964e4
- Child:
- 32:ae95309643aa
--- a/SNIC/SNIC_Core.cpp Tue Apr 01 07:19:19 2014 +0000
+++ b/SNIC/SNIC_Core.cpp Mon May 26 05:17:28 2014 +0000
@@ -15,18 +15,32 @@
#include "SNIC_UartMsgUtil.h"
#include <string>
-using namespace murata_wifi;
+/** Wait signal ID of UART recv */
+#define UART_DISPATCH_SIGNAL 0x00000002
+#define UART_RECEIVE_SIGNAL 0x00000004
-#define UART_RECVBUF_SIZE 2048
+#define UART_RECVBUF_SIZE 2048
+#define UART_THREAD_STACK_SIZE 512
+
typedef struct
{
- unsigned char buf[UART_RECVBUF_SIZE];
+ tagMEMPOOL_BLOCK_T *mem_p;
unsigned int size;
- bool is_receive;
}tagUART_RECVBUF_T;
-tagUART_RECVBUF_T gUART_RCVBUF;
-unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE];
+/*
+ Define the global buffer using the area for Ethernet.
+*/
+unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE] __attribute__((section("AHBSRAM1")));
+unsigned char gUART_COMMAND_BUF[UART_REQUEST_PAYLOAD_MAX] __attribute__((section("AHBSRAM1")));
+unsigned char gPAYLOAD_ARRAY[UART_REQUEST_PAYLOAD_MAX] __attribute__((section("AHBSRAM1")));
+/** MemoryPool for payload of UART response */
+MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_PAYLOAD_NUM> mMemPoolPayload __attribute__((section("AHBSRAM1")));
+/** MemoryPool for UART receive */
+MemoryPool<tagMEMPOOL_BLOCK_T, MEMPOOL_UART_RECV_NUM> mMemPoolUartRecv __attribute__((section("AHBSRAM1")));
+Queue<tagMEMPOOL_BLOCK_T, MEMPOOL_UART_RECV_NUM> mUartRecvQueue;
+
+tagMEMPOOL_BLOCK_T *gUART_RCVBUF_p;
C_SNIC_Core *C_SNIC_Core::mInstance_p = NULL;
C_SNIC_Core *C_SNIC_Core::getInstance()
@@ -49,13 +63,26 @@
mConnectInfo[i].is_connected = false;
}
- mUartRecvThread_p = NULL;
+ mUartRecvThread_p = NULL;
+ mUartRecvDispatchThread_p = NULL;
}
C_SNIC_Core::~C_SNIC_Core()
{
}
+int C_SNIC_Core::resetModule( PinName reset )
+{
+ DigitalOut reset_pin( reset );
+
+ reset_pin = 0;
+ wait(0.2);
+ reset_pin = 1;
+ wait(0.2);
+
+ return 0;
+}
+
int C_SNIC_Core::initUart(PinName tx, PinName rx, int baud)
{
// printf("[C_SNIC_Core::initUart]1\r\n");
@@ -65,36 +92,32 @@
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;
+ gUART_RCVBUF_p = NULL;
- // Create UART recv thread
- mUartRecvThread_p = new Thread( C_SNIC_Core::uartRecvThread );
-// printf("[C_SNIC_Core::initUart]3\r\n");
- if( mUartRecvThread_p == NULL )
+ mUart_p->attach( C_SNIC_Core::uartRecvCallback );
+ // Create UART recv dispatch thread
+ mUartRecvDispatchThread_p = new Thread( C_SNIC_Core::uartRecvDispatchThread, NULL, osPriorityNormal, UART_THREAD_STACK_SIZE);
+ if( mUartRecvDispatchThread_p == NULL )
{
- printf("[C_SNIC_Core::initUart] thread cread failed\r\n");
+ printf("[C_SNIC_Core::initUart] thread create failed\r\n");
return -1;
}
return 0;
}
-
-unsigned int C_SNIC_Core::preparationSendCommand( unsigned char cmd_id, unsigned char cmd_sid
+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 );
+ payload_len = C_SNIC_UartMsgUtil::makePayload( req_buf_len, req_buf_p, gPAYLOAD_ARRAY );
// Make all command request
- command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, payload_array, payload_len, command_p );
+ command_len = C_SNIC_UartMsgUtil::makeRequest( cmd_id, gPAYLOAD_ARRAY, payload_len, command_p );
// Set data for response
mUartCommand_p->setCommandID( cmd_id );
@@ -107,7 +130,6 @@
int C_SNIC_Core::sendUart( unsigned int len, unsigned char *data )
{
int ret = 0;
-
mUartMutex.lock();
for( int i = 0; i < len; i++ )
{
@@ -123,7 +145,7 @@
return ret;
}
-C_SNIC_Core::tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf()
+tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocCmdBuf()
{
// Get buffer from MemoryPool
return mMemPoolPayload.alloc();
@@ -134,6 +156,17 @@
mMemPoolPayload.free( buf_p );
}
+tagMEMPOOL_BLOCK_T *C_SNIC_Core::allocUartRcvBuf()
+{
+ // Get buffer from MemoryPool
+ return mMemPoolUartRecv.alloc();
+}
+
+void C_SNIC_Core::freeUartRecvBuf( tagMEMPOOL_BLOCK_T *buf_p )
+{
+ mMemPoolUartRecv.free( buf_p );
+}
+
C_SNIC_Core::tagCONNECT_INFO_T *C_SNIC_Core::getConnectInfo( int socket_id )
{
if( (socket_id < 0) || (socket_id > MAX_SOCKET_ID) )
@@ -148,82 +181,46 @@
return mUartCommand_p;
}
-DigitalOut led1(LED1);
-void C_SNIC_Core::uartRecvThread (void const *args_p) {
+unsigned char *C_SNIC_Core::getCommandBuf()
+{
+ return gUART_COMMAND_BUF;
+}
+DigitalOut led1(LED1);
+
+void C_SNIC_Core::uartRecvCallback( void )
+{
C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
- if ( instance_p == NULL )
+ 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 recvdata = 0;
- int i;
-
- /* UART recv thread main loop */
- for (;;)
- {
- while( instance_p->mUart_p->readable() )
+ // set signal
+// instance_p->mUartRecvThread_p->signal_set( UART_RECEIVE_SIGNAL );
+ if( 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 )
+ // Check UART receiving buffer
+ if( gUART_RCVBUF_p != NULL )
{
- gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
- gUART_RCVBUF.size++;
+ gUART_RCVBUF_p->buf[ gUART_RCVBUF_p->size ] = (unsigned char)recvdata;
+ gUART_RCVBUF_p->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();
- }
+ // Add queue
+ mUartRecvQueue.put( gUART_RCVBUF_p );
- gUART_RCVBUF.size = 0;
- gUART_RCVBUF.is_receive = false;
+ gUART_RCVBUF_p = NULL;
+
+ // set signal for dispatch thread
+ instance_p->mUartRecvDispatchThread_p->signal_set( UART_DISPATCH_SIGNAL );
}
}
else
@@ -232,15 +229,90 @@
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;
+ gUART_RCVBUF_p = instance_p->allocUartRcvBuf();
+ gUART_RCVBUF_p->size = 0;
+ // get buffer for Uart receive
+ gUART_RCVBUF_p->buf[ 0 ] = (unsigned char)recvdata;
+
+ gUART_RCVBUF_p->size++;
}
}
-// Thread::yield();
}
- Thread::yield();
}
}
+void C_SNIC_Core::uartRecvDispatchThread (void const *args_p)
+{
+ C_SNIC_Core *instance_p = C_SNIC_Core::getInstance();
+ C_SNIC_UartCommandManager *uartCmdMgr_p = instance_p->getUartCommand();
+
+ tagMEMPOOL_BLOCK_T *uartRecvBuf_p;
+ osEvent evt;
+
+ for(;;)
+ {
+ // wait
+ Thread::signal_wait( UART_DISPATCH_SIGNAL );
+
+ // Get scanresults from queue
+ evt = mUartRecvQueue.get(500);
+ if (evt.status == osEventMessage)
+ {
+ do
+ {
+ uartRecvBuf_p = (tagMEMPOOL_BLOCK_T *)evt.value.p;
+
+ {
+ int i;
+ printf("[rcv]:%d",uartRecvBuf_p->size );
+/*
+ for(i=0;i<uartRecvBuf_p->size;i++)
+ {
+ printf("%02x", uartRecvBuf_p->buf[i]);
+ }
+*/
+ printf("\r\n");
+ }
+
+ unsigned char command_id;
+ // Get payload from received data from UART.
+ int payload_len = C_SNIC_UartMsgUtil::getResponsePayload( uartRecvBuf_p->size, uartRecvBuf_p->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) )
+ {
+ //lcd_printf("cid:%02x scid:%02x\r\n", command_id, gUART_TEMP_BUF[0]);
+
+ // 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();
+ }
+ //
+ instance_p->freeUartRecvBuf( uartRecvBuf_p );
+
+ evt = mUartRecvQueue.get(500);
+ Thread::yield();
+ } while( evt.status == osEventMessage );
+ }
+ }
+}
