Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

src/d7a.cpp

Committer:
Jeej
Date:
2016-09-06
Revision:
53:3e4aa4b57090
Parent:
51:644de6fe1ee7
Child:
55:5ea18a3a01b9

File content as of revision 53:3e4aa4b57090:

#include "mbed.h"
#include "rtos.h"
#include "dbg.h"
#include "d7a.h"
#include "d7a_com.h"
#include "d7a_common.h"
#include "d7a_fs.h"
#include "d7a_modem.h"
#include "d7a_sys.h"
#include "d7a_alp.h"

bool g_open = false;
bool g_local_fs = false;


d7a_errors_t d7a_open(const d7a_com_config_t* com_config, PinName reset_pin, const d7a_callbacks_t* callbacks)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    if (g_open)
    {
        WARNING(false, "D7A Already open\r\n");
        return D7A_ERR_NONE;
    }
    
    err = d7a_com_open(com_config);
    if (err < 0) return err;
    
    err = d7a_sys_open();
    if (err < 0) return err;
    
    err = d7a_fs_open(callbacks->write_file, callbacks->read_file);
    if (err < 0) return err;
    
    err = d7a_alp_open();
    if (err < 0) return err;
    
    err = d7a_modem_open(reset_pin, callbacks->notif_done);
    if (err < 0) return err;
    
    if (callbacks->write_file != NULL && callbacks->read_file != NULL)
    {
        g_local_fs = true;
    }
    
    g_open  = true;
    
    return err;
}


d7a_errors_t d7a_close(void)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    // TODO
    //d7a_modem_close();
    //d7a_fs_close();
    //d7a_sys_close();
    err = d7a_com_close();
    
    return err;
}


d7a_errors_t d7a_start(void)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    err = d7a_modem_start();
    
    return err;
}


d7a_errors_t d7a_stop(void)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    err = d7a_modem_stop();
    
    return err;
}


d7a_errors_t d7a_create(const uint8_t file_id, d7a_fs_storage_t prop, d7a_fs_perm_t perm, uint32_t size, uint32_t alloc, uint8_t action_file, uint8_t interface)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    DPRINT("Create %d.\r\n", file_id);
    
    register_file_param_t file_infos = {
        .fid = file_id,
        .type = RAM,
        .afid = action_file,
        .ifid = interface,
        .prop = (uint8_t)prop | ((interface)? FS_ACT_EN : 0),
        .perm = (uint8_t)perm,
        .size = size,
        .alloc = alloc,
    };
    
    err = d7a_modem_register(&file_infos);
    
    DPRINT("Create %d Done. err %d\r\n", file_id, err);
    
    return err;
}


d7a_errors_t d7a_declare(const uint8_t file_id, d7a_fs_storage_t prop, d7a_fs_perm_t perm, uint32_t length, uint32_t alloc, uint8_t action_file, uint8_t interface)
{
    FPRINT("\r\n");
        
    d7a_errors_t err;
    
    DPRINT("Declare %d.\r\n", file_id);
    
    ASSERT(g_local_fs, "You cannot delare a file is the write_file/read_file callbacks are not specified\r\n");
    
    register_file_param_t file_infos = {
        .fid = file_id,
        .type = HOST+RAM,
        .afid = action_file,
        .ifid = interface,
        .prop = (uint8_t)prop | ((interface)? FS_ACT_EN : 0),
        .perm = (uint8_t)perm,
        .size = length,
        .alloc = alloc,
    };
    
    err = d7a_modem_register(&file_infos);
    
    DPRINT("Declare %d Done\r\n", file_id);
    
    return err;
}


d7a_errors_t d7a_read(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* buf, d7a_addressee_t* addressee, alp_rpol_t retry)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    DPRINT("Read %d.\r\n", file_id);
    
    err = d7a_alp_read_file(file_id, offset, size, buf, addressee, retry);
    
    DPRINT("Read %d Done. err %d\r\n", file_id, err);
    
    return err;
}


d7a_errors_t d7a_write(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, d7a_addressee_t* addressee, alp_rpol_t retry, bool resp)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    DPRINT("Write %d.\r\n", file_id);
    
    err = d7a_alp_write_file(file_id, offset, size, buf, addressee, retry, resp);
    
    DPRINT("Write %d Done. err %d\r\n", file_id, err);
    
    return err;
}


d7a_errors_t d7a_notify(const uint8_t file_id, const uint32_t offset, const uint32_t size)
{
    FPRINT("\r\n");
    
    d7a_errors_t err;
    
    DPRINT("Notify %d.\r\n", file_id);
    
    notify_file_param_t notif = {
        .bf.fid = file_id,
        .bf.offset = offset,
        .bf.size = size
    };
    
    err = d7a_modem_notify(&notif);
    
    DPRINT("Notify %d Done. err %d\r\n", file_id, err);
    
    return err;
}


void d7a_modem_print_infos(void)
{
    uint8_t uid[8];
    d7a_revision_t rev;
    
    ASSERT(d7a_read(0, 0, 8, uid) >= D7A_ERR_NONE, "Failed to read UID file\r\n");
    ASSERT(d7a_read(2, 0, sizeof(d7a_revision_t), (uint8_t*)&rev) >= D7A_ERR_NONE, "Failed to read REV file\r\n");
    
    PRINT("------------ D7A Modem infos ------------\r\n");
    PRINT_DATA("| UID:              ", "%02X", uid, 8, "    |\r\n");
    PRINT("| Manufacturer ID:  %08X            |\r\n", rev.manufacturer_id);
    PRINT("| Device ID:        %08X            |\r\n", rev.device_id);
    PRINT("| Hardware version: %08X            |\r\n", rev.hw_version);
    PRINT("| Firmware version: %d-%d.%d.%d-%08x \t|\r\n", rev.fw_version.id, rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.hash);
    PRINT("| File system CRC:  0x%08x          |\r\n", rev.fs_crc);
    PRINT("-----------------------------------------\r\n");
    
}