2024-05-14 16:11:08 +03:00

179 lines
4.3 KiB
C

/* Mirf Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "mirf.h"
#if CONFIG_ADVANCED
void AdvancedSettings(NRF24_t * dev)
{
#if CONFIG_RF_RATIO_2M
ESP_LOGW(pcTaskGetName(0), "Set RF Data Ratio to 2MBps");
Nrf24_SetSpeedDataRates(dev, 1);
#endif // CONFIG_RF_RATIO_2M
#if CONFIG_RF_RATIO_1M
ESP_LOGW(pcTaskGetName(0), "Set RF Data Ratio to 1MBps");
Nrf24_SetSpeedDataRates(dev, 0);
#endif // CONFIG_RF_RATIO_2M
#if CONFIG_RF_RATIO_250K
ESP_LOGW(pcTaskGetName(0), "Set RF Data Ratio to 250KBps");
Nrf24_SetSpeedDataRates(dev, 2);
#endif // CONFIG_RF_RATIO_2M
ESP_LOGW(pcTaskGetName(0), "CONFIG_RETRANSMIT_DELAY=%d", CONFIG_RETRANSMIT_DELAY);
Nrf24_setRetransmitDelay(dev, CONFIG_RETRANSMIT_DELAY);
}
#endif // CONFIG_ADVANCED
#if CONFIG_PRIMARY
void primary(void *pvParameters)
{
ESP_LOGI(pcTaskGetName(0), "Start");
NRF24_t dev;
Nrf24_init(&dev);
uint8_t payload = 32;
uint8_t channel = CONFIG_RADIO_CHANNEL;
Nrf24_config(&dev, channel, payload);
// Set my own address using 5 characters
esp_err_t ret = Nrf24_setRADDR(&dev, (uint8_t *)"ABCDE");
if (ret != ESP_OK) {
ESP_LOGE(pcTaskGetName(0), "nrf24l01 not installed");
while(1) { vTaskDelay(1); }
}
// Set destination address using 5 characters
ret = Nrf24_setTADDR(&dev, (uint8_t *)"FGHIJ");
if (ret != ESP_OK) {
ESP_LOGE(pcTaskGetName(0), "nrf24l01 not installed");
while(1) { vTaskDelay(1); }
}
#if CONFIG_ADVANCED
AdvancedSettings(&dev);
#endif // CONFIG_ADVANCED
// Print settings
Nrf24_printDetails(&dev);
uint8_t buf[32];
while(1) {
TickType_t nowTick = xTaskGetTickCount();
sprintf((char *)buf, "Hello World %"PRIu32, nowTick);
Nrf24_send(&dev, buf);
memset(buf, 0, sizeof(buf));
ESP_LOGI(pcTaskGetName(0), "Wait for sending.....");
if (Nrf24_isSend(&dev, 1000)) {
ESP_LOGI(pcTaskGetName(0),"Send success:%s", buf);
// Wait for response
//ESP_LOGI(pcTaskGetName(0), "Wait for response.....");
bool received = false;
for(int i=0;i<100;i++) {
if (Nrf24_dataReady(&dev)) {
received = true;
break;
}
vTaskDelay(1);
}
if (received) {
Nrf24_getData(&dev, buf);
TickType_t diffTick = xTaskGetTickCount() - nowTick;
ESP_LOGI(pcTaskGetName(0), "Got response:[%s] Elapsed:%"PRIu32" ticks", buf, diffTick);
} else {
ESP_LOGW(pcTaskGetName(0), "No response");
}
} else {
ESP_LOGW(pcTaskGetName(0),"Send fail:");
}
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
#endif // CONFIG_PRIMARY
#if CONFIG_SECONDARY
void secondary(void *pvParameters)
{
ESP_LOGI(pcTaskGetName(0), "Start");
NRF24_t dev;
Nrf24_init(&dev);
uint8_t payload = 32;
uint8_t channel = CONFIG_RADIO_CHANNEL;
Nrf24_config(&dev, channel, payload);
// Set my own address using 5 characters
esp_err_t ret = Nrf24_setRADDR(&dev, (uint8_t *)"FGHIJ");
if (ret != ESP_OK) {
ESP_LOGE(pcTaskGetName(0), "nrf24l01 not installed");
while(1) { vTaskDelay(1); }
}
// Set destination address using 5 characters
ret = Nrf24_setTADDR(&dev, (uint8_t *)"ABCDE");
if (ret != ESP_OK) {
ESP_LOGE(pcTaskGetName(0), "nrf24l01 not installed");
while(1) { vTaskDelay(1); }
}
#if CONFIG_ADVANCED
AdvancedSettings(&dev);
#endif // CONFIG_ADVANCED
// Print settings
Nrf24_printDetails(&dev);
ESP_LOGI(pcTaskGetName(0), "Listening...");
uint8_t buf[32];
// Clear RX FiFo
while(1) {
if (Nrf24_dataReady(&dev) == false) break;
Nrf24_getData(&dev, buf);
}
while(1) {
// Wait for received data
if (Nrf24_dataReady(&dev)) {
Nrf24_getData(&dev, buf);
ESP_LOGI(pcTaskGetName(0), "Got data:%s", buf);
Nrf24_send(&dev, buf);
ESP_LOGI(pcTaskGetName(0), "Wait for sending.....");
if (Nrf24_isSend(&dev, 1000)) {
ESP_LOGI(pcTaskGetName(0),"Send success:%s", buf);
} else {
ESP_LOGW(pcTaskGetName(0),"Send fail:");
}
}
vTaskDelay(1);
}
}
#endif // CONFIG_SECONDARY
void app_main(void)
{
#if CONFIG_PRIMARY
xTaskCreate(&primary, "PRIMARY", 1024*3, NULL, 2, NULL);
#endif
#if CONFIG_SECONDARY
xTaskCreate(&secondary, "SECONDARY", 1024*3, NULL, 2, NULL);
#endif
}