wayne roberts
/
alarm_analog_slave
receives notification of analog change; updates PWM out.
main.cpp@1:3bd43cbba033, 2018-10-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |