May 2021 Commit

Dependencies:   sx128x sx12xx_hal

main.cpp

Committer:
Wayne Roberts
Date:
2018-07-18
Revision:
7:ccb3088ce5be
Parent:
6:59ba1113b3c6
Child:
8:efd5ceb87878

File content as of revision 7:ccb3088ce5be:

//#include "user_platform.h"
#include "radio.h"

#if defined(SX127x_H) || defined(SX126x_H)
    #define BW_KHZ              500
    #define SPREADING_FACTOR    11
    #define CF_HZ               910800000
    #if defined(SX126x_H)
        #define TX_DBM              (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14) 
    #else
        #define TX_DBM              17
    #endif
#elif defined(SX128x_H)
    #define BW_KHZ              200
    #define SPREADING_FACTOR    11
    #define CF_HZ               2487000000

    #define TX_DBM              5
#endif

#ifdef TARGET_DISCO_L072CZ_LRWAN1
    DigitalIn pinA(PB_12);
    DigitalIn pinB(PB_13);
    DigitalIn pinC(PB_14);
    DigitalIn pinD(PB_15);
#elif defined(TARGET_FF_MORPHO)
    DigitalIn pinA(PC_3);
    DigitalIn pinB(PC_2);
    DigitalIn pinC(PC_6);
    DigitalIn pinD(PC_8);
#endif 

volatile struct _f_ {
    uint8_t enable_pin_A : 1;
    uint8_t enable_pin_B : 1;
    uint8_t enable_pin_C : 1;
    uint8_t enable_pin_D : 1;
} flags;
 
Timer t;
#define CMD_PINA       0x02
#define CMD_PINB       0x03
#define CMD_PINC       0x06
#define CMD_PIND       0x08

volatile bool tx_done;

static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
{
    // The CRC calculation follows CCITT
    const uint16_t polynom = 0x1021;
    // CRC initial value
    uint16_t crc = 0x0000;

    if( buffer == NULL )
    {
        return 0;
    }

    for( uint16_t i = 0; i < length; ++i )
    {
        crc ^= ( uint16_t ) buffer[i] << 8;
        for( uint16_t j = 0; j < 8; ++j )
        {
            crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
        }
    }

    return crc;
}

void transmit(unsigned target, uint8_t cmd)
{
    unsigned t_diff;
    uint16_t crc;

    Radio::radio.tx_buf[0] = cmd;
    t_diff = target - t.read_us();
    Radio::radio.tx_buf[1] = t_diff >> 24;
    Radio::radio.tx_buf[2] = t_diff >> 16;
    Radio::radio.tx_buf[3] = t_diff >> 8;
    Radio::radio.tx_buf[4] = t_diff & 0xff;
    crc = crc_ccitt(Radio::radio.tx_buf, 5);
    Radio::radio.tx_buf[5] = crc >> 8;
    Radio::radio.tx_buf[6] = crc & 0xff;

    Radio::Send(7, 0, 0, 0);

    for (tx_done = false; !tx_done; )
        Radio::service();

    printf("t_diff:%u crc:%04x\r\n", t_diff, crc);
}

#define TARGET_LATENCY      2000000
void send_alarm(uint8_t cmd)
{
    int i;
    unsigned target = t.read_us() + TARGET_LATENCY;
    printf("send_alarm() %u\n", target);

    for (i = 0; i < 5; i++) {
        transmit(target, cmd);
        wait(0.1);
    }
}

void debounce(DigitalIn* pin, uint8_t cmd)
{
    if (!pin->read()) {
        int i;
        for (i = 0; i < 5; i++) {
            wait(0.01);
            if (pin->read()) {
                printf("trans\r\n");
                break;
            }
        }
        if (i == 5)
            send_alarm(cmd);

        while (!pin->read())
            ;
    }
}

void txDoneCB()
{
    tx_done = true;
}

void rxDoneCB(uint8_t size, float Rssi, float Snr)
{
}

const RadioEvents_t rev = {
    /* Dio0_top_half */     NULL,
    /* TxDone_topHalf */    NULL,
    /* TxDone_botHalf */    txDoneCB,
    /* TxTimeout  */        NULL,
    /* RxDone  */           rxDoneCB,
    /* RxTimeout  */        NULL,
    /* RxError  */          NULL,
    /* FhssChangeChannel  */NULL,
    /* CadDone  */          NULL
};

int main()
{
    printf("\r\nreset-tx\r\n");

    pinA.mode(PullUp);
    pinB.mode(PullUp);
    pinC.mode(PullUp);
    pinD.mode(PullUp);

    wait(0.05);

    if (pinA.read() == 0) {
        printf("pinA-disabled\r\n");
        flags.enable_pin_A = 0;
    } else
        flags.enable_pin_A = 1;

    if (pinB.read() == 0) {
        printf("pinB-disabled\r\n");
        flags.enable_pin_B = 0;
    } else
        flags.enable_pin_B = 1;

    if (pinC.read() == 0) {
        printf("pinC-disabled\r\n");
        flags.enable_pin_C = 0;
    } else
        flags.enable_pin_C = 1;

    if (pinD.read() == 0) {
        printf("pinD-disabled\r\n");
        flags.enable_pin_D = 0;
    } else
        flags.enable_pin_D = 1;

    t.start();

    Radio::Init(&rev);

    Radio::Standby();
    Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
    Radio::LoRaPacketConfig(8, false, true, false);  // preambleLen, fixLen, crcOn, invIQ
    Radio::SetChannel(CF_HZ);

    Radio::set_tx_dbm(TX_DBM);
                
    for (;;) {       
        if (flags.enable_pin_A)
            debounce(&pinA, CMD_PINA);

        if (flags.enable_pin_B)
            debounce(&pinB, CMD_PINB);

        if (flags.enable_pin_C)
            debounce(&pinC, CMD_PINC);

        if (flags.enable_pin_D)
            debounce(&pinD, CMD_PIND);
    } // ..for (;;)
}