static void _event_cb(netdev_t *dev, netdev_event_t event) { if (event == NETDEV_EVENT_ISR) { msg_t msg; msg.type = MSG_TYPE_ISR; msg.content.ptr = dev; if (msg_send(&msg, _recv_pid) <= 0) { puts("gnrc_netdev: possibly lost interrupt."); } } else { size_t len; netdev_sx127x_lora_packet_info_t packet_info; switch (event) { case NETDEV_EVENT_RX_COMPLETE: len = dev->driver->recv(dev, NULL, 0, 0); dev->driver->recv(dev, message, len, &packet_info); printf("{Payload: \"%s\" (%d bytes), RSSI: %i, SNR: %i, TOA: %lu}\n", message, (int)len, packet_info.rssi, (int)packet_info.snr, sx127x_get_time_on_air((const sx127x_t*)dev, len)); break; case NETDEV_EVENT_TX_COMPLETE: sx127x_set_sleep(&sx127x); puts("Transmission completed"); break; case NETDEV_EVENT_CAD_DONE: break; case NETDEV_EVENT_TX_TIMEOUT: sx127x_set_sleep(&sx127x); break; default: printf("Unexpected netdev event received: %d\n", event); break; } } }
static void _semtech_loramac_event_cb(netdev_t *dev, netdev_event_t event) { netdev_lora_rx_info_t packet_info; msg_t msg; msg.content.ptr = dev; switch (event) { case NETDEV_EVENT_ISR: msg.type = MSG_TYPE_ISR; if (msg_send(&msg, semtech_loramac_pid) <= 0) { DEBUG("[semtech-loramac] possibly lost interrupt.\n"); } break; case NETDEV_EVENT_TX_COMPLETE: sx127x_set_sleep((sx127x_t *)dev); semtech_loramac_radio_events.TxDone(); DEBUG("[semtech-loramac] Transmission completed\n"); break; case NETDEV_EVENT_TX_TIMEOUT: msg.type = MSG_TYPE_TX_TIMEOUT; if (msg_send(&msg, semtech_loramac_pid) <= 0) { DEBUG("[semtech-loramac] TX timeout, possibly lost interrupt.\n"); } break; case NETDEV_EVENT_RX_COMPLETE: { size_t len; uint8_t radio_payload[SX127X_RX_BUFFER_SIZE]; len = dev->driver->recv(dev, NULL, 0, 0); dev->driver->recv(dev, radio_payload, len, &packet_info); semtech_loramac_radio_events.RxDone(radio_payload, len, packet_info.rssi, packet_info.snr); break; } case NETDEV_EVENT_RX_TIMEOUT: msg.type = MSG_TYPE_RX_TIMEOUT; if (msg_send(&msg, semtech_loramac_pid) <= 0) { DEBUG("[semtech-loramac] RX timeout, possibly lost interrupt.\n"); } break; case NETDEV_EVENT_CRC_ERROR: DEBUG("[semtech-loramac] RX CRC error\n"); semtech_loramac_radio_events.RxError(); break; case NETDEV_EVENT_FHSS_CHANGE_CHANNEL: DEBUG("[semtech-loramac] FHSS channel change\n"); if(semtech_loramac_radio_events.FhssChangeChannel) { semtech_loramac_radio_events.FhssChangeChannel(( (sx127x_t *)dev)->_internal.last_channel); } break; case NETDEV_EVENT_CAD_DONE: DEBUG("[semtech-loramac] test: CAD done\n"); if(semtech_loramac_radio_events.CadDone) { semtech_loramac_radio_events.CadDone(( (sx127x_t *)dev)->_internal.is_last_cad_success); } break; default: DEBUG("[semtech-loramac] unexpected netdev event received: %d\n", event); } }