return -1;
return next_send(&pp->presses[i]);
}
+
+bool get_press_due_for_resend(press_pile_t *pp, uint32_t now, press_t *press) {
+ pheap_node_id_t i = ph_peek_head(pp->sleeps_heap);
+ if (i == 0 || next_send(&pp->presses[i]) > now)
+ return false;
+ if (ph_remove_head(pp->sleeps_heap, true) != i)
+ signal_error_by_blinking();
+ *press = pp->presses[i];
+ return true;
+}
* Returns -1 if there's nothing pending. */
int32_t next_scheduled_send(press_pile_t *pp);
+/* Find a press ready for resend at or before `now`.
+ * Move it out of the press-pile `pp` and into into `press`.
+ * Or return false if there is no press due for re-send. */
+bool get_press_due_for_resend(press_pile_t *pp, uint32_t now, press_t *press);
+
#endif
set_resend_alarm(alarm, now, act_time);
return;
}
- pheap_node_id_t i = ph_remove_head(pp->sleeps_heap, false);
- press_t *press = &pp->presses[i];
- uint32_t ago = now - press->timestamp;
- send_report_packet(press->seq, ago);
- press->send_count++;
- if (press->send_count < config_resend_count)
- ph_insert_node(pp->sleeps_heap, i);
- else
- ph_free_node(pp->sleeps_heap, i);
+ press_t press;
+ if (!get_press_due_for_resend(pp, now, &press))
+ signal_error_by_blinking();
+ uint32_t ago = now - press.timestamp;
+ send_report_packet(press.seq, ago);
+ press.send_count++;
+ if (press.send_count < config_resend_count) {
+ add_press(pp, &press);
+ }
}
}