void ModelViewController::Move(string axis, float distance) { if(serial->isPrinting()) { fl_alert("Can't move manually while printing"); return; } if(axis == "X" || axis == "Y" || axis == "Z") { SendNow("G91"); // relative positioning string buffer="G1 F"; std::stringstream oss; if(axis == "Z") oss << ProcessControl.MaxPrintSpeedZ; else oss << ProcessControl.MaxPrintSpeedXY; buffer+= oss.str(); SendNow(buffer); buffer="G1 "; buffer += axis; oss.str(""); oss << distance; buffer+= oss.str(); oss.str(""); if(axis == "Z") oss << ProcessControl.MaxPrintSpeedZ; else oss << ProcessControl.MaxPrintSpeedXY; buffer+=" F"+oss.str(); SendNow(buffer); SendNow("G90"); // absolute positioning } else fl_alert("Move called with unknown axis"); }
void ModelViewController::Goto(string axis, float position) { if(serial->isPrinting()) { fl_alert("Can't move manually while printing"); return; } if(axis == "X" || axis == "Y" || axis == "Z") { string buffer="G1 F"; std::stringstream oss; oss << ProcessControl.MaxPrintSpeedXY; buffer+= oss.str(); SendNow(buffer); buffer="G1 "; buffer += axis; oss.str(""); oss << position; buffer+= oss.str(); oss.str(""); oss << ProcessControl.MaxPrintSpeedXY; buffer+=" F"+oss.str(); SendNow(buffer); } else fl_alert("Goto called with unknown axis"); }
void Model::Goto(string axis, float position) { if(m_printing) { alert("Can't move manually while printing"); return; } if(axis == "X" || axis == "Y" || axis == "Z") { string buffer="G1 F"; std::stringstream oss; oss << settings.Hardware.MaxPrintSpeedXY; buffer+= oss.str(); SendNow(buffer); buffer="G1 "; buffer += axis; oss.str(""); oss << position; buffer+= oss.str(); oss.str(""); oss << settings.Hardware.MaxPrintSpeedXY; buffer+=" F"+oss.str(); SendNow(buffer); } else alert("Goto called with unknown axis"); }
void Model::Move(string axis, float distance) { if(m_printing) { alert("Can't move manually while printing"); return; } if(axis == "X" || axis == "Y" || axis == "Z") { SendNow("G91"); // relative positioning string buffer="G1 F"; std::stringstream oss; if(axis == "Z") oss << settings.Hardware.MaxPrintSpeedZ; else oss << settings.Hardware.MaxPrintSpeedXY; buffer+= oss.str(); SendNow(buffer); buffer="G1 "; buffer += axis; oss.str(""); oss << distance; buffer+= oss.str(); oss.str(""); if(axis == "Z") oss << settings.Hardware.MaxPrintSpeedZ; else oss << settings.Hardware.MaxPrintSpeedXY; buffer+=" F"+oss.str(); SendNow(buffer); SendNow("G90"); // absolute positioning } else alert("Move called with unknown axis"); }
bool Printer::temp_timeout_cb() { if (IsConnected() && m_model && m_model->settings.Misc.TempReadingEnabled) SendNow("M105"); UpdateTemperatureMonitor(); return true; }
void ModelViewController::Home(string axis) { if(serial->isPrinting()) { fl_alert("Can't go home while printing"); return; } if(axis == "X" || axis == "Y" || axis == "Z") { string buffer="G1 F"; std::stringstream oss; if(axis == "Z") oss << ProcessControl.MaxPrintSpeedZ; else oss << ProcessControl.MaxPrintSpeedXY; buffer+= oss.str(); SendNow(buffer); buffer="G1 "; buffer += axis; buffer+="-250 F"; buffer+= oss.str(); SendNow(buffer); buffer="G92 "; buffer += axis; buffer+="0"; SendNow(buffer); // Set this as home oss.str(""); buffer="G1 "; buffer += axis; buffer+="1 F"; buffer+= oss.str(); SendNow(buffer); if(axis == "Z") oss << ProcessControl.MinPrintSpeedZ; else oss << ProcessControl.MinPrintSpeedXY; buffer="G1 "; buffer+="F"; buffer+= oss.str(); SendNow(buffer); // set slow speed buffer="G1 "; buffer += axis; buffer+="-10 F"; buffer+= oss.str(); SendNow(buffer); buffer="G92 "; buffer += axis; buffer+="0"; SendNow(buffer); // Set this as home } else if(axis == "ALL") { SendNow("G28"); } else fl_alert("Home called with unknown axis"); }
void Model::Home(string axis) { if(m_printing) { alert("Can't go home while printing"); return; } if(axis == "X" || axis == "Y" || axis == "Z") { string buffer="G1 F"; std::stringstream oss; if(axis == "Z") oss << settings.Hardware.MaxPrintSpeedZ; else oss << settings.Hardware.MaxPrintSpeedXY; buffer+= oss.str(); SendNow(buffer); buffer="G1 "; buffer += axis; buffer+="-250 F"; buffer+= oss.str(); SendNow(buffer); buffer="G92 "; buffer += axis; buffer+="0"; SendNow(buffer); // Set this as home oss.str(""); buffer="G1 "; buffer += axis; buffer+="1 F"; buffer+= oss.str(); SendNow(buffer); if(axis == "Z") oss << settings.Hardware.MinPrintSpeedZ; else oss << settings.Hardware.MinPrintSpeedXY; buffer="G1 "; buffer+="F"; buffer+= oss.str(); SendNow(buffer); // set slow speed buffer="G1 "; buffer += axis; buffer+="-10 F"; buffer+= oss.str(); SendNow(buffer); buffer="G92 "; buffer += axis; buffer+="0"; SendNow(buffer); // Set this as home } else if(axis == "ALL") { SendNow("G28"); } else alert("Home called with unknown axis"); }
void RepRapSerial::SetDebugMask() { std::stringstream oss; string buffer="M111 S"; oss << debugMask; buffer += oss.str(); SendNow(buffer); }
void Model::RunExtruder (double extruder_speed, double extruder_length, bool reverse) { static bool extruderIsRunning = false; if (settings.Slicing.Use3DGcode) { if (extruderIsRunning) SendNow("M103"); else SendNow("M101"); extruderIsRunning = !extruderIsRunning; return; } std::stringstream oss; string command("G1 F"); oss << extruder_speed; command += oss.str(); SendNow(command); oss.str(""); // set extruder zero SendNow("G92 E0"); oss << extruder_length; string command2("G1 E"); if (reverse) command2+="-"; command2+=oss.str(); SendNow(command2); SendNow("G1 F1500.0"); SendNow("G92 E0"); // set extruder zero }
void RepRapSerial::DisConnect() { if( m_bConnected ) SendNow("M81"); notifyConnection (false); com->close(); Clear(); gui->MVC->serialConnectionLost(); }
bool Printer::SelectExtruder(int extruder_no) { if (extruder_no >= 0){ ostringstream os; os << "T" << extruder_no; return SendNow(os.str()); } return true; // do nothing }
bool Printer::RunExtruder (double extruder_speed, double extruder_length, bool reverse, int extruder_no) { //static bool extruderIsRunning = false; // 3D assert(m_model != NULL); // Need a model first // if (m_model->settings.Slicing.Use3DGcode) { // if (extruderIsRunning) // SendNow("M103"); // else // SendNow("M101"); // extruderIsRunning = !extruderIsRunning; // return; // } if (extruder_no >= 0) if (!SelectExtruder(extruder_no)) return false; std::stringstream oss; string command("G1 F"); oss << extruder_speed; command += oss.str(); if (!SendNow(command)) return false; oss.str(""); // set extruder zero if (!SendNow("G92 E0")) return false; oss << extruder_length; string command2("G1 E"); if (reverse) command2+="-"; command2+=oss.str(); if (!SendNow(command2)) return false; if (!SendNow("G1 F1500.0")) return false; return SendNow("G92 E0"); // set extruder zero }
void RepRapSerial::Connect(string port, int speed) { bool error = false; if( m_bConnecting ) return; m_bConnected = false; m_bConnecting = true; c.notify_all(); std::stringstream oss; oss << "Connecting to port: " << port << " at speed " << speed; debugPrint( oss.str() ); delete com; com = new RepRapBufferedAsyncSerial(this); try{ com->open(port.c_str(), speed); } catch (std::exception& e) { error = true; stringstream oss; oss<<"Exception: " << e.what() << ":" << port.c_str() << endl; debugPrint(oss.str(), true); } if( error ) { ToolkitLock guard; m_bConnecting = false; gui->MVC->serialConnectionLost(); return; } if( m_bValidateConnection ) { ConnectionTimeOut* timeout= new ConnectionTimeOut(); timeout->serial = this; timeout->ConnectAttempt = ++ConnectAttempt; timeout->timer = 5; Fl::add_timeout(1.0f, &ConnectionTimeOutMethod, timeout); // probe the device to see if it is a reprap SendNow("M105"); } else { ToolkitLock guard; notifyConnection(true); gui->MVC->serialConnected(); } Fl::add_timeout(1.0f, &TempReadTimer); }
bool Printer::SetTemp(TempType type, float value, int extruder_no) { ostringstream os; switch (type) { case TEMP_NOZZLE: os << "M104 S"; break; case TEMP_BED: os << "M140 S"; break; default: cerr << "No such Temptype: " << type << endl; return false; } os << value << endl; if (extruder_no >= 0) if (!SelectExtruder(extruder_no)) return false; return SendNow(os.str()); }
/// Will not buffer anything but always send right away. Blocks. /// This will send the upbuffer (if non-empty) first, then the data. /// Any data that could not be send will block until it can be send or the connection is severed. void Socket::Connection::SendNow(const std::string & data){ SendNow(data.c_str(), data.size()); }
/// Will not buffer anything but always send right away. Blocks. /// This will send the upbuffer (if non-empty) first, then the data. /// Any data that could not be send will block until it can be send or the connection is severed. void Socket::Connection::SendNow(const char * data){ int len = strlen(data); SendNow(data, len); }
/// Sends a UDP datagram using the buffer sdata. /// sdata is required to be NULL-terminated. /// This function simply calls SendNow(const char*, size_t) void Socket::UDPConnection::SendNow(const char * sdata) { int len = strlen(sdata); SendNow(sdata, len); }
// RPC internal call PACK *RpcCallInternal(RPC *r, PACK *p) { BUF *b; UINT size; PACK *ret; void *tmp; // Validate arguments if (r == NULL || p == NULL) { return NULL; } if (r->Sock == NULL) { return NULL; } b = PackToBuf(p); size = Endian32(b->Size); SendAdd(r->Sock, &size, sizeof(UINT)); SendAdd(r->Sock, b->Buf, b->Size); FreeBuf(b); if (SendNow(r->Sock, r->Sock->SecureMode) == false) { return NULL; } if (RecvAll(r->Sock, &size, sizeof(UINT), r->Sock->SecureMode) == false) { return NULL; } size = Endian32(size); if (size > MAX_PACK_SIZE) { return NULL; } tmp = MallocEx(size, true); if (RecvAll(r->Sock, tmp, size, r->Sock->SecureMode) == false) { Free(tmp); return NULL; } b = NewBuf(); WriteBuf(b, tmp, size); SeekBuf(b, 0, 0); Free(tmp); ret = BufToPack(b); if (ret == NULL) { FreeBuf(b); return NULL; } FreeBuf(b); return ret; }
// Wait for the next RPC call bool RpcRecvNextCall(RPC *r) { UINT size; void *tmp; SOCK *s; BUF *b; PACK *p; PACK *ret; // Validate arguments if (r == NULL) { return false; } s = r->Sock; if (RecvAll(s, &size, sizeof(UINT), s->SecureMode) == false) { return false; } size = Endian32(size); if (size > MAX_PACK_SIZE) { return false; } tmp = MallocEx(size, true); if (RecvAll(s, tmp, size, s->SecureMode) == false) { Free(tmp); return false; } b = NewBuf(); WriteBuf(b, tmp, size); SeekBuf(b, 0, 0); Free(tmp); p = BufToPack(b); FreeBuf(b); if (p == NULL) { return false; } ret = CallRpcDispatcher(r, p); FreePack(p); if (ret == NULL) { ret = PackError(ERR_NOT_SUPPORTED); } b = PackToBuf(ret); FreePack(ret); size = Endian32(b->Size); SendAdd(s, &size, sizeof(UINT)); SendAdd(s, b->Buf, b->Size); if (SendNow(s, s->SecureMode) == false) { FreeBuf(b); return false; } FreeBuf(b); return true; }
void Model::STOP() { SendNow ("M112"); rr_dev_reset (m_device); }
/// Sends a UDP datagram using the buffer sdata. /// This function simply calls SendNow(const char*, size_t) void Socket::UDPConnection::SendNow(const std::string & sdata) { SendNow(sdata.c_str(), sdata.size()); }
void ModelViewController::STOP() { SendNow("M112"); serial->Clear(); // reset buffer }