wayne roberts
/
alarm_analog_slave
receives notification of analog change; updates PWM out.
Diff: main.cpp
- Revision:
- 0:f4932a6188ea
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Oct 22 17:52:30 2018 -0700 @@ -0,0 +1,145 @@ +#include "radio.h" + +DigitalOut myled(LED1); + +#if defined(SX127x_H) || defined(SX126x_H) + #define BW_KHZ 500 + #define SPREADING_FACTOR 11 + #define CF_HZ 910800000 +#elif defined(SX128x_H) + #define BW_KHZ 200 + #define SPREADING_FACTOR 11 + #define CF_HZ 2487000000 +#endif + +PwmOut pwmA(PB_11); /* CN10-18 */ +PwmOut pwmB(PA_15); /* CN7-17 */ +PwmOut pwmC(PB_1); /* CN10-24 */ +PwmOut pwmD(PC_6); /* CN10-4 */ + +PwmOut* pwmPtr; +uint8_t pwm_hz; +uint8_t pwm_duty; +Timeout to; + +#define PIN_ASSERT_us 500000 + +#define CMD_PWM_A 0x02 +#define CMD_PWM_B 0x03 +#define CMD_PWM_C 0x04 +#define CMD_PWM_D 0x05 + +/**********************************************************************/ + +void alarm_pin_clr() +{ + pwmPtr->write(0); +} + +void alarm_pin_set() +{ + pwmPtr->period(1.0 / pwm_hz); + pwmPtr->write(pwm_duty / 255.0); + to.attach_us(&alarm_pin_clr, PIN_ASSERT_us); + printf("%uHz, duty:%.2f\r\n", pwm_hz, pwm_duty/255.0); +} + +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 get_alarm() +{ + uint16_t rx_crc, crc = crc_ccitt(Radio::radio.rx_buf, 7); + rx_crc = Radio::radio.rx_buf[7]; + rx_crc <<= 8; + rx_crc += Radio::radio.rx_buf[8]; + //printf("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc); + if (crc == rx_crc) { + uint8_t c = Radio::radio.rx_buf[0]; + if (c == CMD_PWM_A || c == CMD_PWM_B || c == CMD_PWM_C || c == CMD_PWM_D) { + pwm_hz = Radio::radio.rx_buf[1]; + pwm_duty = Radio::radio.rx_buf[2]; + unsigned delay; + delay = Radio::radio.rx_buf[3]; + delay <<= 8; + delay += Radio::radio.rx_buf[4]; + delay <<= 8; + delay += Radio::radio.rx_buf[5]; + delay <<= 8; + delay += Radio::radio.rx_buf[6]; + switch (c) { + case CMD_PWM_A: pwmPtr = &pwmA; break; + case CMD_PWM_B: pwmPtr = &pwmB; break; + case CMD_PWM_C: pwmPtr = &pwmC; break; + case CMD_PWM_D: pwmPtr = &pwmD; break; + } + to.attach_us(&alarm_pin_set, delay); + printf("delay:%u\r\n", delay); + } else + printf("cmd? %02x\r\n", Radio::radio.rx_buf[0]); + } else + printf("crc fail %04x, %04x\r\n", rx_crc, crc); +} + +void txDoneCB() +{ +} + +void rxDoneCB(uint8_t size, float Rssi, float Snr) +{ + get_alarm(); + printf("%.1fdBm snr:%.1fdB ", Rssi, 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-rx\r\n"); + + + 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::Rx(0); + + for (;;) { + Radio::service(); + } +}