#include "libs/SerialMessage.h"
#include "StreamOutputPool.h"
+#include "mbed.h"
+
// extern void setled(int, bool);
#define setled(a, b) do {} while (0)
last_char_was_dollar = false;
}
-void USBSerial::ensure_tx_space(int space)
+bool USBSerial::ensure_tx_space(int space)
{
+ // we need some kind of timeout here or it will hang if upstream stalls
+ uint32_t start = us_ticker_read();
while (txbuf.free() < space) {
+ if((us_ticker_read() - start) > 1000000) {
+ // 1 second timeout
+ return false;
+ }
usb->endpointSetInterrupt(CDC_BulkIn.bEndpointAddress, true);
usb->usbisr();
}
+ return true;
}
int USBSerial::_putc(int c)
{
if (!attached)
return 1;
- ensure_tx_space(1);
- txbuf.queue(c);
+ if(ensure_tx_space(1)) {
+ txbuf.queue(c);
+ }
usb->endpointSetInterrupt(CDC_BulkIn.bEndpointAddress, true);
return 1;
return strlen(str);
int i = 0;
while (*str) {
- ensure_tx_space(1);
+ if(!ensure_tx_space(1)) break;
txbuf.queue(*str);
if ((txbuf.available() % 64) == 0)
usb->endpointSetInterrupt(CDC_BulkIn.bEndpointAddress, true);
virtual void on_attach(void);\r
virtual void on_detach(void);\r
\r
- void ensure_tx_space(int);\r
+ bool ensure_tx_space(int);\r
\r
// keep track of number of newlines in the buffer\r
// this makes it trivial to detect if there's a new line available\r
#define panel_checksum CHECKSUM("panel")
// goes in Flash, list of Mxxx codes that are allowed when in Halted state
-static const int allowed_mcodes[]= {2,5,9,30,105,114,119,80,81,911,503,106,107}; // get temp, get pos, get endstops etc
+static const int allowed_mcodes[]= {2,5,9,30,105,114,115,119,80,81,911,503,106,107}; // get temp, get pos, get endstops etc
static bool is_allowed_mcode(int m) {
for (size_t i = 0; i < sizeof(allowed_mcodes)/sizeof(int); ++i) {
if(allowed_mcodes[i] == m) return true;
return;
}
- stream->printf("Suspending print, waiting for queue to empty...\n");
+ stream->printf("// Suspending print, waiting for queue to empty...\n");
// override the leave_heaters_on setting
this->override_leave_heaters_on= (parameters == "h");
return;
}
- stream->printf("resuming print...\n");
+ stream->printf("// resuming print...\n");
// wait for them to reach temp
if(!this->saved_temperatures.empty()) {
float t= h.second;
PublicData::set_value( temperature_control_checksum, h.first, &t );
}
- stream->printf("Waiting for heaters...\n");
+ stream->printf("// Waiting for heaters...\n");
bool wait= true;
uint32_t tus= us_ticker_read(); // mbed call
while(wait) {
// execute optional gcode if defined
if(!before_resume_gcode.empty()) {
- stream->printf("Executing before resume gcode...\n");
+ stream->printf("// Executing before resume gcode...\n");
struct SerialMessage message;
message.message = before_resume_gcode;
message.stream = &(StreamOutput::NullStream);
}
// Restore position
- stream->printf("Restoring saved XYZ positions and state...\n");
+ stream->printf("// Restoring saved XYZ positions and state...\n");
THEROBOT->pop_state();
bool abs_mode= THEROBOT->absolute_mode; // what mode we were in
// force absolute mode for restoring position, then set to the saved relative/absolute mode
return;
}
- stream->printf("Resuming print\n");
+ stream->printf("// Resuming print\n");
if(this->was_playing_file) {
this->playing_file = true;