Layer: L7 Application ยท Build flags: PROTOCORE_ENABLE_RADIO_POWER (+ PROTOCORE_RADIO_WIFI_PS, optional PROTOCORE_RADIO_MAX_TX_DBM)
What this example teaches
On a battery device the WiFi radio dominates the power budget. This applies a WiFi modem-sleep mode (and an optional max-TX-power cap) after the link comes up, trading a little latency for lower average current. GET /radio reports the mode read back from the radio.
Apply after the link is up. The WiFi connect path may set its own default first, so the settings are applied once association completes:
Radio.power();
Serial.printf("radio modem-sleep: %s\n", Radio.ps_name(Radio.ps_mode()));
The mode is a build flag, not a runtime call, so it reaches the separately-compiled library: PROTOCORE_RADIO_WIFI_PS is 0 (none), 1 (min modem sleep), or 2 (max modem sleep), with an optional PROTOCORE_RADIO_MAX_TX_DBM cap. Radio.ps_mode() reads the live mode back and Radio.ps_name() turns it into a string for the endpoint.
Build and run
pio ci --board=esp32dev --project-option="framework=arduino" \
--project-option="build_flags=-DPROTOCORE_ENABLE_RADIO_POWER=1 -DPROTOCORE_RADIO_WIFI_PS=1" \
--lib="." examples/L7-Application/RadioPower/RadioPower.ino
curl http://<ip>/radio # {"modem_sleep":"min"}
Annotated source
The complete sketch (RadioPower.ino), reproduced verbatim with added explanatory comments:
#define PROTOCORE_ENABLE_RADIO_POWER 1
#include "protocore.h"
static const char *SSID = "YOUR_SSID";
static const char *PASSWORD = "YOUR_PASSWORD";
PC server;
void setup()
{
Serial.begin(115200);
Physical.wifi->init(SSID, PASSWORD);
while (!Physical.wifi->ready())
delay(250);
Serial.print("IP: ");
uint32_t ip = Physical.link->egress_ip();
Serial.printf("IP: %u.%u.%u.%u\n", (unsigned)(ip & 0xFF), (unsigned)((ip >> 8) & 0xFF),
(unsigned)((ip >> 16) & 0xFF), (unsigned)((ip >> 24) & 0xFF));
Radio.power();
Serial.printf("radio modem-sleep: %s\n", Radio.ps_name(Radio.ps_mode()));
char b[48];
snprintf(b, sizeof(b), "{\"modem_sleep\":\"%s\"}", Radio.ps_name(Radio.ps_mode()));
server.send(id, 200, "application/json", b);
});
server.begin(80);
}
void loop()
{
server.handle();
}
@ HTTP_GET
Safe, idempotent read.
Layer 1 (Physical) - link bring-up, the interface registry, and live egress reporting.
Layer 1 (Physical) - 802.11 power management and transmit power control (PROTOCORE_ENABLE_RADIO_POWER...