receives notification of analog change; updates PWM out.

Dependencies:   sx12xx_hal

Committer:
wroberts@semtech.com
Date:
Tue Oct 23 07:02:40 2018 -0700
Revision:
1:3bd43cbba033
Parent:
0:f4932a6188ea
remove radio driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:f4932a6188ea 1 #include "radio.h"
Wayne Roberts 0:f4932a6188ea 2
Wayne Roberts 0:f4932a6188ea 3 DigitalOut myled(LED1);
Wayne Roberts 0:f4932a6188ea 4
Wayne Roberts 0:f4932a6188ea 5 #if defined(SX127x_H) || defined(SX126x_H)
Wayne Roberts 0:f4932a6188ea 6 #define BW_KHZ 500
Wayne Roberts 0:f4932a6188ea 7 #define SPREADING_FACTOR 11
Wayne Roberts 0:f4932a6188ea 8 #define CF_HZ 910800000
Wayne Roberts 0:f4932a6188ea 9 #elif defined(SX128x_H)
Wayne Roberts 0:f4932a6188ea 10 #define BW_KHZ 200
Wayne Roberts 0:f4932a6188ea 11 #define SPREADING_FACTOR 11
Wayne Roberts 0:f4932a6188ea 12 #define CF_HZ 2487000000
Wayne Roberts 0:f4932a6188ea 13 #endif
Wayne Roberts 0:f4932a6188ea 14
Wayne Roberts 0:f4932a6188ea 15 PwmOut pwmA(PB_11); /* CN10-18 */
Wayne Roberts 0:f4932a6188ea 16 PwmOut pwmB(PA_15); /* CN7-17 */
Wayne Roberts 0:f4932a6188ea 17 PwmOut pwmC(PB_1); /* CN10-24 */
Wayne Roberts 0:f4932a6188ea 18 PwmOut pwmD(PC_6); /* CN10-4 */
Wayne Roberts 0:f4932a6188ea 19
Wayne Roberts 0:f4932a6188ea 20 PwmOut* pwmPtr;
Wayne Roberts 0:f4932a6188ea 21 uint8_t pwm_hz;
Wayne Roberts 0:f4932a6188ea 22 uint8_t pwm_duty;
Wayne Roberts 0:f4932a6188ea 23 Timeout to;
Wayne Roberts 0:f4932a6188ea 24
Wayne Roberts 0:f4932a6188ea 25 #define PIN_ASSERT_us 500000
Wayne Roberts 0:f4932a6188ea 26
Wayne Roberts 0:f4932a6188ea 27 #define CMD_PWM_A 0x02
Wayne Roberts 0:f4932a6188ea 28 #define CMD_PWM_B 0x03
Wayne Roberts 0:f4932a6188ea 29 #define CMD_PWM_C 0x04
Wayne Roberts 0:f4932a6188ea 30 #define CMD_PWM_D 0x05
Wayne Roberts 0:f4932a6188ea 31
Wayne Roberts 0:f4932a6188ea 32 /**********************************************************************/
Wayne Roberts 0:f4932a6188ea 33
Wayne Roberts 0:f4932a6188ea 34 void alarm_pin_clr()
Wayne Roberts 0:f4932a6188ea 35 {
Wayne Roberts 0:f4932a6188ea 36 pwmPtr->write(0);
Wayne Roberts 0:f4932a6188ea 37 }
Wayne Roberts 0:f4932a6188ea 38
Wayne Roberts 0:f4932a6188ea 39 void alarm_pin_set()
Wayne Roberts 0:f4932a6188ea 40 {
Wayne Roberts 0:f4932a6188ea 41 pwmPtr->period(1.0 / pwm_hz);
Wayne Roberts 0:f4932a6188ea 42 pwmPtr->write(pwm_duty / 255.0);
Wayne Roberts 0:f4932a6188ea 43 to.attach_us(&alarm_pin_clr, PIN_ASSERT_us);
Wayne Roberts 0:f4932a6188ea 44 printf("%uHz, duty:%.2f\r\n", pwm_hz, pwm_duty/255.0);
Wayne Roberts 0:f4932a6188ea 45 }
Wayne Roberts 0:f4932a6188ea 46
Wayne Roberts 0:f4932a6188ea 47 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
Wayne Roberts 0:f4932a6188ea 48 {
Wayne Roberts 0:f4932a6188ea 49 // The CRC calculation follows CCITT
Wayne Roberts 0:f4932a6188ea 50 const uint16_t polynom = 0x1021;
Wayne Roberts 0:f4932a6188ea 51 // CRC initial value
Wayne Roberts 0:f4932a6188ea 52 uint16_t crc = 0x0000;
Wayne Roberts 0:f4932a6188ea 53
Wayne Roberts 0:f4932a6188ea 54 if( buffer == NULL )
Wayne Roberts 0:f4932a6188ea 55 {
Wayne Roberts 0:f4932a6188ea 56 return 0;
Wayne Roberts 0:f4932a6188ea 57 }
Wayne Roberts 0:f4932a6188ea 58
Wayne Roberts 0:f4932a6188ea 59 for( uint16_t i = 0; i < length; ++i )
Wayne Roberts 0:f4932a6188ea 60 {
Wayne Roberts 0:f4932a6188ea 61 crc ^= ( uint16_t ) buffer[i] << 8;
Wayne Roberts 0:f4932a6188ea 62 for( uint16_t j = 0; j < 8; ++j )
Wayne Roberts 0:f4932a6188ea 63 {
Wayne Roberts 0:f4932a6188ea 64 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
Wayne Roberts 0:f4932a6188ea 65 }
Wayne Roberts 0:f4932a6188ea 66 }
Wayne Roberts 0:f4932a6188ea 67
Wayne Roberts 0:f4932a6188ea 68 return crc;
Wayne Roberts 0:f4932a6188ea 69 }
Wayne Roberts 0:f4932a6188ea 70
Wayne Roberts 0:f4932a6188ea 71 void get_alarm()
Wayne Roberts 0:f4932a6188ea 72 {
Wayne Roberts 0:f4932a6188ea 73 uint16_t rx_crc, crc = crc_ccitt(Radio::radio.rx_buf, 7);
Wayne Roberts 0:f4932a6188ea 74 rx_crc = Radio::radio.rx_buf[7];
Wayne Roberts 0:f4932a6188ea 75 rx_crc <<= 8;
Wayne Roberts 0:f4932a6188ea 76 rx_crc += Radio::radio.rx_buf[8];
Wayne Roberts 0:f4932a6188ea 77 //printf("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc);
Wayne Roberts 0:f4932a6188ea 78 if (crc == rx_crc) {
Wayne Roberts 0:f4932a6188ea 79 uint8_t c = Radio::radio.rx_buf[0];
Wayne Roberts 0:f4932a6188ea 80 if (c == CMD_PWM_A || c == CMD_PWM_B || c == CMD_PWM_C || c == CMD_PWM_D) {
Wayne Roberts 0:f4932a6188ea 81 pwm_hz = Radio::radio.rx_buf[1];
Wayne Roberts 0:f4932a6188ea 82 pwm_duty = Radio::radio.rx_buf[2];
Wayne Roberts 0:f4932a6188ea 83 unsigned delay;
Wayne Roberts 0:f4932a6188ea 84 delay = Radio::radio.rx_buf[3];
Wayne Roberts 0:f4932a6188ea 85 delay <<= 8;
Wayne Roberts 0:f4932a6188ea 86 delay += Radio::radio.rx_buf[4];
Wayne Roberts 0:f4932a6188ea 87 delay <<= 8;
Wayne Roberts 0:f4932a6188ea 88 delay += Radio::radio.rx_buf[5];
Wayne Roberts 0:f4932a6188ea 89 delay <<= 8;
Wayne Roberts 0:f4932a6188ea 90 delay += Radio::radio.rx_buf[6];
Wayne Roberts 0:f4932a6188ea 91 switch (c) {
Wayne Roberts 0:f4932a6188ea 92 case CMD_PWM_A: pwmPtr = &pwmA; break;
Wayne Roberts 0:f4932a6188ea 93 case CMD_PWM_B: pwmPtr = &pwmB; break;
Wayne Roberts 0:f4932a6188ea 94 case CMD_PWM_C: pwmPtr = &pwmC; break;
Wayne Roberts 0:f4932a6188ea 95 case CMD_PWM_D: pwmPtr = &pwmD; break;
Wayne Roberts 0:f4932a6188ea 96 }
Wayne Roberts 0:f4932a6188ea 97 to.attach_us(&alarm_pin_set, delay);
Wayne Roberts 0:f4932a6188ea 98 printf("delay:%u\r\n", delay);
Wayne Roberts 0:f4932a6188ea 99 } else
Wayne Roberts 0:f4932a6188ea 100 printf("cmd? %02x\r\n", Radio::radio.rx_buf[0]);
Wayne Roberts 0:f4932a6188ea 101 } else
Wayne Roberts 0:f4932a6188ea 102 printf("crc fail %04x, %04x\r\n", rx_crc, crc);
Wayne Roberts 0:f4932a6188ea 103 }
Wayne Roberts 0:f4932a6188ea 104
Wayne Roberts 0:f4932a6188ea 105 void txDoneCB()
Wayne Roberts 0:f4932a6188ea 106 {
Wayne Roberts 0:f4932a6188ea 107 }
Wayne Roberts 0:f4932a6188ea 108
Wayne Roberts 0:f4932a6188ea 109 void rxDoneCB(uint8_t size, float Rssi, float Snr)
Wayne Roberts 0:f4932a6188ea 110 {
Wayne Roberts 0:f4932a6188ea 111 get_alarm();
Wayne Roberts 0:f4932a6188ea 112 printf("%.1fdBm snr:%.1fdB ", Rssi, Snr);
Wayne Roberts 0:f4932a6188ea 113 }
Wayne Roberts 0:f4932a6188ea 114
Wayne Roberts 0:f4932a6188ea 115 const RadioEvents_t rev = {
Wayne Roberts 0:f4932a6188ea 116 /* Dio0_top_half */ NULL,
Wayne Roberts 0:f4932a6188ea 117 /* TxDone_topHalf */ NULL,
Wayne Roberts 0:f4932a6188ea 118 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 0:f4932a6188ea 119 /* TxTimeout */ NULL,
Wayne Roberts 0:f4932a6188ea 120 /* RxDone */ rxDoneCB,
Wayne Roberts 0:f4932a6188ea 121 /* RxTimeout */ NULL,
Wayne Roberts 0:f4932a6188ea 122 /* RxError */ NULL,
Wayne Roberts 0:f4932a6188ea 123 /* FhssChangeChannel */NULL,
Wayne Roberts 0:f4932a6188ea 124 /* CadDone */ NULL
Wayne Roberts 0:f4932a6188ea 125 };
Wayne Roberts 0:f4932a6188ea 126
Wayne Roberts 0:f4932a6188ea 127
Wayne Roberts 0:f4932a6188ea 128 int main()
Wayne Roberts 0:f4932a6188ea 129 {
Wayne Roberts 0:f4932a6188ea 130 printf("\r\nreset-rx\r\n");
Wayne Roberts 0:f4932a6188ea 131
Wayne Roberts 0:f4932a6188ea 132
Wayne Roberts 0:f4932a6188ea 133 Radio::Init(&rev);
Wayne Roberts 0:f4932a6188ea 134
Wayne Roberts 0:f4932a6188ea 135 Radio::Standby();
Wayne Roberts 0:f4932a6188ea 136 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 0:f4932a6188ea 137 Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 0:f4932a6188ea 138 Radio::SetChannel(CF_HZ);
Wayne Roberts 0:f4932a6188ea 139
Wayne Roberts 0:f4932a6188ea 140 Radio::Rx(0);
Wayne Roberts 0:f4932a6188ea 141
Wayne Roberts 0:f4932a6188ea 142 for (;;) {
Wayne Roberts 0:f4932a6188ea 143 Radio::service();
Wayne Roberts 0:f4932a6188ea 144 }
Wayne Roberts 0:f4932a6188ea 145 }