void rcvRadio(void) { static uint8_t buffer[RADIO_MAX_PACKET]; uint16_t len; len = radioRecv(buffer, sizeof(buffer)); ++rxOk; if (rxOk > 3) rxOk = 3; }
void radioRecvCb() { static uint8_t buffer[128]; int16_t len; redLedToggle(); len = radioRecv(buffer, sizeof(buffer) - 1); if (len <= 0) { PRINTF("radio recv failed, len=%d\n", len); return; } if (len > 0) { buffer[len] = 0; PRINTF("recv: %s\n", (char *) buffer); } }
// -------------------------------------------- // -------------------------------------------- void onRadioRecv(void) { static bool flRxProcessing=false; if(flRxProcessing){ #ifdef PRINT_PACKETS PRINTF("RX Locked\n"); #endif return; } flRxProcessing=true; // There is a chance for a small race condition #ifdef PRINT_PACKETS uint32_t rxTime = getTimeMs(); #endif int16_t rxLen; rssi_t rssi; lqi_t lqi; rxIdx++; if( rxIdx < 0 ) rxIdx=0; led1Toggle(); // rxLen = radioRecv( &(DB_REC(db)), DB_REC_SIZE(db)); // DB_REC(db).recLen = rxLen; rxLen = radioRecv(&radioBuffer, sizeof(radioBuffer)); rssi = radioGetLastRSSI(); lqi = radioGetLastLQI(); #ifdef PRINT_PACKETS PRINTF("%d\t%d\t%d\t%d\t%ld\t", (int)rxIdx, (int)rxLen, (int)rssi, (int)lqi, (long)rxTime); #endif #ifdef PRINT_PACKETS if (rxLen < 0) { PRINTF("RX failed\n"); } else if (rxLen > 0 ) { debugHexdump((uint8_t *) &radioBuffer, rxLen); // debugHexdump((uint8_t *) &(DB_REC(db)), rxLen); } #endif if (rxLen < 0) { led2Toggle(); flRxProcessing=false; return; } if( ! MSG_SIGNATURE_OK(radioBuffer) ) { flRxProcessing = false; return; } // Anticipated payload types. MSG_NEW_PAYLOAD_PTR(radioBuffer, phaser_ping_t, test_data_p); MSG_NEW_PAYLOAD_PTR(radioBuffer, phaser_control_t, ctrl_data_p); MSG_NEW_PAYLOAD_PTR(radioBuffer, msg_text_data_t, msg_text_p); MSG_NEW_PAYLOAD_PTR(radioBuffer, test_config_t, test_config_p); int act = MSG_ACT_CLEAR; bool flOK=true; switch( radioBuffer.id ){ case PH_MSG_Test: MSG_CHECK_FOR_PAYLOAD(radioBuffer, phaser_ping_t, flOK=false ); if( !flOK ){ PRINTF("BadChk\n"); break; } // Check if new experiment iteration started. if(lastExpIdx != test_data_p->expIdx && curExp){ sendTestResults(); } processTestMsg(test_data_p, rssi, lqi); break; case PH_MSG_Angle: if(curExp) sendTestResults(); if( flRestart ){ // Best time to resend the restart message after the angle change send_ctrl_msg(MSG_ACT_RESTART); flRestart = false; } break; case PH_MSG_Control: MSG_CHECK_FOR_PAYLOAD(radioBuffer, phaser_control_t, break); if(curExp) sendTestResults(); act = ctrl_data_p->action; if(act == MSG_ACT_START ){ flRestart = false; // Clear restart command attempt } printAction(act); break; case PH_MSG_Text: MSG_CHECK_FOR_PAYLOAD(radioBuffer, msg_text_data_t, break ); PRINTF(msg_text_p->text); PRINTF("\n"); break; case PH_MSG_Config: MSG_CHECK_FOR_PAYLOAD(radioBuffer, test_config_t, break ); PRINTF("Config received:\n"); // TODO: parse the config and print print_test_config(test_config_p); } flRxProcessing=false; }