|
@@ -165,61 +165,33 @@ static bool cmdqueue_could_enqueue_back(size_t len_asked, bool atomic_update = f
|
|
// Full buffer.
|
|
// Full buffer.
|
|
return false;
|
|
return false;
|
|
|
|
|
|
- if (serial_count > 0) {
|
|
|
|
- // If there is some data stored starting at bufindw, len_asked is certainly smaller than
|
|
|
|
- // the allocated data buffer. Try to reserve a new buffer and to move the already received
|
|
|
|
- // serial data.
|
|
|
|
- // How much memory to reserve for the commands pushed to the front?
|
|
|
|
- // End of the queue, when pushing to the end.
|
|
|
|
- size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
|
|
|
|
- if (bufindw < bufindr)
|
|
|
|
- // Simple case. There is a contiguous space between the write buffer and the read buffer.
|
|
|
|
- return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
|
|
|
|
- // Otherwise the free space is split between the start and end.
|
|
|
|
- if (// Could one fit to the end, including the reserve?
|
|
|
|
- endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
|
|
|
|
- // Could one fit to the end, and the reserve to the start?
|
|
|
|
- (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
|
|
|
|
- return true;
|
|
|
|
- // Could one fit both to the start?
|
|
|
|
- if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
|
|
|
|
- // Mark the rest of the buffer as used.
|
|
|
|
- memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
|
|
|
|
- // and point to the start.
|
|
|
|
- // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
|
|
|
|
- if (atomic_update)
|
|
|
|
- cli();
|
|
|
|
- bufindw = 0;
|
|
|
|
- if (atomic_update)
|
|
|
|
- sei();
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- // How much memory to reserve for the commands pushed to the front?
|
|
|
|
- // End of the queue, when pushing to the end.
|
|
|
|
- size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
|
|
|
|
- if (bufindw < bufindr)
|
|
|
|
- // Simple case. There is a contiguous space between the write buffer and the read buffer.
|
|
|
|
- return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
|
|
|
|
- // Otherwise the free space is split between the start and end.
|
|
|
|
- if (// Could one fit to the end, including the reserve?
|
|
|
|
- endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
|
|
|
|
- // Could one fit to the end, and the reserve to the start?
|
|
|
|
- (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
|
|
|
|
- return true;
|
|
|
|
- // Could one fit both to the start?
|
|
|
|
- if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
|
|
|
|
- // Mark the rest of the buffer as used.
|
|
|
|
- memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
|
|
|
|
- // and point to the start.
|
|
|
|
- // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
|
|
|
|
- if (atomic_update)
|
|
|
|
- cli();
|
|
|
|
- bufindw = 0;
|
|
|
|
- if (atomic_update)
|
|
|
|
- sei();
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
|
|
+ // If there is some data stored starting at bufindw, len_asked is certainly smaller than
|
|
|
|
+ // the allocated data buffer. Try to reserve a new buffer and to move the already received
|
|
|
|
+ // serial data.
|
|
|
|
+ // How much memory to reserve for the commands pushed to the front?
|
|
|
|
+ // End of the queue, when pushing to the end.
|
|
|
|
+ size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
|
|
|
|
+ if (bufindw < bufindr)
|
|
|
|
+ // Simple case. There is a contiguous space between the write buffer and the read buffer.
|
|
|
|
+ return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
|
|
|
|
+ // Otherwise the free space is split between the start and end.
|
|
|
|
+ if (// Could one fit to the end, including the reserve?
|
|
|
|
+ endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
|
|
|
|
+ // Could one fit to the end, and the reserve to the start?
|
|
|
|
+ (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
|
|
|
|
+ return true;
|
|
|
|
+ // Could one fit both to the start?
|
|
|
|
+ if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
|
|
|
|
+ // Mark the rest of the buffer as used.
|
|
|
|
+ memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
|
|
|
|
+ // and point to the start.
|
|
|
|
+ // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
|
|
|
|
+ if (atomic_update)
|
|
|
|
+ cli();
|
|
|
|
+ bufindw = 0;
|
|
|
|
+ if (atomic_update)
|
|
|
|
+ sei();
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|