fota lib for mdot

Dependents:   UQ_LoraWAN

mdot/LoRaConfig.h

Committer:
rklaassen
Date:
2019-01-15
Revision:
8:7ba1f2abb8c0
Parent:
3:63d10f2375ea

File content as of revision 8:7ba1f2abb8c0:

#include "mbed.h"
#if defined (TARGET_MTS_MDOT_F411RE)
#include "spiffs.h"
#include "SpiFlash25.h"
#else
#include "xdot_eeprom.h"
#endif /* TARGET_MTS_MDOT_F411RE */
#include "mDot.h"
#include "ChannelPlan.h"
#include <stdint.h>
#include <string>
#include <vector>

#ifndef __LORA_CONFIG_H__
#define __LORA_CONFIG_H__

#if defined (TARGET_MTS_MDOT_F411RE)
// this value represents the number of files you can have open at the same time
// adjust it according to your requirements
#define MAX_CONCURRENT_FDS      5

#define PAGE_SIZE               256
#define SECTOR_SIZE             64*1024
#define MEM_SIZE                2*1024*1024
#else
#define SETTINGS_ADDR       0x0000      // configuration is 1024 bytes (0x000-0x3FF)
#define PROTECTED_ADDR      0x0400      // protected configuration is 256 bytes (0x400-0x4FF)
#define SESSION_ADDR        0x0500      // session is 256 bytes (0x500-0x5FF)
#define USER_ADDR           0x0800      // user space is 6*1024 bytes (0x800 - 0x1FFF)
#endif /* TARGET_MTS_MDOT_F411RE */

#define MULTICAST_SESSIONS 3
#define EUI_LENGTH 8
#define KEY_LENGTH 16
#define PASSPHRASE_LENGTH 128

// DON'T CHANGE THIS UNLESS YOU REALLY WANT TO
#define PROTECTED_RFU_SIZE 223

// PROTECTED SETTINGS SHOULD ALWAYS HAVE SIZE OF 256 BYTES
typedef struct {
        uint8_t FrequencyBand;
        uint8_t DeviceEUI[EUI_LENGTH];
        uint8_t AppEUI[EUI_LENGTH];
        uint8_t AppKey[KEY_LENGTH];
        uint8_t RFU[PROTECTED_RFU_SIZE];
} ProtectedSettings_t;

// DON'T CHANGE THIS UNLESS YOU REALLY WANT TO
#define CONFIG_RFU_SIZE 361

// SETTINGS SHOULD ALWAYS HAVE SIZE OF 1024 BYTES
typedef struct {
        uint8_t ConfigVersion;

        uint32_t SerialBaudRate;
        uint32_t DebugBaudRate;
        uint8_t StartUpMode;

        /* Network Settings */
        uint8_t NetworkEUI[EUI_LENGTH];
        uint8_t NetworkEUIPassphrase[PASSPHRASE_LENGTH];
        uint8_t NetworkKey[KEY_LENGTH];
        uint8_t NetworkKeyPassphrase[PASSPHRASE_LENGTH];

        uint32_t NetworkAddress;
        uint8_t NetworkSessionKey[KEY_LENGTH];
        uint8_t DataSessionKey[KEY_LENGTH];

        uint8_t JoinMode;
        uint8_t JoinRetries;

        /* Radio Settings */

        uint8_t ForwardErrorCorrection;
        uint8_t ACKAttempts;
        bool EnableEncryption;
        bool EnableCRC;
        bool EnableADR;
        bool EnableEcho;
        bool EnableVerbose;

        uint32_t TxFrequency;
        uint8_t TxDataRate;
        bool TxInverted;
        uint8_t TxPower;
        bool TxWait;
        uint8_t FrequencySubBand;

        uint32_t RxFrequency;
        uint8_t RxDataRate;
        bool RxInverted;
        uint8_t RxOutput;

        /* Serial Settings */
        uint32_t WakeInterval;
        uint16_t WakeTimeout;
        uint32_t WakeDelay;

        uint8_t PublicNetwork;
        uint8_t LinkCheckCount;
        uint8_t LinkCheckThreshold;

        uint8_t LogLevel;
        uint8_t JoinByteOrder;

        uint8_t WakePin;
        uint8_t WakeMode;

        uint8_t PreserveSessionOverReset;

        uint8_t JoinDelay;
        uint8_t RxDelay;
        uint8_t Port;

        uint8_t Class;
        int8_t AntennaGain;

        bool FlowControl;
        uint8_t Repeat;

        bool SerialClearOnError;
        uint8_t Rx2Datarate;
        uint8_t JoinRx1DatarateOffset;  //!< Offset for datarate for first window
        uint8_t JoinRx2DatarateIndex;   //!< Datarate for second window

        uint32_t Channels[16];
        uint8_t ChannelRanges[16];

        uint32_t JoinRx2Frequency;      //!< Frequency used in second window

        uint8_t MaxEIRP;
        uint8_t UlDwellTime;
        uint8_t DlDwellTime;

        uint8_t padding;

        uint32_t DlChannels[16];

        uint8_t LastPlan;               //!< Channel plan from last saved configuration

        int8_t lbtThreshold;            //!< Listen before talk threshold
        uint16_t lbtTimeUs;             //!< Listen before talk time

        // Multicast session address and keys
        uint32_t MulticastAddress[MULTICAST_SESSIONS];
        uint8_t MulticastNetSessionKey[MULTICAST_SESSIONS][KEY_LENGTH];
        uint8_t MulticastAppSessionKey[MULTICAST_SESSIONS][KEY_LENGTH];

        uint8_t AutoSleep;

        uint8_t RFU[CONFIG_RFU_SIZE];
} LoRaSettings_t;

// DON'T CHANGE THIS UNLESS YOU REALLY WANT TO
#define SESSION_RFU_SIZE 2

// SESSION SETTINGS SHOULD ALWAYS HAVE SIZE OF 256 BYTES
typedef struct {
        bool Joined;
        uint8_t Rx1DatarateOffset;
        uint8_t Rx2Datarate;
        uint8_t ChannelMask500k;

        uint32_t NetworkAddress;

        uint8_t NetworkKey[KEY_LENGTH];
        uint8_t DataKey[KEY_LENGTH];

        uint64_t ChannelMask;

        uint32_t Channels[16];
        uint8_t ChannelRanges[16];

        uint32_t UplinkCounter;

        uint8_t Rx1Delay;
        uint8_t Datarate;
        uint8_t TxPower;
        uint8_t Repeat;

        uint32_t Rx2Frequency;

        uint32_t DownlinkCounter;

        uint8_t MaxDutyCycle;
        uint8_t AdrAckCounter;
        uint8_t LinkFailCount;
        uint8_t FrequencySubBand;

        uint32_t NetworkId;

        bool ServerAckRequested;
        uint8_t DeviceClass;

        uint8_t CommandBufferIndex;

        uint8_t CommandBuffer[15];

        uint8_t UlDwellTime;
        uint8_t DlDwellTime;

        uint32_t DlChannels[16];

        uint8_t MaxEIRP;

        // Multicast session counter values
        uint32_t MulticastCounters[MULTICAST_SESSIONS];

        uint8_t RFU[SESSION_RFU_SIZE];

        uint8_t LastPlan;               //!< Channel plan from last saved session

} NetworkSession_t;

class LoRaConfig {

    public:

        static const uint8_t EuiLength = EUI_LENGTH;
        static const uint8_t KeyLength = KEY_LENGTH;
        static const uint8_t PassPhraseLength = PASSPHRASE_LENGTH;

        enum JoinMode {
            MANUAL,
            OTA,
            AUTO_OTA,
            PEER_TO_PEER
        };

        enum Mode {
            COMMAND_MODE,
            SERIAL_MODE
        };

        enum RX_Output {
            HEXADECIMAL,
            BINARY
        };

        enum DataRates {
            DR0,
            DR1,
            DR2,
            DR3,
            DR4,
            DR5,
            DR6,
            DR7,
            DR8,
            DR9,
            DR10,
            DR11,
            DR12,
            DR13,
            DR14,
            DR15
        };

        enum FrequencySubBands {
            FSB_ALL,
            FSB_1,
            FSB_2,
            FSB_3,
            FSB_4,
            FSB_5,
            FSB_6,
            FSB_7,
            FSB_8
        };

        enum JoinByteOrder {
            LSB,
            MSB
        };

        static const uint32_t BaudRates[];
        static const std::string DRS[];
        static const uint32_t DefaultBaudRate;

        uint32_t ValidateBaudRate(uint32_t rate);

        LoRaConfig(lora::ChannelPlan *plan);
        ~LoRaConfig();

        bool Save();
        bool SaveSession();
        bool SaveProtected();

#if defined (TARGET_MTS_MDOT_F411RE)
        void EnablePVD();
        bool PVDO();
#endif /* TARGET_MTS_MDOT_F411RE */

        void Mount();
        void Load();
        void Default();
        void DefaultSession();
        void DefaultProtected();

        uint8_t PublicNetwork();
        void PublicNetwork(uint8_t val);

        uint8_t* DeviceEUI();
        void DeviceEUI(uint8_t* devEUI);

        const uint8_t* AppEUI();
        void AppEUI(const uint8_t* appEUI);

        const uint8_t* AppKey();
        void AppKey(const uint8_t* appKey);

        uint8_t* NetworkEUI();
        void NetworkEUI(const uint8_t* networkEUI);

        uint8_t* NetworkEUIPassphrase();
        void NetworkEUIPassphrase(uint8_t* networkEUIPassphrase, uint8_t length);

        uint8_t* NetworkKey();
        void NetworkKey(const uint8_t* networkKey);

        uint8_t* NetworkKeyPassphrase();
        void NetworkKeyPassphrase(uint8_t* networkKeyPassphrase, uint8_t length);

        uint32_t NetworkAddress();
        void NetworkAddress(uint32_t addr);

        uint8_t* NetworkSessionKey();
        void NetworkSessionKey(uint8_t* networkSessionKey);

        uint8_t* DataSessionKey();
        void DataSessionKey(uint8_t* dataSessionKey);

        uint8_t JoinMode();
        void JoinMode(uint8_t mode);

        uint8_t JoinRetries();
        void JoinRetries(uint8_t retries);

        uint8_t LinkCheckCount();
        void LinkCheckCount(uint8_t count);

        uint8_t LinkCheckThreshold();
        void LinkCheckThreshold(uint8_t count);

        uint8_t ForwardErrorCorrection();
        void ForwardErrorCorrection(uint8_t bytes);

        uint8_t ACKAttempts();
        void ACKAttempts(uint8_t attempts);

        bool EnableEncryption();
        void EnableEncryption(uint8_t enable);

        bool EnableCRC();
        void EnableCRC(uint8_t enable);

        bool EnableADR();
        void EnableADR(uint8_t enable);

        bool EnableEcho();
        void EnableEcho(uint8_t enable);

        bool EnableVerbose();
        void EnableVerbose(uint8_t enable);

        uint8_t TxDataRate();
        void TxDataRate(uint8_t rate);

        uint8_t TxPower();
        void TxPower(uint8_t power);

        uint8_t FrequencyBand();
        void FrequencyBand(uint8_t band);

        uint8_t FrequencySubBand();
        void FrequencySubBand(uint8_t band);

        uint32_t TxFrequency();
        void TxFrequency(uint32_t freq);

        bool TxInverted();
        void TxInverted(bool enable);

        bool TxWait();
        void TxWait(bool timeout);

        uint32_t RxFrequency();
        void RxFrequency(uint32_t freq);

        bool RxInverted();
        void RxInverted(bool enable);

        uint8_t RxOutput();
        void RxOutput(uint8_t type);

        uint8_t RxDataRate();
        void RxDataRate(uint8_t rate);

        uint8_t Rx2DataRate();
        void Rx2DataRate(uint8_t rate);

        uint8_t StartUpMode();
        void StartUpMode(uint8_t mode);

        /* Serial Settings */
        uint32_t SerialBaudRate();
        void SerialBaudRate(uint32_t rate);

        uint32_t WakeInterval();
        void WakeInterval(uint32_t interval);

        uint32_t WakeDelay();
        void WakeDelay(uint32_t delay);

        uint16_t WakeTimeout();
        void WakeTimeout(uint16_t timeout);

        uint8_t WakePin();
        void WakePin(uint8_t pin);

        uint8_t WakeMode();
        void WakeMode(uint8_t mode);

        uint32_t DebugBaudRate();
        void DebugBaudRate(uint32_t baud);

        bool Joined();
        void Joined(bool val);

        uint32_t* Channels();

        uint32_t* DownlinkChannels();

        uint8_t* ChannelRanges();

        uint8_t* SessionDataKey();
        void SessionDataKey(uint8_t* key);

        uint8_t* SessionNetworkKey();
        void SessionNetworkKey(uint8_t* key);

        uint32_t SessionNetworkAddress();
        void SessionNetworkAddress(uint32_t addr);

        uint8_t SessionDatarate();
        void SessionDatarate(uint8_t datarate);

        uint8_t SessionTxPower();
        void SessionTxPower(uint8_t power);

        uint8_t SessionRepeat();
        void SessionRepeat(uint8_t repeat);

        uint8_t SessionRxDelay();
        void SessionRxDelay(uint8_t delay);

        uint8_t SessionRx1DatarateOffset();
        void SessionRx1DatarateOffset(uint8_t offset);

        uint8_t SessionRx2Datarate();
        void SessionRx2Datarate(uint8_t datarate);

        uint32_t SessionRx2Frequency();
        void SessionRx2Frequency(uint32_t frequency);

        uint64_t SessionChannelMask();
        void SessionChannelMask(uint64_t mask);

        uint8_t Session500kMask();
        void Session500kMask(uint8_t mask);

        uint32_t* SessionChannels();

        uint32_t* SessionDownlinkChannels();

        uint8_t* SessionChannelRanges();

        uint32_t SessionUplinkCounter();
        void SessionUplinkCounter(uint32_t count);

        uint32_t SessionDownlinkCounter();
        void SessionDownlinkCounter(uint32_t count);

        uint8_t SessionAdrAckCounter();
        void SessionAdrAckCounter(uint8_t count);

        uint8_t SessionLinkFailCount();
        void SessionLinkFailCount(uint8_t count);

        uint8_t SessionFrequencySubBand();
        void SessionFrequencySubBand(uint8_t band);

        bool SessionServerAckRequested();
        void SessionServerAckRequested(bool val);

        uint32_t SessionNetworkId();
        void SessionNetworkId(uint32_t id);

        uint8_t SessionDeviceClass();
        void SessionDeviceClass(uint8_t cls);

        uint8_t* SessionCommandBuffer();
        void SessionCommandBuffer(uint8_t* buffer);

        uint8_t SessionCommandBufferIndex();
        void SessionCommandBufferIndex(uint8_t index);

        uint8_t SessionMaxDutyCycle();
        void SessionMaxDutyCycle(uint8_t duty);

        uint8_t SessionUplinkDwelltime();
        void SessionUplinkDwelltime(uint8_t dwell);

        uint8_t SessionDownlinkDwelltime();
        void SessionDownlinkDwelltime(uint8_t dwell);

        uint8_t SessionMaxEIRP();
        void SessionMaxEIRP(uint8_t pow);

        uint8_t LogLevel();
        void LogLevel(uint8_t level);

        uint8_t JoinByteOrder();
        void JoinByteOrder(uint8_t order);

        uint8_t PreserveSessionOverReset();
        void PreserveSessionOverReset(uint8_t);

        uint8_t JoinDelay();
        void JoinDelay(uint8_t delay);

        uint8_t JoinRx1DatarateOffset();
        void JoinRx1DatarateOffset(uint8_t offset);

        uint8_t JoinRx2DatarateIndex();
        void JoinRx2DatarateIndex(uint8_t datarate);

        uint32_t JoinRx2Frequency();
        void JoinRx2Frequency(uint32_t freq);

        uint8_t RxDelay();
        void RxDelay(uint8_t delay);

        uint8_t Port();
        void Port(uint8_t port);

        uint8_t Class();
        void Class(uint8_t cls);

        int8_t AntennaGain();
        void AntennaGain(int8_t gain);

        bool FlowControl();
        void FlowControl(bool enable);

        uint8_t Repeat();
        void Repeat(uint8_t repeat);

        bool SerialClearOnError();
        void SerialClearOnError(bool val);

        uint8_t LastPlan();
        uint8_t SessionLastPlan();

        void LbtTimeUs(uint16_t us);
        uint16_t LbtTimeUs();
        void LbtThreshold(int8_t rssi);
        int8_t LbtThreshold();

        uint32_t GetMulticastAddress(int i);
        uint8_t* GetMulticastNetSessionKey(int i);
        uint8_t* GetMulticastAppSessionKey(int i);
        uint32_t GetMulticastCounter(int i);


        void SetMulticastAddress(int i, uint32_t addr);
        void SetMulticastNetSessionKey(int i, const uint8_t* key);
        void SetMulticastAppSessionKey(int i, const uint8_t* key);
        void SetMulticastCounter(int i, uint32_t count);

        void AutoSleep(uint8_t enable);
        uint8_t AutoSleep();

        /*!
         * AES encryption/decryption cipher network app ieee eui
         */
        static const uint8_t defaultNetworkEUI[EUI_LENGTH];
        /*!
         * AES encryption/decryption cipher application key
         */
        static const uint8_t defaultNetworkKey[KEY_LENGTH];

        /*!
         * AES encryption/decryption cipher network session key
         */
        static const uint8_t defaultNetworkSessionKey[KEY_LENGTH];

        /*!
         * AES encryption/decryption cipher application session key
         */
        static const uint8_t defaultDataSessionKey[KEY_LENGTH];

        void Sleep();
        void Wakeup();

        void SetChannelPlan(lora::ChannelPlan *plan);

#if defined (TARGET_MTS_MDOT_F411RE)
        mDot::mdot_file OpenUserFile(const char* file, int mode);
        bool SeekUserFile(mDot::mdot_file& file, size_t offset, int whence);
        int ReadUserFile(mDot::mdot_file& file, void* data, size_t length);
        int WriteUserFile(mDot::mdot_file& file, void* data, size_t length);
        bool CloseUserFile(mDot::mdot_file& file);
        bool MoveUserFile(mDot::mdot_file& file, const char* new_name);

        bool MoveUserFile(const char* file, const char* new_name);
        bool SaveUserFile(const char* file, void* data, uint32_t size);
        bool AppendUserFile(const char* file, void* data, uint32_t size);
        bool ReadUserFile(const char* file, void* data, uint32_t size);
        bool DeleteUserFile(const char* file);
        bool DeleteFile(const char* file);

        bool MoveUserFileToFirwareUpgrade(const char* file);

        std::vector<mDot::mdot_file> ListUserFiles();
#endif /* TARGET_MTS_MDOT_F411RE */

    private:
        LoRaSettings_t _settings;
        ProtectedSettings_t _protected;
        NetworkSession_t _session;
        bool _dirty_settings;

        uint32_t _frequencyMin;
        uint32_t _frequencyMax;

        lora::ChannelPlan *_plan;

#if defined (TARGET_MTS_MDOT_F411RE)
        // SpiFlash25 flash(MOSI, MISO, SCK, CS, W, HOLD);
        static SpiFlash25 _flash;

        mDot::mdot_file OpenFile(spiffs *fs, const char* file, int mode);
        bool SeekFile(spiffs *fs, mDot::mdot_file& file, size_t offset, int whence);

        int ReadFile(spiffs *fs, mDot::mdot_file& file, void* data, size_t length);
        int WriteFile(spiffs *fs, mDot::mdot_file& file, void* data, size_t length);
        int MoveFile(spiffs* fs, mDot::mdot_file& file, const char* new_name);
        bool CloseFile(spiffs *fs, mDot::mdot_file& file);

        bool AppendFile(spiffs *fs, const char* file, void* data, uint32_t size);
        bool SaveFile(spiffs *fs, const char* file, void* data, uint32_t size);
        bool ReadFile(spiffs *fs, const char* file, void* dest, uint32_t size);
        bool MoveFile(spiffs *fs, const char* file, const char* new_name);

        // glue code between SPI driver and filesystem
        static int spi_read(unsigned int addr, unsigned int size, unsigned char* data);
        static int spi_write(unsigned int addr, unsigned int size, unsigned char* data);
        static int spi_erase(unsigned int addr, unsigned int size);

        static u8_t spiffs_work_buf[PAGE_SIZE * 2];
        static u8_t spiffs_fds[32 * MAX_CONCURRENT_FDS];
        static u8_t spiffs_cache_buf[(PAGE_SIZE + 32) * 4];

        u8_t _openFds;

        static spiffs _fs;

        static char file[];
        static char protected_file[];
        static char session_file[];
        static char user_dir[];
#endif /* TARGET_MTS_MDOT_F411RE */

};

#endif // __LORA_CONFIG_H__