Real cellular radios do not collapse straight from "sending data" back to "asleep." 3GPP's RRC state machine cascades through an intermediate step: after the last upload, the radio holds its high-power DCH state for a tail timer, then drops to a cheaper intermediate FACH state (still listening, much lower draw) for a second tail timer, and only then reaches true IDLE. Crucially, re-promoting from FACH back to DCH is far cheaper than re-promoting from IDLE — so whether a new flush lands inside the FACH window changes the energy bill a lot:
state: IDLE --flush--> DCH --tailDch expires--> FACH --tailFach expires--> IDLE
^ |
'--- flush (cheap, E_soft) -' flush while in FACH: soft re-promotion
flush while in IDLE: full re-promotion, cost E_full » E_soft
Battery(t) = Battery(t-dt) − P_state(t)·dt − [E_full if IDLE→DCH this step]
− [E_soft if FACH→DCH this step]
P_idle ≪ P_fach ≪ P_dch
This simulator's numbers: P_idle = 0.02%/s, P_fach = 0.25%/s, P_dch = 0.9%/s, a full IDLE→DCH promotion costs E_full = 0.15%, a soft FACH→DCH reactivation costs only E_soft = 0.03%. They are illustrative, not one specific chipset's datasheet, but the shape — three power tiers instead of two, and a much cheaper "catch it before it fully sleeps" reactivation — matches real UMTS/LTE RRC behaviour, and is the deeper mechanism the 3D companion sim (a simplified 2-state idle/active model) approximates.
- Event rate — how often the app generates a telemetry event.
- Batch flush threshold — how many queued events accumulate before the app calls the network. At 1, every event flushes on its own — the naive, worst case.
- DCH tail timer — how long the radio holds high power after the last flush before stepping down to FACH.
- FACH tail timer — how long the radio then holds the cheaper intermediate state before dropping all the way to IDLE. A flush that arrives inside this window only pays the small soft-reactivation cost.
- Poisson jitter — toggles whether telemetry events arrive as a random (Poisson) process, matching irregular real app traffic, or as a smooth deterministic stream at exactly the configured rate.
Real-world relevance: production mobile SDKs batch and debounce network calls partly to avoid re-triggering full IDLE→DCH promotions — landing every upload inside the cheaper FACH window (or avoiding the radio ever fully sleeping) is a deliberate, measurable battery-saving strategy, not just an implementation detail.