diff --git a/Drivers/Marlin/ACT/LibMCDriver_Marlin.xml b/Drivers/Marlin/ACT/LibMCDriver_Marlin.xml index 13988785..dbaa5391 100644 --- a/Drivers/Marlin/ACT/LibMCDriver_Marlin.xml +++ b/Drivers/Marlin/ACT/LibMCDriver_Marlin.xml @@ -109,6 +109,7 @@ Custom implementation + @@ -120,11 +121,18 @@ Custom implementation + + + + + + + @@ -148,7 +156,7 @@ Custom implementation - + @@ -185,6 +193,7 @@ Custom implementation + @@ -196,6 +205,7 @@ Custom implementation + diff --git a/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_abi.hpp b/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_abi.hpp index 60e7f339..c008d1ce 100644 --- a/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_abi.hpp +++ b/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_abi.hpp @@ -126,9 +126,10 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_g * @param[in] pCOMPort - Device Port to connect to * @param[in] nBaudrate - Baudrate to use * @param[in] dStatusUpdateInterval - Timer interval [ms] for updating status +* @param[in] nConnectTimeout - Timeout [ms] for connecting printer * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval, LibMCDriver_Marlin_uint32 nConnectTimeout); /** * Disconnects from the Marlin board. @@ -152,9 +153,10 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dTemperatureInDegreeCelcius - Bed target temperature. +* @param[in] bWaitForTemp - If true, waits for the target bed temperature to be reached before proceeding * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp); /** * Sets target temperature of the given extruder. @@ -162,9 +164,20 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] nExtruderID - ID of extruder. * @param[in] dTemperatureInDegreeCelcius - Extruder target temperature. +* @param[in] bWaitForTemp - If true, waits for the target extruder temperature to be reached before proceeding * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp); + +/** +* Turns on one of the fans and set its speed. +* +* @param[in] pDriver_Marlin - Driver_Marlin instance. +* @param[in] nFanID - ID of fan. +* @param[in] nSpeed - Fan speed [0..255]. 0=0%!.(MISSING).255=100%! +(MISSING)* @return error code or 0 (success) +*/ +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setfanspeed(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nFanID, LibMCDriver_Marlin_uint32 nSpeed); /** * Sets PID parameters. @@ -208,13 +221,13 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_gettargetposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pX, LibMCDriver_Marlin_double * pY, LibMCDriver_Marlin_double * pZ); /** -* Returns the current extruder position. +* Returns the target extruder position. * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[out] pE - E Value in mm * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextruderposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextrudertargetposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE); /** * Returns the current and the target bed temperature. @@ -281,10 +294,11 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dX - X Value in mm * @param[in] dY - Y Value in mm +* @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dSpeed); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed); /** * Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. @@ -302,10 +316,11 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dZ - Z Value in mm +* @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dSpeed); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed); /** * Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. diff --git a/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.h b/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.h index e2c3b664..a4094385 100644 --- a/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.h +++ b/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.h @@ -113,9 +113,10 @@ typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_GetHeaderInformatio * @param[in] pCOMPort - Device Port to connect to * @param[in] nBaudrate - Baudrate to use * @param[in] dStatusUpdateInterval - Timer interval [ms] for updating status +* @param[in] nConnectTimeout - Timeout [ms] for connecting printer * @return error code or 0 (success) */ -typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_ConnectPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval); +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_ConnectPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval, LibMCDriver_Marlin_uint32 nConnectTimeout); /** * Disconnects from the Marlin board. @@ -139,9 +140,10 @@ typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetAbsoluteP * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dTemperatureInDegreeCelcius - Bed target temperature. +* @param[in] bWaitForTemp - If true, waits for the target bed temperature to be reached before proceeding * @return error code or 0 (success) */ -typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetHeatedBedTargetTemperaturePtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetHeatedBedTargetTemperaturePtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp); /** * Sets target temperature of the given extruder. @@ -149,9 +151,20 @@ typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetHeatedBed * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] nExtruderID - ID of extruder. * @param[in] dTemperatureInDegreeCelcius - Extruder target temperature. +* @param[in] bWaitForTemp - If true, waits for the target extruder temperature to be reached before proceeding * @return error code or 0 (success) */ -typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetExtruderTargetTemperaturePtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetExtruderTargetTemperaturePtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp); + +/** +* Turns on one of the fans and set its speed. +* +* @param[in] pDriver_Marlin - Driver_Marlin instance. +* @param[in] nFanID - ID of fan. +* @param[in] nSpeed - Fan speed [0..255]. 0=0%!.(MISSING).255=100%! +(MISSING)* @return error code or 0 (success) +*/ +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_SetFanSpeedPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nFanID, LibMCDriver_Marlin_uint32 nSpeed); /** * Sets PID parameters. @@ -195,13 +208,13 @@ typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_GetCurrentPo typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_GetTargetPositionPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pX, LibMCDriver_Marlin_double * pY, LibMCDriver_Marlin_double * pZ); /** -* Returns the current extruder position. +* Returns the target extruder position. * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[out] pE - E Value in mm * @return error code or 0 (success) */ -typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_GetExtruderPositionPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE); +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_GetExtruderTargetPositionPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE); /** * Returns the current and the target bed temperature. @@ -268,10 +281,11 @@ typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_IsHomedPtr) * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dX - X Value in mm * @param[in] dY - Y Value in mm +* @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s * @return error code or 0 (success) */ -typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_MoveToXYPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dSpeed); +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_MoveToXYPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed); /** * Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. @@ -289,10 +303,11 @@ typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_MoveFastToXY * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dZ - Z Value in mm +* @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s * @return error code or 0 (success) */ -typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_MoveToZPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dSpeed); +typedef LibMCDriver_MarlinResult (*PLibMCDriver_MarlinDriver_Marlin_MoveToZPtr) (LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed); /** * Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. @@ -397,11 +412,12 @@ typedef struct { PLibMCDriver_MarlinDriver_Marlin_SetAbsolutePositioningPtr m_Driver_Marlin_SetAbsolutePositioning; PLibMCDriver_MarlinDriver_Marlin_SetHeatedBedTargetTemperaturePtr m_Driver_Marlin_SetHeatedBedTargetTemperature; PLibMCDriver_MarlinDriver_Marlin_SetExtruderTargetTemperaturePtr m_Driver_Marlin_SetExtruderTargetTemperature; + PLibMCDriver_MarlinDriver_Marlin_SetFanSpeedPtr m_Driver_Marlin_SetFanSpeed; PLibMCDriver_MarlinDriver_Marlin_SetPidParametersPtr m_Driver_Marlin_SetPidParameters; PLibMCDriver_MarlinDriver_Marlin_UpdateStatePtr m_Driver_Marlin_UpdateState; PLibMCDriver_MarlinDriver_Marlin_GetCurrentPositionPtr m_Driver_Marlin_GetCurrentPosition; PLibMCDriver_MarlinDriver_Marlin_GetTargetPositionPtr m_Driver_Marlin_GetTargetPosition; - PLibMCDriver_MarlinDriver_Marlin_GetExtruderPositionPtr m_Driver_Marlin_GetExtruderPosition; + PLibMCDriver_MarlinDriver_Marlin_GetExtruderTargetPositionPtr m_Driver_Marlin_GetExtruderTargetPosition; PLibMCDriver_MarlinDriver_Marlin_GetHeatedBedTemperaturePtr m_Driver_Marlin_GetHeatedBedTemperature; PLibMCDriver_MarlinDriver_Marlin_GetExtruderTemperaturePtr m_Driver_Marlin_GetExtruderTemperature; PLibMCDriver_MarlinDriver_Marlin_GetPidParametersPtr m_Driver_Marlin_GetPidParameters; diff --git a/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.hpp b/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.hpp index 535c9e58..f910e228 100644 --- a/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.hpp +++ b/Drivers/Marlin/Headers/CppDynamic/libmcdriver_marlin_dynamic.hpp @@ -360,25 +360,26 @@ class CDriver_Marlin : public CDriver { { } - inline void Connect(const std::string & sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval); + inline void Connect(const std::string & sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval, const LibMCDriver_Marlin_uint32 nConnectTimeout); inline void Disconnect(); inline void SetAbsolutePositioning(const bool bAbsolute); - inline void SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); - inline void SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); + inline void SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp); + inline void SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp); + inline void SetFanSpeed(const LibMCDriver_Marlin_uint32 nFanID, const LibMCDriver_Marlin_uint32 nSpeed); inline void SetPidParameters(const LibMCDriver_Marlin_double dP, const LibMCDriver_Marlin_double dI, const LibMCDriver_Marlin_double dD); inline void UpdateState(); inline void GetCurrentPosition(LibMCDriver_Marlin_double & dX, LibMCDriver_Marlin_double & dY, LibMCDriver_Marlin_double & dZ); inline void GetTargetPosition(LibMCDriver_Marlin_double & dX, LibMCDriver_Marlin_double & dY, LibMCDriver_Marlin_double & dZ); - inline void GetExtruderPosition(LibMCDriver_Marlin_double & dE); + inline void GetExtruderTargetPosition(LibMCDriver_Marlin_double & dE); inline void GetHeatedBedTemperature(LibMCDriver_Marlin_double & dTargetTemperature, LibMCDriver_Marlin_double & dCurrentTemperature); inline void GetExtruderTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double & dTargetTemperature, LibMCDriver_Marlin_double & dCurrentTemperature); inline void GetPidParameters(LibMCDriver_Marlin_double & dP, LibMCDriver_Marlin_double & dI, LibMCDriver_Marlin_double & dD); inline bool CanExecuteMovement(); inline bool IsMoving(); inline bool IsHomed(); - inline void MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed); + inline void MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed); inline void MoveFastToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed); - inline void MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed); + inline void MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed); inline void MoveFastToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed); inline void StartHoming(); }; @@ -513,11 +514,12 @@ class CDriver_Marlin : public CDriver { pWrapperTable->m_Driver_Marlin_SetAbsolutePositioning = nullptr; pWrapperTable->m_Driver_Marlin_SetHeatedBedTargetTemperature = nullptr; pWrapperTable->m_Driver_Marlin_SetExtruderTargetTemperature = nullptr; + pWrapperTable->m_Driver_Marlin_SetFanSpeed = nullptr; pWrapperTable->m_Driver_Marlin_SetPidParameters = nullptr; pWrapperTable->m_Driver_Marlin_UpdateState = nullptr; pWrapperTable->m_Driver_Marlin_GetCurrentPosition = nullptr; pWrapperTable->m_Driver_Marlin_GetTargetPosition = nullptr; - pWrapperTable->m_Driver_Marlin_GetExtruderPosition = nullptr; + pWrapperTable->m_Driver_Marlin_GetExtruderTargetPosition = nullptr; pWrapperTable->m_Driver_Marlin_GetHeatedBedTemperature = nullptr; pWrapperTable->m_Driver_Marlin_GetExtruderTemperature = nullptr; pWrapperTable->m_Driver_Marlin_GetPidParameters = nullptr; @@ -665,6 +667,15 @@ class CDriver_Marlin : public CDriver { if (pWrapperTable->m_Driver_Marlin_SetExtruderTargetTemperature == nullptr) return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; + #ifdef _WIN32 + pWrapperTable->m_Driver_Marlin_SetFanSpeed = (PLibMCDriver_MarlinDriver_Marlin_SetFanSpeedPtr) GetProcAddress(hLibrary, "libmcdriver_marlin_driver_marlin_setfanspeed"); + #else // _WIN32 + pWrapperTable->m_Driver_Marlin_SetFanSpeed = (PLibMCDriver_MarlinDriver_Marlin_SetFanSpeedPtr) dlsym(hLibrary, "libmcdriver_marlin_driver_marlin_setfanspeed"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_Driver_Marlin_SetFanSpeed == nullptr) + return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; + #ifdef _WIN32 pWrapperTable->m_Driver_Marlin_SetPidParameters = (PLibMCDriver_MarlinDriver_Marlin_SetPidParametersPtr) GetProcAddress(hLibrary, "libmcdriver_marlin_driver_marlin_setpidparameters"); #else // _WIN32 @@ -702,12 +713,12 @@ class CDriver_Marlin : public CDriver { return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef _WIN32 - pWrapperTable->m_Driver_Marlin_GetExtruderPosition = (PLibMCDriver_MarlinDriver_Marlin_GetExtruderPositionPtr) GetProcAddress(hLibrary, "libmcdriver_marlin_driver_marlin_getextruderposition"); + pWrapperTable->m_Driver_Marlin_GetExtruderTargetPosition = (PLibMCDriver_MarlinDriver_Marlin_GetExtruderTargetPositionPtr) GetProcAddress(hLibrary, "libmcdriver_marlin_driver_marlin_getextrudertargetposition"); #else // _WIN32 - pWrapperTable->m_Driver_Marlin_GetExtruderPosition = (PLibMCDriver_MarlinDriver_Marlin_GetExtruderPositionPtr) dlsym(hLibrary, "libmcdriver_marlin_driver_marlin_getextruderposition"); + pWrapperTable->m_Driver_Marlin_GetExtruderTargetPosition = (PLibMCDriver_MarlinDriver_Marlin_GetExtruderTargetPositionPtr) dlsym(hLibrary, "libmcdriver_marlin_driver_marlin_getextrudertargetposition"); dlerror(); #endif // _WIN32 - if (pWrapperTable->m_Driver_Marlin_GetExtruderPosition == nullptr) + if (pWrapperTable->m_Driver_Marlin_GetExtruderTargetPosition == nullptr) return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef _WIN32 @@ -924,6 +935,10 @@ class CDriver_Marlin : public CDriver { if ( (eLookupError != 0) || (pWrapperTable->m_Driver_Marlin_SetExtruderTargetTemperature == nullptr) ) return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; + eLookupError = (*pLookup)("libmcdriver_marlin_driver_marlin_setfanspeed", (void**)&(pWrapperTable->m_Driver_Marlin_SetFanSpeed)); + if ( (eLookupError != 0) || (pWrapperTable->m_Driver_Marlin_SetFanSpeed == nullptr) ) + return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; + eLookupError = (*pLookup)("libmcdriver_marlin_driver_marlin_setpidparameters", (void**)&(pWrapperTable->m_Driver_Marlin_SetPidParameters)); if ( (eLookupError != 0) || (pWrapperTable->m_Driver_Marlin_SetPidParameters == nullptr) ) return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; @@ -940,8 +955,8 @@ class CDriver_Marlin : public CDriver { if ( (eLookupError != 0) || (pWrapperTable->m_Driver_Marlin_GetTargetPosition == nullptr) ) return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; - eLookupError = (*pLookup)("libmcdriver_marlin_driver_marlin_getextruderposition", (void**)&(pWrapperTable->m_Driver_Marlin_GetExtruderPosition)); - if ( (eLookupError != 0) || (pWrapperTable->m_Driver_Marlin_GetExtruderPosition == nullptr) ) + eLookupError = (*pLookup)("libmcdriver_marlin_driver_marlin_getextrudertargetposition", (void**)&(pWrapperTable->m_Driver_Marlin_GetExtruderTargetPosition)); + if ( (eLookupError != 0) || (pWrapperTable->m_Driver_Marlin_GetExtruderTargetPosition == nullptr) ) return LIBMCDRIVER_MARLIN_ERROR_COULDNOTFINDLIBRARYEXPORT; eLookupError = (*pLookup)("libmcdriver_marlin_driver_marlin_getheatedbedtemperature", (void**)&(pWrapperTable->m_Driver_Marlin_GetHeatedBedTemperature)); @@ -1104,10 +1119,11 @@ class CDriver_Marlin : public CDriver { * @param[in] sCOMPort - Device Port to connect to * @param[in] nBaudrate - Baudrate to use * @param[in] dStatusUpdateInterval - Timer interval [ms] for updating status + * @param[in] nConnectTimeout - Timeout [ms] for connecting printer */ - void CDriver_Marlin::Connect(const std::string & sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval) + void CDriver_Marlin::Connect(const std::string & sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval, const LibMCDriver_Marlin_uint32 nConnectTimeout) { - CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_Connect(m_pHandle, sCOMPort.c_str(), nBaudrate, dStatusUpdateInterval)); + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_Connect(m_pHandle, sCOMPort.c_str(), nBaudrate, dStatusUpdateInterval, nConnectTimeout)); } /** @@ -1130,20 +1146,32 @@ class CDriver_Marlin : public CDriver { /** * CDriver_Marlin::SetHeatedBedTargetTemperature - Sets heated bed target temperature. * @param[in] dTemperatureInDegreeCelcius - Bed target temperature. + * @param[in] bWaitForTemp - If true, waits for the target bed temperature to be reached before proceeding */ - void CDriver_Marlin::SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) + void CDriver_Marlin::SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) { - CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_SetHeatedBedTargetTemperature(m_pHandle, dTemperatureInDegreeCelcius)); + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_SetHeatedBedTargetTemperature(m_pHandle, dTemperatureInDegreeCelcius, bWaitForTemp)); } /** * CDriver_Marlin::SetExtruderTargetTemperature - Sets target temperature of the given extruder. * @param[in] nExtruderID - ID of extruder. * @param[in] dTemperatureInDegreeCelcius - Extruder target temperature. + * @param[in] bWaitForTemp - If true, waits for the target extruder temperature to be reached before proceeding */ - void CDriver_Marlin::SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) + void CDriver_Marlin::SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) + { + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_SetExtruderTargetTemperature(m_pHandle, nExtruderID, dTemperatureInDegreeCelcius, bWaitForTemp)); + } + + /** + * CDriver_Marlin::SetFanSpeed - Turns on one of the fans and set its speed. + * @param[in] nFanID - ID of fan. + * @param[in] nSpeed - Fan speed [0..255]. 0=0%!.(MISSING).255=100%! +(MISSING) */ + void CDriver_Marlin::SetFanSpeed(const LibMCDriver_Marlin_uint32 nFanID, const LibMCDriver_Marlin_uint32 nSpeed) { - CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_SetExtruderTargetTemperature(m_pHandle, nExtruderID, dTemperatureInDegreeCelcius)); + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_SetFanSpeed(m_pHandle, nFanID, nSpeed)); } /** @@ -1188,12 +1216,12 @@ class CDriver_Marlin : public CDriver { } /** - * CDriver_Marlin::GetExtruderPosition - Returns the current extruder position. + * CDriver_Marlin::GetExtruderTargetPosition - Returns the target extruder position. * @param[out] dE - E Value in mm */ - void CDriver_Marlin::GetExtruderPosition(LibMCDriver_Marlin_double & dE) + void CDriver_Marlin::GetExtruderTargetPosition(LibMCDriver_Marlin_double & dE) { - CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_GetExtruderPosition(m_pHandle, &dE)); + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_GetExtruderTargetPosition(m_pHandle, &dE)); } /** @@ -1268,11 +1296,12 @@ class CDriver_Marlin : public CDriver { * CDriver_Marlin::MoveToXY - Moves to/by a certain position by a linear move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. * @param[in] dX - X Value in mm * @param[in] dY - Y Value in mm + * @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s */ - void CDriver_Marlin::MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed) + void CDriver_Marlin::MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) { - CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_MoveToXY(m_pHandle, dX, dY, dSpeed)); + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_MoveToXY(m_pHandle, dX, dY, dE, dSpeed)); } /** @@ -1289,11 +1318,12 @@ class CDriver_Marlin : public CDriver { /** * CDriver_Marlin::MoveToZ - Moves to/by a certain position by a linear move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. * @param[in] dZ - Z Value in mm + * @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s */ - void CDriver_Marlin::MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed) + void CDriver_Marlin::MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) { - CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_MoveToZ(m_pHandle, dZ, dSpeed)); + CheckError(m_pWrapper->m_WrapperTable.m_Driver_Marlin_MoveToZ(m_pHandle, dZ, dE, dSpeed)); } /** diff --git a/Drivers/Marlin/Implementation/AMC_SerialController.hpp b/Drivers/Marlin/Implementation/AMC_SerialController.hpp index 285f16a4..1aeebb76 100644 --- a/Drivers/Marlin/Implementation/AMC_SerialController.hpp +++ b/Drivers/Marlin/Implementation/AMC_SerialController.hpp @@ -35,8 +35,9 @@ namespace AMC { virtual void setPositioningAbolute() = 0; virtual void setPositioningRelative() = 0; - virtual void setHeatedBedTargetTemperature(double nTemperatureInDegreeCelcius) = 0; - virtual void setExtruderTargetTemperature(uint32_t nExtruderIndex, double nTemperatureInDegreeCelcius) = 0; + virtual void setHeatedBedTargetTemperature(double nTemperatureInDegreeCelcius, bool bWait) = 0; + virtual void setExtruderTargetTemperature(uint32_t nExtruderIndex, double nTemperatureInDegreeCelcius, bool bWait) = 0; + virtual void setFanSpeed(uint32_t nFanIndex, uint32_t nSpeed) = 0; virtual void setPidParameters(double dP, double dI, double dD) = 0; virtual void queryTemperatureState (uint32_t nExtruderIndex) = 0; @@ -47,16 +48,16 @@ namespace AMC { virtual void getTargetPosition (double & dX, double& dY, double& dZ) = 0; virtual void getCurrentPosition(double& dX, double& dY, double& dZ) = 0; - virtual void getExtruderPosition (double &dE) = 0; + virtual void getExtruderTargetPosition (double &dE) = 0; virtual void getPidParameters(double& dP, double& dI, double& dD) = 0; virtual void startHoming() = 0; virtual void setLcdMsg(const std::string& sLcdMsg) = 0; - virtual void moveXY(const double dX, const double dY, const double dSpeedInMMperSecond) = 0; + virtual void moveXY(const double dX, const double dY, const double dE, const double dSpeedInMMperSecond) = 0; virtual void moveFastXY(const double dX, const double dY, const double dSpeedInMMperSecond) = 0; - virtual void moveZ(const double dZ, const double dSpeedInMMperSecond) = 0; + virtual void moveZ(const double dZ, const double dE, const double dSpeedInMMperSecond) = 0; virtual void moveFastZ(const double dZ, const double dSpeedInMMperSecond) = 0; virtual bool isHomed() = 0; diff --git a/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.cpp b/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.cpp index b5941d7e..f620fc15 100644 --- a/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.cpp +++ b/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.cpp @@ -44,6 +44,7 @@ namespace AMC { CSerialController_Marlin::CSerialController_Marlin(bool bDebug, bool bDoQueryFirmwareInfo, bool bDisableHoming) : m_sCOMPort("COM1"), m_nBaudRate(115200), + m_nConnectTimeout(2000), m_bDoQueryFirmwareInfo(bDoQueryFirmwareInfo), m_bDisableHoming(bDisableHoming), m_dStatusUpdateTimerInterval(100), @@ -65,7 +66,6 @@ namespace AMC { m_dCurrentPosX(0), m_dCurrentPosY(0), m_dCurrentPosZ(0), - m_dCurrentPosE(0), m_dAxisStepsPerUnitX(0), m_dAxisStepsPerUnitY(0), m_dAxisStepsPerUnitZ(0), @@ -99,7 +99,7 @@ namespace AMC { return m_sCOMPort; } - + void CSerialController_Marlin::setBaudrate(const uint32_t nBaudrate) { if (m_pConnection.get() != nullptr) @@ -113,6 +113,19 @@ namespace AMC { return m_nBaudRate; } + void CSerialController_Marlin::setConnectTimeout(const uint32_t nConnectTimeout) + { + if (m_pConnection.get() != nullptr) + throw std::runtime_error("Serial Port already initialized"); + + m_nConnectTimeout = nConnectTimeout; + } + + uint32_t CSerialController_Marlin::getConnectTimeout() + { + return m_nConnectTimeout; + } + CSerialController_Marlin::~CSerialController_Marlin() { } @@ -122,7 +135,7 @@ namespace AMC { if (m_pConnection.get() != nullptr) throw std::runtime_error("Serial Port already initialized"); - // set timeout >1000 => 3000 + // set timeout >1000 => 2000 (default of m_nConnectTimeout) // // if printer is booting (echoing start+ Date+Memory... after switch on printer or plug in cable) and // timeout would be 1000 the while loop below we be leaved "to early" (after timeout of 1sec) and @@ -131,9 +144,9 @@ namespace AMC { // // if printer is not booting (no echoing text... after software" reconnect) // "start" will no be received, - // but timeout after 3000 will respond with an empty string and + // but timeout after 2000 will respond with an empty string and // printer is ready to receive commands - m_pConnection.reset(new serial::Serial(m_sCOMPort, m_nBaudRate, serial::Timeout::simpleTimeout(2000))); + m_pConnection.reset(new serial::Serial(m_sCOMPort, m_nBaudRate, serial::Timeout::simpleTimeout(m_nConnectTimeout))); if (!m_pConnection->isOpen()) { m_pConnection.reset(); @@ -314,16 +327,30 @@ namespace AMC { - void CSerialController_Marlin::setHeatedBedTargetTemperature(double nTemperatureInDegreeCelcius) + void CSerialController_Marlin::setHeatedBedTargetTemperature(double nTemperatureInDegreeCelcius, bool bWait) { - sendCommand("M140 S" + std::to_string(nTemperatureInDegreeCelcius)); + if (bWait) { + // wait for the target bed temperature to be reached before proceeding + sendCommand("M190 S" + std::to_string(nTemperatureInDegreeCelcius)); + } + else { + // don't wait + sendCommand("M140 S" + std::to_string(nTemperatureInDegreeCelcius)); + } } - void CSerialController_Marlin::setExtruderTargetTemperature(uint32_t nExtruderIndex, double nTemperatureInDegreeCelcius) + void CSerialController_Marlin::setExtruderTargetTemperature(uint32_t nExtruderIndex, double nTemperatureInDegreeCelcius, bool bWait) { - if (nExtruderIndex < m_iExtruderCount) + if ((nExtruderIndex >= 0) && (nExtruderIndex < m_iExtruderCount)) { - sendCommand("M104 T" + std::to_string(nExtruderIndex) + " S" + std::to_string(nTemperatureInDegreeCelcius)); + if (bWait) { + // wait for the target extruder temperature to be reached before proceeding + sendCommand("M109 T" + std::to_string(nExtruderIndex) + " S" + std::to_string(nTemperatureInDegreeCelcius)); + } + else { + // don't wait + sendCommand("M104 T" + std::to_string(nExtruderIndex) + " S" + std::to_string(nTemperatureInDegreeCelcius)); + } } } @@ -337,6 +364,21 @@ namespace AMC { } + void CSerialController_Marlin::setFanSpeed(uint32_t nFanIndex, uint32_t nSpeed) + { + if ((nFanIndex >= 0)) + { + if ((nSpeed > 0) && (nSpeed < 256)) { + // turn fan on + sendCommand("M106 P" + std::to_string(nFanIndex) + " S" + std::to_string(nSpeed)); + } + else { + // turn fan off + sendCommand("M107 P" + std::to_string(nFanIndex)); + } + } + } + void CSerialController_Marlin::queryTemperatureState(uint32_t nExtruderIndex) { if (nExtruderIndex < m_iExtruderCount) @@ -622,9 +664,9 @@ namespace AMC { dZ = m_dCurrentPosZ; } - void CSerialController_Marlin::getExtruderPosition(double& dE) + void CSerialController_Marlin::getExtruderTargetPosition(double& dE) { - dE = m_dCurrentPosE; + dE = m_dTargetPosE; } void CSerialController_Marlin::startHoming() @@ -652,7 +694,12 @@ namespace AMC { sendCommand("G91"); } - void CSerialController_Marlin::moveToEx(bool bFastMove, bool bInX, const double dX, bool bInY, const double dY, bool bInZ, const double dZ, const double dSpeedInMMperSecond) + void CSerialController_Marlin::moveToEx(bool bFastMove, + bool bInX, const double dX, + bool bInY, const double dY, + bool bInZ, const double dZ, + bool bInE, const double dE, + const double dSpeedInMMperSecond) { std::stringstream sCommand; @@ -675,6 +722,11 @@ namespace AMC { // Z given => add Z+value to command str sCommand << " Z" << dZ; } + if (bInE && !bFastMove) { + // E given => add E+value to command str + // TODO remove to activate Extrusion + //sCommand << " E" << dE; + } if (dSpeedInMMperSecond > 0) { if (fabs(m_dCurrentSpeedInMMperSecond - dSpeedInMMperSecond) > MARLINDRIVER_MINSPEED) { m_dCurrentSpeedInMMperSecond = dSpeedInMMperSecond; @@ -692,27 +744,38 @@ namespace AMC { if (bInZ) { m_dTargetPosZ = dZ; } + if (bInE) { + m_dTargetPosE = dE; + } } - void CSerialController_Marlin::moveXY(const double dX, const double dY, const double dSpeedInMMperSecond) + void CSerialController_Marlin::moveXY(const double dX, const double dY, const double dE, const double dSpeedInMMperSecond) { - moveToEx(false, true, dX, true, dY, false, 0.0, dSpeedInMMperSecond); + bool dInE = false; + if (fabs(dE) > MARLINDRIVER_MINSPEED) { + dInE = true; + } + moveToEx(false, true, dX, true, dY, false, 0.0, dInE, dE, dSpeedInMMperSecond); } void CSerialController_Marlin::moveFastXY(const double dX, const double dY, const double dSpeedInMMperSecond) { - moveToEx(true, true, dX, true, dY, false, 0.0, dSpeedInMMperSecond); + moveToEx(true, true, dX, true, dY, false, 0.0, false, 0.0, dSpeedInMMperSecond); } - void CSerialController_Marlin::moveZ(const double dZ, const double dSpeedInMMperSecond) + void CSerialController_Marlin::moveZ(const double dZ, const double dE, const double dSpeedInMMperSecond) { - moveToEx(false, false, 0.0, false, 0.0, true, dZ, dSpeedInMMperSecond); + bool dInE = false; + if (fabs(dE) > MARLINDRIVER_MINSPEED) { + dInE = true; + } + moveToEx(false, false, 0.0, false, 0.0, true, dZ, dInE, dE, dSpeedInMMperSecond); } void CSerialController_Marlin::moveFastZ(const double dZ, const double dSpeedInMMperSecond) { - moveToEx(true, false, 0.0, false, 0.0, true, dZ, dSpeedInMMperSecond); + moveToEx(true, false, 0.0, false, 0.0, true, dZ, false, 0.0, dSpeedInMMperSecond); } void CSerialController_Marlin::waitForMovement() diff --git a/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.hpp b/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.hpp index 2ab4633a..608a44f5 100644 --- a/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.hpp +++ b/Drivers/Marlin/Implementation/AMC_SerialController_Marlin.hpp @@ -15,6 +15,7 @@ namespace AMC { std::unique_ptr m_pConnection; std::string m_sCOMPort; uint32_t m_nBaudRate; + uint32_t m_nConnectTimeout; uint32_t m_nLineNumber; double m_dStatusUpdateTimerInterval; @@ -40,7 +41,6 @@ namespace AMC { double m_dCurrentPosX; double m_dCurrentPosY; double m_dCurrentPosZ; - double m_dCurrentPosE; double m_dCurrentSpeedInMMperSecond; // firmware info @@ -71,7 +71,7 @@ namespace AMC { bool parseAckSymbol(const std::string& sLine, const uint32_t nLineNumber); void queryAxisStepsPerUnitStateAndPidValues(); void queryFirmwareInfo(); - void moveToEx (bool bFastMove, bool bInX, const double dX, bool bInY, const double dY, bool bInZ, const double dZ, const double dSpeedInMMperSecond); + void moveToEx (bool bFastMove, bool bInX, const double dX, bool bInY, const double dY, bool bInZ, const double dZ, bool bInE, const double dE, const double dSpeedInMMperSecond); public: CSerialController_Marlin(bool bDebug, bool bDoQueryFirmwareInfo, bool bDisableHoming); @@ -79,7 +79,10 @@ namespace AMC { void setStatusUpdateTimerInterval(const double dStatusUpdateTimerInterval); - void setCOMPort(const std::string & sCOMPort); + void setConnectTimeout(const uint32_t nConnectTimeout); + uint32_t getConnectTimeout(); + + void setCOMPort(const std::string& sCOMPort); std::string getCOMPort(); void setBaudrate(const uint32_t nBaudrate); @@ -92,9 +95,10 @@ namespace AMC { void setPositioningAbolute(); void setPositioningRelative(); - void setHeatedBedTargetTemperature(double nTemperatureInDegreeCelcius) override; - void setExtruderTargetTemperature(uint32_t nExtruderIndex, double nTemperatureInDegreeCelcius) override; + void setHeatedBedTargetTemperature(double nTemperatureInDegreeCelcius, bool bWait) override; + void setExtruderTargetTemperature(uint32_t nExtruderIndex, double nTemperatureInDegreeCelcius, bool bWait) override; void setPidParameters(double dP, double dI, double dD) override; + void setFanSpeed(uint32_t nFanIndex, uint32_t nSpeed) override; void queryTemperatureState(uint32_t nExtruderIndex) override; void queryPositionState() override; @@ -104,15 +108,15 @@ namespace AMC { void getTargetPosition(double& dX, double& dY, double& dZ) override; void getCurrentPosition(double& dX, double& dY, double& dZ) override; - void getExtruderPosition(double& dE) override; + void getExtruderTargetPosition(double& dE) override; void getPidParameters(double& dP, double& dI, double& dD) override; void startHoming() override; void setLcdMsg(const std::string& sLcdMsg) override; - void moveXY(const double dX, const double dY, const double dSpeedInMMperSecond) override; + void moveXY(const double dX, const double dY, const double dE, const double dSpeedInMMperSecond) override; void moveFastXY(const double dX, const double dY, const double dSpeedInMMperSecond) override; - void moveZ(const double dZ, const double dSpeedInMMperSecond) override; + void moveZ(const double dZ, const double dE, const double dSpeedInMMperSecond) override; void moveFastZ(const double dZ, const double dSpeedInMMperSecond) override; bool isHomed() override; diff --git a/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.cpp b/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.cpp index 1265a887..309ff7fd 100644 --- a/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.cpp +++ b/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.cpp @@ -46,13 +46,14 @@ CDriver_Marlin::CDriver_Marlin(const std::string& sName, const std::string& sTyp } -void CDriver_Marlin::Connect(const std::string& sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval) +void CDriver_Marlin::Connect(const std::string& sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval, const LibMCDriver_Marlin_uint32 nConnectTimeout) { Disconnect (); auto pSerialController = std::make_shared(m_bDebug, m_doQueryFirmwareInfo, m_bDisableHoming); pSerialController->setCOMPort(sCOMPort); pSerialController->setBaudrate(nBaudrate); + pSerialController->setConnectTimeout(nConnectTimeout); pSerialController->setStatusUpdateTimerInterval(dStatusUpdateInterval); pSerialController->initializeController(); m_pSerialController = pSerialController; @@ -80,14 +81,19 @@ void CDriver_Marlin::SetAbsolutePositioning(const bool bAbsolute) } } -void CDriver_Marlin::SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) +void CDriver_Marlin::SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) { - m_pSerialController->setHeatedBedTargetTemperature(dTemperatureInDegreeCelcius); + m_pSerialController->setHeatedBedTargetTemperature(dTemperatureInDegreeCelcius, bWaitForTemp); } -void CDriver_Marlin::SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) +void CDriver_Marlin::SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) { - m_pSerialController->setExtruderTargetTemperature(nExtruderID, dTemperatureInDegreeCelcius); + m_pSerialController->setExtruderTargetTemperature(nExtruderID, dTemperatureInDegreeCelcius, bWaitForTemp); +} + +void CDriver_Marlin::SetFanSpeed(const LibMCDriver_Marlin_uint32 nFanID, const LibMCDriver_Marlin_uint32 nSpeed) +{ + m_pSerialController->setFanSpeed(nFanID, nSpeed); } void CDriver_Marlin::SetPidParameters(const LibMCDriver_Marlin_double dP, const LibMCDriver_Marlin_double dI, const LibMCDriver_Marlin_double dD) @@ -114,9 +120,9 @@ void CDriver_Marlin::GetTargetPosition(LibMCDriver_Marlin_double& dX, LibMCDrive m_pSerialController->getTargetPosition(dX, dY, dZ); } -void CDriver_Marlin::GetExtruderPosition(LibMCDriver_Marlin_double& dE) +void CDriver_Marlin::GetExtruderTargetPosition(LibMCDriver_Marlin_double& dE) { - m_pSerialController->getExtruderPosition(dE); + m_pSerialController->getExtruderTargetPosition(dE); } void CDriver_Marlin::GetHeatedBedTemperature(LibMCDriver_Marlin_double& dTargetTemperature, LibMCDriver_Marlin_double& dCurrentTemperature) @@ -149,9 +155,9 @@ bool CDriver_Marlin::IsHomed() return m_pSerialController->isHomed(); } -void CDriver_Marlin::MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed) +void CDriver_Marlin::MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) { - m_pSerialController->moveXY(dX, dY, dSpeed); + m_pSerialController->moveXY(dX, dY, dE, dSpeed); } void CDriver_Marlin::MoveFastToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed) @@ -159,9 +165,9 @@ void CDriver_Marlin::MoveFastToXY(const LibMCDriver_Marlin_double dX, const LibM m_pSerialController->moveFastXY(dX, dY, dSpeed); } -void CDriver_Marlin::MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed) +void CDriver_Marlin::MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) { - m_pSerialController->moveZ(dZ, dSpeed); + m_pSerialController->moveZ(dZ, dE, dSpeed); } void CDriver_Marlin::MoveFastToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed) diff --git a/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.hpp b/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.hpp index 4dfa392d..68508d7c 100644 --- a/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.hpp +++ b/Drivers/Marlin/Implementation/libmcdriver_marlin_driver_marlin.hpp @@ -46,15 +46,17 @@ class CDriver_Marlin : public virtual IDriver_Marlin, public virtual CDriver { CDriver_Marlin(const std::string& sName, const std::string& sType, const bool doQueryFirmwareInfo, const bool bDisableHoming, const bool bDebug); - void Connect(const std::string& sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval) override; + void Connect(const std::string& sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval, const LibMCDriver_Marlin_uint32 nConnectTimeout) override; void Disconnect() override; void SetAbsolutePositioning(const bool bAbsolute) override; - void SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) override; + void SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) override; - void SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) override; + void SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) override; + + void SetFanSpeed(const LibMCDriver_Marlin_uint32 nFanID, const LibMCDriver_Marlin_uint32 dSpeed) override; void SetPidParameters(const LibMCDriver_Marlin_double dP, const LibMCDriver_Marlin_double dI, const LibMCDriver_Marlin_double dD) override; @@ -64,7 +66,7 @@ class CDriver_Marlin : public virtual IDriver_Marlin, public virtual CDriver { void GetTargetPosition(LibMCDriver_Marlin_double& dX, LibMCDriver_Marlin_double& dY, LibMCDriver_Marlin_double& dZ) override; - void GetExtruderPosition(LibMCDriver_Marlin_double& dE) override; + void GetExtruderTargetPosition(LibMCDriver_Marlin_double& dE) override; void GetHeatedBedTemperature(LibMCDriver_Marlin_double& dTargetTemperature, LibMCDriver_Marlin_double& dCurrentTemperature) override; @@ -78,11 +80,11 @@ class CDriver_Marlin : public virtual IDriver_Marlin, public virtual CDriver { bool IsHomed() override; - void MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed) override; + void MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) override; void MoveFastToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed) override; - void MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed) override; + void MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) override; void MoveFastToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed) override; diff --git a/Drivers/Marlin/Interfaces/libmcdriver_marlin_abi.hpp b/Drivers/Marlin/Interfaces/libmcdriver_marlin_abi.hpp index 60e7f339..c008d1ce 100644 --- a/Drivers/Marlin/Interfaces/libmcdriver_marlin_abi.hpp +++ b/Drivers/Marlin/Interfaces/libmcdriver_marlin_abi.hpp @@ -126,9 +126,10 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_g * @param[in] pCOMPort - Device Port to connect to * @param[in] nBaudrate - Baudrate to use * @param[in] dStatusUpdateInterval - Timer interval [ms] for updating status +* @param[in] nConnectTimeout - Timeout [ms] for connecting printer * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval, LibMCDriver_Marlin_uint32 nConnectTimeout); /** * Disconnects from the Marlin board. @@ -152,9 +153,10 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dTemperatureInDegreeCelcius - Bed target temperature. +* @param[in] bWaitForTemp - If true, waits for the target bed temperature to be reached before proceeding * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp); /** * Sets target temperature of the given extruder. @@ -162,9 +164,20 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] nExtruderID - ID of extruder. * @param[in] dTemperatureInDegreeCelcius - Extruder target temperature. +* @param[in] bWaitForTemp - If true, waits for the target extruder temperature to be reached before proceeding * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp); + +/** +* Turns on one of the fans and set its speed. +* +* @param[in] pDriver_Marlin - Driver_Marlin instance. +* @param[in] nFanID - ID of fan. +* @param[in] nSpeed - Fan speed [0..255]. 0=0%!.(MISSING).255=100%! +(MISSING)* @return error code or 0 (success) +*/ +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setfanspeed(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nFanID, LibMCDriver_Marlin_uint32 nSpeed); /** * Sets PID parameters. @@ -208,13 +221,13 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_gettargetposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pX, LibMCDriver_Marlin_double * pY, LibMCDriver_Marlin_double * pZ); /** -* Returns the current extruder position. +* Returns the target extruder position. * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[out] pE - E Value in mm * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextruderposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextrudertargetposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE); /** * Returns the current and the target bed temperature. @@ -281,10 +294,11 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dX - X Value in mm * @param[in] dY - Y Value in mm +* @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dSpeed); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed); /** * Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. @@ -302,10 +316,11 @@ LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_m * * @param[in] pDriver_Marlin - Driver_Marlin instance. * @param[in] dZ - Z Value in mm +* @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s * @return error code or 0 (success) */ -LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dSpeed); +LIBMCDRIVER_MARLIN_DECLSPEC LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed); /** * Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. diff --git a/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfaces.hpp b/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfaces.hpp index d8a19647..6195cbcf 100644 --- a/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfaces.hpp +++ b/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfaces.hpp @@ -309,8 +309,9 @@ class IDriver_Marlin : public virtual IDriver { * @param[in] sCOMPort - Device Port to connect to * @param[in] nBaudrate - Baudrate to use * @param[in] dStatusUpdateInterval - Timer interval [ms] for updating status + * @param[in] nConnectTimeout - Timeout [ms] for connecting printer */ - virtual void Connect(const std::string & sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval) = 0; + virtual void Connect(const std::string & sCOMPort, const LibMCDriver_Marlin_uint32 nBaudrate, const LibMCDriver_Marlin_double dStatusUpdateInterval, const LibMCDriver_Marlin_uint32 nConnectTimeout) = 0; /** * IDriver_Marlin::Disconnect - Disconnects from the Marlin board. @@ -326,15 +327,24 @@ class IDriver_Marlin : public virtual IDriver { /** * IDriver_Marlin::SetHeatedBedTargetTemperature - Sets heated bed target temperature. * @param[in] dTemperatureInDegreeCelcius - Bed target temperature. + * @param[in] bWaitForTemp - If true, waits for the target bed temperature to be reached before proceeding */ - virtual void SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) = 0; + virtual void SetHeatedBedTargetTemperature(const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) = 0; /** * IDriver_Marlin::SetExtruderTargetTemperature - Sets target temperature of the given extruder. * @param[in] nExtruderID - ID of extruder. * @param[in] dTemperatureInDegreeCelcius - Extruder target temperature. + * @param[in] bWaitForTemp - If true, waits for the target extruder temperature to be reached before proceeding */ - virtual void SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) = 0; + virtual void SetExtruderTargetTemperature(const LibMCDriver_Marlin_uint32 nExtruderID, const LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, const bool bWaitForTemp) = 0; + + /** + * IDriver_Marlin::SetFanSpeed - Turns on one of the fans and set its speed. + * @param[in] nFanID - ID of fan. + * @param[in] nSpeed - Fan speed [0..255]. 0=0%...255=100% + */ + virtual void SetFanSpeed(const LibMCDriver_Marlin_uint32 nFanID, const LibMCDriver_Marlin_uint32 nSpeed) = 0; /** * IDriver_Marlin::SetPidParameters - Sets PID parameters. @@ -366,10 +376,10 @@ class IDriver_Marlin : public virtual IDriver { virtual void GetTargetPosition(LibMCDriver_Marlin_double & dX, LibMCDriver_Marlin_double & dY, LibMCDriver_Marlin_double & dZ) = 0; /** - * IDriver_Marlin::GetExtruderPosition - Returns the current extruder position. + * IDriver_Marlin::GetExtruderTargetPosition - Returns the target extruder position. * @param[out] dE - E Value in mm */ - virtual void GetExtruderPosition(LibMCDriver_Marlin_double & dE) = 0; + virtual void GetExtruderTargetPosition(LibMCDriver_Marlin_double & dE) = 0; /** * IDriver_Marlin::GetHeatedBedTemperature - Returns the current and the target bed temperature. @@ -416,9 +426,10 @@ class IDriver_Marlin : public virtual IDriver { * IDriver_Marlin::MoveToXY - Moves to/by a certain position by a linear move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. * @param[in] dX - X Value in mm * @param[in] dY - Y Value in mm + * @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s */ - virtual void MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dSpeed) = 0; + virtual void MoveToXY(const LibMCDriver_Marlin_double dX, const LibMCDriver_Marlin_double dY, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) = 0; /** * IDriver_Marlin::MoveFastToXY - Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. @@ -431,9 +442,10 @@ class IDriver_Marlin : public virtual IDriver { /** * IDriver_Marlin::MoveToZ - Moves to/by a certain position by a linear move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. * @param[in] dZ - Z Value in mm + * @param[in] dE - E Value in mm * @param[in] dSpeed - Movement speed in mm/s */ - virtual void MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dSpeed) = 0; + virtual void MoveToZ(const LibMCDriver_Marlin_double dZ, const LibMCDriver_Marlin_double dE, const LibMCDriver_Marlin_double dSpeed) = 0; /** * IDriver_Marlin::MoveFastToZ - Moves to/by a certain position by a fast move. Takes the relative/absolute mode into account. Fails if it cannot execute a movement. diff --git a/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfacewrapper.cpp b/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfacewrapper.cpp index 757eeae4..8df5c462 100644 --- a/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfacewrapper.cpp +++ b/Drivers/Marlin/Interfaces/libmcdriver_marlin_interfacewrapper.cpp @@ -297,7 +297,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_getheaderinformation(LibMCDri /************************************************************************************************************************* Class implementation for Driver_Marlin **************************************************************************************************************************/ -LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval) +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, const char * pCOMPort, LibMCDriver_Marlin_uint32 nBaudrate, LibMCDriver_Marlin_double dStatusUpdateInterval, LibMCDriver_Marlin_uint32 nConnectTimeout) { IBase* pIBaseClass = (IBase *)pDriver_Marlin; @@ -309,7 +309,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_connect(LibMCDriver_Ma if (!pIDriver_Marlin) throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); - pIDriver_Marlin->Connect(sCOMPort, nBaudrate, dStatusUpdateInterval); + pIDriver_Marlin->Connect(sCOMPort, nBaudrate, dStatusUpdateInterval, nConnectTimeout); return LIBMCDRIVER_MARLIN_SUCCESS; } @@ -372,7 +372,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setabsolutepositioning } } -LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp) { IBase* pIBaseClass = (IBase *)pDriver_Marlin; @@ -381,7 +381,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemp if (!pIDriver_Marlin) throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); - pIDriver_Marlin->SetHeatedBedTargetTemperature(dTemperatureInDegreeCelcius); + pIDriver_Marlin->SetHeatedBedTargetTemperature(dTemperatureInDegreeCelcius, bWaitForTemp); return LIBMCDRIVER_MARLIN_SUCCESS; } @@ -396,7 +396,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setheatedbedtargettemp } } -LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius) +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettemperature(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nExtruderID, LibMCDriver_Marlin_double dTemperatureInDegreeCelcius, bool bWaitForTemp) { IBase* pIBaseClass = (IBase *)pDriver_Marlin; @@ -405,7 +405,31 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setextrudertargettempe if (!pIDriver_Marlin) throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); - pIDriver_Marlin->SetExtruderTargetTemperature(nExtruderID, dTemperatureInDegreeCelcius); + pIDriver_Marlin->SetExtruderTargetTemperature(nExtruderID, dTemperatureInDegreeCelcius, bWaitForTemp); + + return LIBMCDRIVER_MARLIN_SUCCESS; + } + catch (ELibMCDriver_MarlinInterfaceException & Exception) { + return handleLibMCDriver_MarlinException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_setfanspeed(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_uint32 nFanID, LibMCDriver_Marlin_uint32 nSpeed) +{ + IBase* pIBaseClass = (IBase *)pDriver_Marlin; + + try { + IDriver_Marlin* pIDriver_Marlin = dynamic_cast(pIBaseClass); + if (!pIDriver_Marlin) + throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); + + pIDriver_Marlin->SetFanSpeed(nFanID, nSpeed); return LIBMCDRIVER_MARLIN_SUCCESS; } @@ -528,7 +552,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_gettargetposition(LibM } } -LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextruderposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE) +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextrudertargetposition(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double * pE) { IBase* pIBaseClass = (IBase *)pDriver_Marlin; @@ -539,7 +563,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_getextruderposition(Li if (!pIDriver_Marlin) throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); - pIDriver_Marlin->GetExtruderPosition(*pE); + pIDriver_Marlin->GetExtruderTargetPosition(*pE); return LIBMCDRIVER_MARLIN_SUCCESS; } @@ -718,7 +742,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_ishomed(LibMCDriver_Ma } } -LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dSpeed) +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dX, LibMCDriver_Marlin_double dY, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed) { IBase* pIBaseClass = (IBase *)pDriver_Marlin; @@ -727,7 +751,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoxy(LibMCDriver_M if (!pIDriver_Marlin) throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); - pIDriver_Marlin->MoveToXY(dX, dY, dSpeed); + pIDriver_Marlin->MoveToXY(dX, dY, dE, dSpeed); return LIBMCDRIVER_MARLIN_SUCCESS; } @@ -766,7 +790,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movefasttoxy(LibMCDriv } } -LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dSpeed) +LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Marlin_Driver_Marlin pDriver_Marlin, LibMCDriver_Marlin_double dZ, LibMCDriver_Marlin_double dE, LibMCDriver_Marlin_double dSpeed) { IBase* pIBaseClass = (IBase *)pDriver_Marlin; @@ -775,7 +799,7 @@ LibMCDriver_MarlinResult libmcdriver_marlin_driver_marlin_movetoz(LibMCDriver_Ma if (!pIDriver_Marlin) throw ELibMCDriver_MarlinInterfaceException(LIBMCDRIVER_MARLIN_ERROR_INVALIDCAST); - pIDriver_Marlin->MoveToZ(dZ, dSpeed); + pIDriver_Marlin->MoveToZ(dZ, dE, dSpeed); return LIBMCDRIVER_MARLIN_SUCCESS; } @@ -871,6 +895,8 @@ LibMCDriver_MarlinResult LibMCDriver_Marlin::Impl::LibMCDriver_Marlin_GetProcAdd *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_setheatedbedtargettemperature; if (sProcName == "libmcdriver_marlin_driver_marlin_setextrudertargettemperature") *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_setextrudertargettemperature; + if (sProcName == "libmcdriver_marlin_driver_marlin_setfanspeed") + *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_setfanspeed; if (sProcName == "libmcdriver_marlin_driver_marlin_setpidparameters") *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_setpidparameters; if (sProcName == "libmcdriver_marlin_driver_marlin_updatestate") @@ -879,8 +905,8 @@ LibMCDriver_MarlinResult LibMCDriver_Marlin::Impl::LibMCDriver_Marlin_GetProcAdd *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_getcurrentposition; if (sProcName == "libmcdriver_marlin_driver_marlin_gettargetposition") *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_gettargetposition; - if (sProcName == "libmcdriver_marlin_driver_marlin_getextruderposition") - *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_getextruderposition; + if (sProcName == "libmcdriver_marlin_driver_marlin_getextrudertargetposition") + *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_getextrudertargetposition; if (sProcName == "libmcdriver_marlin_driver_marlin_getheatedbedtemperature") *ppProcAddress = (void*) &libmcdriver_marlin_driver_marlin_getheatedbedtemperature; if (sProcName == "libmcdriver_marlin_driver_marlin_getextrudertemperature") diff --git a/Plugins/Main/mcplugin_main.cpp b/Plugins/Main/mcplugin_main.cpp index 394e601f..70710981 100644 --- a/Plugins/Main/mcplugin_main.cpp +++ b/Plugins/Main/mcplugin_main.cpp @@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace LibMCPlugin::Impl; -#include "libmcdriver_camera_dynamic.hpp" +//#include "libmcdriver_camera_dynamic.hpp" #include "libmcenv_drivercast.hpp" #ifdef _MSC_VER @@ -45,8 +45,8 @@ using namespace LibMCPlugin::Impl; /************************************************************************************************************************* Import functionality for Driver into current plugin **************************************************************************************************************************/ -typedef LibMCDriver_Camera::PDriver_RaspiCamera PDriver_RaspiCamera; -typedef LibMCEnv::CDriverCast PDriverCast_RaspiCamera; +//typedef LibMCDriver_Camera::PDriver_RaspiCamera PDriver_RaspiCamera; +//typedef LibMCEnv::CDriverCast PDriverCast_RaspiCamera; /************************************************************************************************************************* Class definition of CMainData @@ -54,14 +54,14 @@ typedef LibMCEnv::CDriverCast SetIntegerParameter("jobinfo", "layercount", nLayerCount); pStateEnvironment->SetBoolParameter("jobinfo", "autostart", false); pStateEnvironment->SetBoolParameter("jobinfo", "printinprogress", true); + pStateEnvironment->SetNextState("waitfortemperature"); + } + +}; + + +/************************************************************************************************************************* + Class definition of CMainState_WaitForTemperature +**************************************************************************************************************************/ + +class CMainState_WaitForTemperature : public virtual CMainState { +public: + + CMainState_WaitForTemperature(const std::string& sStateName, PPluginData pPluginData) + : CMainState(getStateName(), sStateName, pPluginData) + { + } + + static const std::string getStateName() + { + return "waitfortemperature"; + } + + + void Execute(LibMCEnv::PStateEnvironment pStateEnvironment) + { + if (pStateEnvironment.get() == nullptr) + throw ELibMCPluginInterfaceException(LIBMCPLUGIN_ERROR_INVALIDPARAM); + + pStateEnvironment->LogMessage("Wait for temperature..."); + + // TODO do something... + pStateEnvironment->SetNextState("extrudelayer"); } @@ -355,20 +388,20 @@ class CMainState_NextLayer : public virtual CMainState { auto nCurrentLayer = pStateEnvironment->GetIntegerParameter("jobinfo", "currentlayer"); auto nLayerCount = pStateEnvironment->GetIntegerParameter("jobinfo", "layercount"); - pStateEnvironment->LogMessage("Getting Camera Image"); - auto pCameraDriver = m_pPluginData->acquireCameraDriver(pStateEnvironment); - auto pPNGImage = pCameraDriver->CapturePNGImage(); - - std::vector Buffer; - pPNGImage->GetRawData(Buffer); + //pStateEnvironment->LogMessage("Getting Camera Image"); + //auto pCameraDriver = m_pPluginData->acquireCameraDriver(pStateEnvironment); + //auto pPNGImage = pCameraDriver->CapturePNGImage(); + // + //std::vector Buffer; + //pPNGImage->GetRawData(Buffer); auto pBuild = pStateEnvironment->GetBuildJob(sJobUUID); - pBuild->AddBinaryData("image_layer_" + std::to_string(nCurrentLayer) + ".png", "image/png", Buffer); + //pBuild->AddBinaryData("image_layer_" + std::to_string(nCurrentLayer) + ".png", "image/png", Buffer); if (nCurrentLayer < (nLayerCount - 1)) { pStateEnvironment->LogMessage("Advancing to layer #" + std::to_string(nCurrentLayer + 1) + "..."); pStateEnvironment->SetIntegerParameter("jobinfo", "currentlayer", nCurrentLayer + 1); - pStateEnvironment->SetNextState("extrudelayer"); + pStateEnvironment->SetNextState("waitfortemperature"); } else { pStateEnvironment->LogMessage("Finishing process..."); @@ -450,6 +483,9 @@ IState * CStateFactory::CreateState(const std::string & sStateName) if (createStateInstanceByName(sStateName, pStateInstance, m_pPluginData)) return pStateInstance; + if (createStateInstanceByName(sStateName, pStateInstance, m_pPluginData)) + return pStateInstance; + throw ELibMCPluginInterfaceException(LIBMCPLUGIN_ERROR_INVALIDSTATENAME); } diff --git a/Plugins/Movement/mcplugin_movement.cpp b/Plugins/Movement/mcplugin_movement.cpp index c70a07f3..7cc94655 100644 --- a/Plugins/Movement/mcplugin_movement.cpp +++ b/Plugins/Movement/mcplugin_movement.cpp @@ -173,16 +173,31 @@ class CMovementState_Init : public virtual CMovementState { auto sCOMPort = pStateEnvironment->GetStringParameter ("comdata", "port"); auto nBaudRate = pStateEnvironment->GetIntegerParameter("comdata", "baudrate"); + auto nConnectTimeout = pStateEnvironment->GetIntegerParameter("comdata", "connecttimeout"); auto dTimerInterval = pStateEnvironment->GetDoubleParameter("movementstate", "statusupdateinterval"); auto pDriver = m_pPluginData->acquireDriver(pStateEnvironment); - pDriver->Connect(sCOMPort, (uint32_t) nBaudRate, dTimerInterval); + pDriver->Connect(sCOMPort, (uint32_t) nBaudRate, dTimerInterval, nConnectTimeout); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, false); if (!pDriver->IsHomed()) { pStateEnvironment->SetNextState("homing"); } else { + // TODO set temp, fan speed etc parameters?? + //pDriver->SetFanSpeed(0, 126); + //pDriver->SetExtruderTargetTemperature(0, 190, false); + //pDriver->SetHeatedBedTargetTemperature(45, false); + // TODO lower temp for testing without extrusion + //pDriver->SetExtruderTargetTemperature(0, 25, false); + //pDriver->SetHeatedBedTargetTemperature(25, false); + + //pDriver->SetExtruderTargetTemperature(0, 190, true); + //pDriver->SetHeatedBedTargetTemperature(45, true); + // TODO lower temp for testing without extrusion + //pDriver->SetExtruderTargetTemperature(0, 30, true); + //pDriver->SetHeatedBedTargetTemperature(30, true); + pStateEnvironment->SetNextState("idle"); } @@ -323,7 +338,7 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { throw ELibMCPluginInterfaceException(LIBMCPLUGIN_ERROR_INVALIDPARAM); bool bSucces = true; std::stringstream sNoSuccessMsg; - + double dStatusUpdateInterval = pStateEnvironment->GetDoubleParameter("movementstate", "statusupdateinterval"); auto pSignal = pStateEnvironment->RetrieveSignal("globalsignal_doextrudelayer"); @@ -337,24 +352,29 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { auto dLayerZ = pLayer->GetZValue(); double dZ = dLayerZ * dUnit; - auto pDriver = m_pPluginData->acquireDriver(pStateEnvironment); - auto nSegmentCount = pLayer->GetSegmentCount(); + // TODO set speed values by reading data from toolptah... uncomment if data is available + //const double dSpeedMmPerSecond = pLayer->GetSegmentProfileTypedValue(LibMCEnv::eToolpathProfileValueType::Speed); + //const double dSpeedFastMmPerSecond = pLayer->GetSegmentProfileTypedValue(LibMCEnv::eToolpathProfileValueType::JumpSpeed); + //const double dExtrusionFactor = pLayer->GetSegmentProfileTypedValue(LibMCEnv::eToolpathProfileValueType::ExtrusionFactor); + const double dSpeedMmPerSecond = 20; + const double dSpeedFastMmPerSecond = 50; + const double dExtrusionFactor = 5.0; + double dE = 0.0; - auto tStart = std::chrono::high_resolution_clock::now(); + auto pDriver = m_pPluginData->acquireDriver(pStateEnvironment); // do initial move to read z value/layer height + auto nSegmentCount = pLayer->GetSegmentCount(); + auto tStart = std::chrono::high_resolution_clock::now(); if ((nSegmentCount > 0) && (dZ > 0)) { bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveToZ(dZ, 100.0); + pDriver->MoveFastToZ(dZ, dSpeedFastMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); } else { sNoSuccessMsg << "Timeout while moving to layer height Z=" << dZ << " of layer " << nLayerIndex; } - } for (uint32_t nSegmentIndex = 0; nSegmentIndex < nSegmentCount; nSegmentIndex++) { @@ -376,17 +396,17 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { // move fast to first hatch coord (first of a pair of coord) bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveFastToXY(PointData[i].m_Coordinates[0] * dUnit, PointData[i].m_Coordinates[1] * dUnit, 100.0); + pDriver->MoveFastToXY(PointData[i].m_Coordinates[0] * dUnit, PointData[i].m_Coordinates[1] * dUnit, dSpeedFastMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); // move to second hatch coord with extrusion (second of a pair of coord) bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveToXY(PointData[i + 1].m_Coordinates[0] * dUnit, PointData[i + 1].m_Coordinates[1] * dUnit, 100.0); + auto dDistance = sqrt( + pow(PointData[i + 1].m_Coordinates[0] - PointData[i].m_Coordinates[0], 2) + + pow(PointData[i + 1].m_Coordinates[1] - PointData[i].m_Coordinates[1], 2)) * dUnit; + dE = dDistance * dExtrusionFactor; + pDriver->MoveToXY(PointData[i + 1].m_Coordinates[0] * dUnit, PointData[i + (int)1].m_Coordinates[1] * dUnit, dE, dSpeedMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); } else { @@ -412,9 +432,7 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { // move fast to first point of loop bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveFastToXY(PointData[0].m_Coordinates[0] * dUnit, PointData[0].m_Coordinates[1] * dUnit, 100.0); + pDriver->MoveFastToXY(PointData[0].m_Coordinates[0] * dUnit, PointData[0].m_Coordinates[1] * dUnit, dSpeedFastMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); @@ -422,9 +440,11 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { // move to rest of points of loop (with extrusion) bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveToXY(PointData[i].m_Coordinates[0] * dUnit, PointData[i].m_Coordinates[1] * dUnit, 100.0); + auto dDistance = sqrt( + pow(PointData[i].m_Coordinates[0] - PointData[i - 1].m_Coordinates[0], 2) + + pow(PointData[i].m_Coordinates[1] - PointData[i - 1].m_Coordinates[1], 2)) * dUnit; + dE = dDistance * dExtrusionFactor; + pDriver->MoveToXY(PointData[i].m_Coordinates[0] * dUnit, PointData[i].m_Coordinates[1] * dUnit, dE, dSpeedMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); } else { @@ -437,9 +457,11 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { // move from last point in list to first point to close the of loop (with extrusion) bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveToXY(PointData[0].m_Coordinates[0] * dUnit, PointData[0].m_Coordinates[1] * dUnit, 100.0); + auto dDistance = sqrt( + pow(PointData[0].m_Coordinates[0] - PointData[nPointCount - 1].m_Coordinates[0], 2) + + pow(PointData[0].m_Coordinates[1] - PointData[nPointCount - 1].m_Coordinates[1], 2)) * dUnit; + dE = dDistance * dExtrusionFactor; + pDriver->MoveToXY(PointData[0].m_Coordinates[0] * dUnit, PointData[0].m_Coordinates[1] * dUnit, dE, dSpeedMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); } else { @@ -455,9 +477,7 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { // move fast to first point of Polyline bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveFastToXY(PointData[0].m_Coordinates[0] * dUnit, PointData[0].m_Coordinates[1] * dUnit, 100.0); + pDriver->MoveFastToXY(PointData[0].m_Coordinates[0] * dUnit, PointData[0].m_Coordinates[1] * dUnit, dSpeedFastMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); @@ -465,9 +485,11 @@ class CMovementState_DoExtrudeLayer : public virtual CMovementState { // move to rest of points of polyline (with extrusion) bSucces = canExecuteMovement(pStateEnvironment, dStatusUpdateInterval, pDriver, nLayerTimeout, tStart); if (bSucces) { - // TODO check how to en/disable extrusion - // TODO check how to set Speed/Feedrate - pDriver->MoveToXY(PointData[i].m_Coordinates[0] * dUnit, PointData[i].m_Coordinates[1] * dUnit, 100.0); + auto dDistance = sqrt( + pow(PointData[i].m_Coordinates[0] - PointData[i -1].m_Coordinates[0], 2) + + pow(PointData[i].m_Coordinates[1] - PointData[i - 1].m_Coordinates[1], 2)) * dUnit; + dE = dDistance * dExtrusionFactor; + pDriver->MoveToXY(PointData[i].m_Coordinates[0] * dUnit, PointData[i].m_Coordinates[1] * dUnit, dE, dSpeedMmPerSecond); m_pPluginData->updateStateFromDriver(pDriver, pStateEnvironment, true); } @@ -531,6 +553,20 @@ class CMovementState_Homing : public virtual CMovementState { auto pDriver = m_pPluginData->acquireDriver(pStateEnvironment); pDriver->StartHoming(); + // TODO set temp, fan speed etc parameters?? + //pDriver->SetFanSpeed(0, 126); + //pDriver->SetExtruderTargetTemperature(0, 190, false); + //pDriver->SetHeatedBedTargetTemperature(45, false); + // TODO lower temp for testing without extrusion + //pDriver->SetExtruderTargetTemperature(0, 25, false); + //pDriver->SetHeatedBedTargetTemperature(25, false); + + //pDriver->SetExtruderTargetTemperature(0, 190, true); + //pDriver->SetHeatedBedTargetTemperature(45, true); + // TODO lower temp for testing without extrusion + //pDriver->SetExtruderTargetTemperature(0, 30, true); + //pDriver->SetHeatedBedTargetTemperature(30, true); + pStateEnvironment->SetNextState("idle"); } diff --git a/Plugins/PIDControl/mcplugin_pidcontrol.cpp b/Plugins/PIDControl/mcplugin_pidcontrol.cpp index dd244e09..277a1441 100644 --- a/Plugins/PIDControl/mcplugin_pidcontrol.cpp +++ b/Plugins/PIDControl/mcplugin_pidcontrol.cpp @@ -149,7 +149,9 @@ class CPIDControlState_Idle : public virtual CPIDControlState { //pSignalHandler->SignalHandled(); pStateEnvironment->LogMessage("PIDControl Active..."); - pStateEnvironment->SetNextState("controlling"); + // TODO blocked while testing extrusion => do uncomment later pStateEnvironment->SetNextState("controlling"); + pStateEnvironment->Sleep(2000); + pStateEnvironment->SetNextState("idle"); } else { diff --git a/Templates/libmcconfig.xml b/Templates/libmcconfig.xml index 63dbcf4e..ede9a239 100644 --- a/Templates/libmcconfig.xml +++ b/Templates/libmcconfig.xml @@ -18,6 +18,13 @@ + + + + + + + @@ -37,17 +44,21 @@ - + + + + + - + @@ -82,9 +93,16 @@ + + + + + + + diff --git a/githash.txt b/githash.txt new file mode 100644 index 00000000..38cd0f8d --- /dev/null +++ b/githash.txt @@ -0,0 +1 @@ +924f8fa