I gave a the HAL code a more detailed review, so I think there's a possibility to implement something like a simple 'collision avoidance' using RPD register. First, here's some info from the datasheet:
Now, let's do some calculations.
We have ~42 byte packets max (1 + 5 + 2 + 32 + 2). These take 42/250000.0 * 1000 * 1000 = 168 uS of radio time at 250000. With that in mind, I'd try something like this.
LOCAL bool RF24_sendMessage(const uint8_t recipient, const void *buf, const uint8_t len,
const bool noACK)
{
int retry = 5;
while (retry--) {
RF24_stopListening();
if (RF24_testRPD()) { //Something was talking on the radio, we have to wait for a while
RF24_startListening(); //Start listening again and wait.
delay_us(180 * 2); // Delay enough time to chew up at least 2 radio packets at 250Kbps
}
But that would be RF24-specific. Another idea is making the delays dependent on NODE_ID and implement something like a simple bus arbiter, so that nodes with lower NODE_ID have more priority. I will only be able to give this a shot on the weekend, so feel free to try it out.