diff --git a/src/boards/rp2040/sx1276-board.c b/src/boards/rp2040/sx1276-board.c index f6721bf..c734b37 100644 --- a/src/boards/rp2040/sx1276-board.c +++ b/src/boards/rp2040/sx1276-board.c @@ -67,11 +67,26 @@ const struct Radio_s Radio = static DioIrqHandler** irq_handlers; -void dio_gpio_callback(uint gpio, uint32_t events) +// void dio_gpio_callback(uint gpio, uint32_t events) +// { +// if (gpio == SX1276.DIO0.pin) { +// irq_handlers[0](NULL); +// } else if (gpio == SX1276.DIO1.pin) { +// irq_handlers[1](NULL); +// } +// } + + +void dio_gpio_callback() { - if (gpio == SX1276.DIO0.pin) { + if(gpio_get_irq_event_mask(SX1276.DIO0.pin) & GPIO_IRQ_EDGE_RISE) + { + gpio_acknowledge_irq(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE); irq_handlers[0](NULL); - } else if (gpio == SX1276.DIO1.pin) { + } + if(gpio_get_irq_event_mask(SX1276.DIO1.pin) & GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL) + { + gpio_acknowledge_irq(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL); irq_handlers[1](NULL); } } @@ -122,8 +137,18 @@ void SX1276IoIrqInit( DioIrqHandler **irqHandlers ) { irq_handlers = irqHandlers; - gpio_set_irq_enabled_with_callback(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true, &dio_gpio_callback); - gpio_set_irq_enabled_with_callback(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &dio_gpio_callback); + gpio_add_raw_irq_handler(SX1276.DIO0.pin,&dio_gpio_callback); + gpio_set_irq_enabled(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true); + + irq_set_enabled(IO_IRQ_BANK0,true); + + gpio_add_raw_irq_handler(SX1276.DIO1.pin,&dio_gpio_callback); + gpio_set_irq_enabled(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true); + + irq_set_enabled(IO_IRQ_BANK0,true); + + // gpio_set_irq_enabled_with_callback(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true, &dio_gpio_callback); + // gpio_set_irq_enabled_with_callback(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &dio_gpio_callback); } /*! @@ -217,4 +242,4 @@ static uint8_t SX1276GetPaSelect( int8_t power ) uint32_t SX1276GetBoardTcxoWakeupTime( void ) { return 0; -} +} \ No newline at end of file diff --git a/src/include/pico/lorawan.h b/src/include/pico/lorawan.h index be0a71f..85436d3 100644 --- a/src/include/pico/lorawan.h +++ b/src/include/pico/lorawan.h @@ -44,6 +44,8 @@ struct lorawan_otaa_settings { const char* channel_mask; }; +int lorawan_change_device_class(DeviceClass_t newClass); + const char* lorawan_default_dev_eui(char* dev_eui); int lorawan_init(const struct lorawan_sx1276_settings* sx1276_settings, LoRaMacRegion_t region); diff --git a/src/lorawan.c b/src/lorawan.c index dc24e60..5dbaf60 100644 --- a/src/lorawan.c +++ b/src/lorawan.c @@ -184,6 +184,15 @@ static bool Debug = false; extern void EepromMcuInit(); extern uint8_t EepromMcuFlush(); + +static DeviceClass_t deviceClass = LORAWAN_DEFAULT_CLASS; + +int lorawan_change_device_class(DeviceClass_t newClass) +{ + deviceClass = newClass; + return LmHandlerRequestClass( deviceClass ); +} + const char* lorawan_default_dev_eui(char* dev_eui) { uint8_t boardId[8]; @@ -582,7 +591,7 @@ static void OnJoinRequest( LmHandlerJoinParams_t* params ) } else { - LmHandlerRequestClass( LORAWAN_DEFAULT_CLASS ); + LmHandlerRequestClass( deviceClass ); } }