Sending and reception of big data file (1kB example)

Dependencies:   modem_ref_helper CRC DebouncedInterrupt

modem_callbacks.cpp

Committer:
Jeej
Date:
2017-12-21
Revision:
4:fd480d5fe62b
Parent:
0:a2bbc478f812
Child:
6:33dfecc85ebf

File content as of revision 4:fd480d5fe62b:

#include "modem_ref_helper.h"
#include "files.h"

#define SERIAL_MAX_PACKET_SIZE  (255)

// ============================================================}}}

// Callbacks to MODEM's ALP requests
// ============================================================{{{
void my_read(u8 fid, u32 offset, u32 length, int id)
{
    u8 data[SERIAL_MAX_PACKET_SIZE];
    
    ASSERT((ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE(offset, length)) <= SERIAL_MAX_PACKET_SIZE,
    "Read response too big for serial protocol (%d/%dmax)", length, ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE(offset,SERIAL_MAX_PACKET_SIZE));
    
    if (ram_fs_read(fid, offset, length, data))
    {
        modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
    }
    else
    {
        modem_respond_read(fid, data, offset, length, id);
    }
}

void my_write(u8 fid, void *data, u32 offset, u32 length, int id)
{
    alp_errors_t err;
    
    if (ram_fs_write(fid, offset, length, (uint8_t*)data))
    {
        err = ALP_ERR_FILE_NOT_FOUND;
    }
    else
    {
        err = ALP_ERR_NONE;
        
        touch_t* touch = (touch_t*)MALLOC(sizeof(touch_t));
        
        touch->fid = fid;
        touch->offset = offset;
        touch->length = length;
        
        g_file_modified.put(touch);
    }
    
    modem_respond(0, err, id);
}

void my_read_fprop(u8 fid, int id)
{
    u8* hdr = (u8*)ram_fs_get_header(fid);
    
    if (hdr != NULL)
    {
        modem_respond_fprop(fid, hdr, id);
    }
    else
    {
        modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
    }
}

void my_flush(u8 fid, int id)
{
    // No flush in this file system
    modem_respond(0, ALP_ERR_NONE, id);
}

void my_delete(u8 fid, int id)
{
    modem_respond(0, (ram_fs_delete(fid))? ALP_ERR_FILE_NOT_FOUND : ALP_ERR_NONE, id);
}

void my_udata(u8 fid, void *data, u32 offset, u32 length, u8 i_type, u8 i_length, u8* i_data)
{
    (void)data;
    (void)i_length;
    PRINT("Got UNS File[%3d]@%d %d Bytes\n",fid,offset,length);
    if (i_type == ALP_ITF_TYPE_D7A)
    {
        static union {
            u8      b[8];
            u32     w[2];
        } uid;
        d7a_sp_res_t* istat = (d7a_sp_res_t*) i_data;
        memcpy(uid.b,istat->addressee.id,8);
        PRINT("From UID: %08X%08X (rxlev:%d lb:%d)\n",
                HAL_U32_BYTE_SWAP(uid.w[0]), HAL_U32_BYTE_SWAP(uid.w[1]),
                istat->rxlev, istat->lb);
    }
}

void my_lqual(u8 ifid, int per)
{
    PRINT("Interface File [%3d] LQUAL : %d%% PER\r\n", ifid, per);
}

void my_ldown(u8 ifid)
{
    PRINT("Interface File [%3d] LDOWN\r\n", ifid);
}

void my_reset(void)
{
    PRINT("Restarting application...\r\n");
    FLUSH();
    NVIC_SystemReset();
}

void my_boot(u8 cause, u16 number)
{
    PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
    
    // Modem re-booted, restart APP
    my_reset();
}