*/
#include "ao.h"
+#if HAS_PAD
+#include <ao_pad.h>
+#endif
/* Values from SmartRF® Studio for:
*
RF_BSCFG_BS_POST_KI_PRE_KI|
RF_BSCFG_BS_POST_KP_PRE_KP|
RF_BSCFG_BS_LIMIT_0),
- RF_AGCCTRL2_OFF, 0x43,
+ RF_AGCCTRL2_OFF, 0x03,
RF_AGCCTRL1_OFF, 0x40,
RF_AGCCTRL0_OFF, 0x91,
RF_MDMCFG3_OFF, (RDF_DRATE_M << RF_MDMCFG3_DRATE_M_SHIFT),
RF_MDMCFG2_OFF, (RF_MDMCFG2_DEM_DCFILT_OFF |
RF_MDMCFG2_MOD_FORMAT_GFSK |
- RF_MDMCFG2_SYNC_MODE_15_16_THRES),
+ RF_MDMCFG2_SYNC_MODE_NONE),
RF_MDMCFG1_OFF, (RF_MDMCFG1_FEC_DIS |
RF_MDMCFG1_NUM_PREAMBLE_2 |
(2 << RF_MDMCFG1_CHANSPC_E_SHIFT)),
__xdata uint8_t ao_radio_abort;
__xdata uint8_t ao_radio_mutex;
+#if PACKET_HAS_MASTER || HAS_AES
+#define NEED_RADIO_RSSI 1
+#endif
+
+#ifndef NEED_RADIO_RSSI
+#define NEED_RADIO_RSSI 0
+#endif
+
+#if NEED_RADIO_RSSI
+__xdata int8_t ao_radio_rssi;
+#endif
+
void
ao_radio_general_isr(void) __interrupt 16
{
}
}
-void
+static void
ao_radio_set_packet(void)
{
uint8_t i;
RF[fixed_pkt_setup[i]] = fixed_pkt_setup[i+1];
}
-void
+static void
ao_radio_idle(void)
{
if (RF_MARCSTATE != RF_MARCSTATE_IDLE)
}
}
-void
+#define ao_radio_put() ao_mutex_put(&ao_radio_mutex)
+
+static void
ao_radio_get(uint8_t len)
{
ao_config_get();
ao_mutex_get(&ao_radio_mutex);
ao_radio_idle();
- RF_CHANNR = ao_config.radio_channel;
+ RF_CHANNR = 0;
RF_FREQ2 = (uint8_t) (ao_config.radio_setting >> 16);
RF_FREQ1 = (uint8_t) (ao_config.radio_setting >> 8);
RF_FREQ0 = (uint8_t) (ao_config.radio_setting);
}
uint8_t
-ao_radio_recv(__xdata void *packet, uint8_t size) __reentrant
+ao_radio_recv(__xdata void *packet, uint8_t size, uint8_t timeout) __reentrant
{
ao_radio_abort = 0;
ao_radio_get(size - 2);
/* Wait for DMA to be done, for the radio receive process to
* get aborted or for a receive timeout to fire
*/
+ if (timeout)
+ ao_alarm(timeout);
__critical while (!ao_radio_dma_done && !ao_radio_abort)
if (ao_sleep(&ao_radio_dma_done))
break;
+ if (timeout)
+ ao_clear_alarm();
/* If recv was aborted, clean up by stopping the DMA engine
* and idling the radio
if (!ao_radio_dma_done) {
ao_dma_abort(ao_radio_dma);
ao_radio_idle();
+#if NEED_RADIO_RSSI
+ ao_radio_rssi = 0;
+#endif
}
+#if NEED_RADIO_RSSI
+ else
+ ao_radio_rssi = AO_RSSI_FROM_RADIO(((uint8_t *)packet)[size - 1]);
+#endif
ao_radio_put();
return ao_radio_dma_done;
}
ao_wakeup(&ao_radio_dma_done);
}
-__xdata ao_radio_rdf_value = 0x55;
+__code ao_radio_rdf_value = 0x55;
-void
-ao_radio_rdf(uint8_t pkt_len)
+static void
+ao_radio_rdf_start(void)
{
uint8_t i;
-
ao_radio_abort = 0;
- ao_radio_get(pkt_len);
+ ao_radio_get(AO_RADIO_RDF_LEN);
ao_radio_done = 0;
for (i = 0; i < sizeof (rdf_setup); i += 2)
RF[rdf_setup[i]] = rdf_setup[i+1];
+}
- ao_dma_set_transfer(ao_radio_dma,
- &ao_radio_rdf_value,
- &RFDXADDR,
- pkt_len,
- DMA_CFG0_WORDSIZE_8 |
- DMA_CFG0_TMODE_SINGLE |
- DMA_CFG0_TRIGGER_RADIO,
- DMA_CFG1_SRCINC_0 |
- DMA_CFG1_DESTINC_0 |
- DMA_CFG1_PRIORITY_HIGH);
+static void
+ao_radio_rdf_run(void)
+{
ao_dma_start(ao_radio_dma);
RFST = RFST_STX;
__critical while (!ao_radio_done && !ao_radio_abort)
ao_radio_put();
}
+void
+ao_radio_rdf(void)
+{
+ ao_radio_rdf_start();
+
+ ao_dma_set_transfer(ao_radio_dma,
+ CODE_TO_XDATA(&ao_radio_rdf_value),
+ &RFDXADDR,
+ AO_RADIO_RDF_LEN,
+ DMA_CFG0_WORDSIZE_8 |
+ DMA_CFG0_TMODE_SINGLE |
+ DMA_CFG0_TRIGGER_RADIO,
+ DMA_CFG1_SRCINC_0 |
+ DMA_CFG1_DESTINC_0 |
+ DMA_CFG1_PRIORITY_HIGH);
+ ao_radio_rdf_run();
+}
+
+#define PA 0x00
+#define BE 0x55
+
+#define CONT_PAUSE_8 PA, PA, PA, PA, PA, PA, PA, PA
+#define CONT_PAUSE_16 CONT_PAUSE_8, CONT_PAUSE_8
+#define CONT_PAUSE_24 CONT_PAUSE_16, CONT_PAUSE_8
+
+#define CONT_BEEP_8 BE, BE, BE, BE, BE, BE, BE, BE
+
+#if AO_RADIO_CONT_PAUSE_LEN == 24
+#define CONT_PAUSE CONT_PAUSE_24
+#endif
+
+#if AO_RADIO_CONT_TONE_LEN == 8
+#define CONT_BEEP CONT_BEEP_8
+#define CONT_PAUSE_SHORT CONT_PAUSE_8
+#endif
+
+#define CONT_ADDR(c) CODE_TO_XDATA(&ao_radio_cont[(3-(c)) * (AO_RADIO_CONT_PAUSE_LEN + AO_RADIO_CONT_TONE_LEN)])
+
+__code uint8_t ao_radio_cont[] = {
+ CONT_PAUSE, CONT_BEEP,
+ CONT_PAUSE, CONT_BEEP,
+ CONT_PAUSE, CONT_BEEP,
+ CONT_PAUSE, CONT_PAUSE_SHORT,
+ CONT_PAUSE, CONT_PAUSE_SHORT,
+ CONT_PAUSE,
+};
+
+void
+ao_radio_continuity(uint8_t c)
+{
+ ao_radio_rdf_start();
+ ao_dma_set_transfer(ao_radio_dma,
+ CONT_ADDR(c),
+ &RFDXADDR,
+ AO_RADIO_CONT_TOTAL_LEN,
+ DMA_CFG0_WORDSIZE_8 |
+ DMA_CFG0_TMODE_SINGLE |
+ DMA_CFG0_TRIGGER_RADIO,
+ DMA_CFG1_SRCINC_1 |
+ DMA_CFG1_DESTINC_0 |
+ DMA_CFG1_PRIORITY_HIGH);
+ ao_radio_rdf_run();
+}
+
void
ao_radio_rdf_abort(void)
{
/* Output carrier */
+
+static __xdata ao_radio_test_on;
+
void
-ao_radio_test(void)
+ao_radio_test(uint8_t on)
+{
+ if (on) {
+ if (!ao_radio_test_on) {
+#if HAS_MONITOR
+ ao_monitor_disable();
+#endif
+#if PACKET_HAS_SLAVE
+ ao_packet_slave_stop();
+#endif
+#if HAS_PAD
+ ao_pad_disable();
+#endif
+ ao_radio_get(0xff);
+ RFST = RFST_STX;
+ ao_radio_test_on = 1;
+ }
+ } else {
+ if (ao_radio_test_on) {
+ ao_radio_idle();
+ ao_radio_put();
+ ao_radio_test_on = 0;
+#if HAS_MONITOR
+ ao_monitor_enable();
+#endif
+#if HAS_PAD
+ ao_pad_enable();
+#endif
+ }
+ }
+}
+
+static void
+ao_radio_test_cmd(void)
{
uint8_t mode = 2;
static __xdata radio_on;
mode = (uint8_t) ao_cmd_lex_u32;
}
mode++;
- if ((mode & 2) && !radio_on) {
-#if HAS_MONITOR
- ao_set_monitor(0);
-#endif
-#if PACKET_HAS_SLAVE
- ao_packet_slave_stop();
-#endif
- ao_radio_get(0xff);
- RFST = RFST_STX;
- radio_on = 1;
- }
+ if ((mode & 2))
+ ao_radio_test(1);
if (mode == 3) {
printf ("Hit a character to stop..."); flush();
getchar();
putchar('\n');
}
- if ((mode & 1) && radio_on) {
- ao_radio_idle();
- ao_radio_put();
- radio_on = 0;
- }
+ if ((mode & 1))
+ ao_radio_test(0);
}
__code struct ao_cmds ao_radio_cmds[] = {
- { ao_radio_test, "C <1 start, 0 stop, none both>\0Radio carrier test" },
+ { ao_radio_test_cmd, "C <1 start, 0 stop, none both>\0Radio carrier test" },
{ 0, NULL },
};