diff --git a/avrrfm.c b/avrrfm.c index 175407e..0716777 100644 --- a/avrrfm.c +++ b/avrrfm.c @@ -45,7 +45,7 @@ // set radio CS and RST pin as output pin DDR_RFM |= (1 << PIN_RCS); DDR_RFM |= (1 << PIN_RRST); - + // drive output pins high PORT_RFM |= (1 << PIN_RCS); } @@ -77,6 +77,21 @@ EICRA |= (1 << ISC01) | (1 << ISC00); // interrupt on rising edge } +/** + * Prints the given payload with the given size. + * + * @param payload + * @param size + */ +static void printPayload(uint8_t *payload, size_t size) { + printString("Length: "); + printUint(size); + printString("Payload:\r\n"); + char buf[FIFO_SIZE + 3]; + snprintf(buf, size + 3, "%s\r\n", payload); + printString(buf); +} + int main(void) { initUSART(); initPins(); @@ -86,16 +101,26 @@ // enable global interrupts sei(); - + printString("Hello Radio!\r\n"); - + initRadio(868600); + bool tx = false; + while (true) { - // transmitByte(123); - // transmitString("Hello Radio!"); - // _delay_ms(1000); - receive(); + if (tx) { + // uint8_t payload[] = {123}; + // transmitPayload(payload, sizeof(payload)); + char hello[] = "Hello Radio!"; + transmitPayload((uint8_t*)hello, sizeof(hello) - 1); + _delay_ms(1000); + } else { + uint8_t payload[FIFO_SIZE]; + memset(payload, 0, FIFO_SIZE); + uint8_t len = receivePayload(payload, sizeof (payload)); + printPayload(payload, len); + } } return 0; diff --git a/rfm69.c b/rfm69.c index 6142f76..4a60b51 100644 --- a/rfm69.c +++ b/rfm69.c @@ -145,7 +145,7 @@ printString("Init done\r\n"); } -void receive(void) { +size_t receivePayload(uint8_t *payload, size_t size) { // get "PayloadReady" on DIO0 regWrite(DIO_MAP1, 0x40); @@ -158,45 +158,24 @@ setMode(MODE_STDBY); size_t len = fmin(regRead(FIFO), FIFO_SIZE) - 1; - uint8_t address = regRead(FIFO); + len = fmin(len, size); - printString("Length: "); - printUint(len); - printString("Address: "); - printHex(address); - printString("Payload:\r\n"); + // TODO assume and ignore address for now + regRead(FIFO); + spiSel(); transmit(FIFO); for (size_t i = 0; i < len; i++) { - printUint(transmit(FIFO)); + payload[i] = (transmit(FIFO)); } spiDes(); + + return len; } -void transmitByte(uint8_t payload) { - spiSel(); - transmit(FIFO | 0x80); - transmit(2); - transmit(NODE_ADDRESS); - transmit(payload); - spiDes(); - - // get "PacketSent" on DIO0 (default) - regWrite(DIO_MAP1, 0x00); - - setMode(MODE_TX); - - loop_until_bit_is_set(irqFlags2, 3); - clearIrqFlags(); - - setMode(MODE_STDBY); - - printString("PacketSent\r\n"); -} - -size_t transmitString(char *payload) { +size_t transmitPayload(uint8_t *payload, size_t size) { // payload + address byte - size_t len = fmin(strlen(payload), FIFO_SIZE) + 1; + size_t len = fmin(size, FIFO_SIZE) + 1; spiSel(); transmit(FIFO | 0x80); @@ -210,14 +189,14 @@ // get "PacketSent" on DIO0 (default) regWrite(DIO_MAP1, 0x00); - printString("Sending...\r\n"); setMode(MODE_TX); loop_until_bit_is_set(irqFlags2, 3); clearIrqFlags(); - printString("PacketSent\r\n"); - + setMode(MODE_STDBY); + printString("PacketSent\r\n"); + return len; } diff --git a/rfm69.h b/rfm69.h index f51b777..48d0e0b 100644 --- a/rfm69.h +++ b/rfm69.h @@ -67,23 +67,21 @@ void initRadio(uint32_t kHz); /** - * Waits for a packet and prints it. - */ -void receive(void); - -/** - * Transmits one byte and prints some info. - */ -void transmitByte(uint8_t payload); - -/** - * Transmits up to 64 characters of the given string, excluding the - * terminal '\\0' character. + * Waits for a packet, puts the payload into the given array with the + * given size, and returns the length of the payload. * - * @param payload string to be sent - * @return characters sent + * @param payload buffer for payload + * @return bytes actually received */ -size_t transmitString(char *payload); +size_t receivePayload(uint8_t *payload, size_t size); + +/** + * Transmits up to 64 bytes of the given payload. + * + * @param payload to be sent + * @return bytes actually sent + */ +size_t transmitPayload(uint8_t *payload, size_t size); #endif /* RFM69_H */