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 d7a_1x by
Diff: src/d7a_modem.cpp
- Revision:
- 25:aac250164497
- Child:
- 26:9f0b9833cac6
diff -r a8433b091764 -r aac250164497 src/d7a_modem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/d7a_modem.cpp Fri Mar 25 16:48:02 2016 +0000 @@ -0,0 +1,135 @@ +#include "mbed.h" +#include "rtos.h" +#include "dbg.h" +#include "d7a_com.h" +#include "d7a_fs.h" +#include "d7a_modem.h" +#include "d7a_common.h" + +typedef struct { + Thread* thread; + Semaphore* ready; + Queue<d7a_com_rx_msg_t, 16> pkt_queue; +} d7a_modem_ctx_t; + +d7a_modem_ctx_t g_modem_ctx; + +void d7a_modem_thread(const void *p); + +void d7a_modem_open( void ) +{ + FPRINT("\r\n"); + g_modem_ctx.ready = new Semaphore(1); + g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2); + + // Wait to consume the semaphore + g_modem_ctx.ready->wait(); +} + +void d7a_modem_wait_ready( uint32_t millisec ) +{ + FPRINT("\r\n"); + g_modem_ctx.ready->wait(millisec); +} + +void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt) +{ + FPRINT("\r\n"); + ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n"); +} + +d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec ) +{ + FPRINT("\r\n"); + osEvent evt = g_modem_ctx.pkt_queue.get(millisec); + return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL; +} + +static void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len) +{ + FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len); + d7a_com_tx_msg_t msg; + uint8_t val=value; + msg.id = KAL_COM_FLOW_CMD; + msg.pbuf = &val; + msg.abuf = buf; + msg.plen = 1; + msg.alen = len; + d7a_com_send_msg(&msg); +} + +void d7a_modem_register_file(uint8_t fid, uint8_t fifo_size, uint8_t flush_policy) +{ + FPRINT("(fid:%d, fifo_size:%d, flush_policy:0x%02X)\r\n", fid, fifo_size, flush_policy); + register_file_param_t rparams = { + .bf.fid = fid , + .bf.fifo_size = fifo_size, + .bf.flush_policy = flush_policy + }; + + d7a_fs_properties_t props; + // retrieve local properties + d7a_fs_get_properties(rparams.bf.fid,KAL_FS_PROP_ALL,&props); + if (props.type != HOST) + { + // create a remote Host file matching our local one + props.type = HOST; + } + else + { + // create a remote Real file matching our local Host-one + props.type = EEPROM; + } + d7a_fs_distant_create(rparams.bf.fid, &props); + d7a_modem_wait_ready(); + + // Distant file is ready, lets register a D7A Interface for it + d7a_modem_msg(WM_CMD_REGISTER_FILE,(uint8_t*)&rparams,sizeof(register_file_param_t)); + d7a_modem_wait_ready(); +} + +void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length) +{ + FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length); + notify_file_param_t nfp = { + .bf.fid = fid, + .bf.offset = offset, + .bf.size = length + }; + + d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t)); + d7a_modem_wait_ready(); +} + +void d7a_modem_thread(const void *p) +{ + FPRINT("\r\n"); + d7a_com_rx_msg_t* pkt; + + while (true) + { + pkt = d7a_modem_wait_pkt(); + ASSERT(pkt != NULL, "MODEM NULL pkt\r\n"); + + switch(pkt->id) + { + case KAL_COM_FLOW_CMD: + uint8_t cmd = pkt->buffer[0]; + if (cmd == WM_CMD_READY) + { + IPRINT("Modem ready\r\n"); + g_modem_ctx.ready->release(); + } + else + { + EPRINT("MODEM Unknown cmd %d\r\n", cmd); + } + break; + default: + EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id); + break; + } + + FREE(pkt); + } +}