Merge branch 'bugfix-2.0.x' into Trex_2.0.x_Devel
This commit is contained in:
@@ -61,7 +61,7 @@ jobs:
|
||||
- STM32F103RC_fysetc
|
||||
- STM32F103RC_meeb
|
||||
- jgaurora_a5s_a1
|
||||
- STM32F103VE_longer
|
||||
- STM32F103VE_longer_maple
|
||||
#- mks_robin_maple
|
||||
- mks_robin_lite
|
||||
- mks_robin_pro
|
||||
@@ -75,6 +75,7 @@ jobs:
|
||||
- STM32F103RE_btt
|
||||
- STM32F103RE_btt_USB
|
||||
- STM32F103RET6_creality
|
||||
- STM32F103VE_longer
|
||||
- STM32F407VE_black
|
||||
- STM32F401VE_STEVAL
|
||||
- BIGTREE_BTT002
|
||||
|
||||
@@ -425,6 +425,7 @@
|
||||
#define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164
|
||||
//#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands
|
||||
//#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD
|
||||
//#define MIXING_PRESETS // Assign 8 default V-tool presets for 2 or 3 MIXING_STEPPERS
|
||||
#if ENABLED(GRADIENT_MIX)
|
||||
//#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias
|
||||
#endif
|
||||
@@ -1288,7 +1289,7 @@
|
||||
#endif
|
||||
|
||||
// Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J
|
||||
// When the pin is defined you can use M672 to set/reset the probe sensivity.
|
||||
// When the pin is defined you can use M672 to set/reset the probe sensitivity.
|
||||
//#define DUET_SMART_EFFECTOR
|
||||
#if ENABLED(DUET_SMART_EFFECTOR)
|
||||
#define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin
|
||||
|
||||
@@ -3907,7 +3907,7 @@
|
||||
*/
|
||||
#define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks.
|
||||
|
||||
// Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise.
|
||||
// Use a rolling average to identify persistent errors that indicate skips, as opposed to vibration and noise.
|
||||
#define I2CPE_ERR_ROLLING_AVERAGE
|
||||
|
||||
#endif // I2C_POSITION_ENCODERS
|
||||
|
||||
+1
-1
@@ -110,7 +110,7 @@ LIQUID_TWI2 ?= 0
|
||||
WIRE ?= 0
|
||||
|
||||
# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h)
|
||||
# Disabling this (and SPEAKER) saves approximatively 350 bytes of memory.
|
||||
# Disabling this (and SPEAKER) saves approximately 350 bytes of memory.
|
||||
TONE ?= 1
|
||||
|
||||
# This defines if U8GLIB is needed (may require RELOC_WORKAROUND)
|
||||
|
||||
+2
-2
@@ -28,7 +28,7 @@
|
||||
/**
|
||||
* Marlin release version identifier
|
||||
*/
|
||||
#define SHORT_BUILD_VERSION "2.0.5_TR25"
|
||||
#define SHORT_BUILD_VERSION "2.0.9_TR1"
|
||||
|
||||
/**
|
||||
* Verbose version identifier which should contain a reference to the location
|
||||
@@ -41,7 +41,7 @@
|
||||
* here we define this default string as the date where the latest release
|
||||
* version was tagged.
|
||||
*/
|
||||
#define STRING_DISTRIBUTION_DATE "2021-07-31"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-08-05"
|
||||
|
||||
/**
|
||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||
|
||||
@@ -284,7 +284,7 @@ enum ClockSource2 : char {
|
||||
* PWM availability macros
|
||||
*/
|
||||
|
||||
// Determine which harware PWMs are already in use
|
||||
// Determine which hardware PWMs are already in use
|
||||
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
|
||||
#if PIN_EXISTS(CONTROLLER_FAN)
|
||||
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
||||
|
||||
@@ -437,7 +437,7 @@
|
||||
} while (--todo);
|
||||
}
|
||||
|
||||
// Pointers to generic functions for block tranfers
|
||||
// Pointers to generic functions for block transfers
|
||||
static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
* \page arduino_due_x_board_info "Arduino Due/X - Board informations"
|
||||
* \page arduino_due_x_board_info "Arduino Due/X - Board information"
|
||||
* This page lists several definition related to the board description.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -90,7 +90,7 @@ typedef struct {
|
||||
//! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer)
|
||||
uint8_t *payload;
|
||||
|
||||
//! Size of buffer to send or fill, and content the number of byte transfered
|
||||
//! Size of buffer to send or fill, and content the number of byte transferred
|
||||
uint16_t payload_size;
|
||||
|
||||
//! Callback called after reception of ZLP from setup request
|
||||
@@ -132,7 +132,7 @@ typedef void (*udd_callback_halt_cleared_t)(void);
|
||||
*
|
||||
* \param status UDD_EP_TRANSFER_OK, if transfer is complete
|
||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
||||
* \param n number of data transfered
|
||||
* \param n number of data transferred
|
||||
*/
|
||||
typedef void (*udd_callback_trans_t) (udd_ep_status_t status,
|
||||
iram_size_t nb_transfered, udd_ep_id_t ep);
|
||||
@@ -303,7 +303,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
|
||||
* The driver uses a specific DMA USB to transfer data
|
||||
* from internal RAM to endpoint, if this one is available.
|
||||
* When the transfer is finished or aborted (stall, reset, ...), the \a callback is called.
|
||||
* The \a callback returns the transfer status and eventually the number of byte transfered.
|
||||
* The \a callback returns the transfer status and eventually the number of byte transferred.
|
||||
* Note: The control endpoint is not authorized.
|
||||
*
|
||||
* \param ep The ID of the endpoint to use
|
||||
|
||||
@@ -162,7 +162,7 @@ static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep);
|
||||
*
|
||||
* \param status UDD_EP_TRANSFER_OK, if transfer finished
|
||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
||||
* \param n number of data transfered
|
||||
* \param n number of data transferred
|
||||
*/
|
||||
static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
|
||||
|
||||
@@ -200,7 +200,7 @@ static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_
|
||||
*
|
||||
* \param status UDD_EP_TRANSFER_OK, if transfer finished
|
||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
||||
* \param n number of data transfered
|
||||
* \param n number of data transferred
|
||||
*/
|
||||
static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ extern "C" {
|
||||
*/
|
||||
//@{
|
||||
# if UDI_CDC_PORT_NB > 2
|
||||
# error USBB, UDP, UDPHS and UOTGHS interfaces have not enought endpoints.
|
||||
# error USBB, UDP, UDPHS and UOTGHS interfaces have not enough endpoints.
|
||||
# endif
|
||||
#define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX
|
||||
#define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX
|
||||
|
||||
@@ -173,7 +173,7 @@ static void udi_msc_cbw_wait(void);
|
||||
*
|
||||
* \param status UDD_EP_TRANSFER_OK, if transfer is finished
|
||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
||||
* \param nb_received number of data transfered
|
||||
* \param nb_received number of data transferred
|
||||
*/
|
||||
static void udi_msc_cbw_received(udd_ep_status_t status,
|
||||
iram_size_t nb_received, udd_ep_id_t ep);
|
||||
@@ -211,7 +211,7 @@ static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size);
|
||||
*
|
||||
* \param status UDD_EP_TRANSFER_OK, if transfer finish
|
||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
||||
* \param nb_sent number of data transfered
|
||||
* \param nb_sent number of data transferred
|
||||
*/
|
||||
static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
|
||||
udd_ep_id_t ep);
|
||||
@@ -244,7 +244,7 @@ void udi_msc_csw_send(void);
|
||||
*
|
||||
* \param status UDD_EP_TRANSFER_OK, if transfer is finished
|
||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
||||
* \param nb_sent number of data transfered
|
||||
* \param nb_sent number of data transferred
|
||||
*/
|
||||
static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
|
||||
udd_ep_id_t ep);
|
||||
@@ -463,7 +463,7 @@ uint8_t udi_msc_getsetting(void)
|
||||
static void udi_msc_cbw_invalid(void)
|
||||
{
|
||||
if (!udi_msc_b_cbw_invalid)
|
||||
return; // Don't re-stall endpoint if error reseted by setup
|
||||
return; // Don't re-stall endpoint if error reset by setup
|
||||
udd_ep_set_halt(UDI_MSC_EP_OUT);
|
||||
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it
|
||||
udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid);
|
||||
@@ -472,7 +472,7 @@ static void udi_msc_cbw_invalid(void)
|
||||
static void udi_msc_csw_invalid(void)
|
||||
{
|
||||
if (!udi_msc_b_cbw_invalid)
|
||||
return; // Don't re-stall endpoint if error reseted by setup
|
||||
return; // Don't re-stall endpoint if error reset by setup
|
||||
udd_ep_set_halt(UDI_MSC_EP_IN);
|
||||
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it
|
||||
udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid);
|
||||
|
||||
@@ -325,7 +325,7 @@ static void udd_sleep_mode(bool b_idle)
|
||||
/**
|
||||
* \name Control endpoint low level management routine.
|
||||
*
|
||||
* This function performs control endpoint mangement.
|
||||
* This function performs control endpoint management.
|
||||
* It handle the SETUP/DATA/HANDSHAKE phases of a control transaction.
|
||||
*/
|
||||
//@{
|
||||
@@ -397,9 +397,9 @@ static void udd_ctrl_endofrequest(void);
|
||||
/**
|
||||
* \brief Main interrupt routine for control endpoint
|
||||
*
|
||||
* This switchs control endpoint events to correct sub function.
|
||||
* This switches control endpoint events to correct sub function.
|
||||
*
|
||||
* \return \c 1 if an event about control endpoint is occured, otherwise \c 0.
|
||||
* \return \c 1 if an event about control endpoint is occurred, otherwise \c 0.
|
||||
*/
|
||||
static bool udd_ctrl_interrupt(void);
|
||||
|
||||
@@ -410,7 +410,7 @@ static bool udd_ctrl_interrupt(void);
|
||||
* \name Management of bulk/interrupt/isochronous endpoints
|
||||
*
|
||||
* The UDD manages the data transfer on endpoints:
|
||||
* - Start data tranfer on endpoint with USB Device DMA
|
||||
* - Start data transfer on endpoint with USB Device DMA
|
||||
* - Send a ZLP packet if requested
|
||||
* - Call callback registered to signal end of transfer
|
||||
* The transfer abort and stall feature are supported.
|
||||
@@ -431,7 +431,7 @@ typedef struct {
|
||||
uint8_t *buf;
|
||||
//! Size of buffer to send or fill
|
||||
iram_size_t buf_size;
|
||||
//!< Size of data transfered
|
||||
//!< Size of data transferred
|
||||
iram_size_t buf_cnt;
|
||||
//!< Size of data loaded (or prepared for DMA) last time
|
||||
iram_size_t buf_load;
|
||||
@@ -486,7 +486,7 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
|
||||
|
||||
#ifdef UDD_EP_DMA_SUPPORTED
|
||||
/**
|
||||
* \brief Start the next transfer if necessary or complet the job associated.
|
||||
* \brief Start the next transfer if necessary or complete the job associated.
|
||||
*
|
||||
* \param ep endpoint number without direction flag
|
||||
*/
|
||||
@@ -496,9 +496,9 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
|
||||
/**
|
||||
* \brief Main interrupt routine for bulk/interrupt/isochronous endpoints
|
||||
*
|
||||
* This switchs endpoint events to correct sub function.
|
||||
* This switches endpoint events to correct sub function.
|
||||
*
|
||||
* \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occured, otherwise \c 0.
|
||||
* \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occurred, otherwise \c 0.
|
||||
*/
|
||||
static bool udd_ep_interrupt(void);
|
||||
|
||||
@@ -520,7 +520,7 @@ static bool udd_ep_interrupt(void);
|
||||
*
|
||||
* Note:
|
||||
* Here, the global interrupt mask is not clear when an USB interrupt is enabled
|
||||
* because this one can not be occured during the USB ISR (=during INTX is masked).
|
||||
* because this one can not be occurred during the USB ISR (=during INTX is masked).
|
||||
* See Technical reference $3.8.3 Masking interrupt requests in peripheral modules.
|
||||
*/
|
||||
#ifdef UHD_ENABLE
|
||||
@@ -787,7 +787,7 @@ void udd_attach(void)
|
||||
udd_sleep_mode(true);
|
||||
otg_unfreeze_clock();
|
||||
|
||||
// This section of clock check can be improved with a chek of
|
||||
// This section of clock check can be improved with a check of
|
||||
// USB clock source via sysclk()
|
||||
// Check USB clock because the source can be a PLL
|
||||
while (!Is_otg_clock_usable());
|
||||
@@ -803,7 +803,7 @@ void udd_attach(void)
|
||||
#ifdef USB_DEVICE_HS_SUPPORT
|
||||
udd_enable_msof_interrupt();
|
||||
#endif
|
||||
// Reset following interupts flag
|
||||
// Reset following interrupts flag
|
||||
udd_ack_reset();
|
||||
udd_ack_sof();
|
||||
udd_ack_msof();
|
||||
@@ -902,7 +902,7 @@ bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes,
|
||||
}
|
||||
dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize);
|
||||
|
||||
// Bank choise
|
||||
// Bank choice
|
||||
switch (bmAttributes & USB_EP_TYPE_MASK) {
|
||||
case USB_EP_TYPE_ISOCHRONOUS:
|
||||
nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep);
|
||||
@@ -1228,7 +1228,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
|
||||
|
||||
if (Is_udd_endpoint_stall_requested(ep)
|
||||
|| ptr_job->stall_requested) {
|
||||
// Endpoint halted then registes the callback
|
||||
// Endpoint halted then registers the callback
|
||||
ptr_job->busy = true;
|
||||
ptr_job->call_nohalt = callback;
|
||||
} else {
|
||||
@@ -1386,7 +1386,7 @@ static void udd_ctrl_setup_received(void)
|
||||
|
||||
// Decode setup request
|
||||
if (udc_process_setup() == false) {
|
||||
// Setup request unknow then stall it
|
||||
// Setup request unknown then stall it
|
||||
udd_ctrl_stall_data();
|
||||
udd_ack_setup_received(0);
|
||||
return;
|
||||
@@ -1447,7 +1447,7 @@ static void udd_ctrl_in_sent(void)
|
||||
udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt;
|
||||
if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt)
|
||||
|| b_shortpacket) {
|
||||
// All data requested are transfered or a short packet has been sent
|
||||
// All data requested are transferred or a short packet has been sent
|
||||
// then it is the end of data phase.
|
||||
// Generate an OUT ZLP for handshake phase.
|
||||
udd_ctrl_send_zlp_out();
|
||||
@@ -1516,7 +1516,7 @@ static void udd_ctrl_out_received(void)
|
||||
// End of SETUP request:
|
||||
// - Data IN Phase aborted,
|
||||
// - or last Data IN Phase hidden by ZLP OUT sending quiclky,
|
||||
// - or ZLP OUT received normaly.
|
||||
// - or ZLP OUT received normally.
|
||||
udd_ctrl_endofrequest();
|
||||
} else {
|
||||
// Protocol error during SETUP request
|
||||
@@ -1544,7 +1544,7 @@ static void udd_ctrl_out_received(void)
|
||||
(udd_ctrl_prev_payload_buf_cnt +
|
||||
udd_ctrl_payload_buf_cnt))) {
|
||||
// End of reception because it is a short packet
|
||||
// Before send ZLP, call intermediat calback
|
||||
// Before send ZLP, call intermediate callback
|
||||
// in case of data receiv generate a stall
|
||||
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
||||
if (NULL != udd_g_ctrlreq.over_under_run) {
|
||||
@@ -1565,7 +1565,7 @@ static void udd_ctrl_out_received(void)
|
||||
if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) {
|
||||
// Overrun then request a new payload buffer
|
||||
if (!udd_g_ctrlreq.over_under_run) {
|
||||
// No callback availabled to request a new payload buffer
|
||||
// No callback available to request a new payload buffer
|
||||
udd_ctrl_stall_data();
|
||||
// Ack reception of OUT to replace NAK by a STALL
|
||||
udd_ack_out_received(0);
|
||||
@@ -1805,7 +1805,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
|
||||
// transfer size of UDD_ENDPOINT_MAX_TRANS Bytes
|
||||
next_trans = UDD_ENDPOINT_MAX_TRANS;
|
||||
|
||||
// Set 0 to tranfer the maximum
|
||||
// Set 0 to transfer the maximum
|
||||
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0);
|
||||
} else {
|
||||
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans);
|
||||
@@ -1850,7 +1850,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
|
||||
}
|
||||
cpu_irq_restore(flags);
|
||||
|
||||
// Here a ZLP has been recieved
|
||||
// Here a ZLP has been received
|
||||
// and the DMA transfer must be not started.
|
||||
// It is the end of transfer
|
||||
ptr_job->buf_size = ptr_job->buf_cnt;
|
||||
@@ -1991,13 +1991,13 @@ static bool udd_ep_interrupt(void)
|
||||
}
|
||||
dbg_print("dma%x: ", ep);
|
||||
udd_disable_endpoint_dma_interrupt(ep);
|
||||
// Save number of data no transfered
|
||||
// Save number of data no transferred
|
||||
nb_remaining = (udd_endpoint_dma_get_status(ep) &
|
||||
UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk)
|
||||
>> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos;
|
||||
if (nb_remaining) {
|
||||
// Transfer no complete (short packet or ZLP) then:
|
||||
// Update number of data transfered
|
||||
// Update number of data transferred
|
||||
ptr_job->buf_cnt -= nb_remaining;
|
||||
// Set transfer complete to stop the transfer
|
||||
ptr_job->buf_size = ptr_job->buf_cnt;
|
||||
@@ -2056,7 +2056,7 @@ static bool udd_ep_interrupt(void)
|
||||
udd_disable_endpoint_interrupt(ep);
|
||||
|
||||
Assert(ptr_job->stall_requested);
|
||||
// A stall has been requested during backgound transfer
|
||||
// A stall has been requested during background transfer
|
||||
ptr_job->stall_requested = false;
|
||||
udd_disable_endpoint_bank_autoswitch(ep);
|
||||
udd_enable_stall_handshake(ep);
|
||||
|
||||
@@ -130,7 +130,7 @@ struct usb_msc_cbw {
|
||||
struct usb_msc_csw {
|
||||
le32_t dCSWSignature; //!< Must contain 'USBS'
|
||||
le32_t dCSWTag; //!< Same as dCBWTag
|
||||
le32_t dCSWDataResidue; //!< Number of bytes not transfered
|
||||
le32_t dCSWDataResidue; //!< Number of bytes not transferred
|
||||
uint8_t bCSWStatus; //!< Status code
|
||||
};
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ void Heater::update() {
|
||||
}
|
||||
|
||||
void Heater::interrupt(GpioEvent ev) {
|
||||
// ununsed
|
||||
// unused
|
||||
}
|
||||
|
||||
#endif // __PLAT_LINUX__
|
||||
|
||||
@@ -55,7 +55,7 @@ constexpr bool VALID_PIN(const pin_t p) { return WITHIN(p, 0, NUM_DIGITAL_PINS);
|
||||
// Test whether the pin is PWM
|
||||
constexpr bool PWM_PIN(const pin_t p) { return false; }
|
||||
|
||||
// Test whether the pin is interruptable
|
||||
// Test whether the pin is interruptible
|
||||
constexpr bool INTERRUPT_PIN(const pin_t p) { return false; }
|
||||
|
||||
// Get the pin number at the given index
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
// Struct must be 32 bits aligned because of DMA accesses but fields needs to be 8 bits packed
|
||||
typedef struct __attribute__((aligned(4), packed)) {
|
||||
ADC_INPUTCTRL_Type INPUTCTRL;
|
||||
} HAL_DMA_DAC_Registers; // DMA transfered registers
|
||||
} HAL_DMA_DAC_Registers; // DMA transferred registers
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
*/
|
||||
#define PWM_PIN(P) (WITHIN(P, 2, 13) || WITHIN(P, 22, 23) || WITHIN(P, 44, 45) || P == 48)
|
||||
|
||||
// Return fullfilled ADCx->INPUTCTRL.reg
|
||||
// Return fulfilled ADCx->INPUTCTRL.reg
|
||||
#define PIN_TO_INPUTCTRL(P) ( (PIN_TO_AIN(P) == 0) ? ADC_INPUTCTRL_MUXPOS_AIN0 \
|
||||
: (PIN_TO_AIN(P) == 1) ? ADC_INPUTCTRL_MUXPOS_AIN1 \
|
||||
: (PIN_TO_AIN(P) == 2) ? ADC_INPUTCTRL_MUXPOS_AIN2 \
|
||||
|
||||
@@ -107,7 +107,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
tc->COUNT32.INTENCLR.reg = TC_INTENCLR_OVF; // disable overflow interrupt
|
||||
|
||||
// TCn clock setup
|
||||
const uint8_t clockID = GCLK_CLKCTRL_IDs[TCC_INST_NUM + timer_num]; // TC clock are preceeded by TCC ones
|
||||
const uint8_t clockID = GCLK_CLKCTRL_IDs[TCC_INST_NUM + timer_num]; // TC clock are preceded by TCC ones
|
||||
GCLK->PCHCTRL[clockID].bit.CHEN = false;
|
||||
SYNC(GCLK->PCHCTRL[clockID].bit.CHEN);
|
||||
GCLK->PCHCTRL[clockID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed
|
||||
|
||||
@@ -123,7 +123,7 @@ static void TX(char c) {
|
||||
}
|
||||
regs->DR = c;
|
||||
#else
|
||||
// Let's hope a mystical guru will fix this, one day by writting interrupt-free USB CDC ACM code (or, at least, by polling the registers since interrupt will be queued but will never trigger)
|
||||
// Let's hope a mystical guru will fix this, one day by writing interrupt-free USB CDC ACM code (or, at least, by polling the registers since interrupt will be queued but will never trigger)
|
||||
// For now, it's completely lost to oblivion.
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM
|
||||
// This allows all timer interrupt priorities to be managed from a single location in the HAL.
|
||||
static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
|
||||
|
||||
// This must be called after the STM32 Servo class has intialized the timer.
|
||||
// This must be called after the STM32 Servo class has initialized the timer.
|
||||
// It may only be needed after the first call to attach(), but it is possible
|
||||
// that is is necessary after every detach() call. To be safe this is currently
|
||||
// called after every call to attach().
|
||||
|
||||
@@ -121,7 +121,7 @@ bool PersistentStore::access_start() {
|
||||
address += sizeof(uint32_t);
|
||||
}
|
||||
if (current_slot == -1) {
|
||||
// We didn't find anything, so we'll just intialize to empty
|
||||
// We didn't find anything, so we'll just initialize to empty
|
||||
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8;
|
||||
current_slot = EEPROM_SLOTS;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
// multi block optmization
|
||||
// multi block optimization
|
||||
sd2card->writeStart(blkAddr, blkLen);
|
||||
while (blkLen--) {
|
||||
watchdog_refresh();
|
||||
@@ -80,7 +80,7 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
// multi block optmization
|
||||
// multi block optimization
|
||||
sd2card->readStart(blkAddr);
|
||||
while (blkLen--) {
|
||||
watchdog_refresh();
|
||||
|
||||
@@ -253,7 +253,7 @@ static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) {
|
||||
reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */
|
||||
reg_value = (reg_value |
|
||||
((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) |
|
||||
(PriorityGroupTmp << 8)); /* Insert write key and priorty group */
|
||||
(PriorityGroupTmp << 8)); /* Insert write key & priority group */
|
||||
SCB->AIRCR = reg_value;
|
||||
}
|
||||
|
||||
|
||||
@@ -363,8 +363,8 @@ uint16_t SPIClass::transfer16(uint16_t data) const {
|
||||
/**
|
||||
* Roger Clark and Victor Perez, 2015
|
||||
* Performs a DMA SPI transfer with at least a receive buffer.
|
||||
* If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer.
|
||||
* On exit TX buffer is not modified, and RX buffer cotains the received data.
|
||||
* If a TX buffer is not provided, FF is sent over and over for the length of the transfer.
|
||||
* On exit TX buffer is not modified, and RX buffer contains the received data.
|
||||
* Still in progress.
|
||||
*/
|
||||
void SPIClass::dmaTransferSet(const void *transmitBuf, void *receiveBuf) {
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
#pragma once
|
||||
|
||||
#define _DISKIO_WRITE 1 /* 1: Enable disk_write function */
|
||||
#define _DISKIO_IOCTL 1 /* 1: Enable disk_ioctl fucntion */
|
||||
#define _DISKIO_ISDIO 0 /* 1: Enable iSDIO control fucntion */
|
||||
#define _DISKIO_IOCTL 1 /* 1: Enable disk_ioctl function */
|
||||
#define _DISKIO_ISDIO 0 /* 1: Enable iSDIO control function */
|
||||
|
||||
typedef unsigned char BYTE;
|
||||
typedef unsigned short WORD;
|
||||
@@ -56,7 +56,7 @@ DRESULT disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
|
||||
#define STA_NODISK 0x02 /* No medium in the drive */
|
||||
#define STA_PROTECT 0x04 /* Write protected */
|
||||
|
||||
/* Command code for disk_ioctrl fucntion */
|
||||
/* Command code for disk_ioctrl function */
|
||||
|
||||
/* Generic command (Used by FatFs) */
|
||||
#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */
|
||||
|
||||
@@ -166,7 +166,7 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const ha
|
||||
case STEP_TIMER_NUM:
|
||||
// NOTE: WE have set ARPE = 0, which means the Auto reload register is not preloaded
|
||||
// and there is no need to use any compare, as in the timer mode used, setting ARR to the compare value
|
||||
// will result in exactly the same effect, ie trigerring an interrupt, and on top, set counter to 0
|
||||
// will result in exactly the same effect, ie triggering an interrupt, and on top, set counter to 0
|
||||
timer_set_reload(STEP_TIMER_DEV, compare); // We reload direct ARR as needed during counting up
|
||||
break;
|
||||
case TEMP_TIMER_NUM:
|
||||
|
||||
@@ -65,7 +65,7 @@ void spiInit(uint8_t spiRate) {
|
||||
case SPI_EIGHTH_SPEED: clock = 1250000; break;
|
||||
case SPI_SPEED_5: clock = 625000; break;
|
||||
case SPI_SPEED_6: clock = 312500; break;
|
||||
default: clock = 4000000; // Default from the SPI libarary
|
||||
default: clock = 4000000; // Default from the SPI library
|
||||
}
|
||||
spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0);
|
||||
SPI.begin();
|
||||
|
||||
@@ -65,7 +65,7 @@ void spiInit(uint8_t spiRate) {
|
||||
case SPI_SPEED_5: clock = 625000; break;
|
||||
case SPI_SPEED_6: clock = 312500; break;
|
||||
default:
|
||||
clock = 4000000; // Default from the SPI libarary
|
||||
clock = 4000000; // Default from the SPI library
|
||||
}
|
||||
spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0);
|
||||
SPI.begin();
|
||||
|
||||
@@ -82,7 +82,7 @@ void spiInit(uint8_t spiRate) {
|
||||
case SPI_SPEED_5: clock = 625000; break;
|
||||
case SPI_SPEED_6: clock = 312500; break;
|
||||
default:
|
||||
clock = 4000000; // Default from the SPI libarary
|
||||
clock = 4000000; // Default from the SPI library
|
||||
}
|
||||
spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0);
|
||||
SPI.begin();
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* This program is PUBLIC DOMAIN.
|
||||
* This means that there is no copyright and anyone is able to take a copy
|
||||
* for free and use it as they wish, with or without modifications, and in
|
||||
* any context, commerically or otherwise. The only limitation is that I
|
||||
* any context, commercially or otherwise. The only limitation is that I
|
||||
* don't guarantee that the software is fit for any purpose or accept any
|
||||
* liability for its use or misuse - this software is without warranty.
|
||||
***************************************************************************
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* This program is PUBLIC DOMAIN.
|
||||
* This means that there is no copyright and anyone is able to take a copy
|
||||
* for free and use it as they wish, with or without modifications, and in
|
||||
* any context, commerically or otherwise. The only limitation is that I
|
||||
* any context, commercially or otherwise. The only limitation is that I
|
||||
* don't guarantee that the software is fit for any purpose or accept any
|
||||
* liability for its use or misuse - this software is without warranty.
|
||||
***************************************************************************
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* This program is PUBLIC DOMAIN.
|
||||
* This means that there is no copyright and anyone is able to take a copy
|
||||
* for free and use it as they wish, with or without modifications, and in
|
||||
* any context, commerically or otherwise. The only limitation is that I
|
||||
* any context, commercially or otherwise. The only limitation is that I
|
||||
* don't guarantee that the software is fit for any purpose or accept any
|
||||
* liability for its use or misuse - this software is without warranty.
|
||||
***************************************************************************
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* This program is PUBLIC DOMAIN.
|
||||
* This means that there is no copyright and anyone is able to take a copy
|
||||
* for free and use it as they wish, with or without modifications, and in
|
||||
* any context, commerically or otherwise. The only limitation is that I
|
||||
* any context, commercially or otherwise. The only limitation is that I
|
||||
* don't guarantee that the software is fit for any purpose or accept any
|
||||
* liability for its use or misuse - this software is without warranty.
|
||||
***************************************************************************
|
||||
|
||||
@@ -28,7 +28,7 @@ extern "C" const UnwTabEntry __exidx_end[];
|
||||
|
||||
// Detect if unwind information is present or not
|
||||
static int HasUnwindTableInfo() {
|
||||
// > 16 because there are default entries we can't supress
|
||||
// > 16 because there are default entries we can't suppress
|
||||
return ((char*)(&__exidx_end) - (char*)(&__exidx_start)) > 16 ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* This program is PUBLIC DOMAIN.
|
||||
* This means that there is no copyright and anyone is able to take a copy
|
||||
* for free and use it as they wish, with or without modifications, and in
|
||||
* any context, commerically or otherwise. The only limitation is that I
|
||||
* any context, commercially or otherwise. The only limitation is that I
|
||||
* don't guarantee that the software is fit for any purpose or accept any
|
||||
* liability for its use or misuse - this software is without warranty.
|
||||
**************************************************************************/
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* This program is PUBLIC DOMAIN.
|
||||
* This means that there is no copyright and anyone is able to take a copy
|
||||
* for free and use it as they wish, with or without modifications, and in
|
||||
* any context, commerically or otherwise. The only limitation is that I
|
||||
* any context, commercially or otherwise. The only limitation is that I
|
||||
* don't guarantee that the software is fit for any purpose or accept any
|
||||
* liability for its use or misuse - this software is without warranty.
|
||||
***************************************************************************
|
||||
|
||||
@@ -345,7 +345,7 @@ void hook_cpu_exceptions() {
|
||||
// We failed to find a valid vector table size, let's abort hooking up
|
||||
if (vec_size == VECTOR_TABLE_SENTINEL) return;
|
||||
// Poor method that's wasting RAM here, but allocating with malloc and alignment would be worst
|
||||
// 128 bytes alignement is required for writing the VTOR register
|
||||
// 128 bytes alignment is required for writing the VTOR register
|
||||
alignas(128) static unsigned long vectable[VECTOR_TABLE_SENTINEL];
|
||||
|
||||
SERIAL_ECHOPGM("Detected vector table size: ");
|
||||
|
||||
@@ -399,7 +399,7 @@
|
||||
template <typename T, typename ... Args> struct first_type_of { typedef T type; };
|
||||
template <typename T> struct first_type_of<T> { typedef T type; };
|
||||
}
|
||||
// C++11 solution using SFINAE to detect the existance of a member in a class at compile time.
|
||||
// C++11 solution using SFINAE to detect the existence of a member in a class at compile time.
|
||||
// It creates a HasMember<Type> structure containing 'value' set to true if the member exists
|
||||
#define HAS_MEMBER_IMPL(Member) \
|
||||
namespace Private { \
|
||||
|
||||
@@ -37,6 +37,7 @@ extern const char NUL_STR[],
|
||||
SP_I_LBL[], SP_J_LBL[], SP_K_LBL[],
|
||||
SP_P_STR[], SP_T_STR[],
|
||||
X_STR[], Y_STR[], Z_STR[], E_STR[],
|
||||
I_STR[], J_STR[], K_STR[],
|
||||
X_LBL[], Y_LBL[], Z_LBL[], E_LBL[],
|
||||
I_LBL[], J_LBL[], K_LBL[];
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial<SerialT> > {
|
||||
ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {}
|
||||
};
|
||||
|
||||
// A simple foward class that taking a reference to an existing serial instance (likely created in their respective framework)
|
||||
// A simple forward class that taking a reference to an existing serial instance (likely created in their respective framework)
|
||||
template <class SerialT>
|
||||
struct ForwardSerial : public SerialBase< ForwardSerial<SerialT> > {
|
||||
typedef SerialBase< ForwardSerial<SerialT> > BaseClassT;
|
||||
|
||||
@@ -35,7 +35,7 @@ constexpr uint8_t dim = _BV(ord);
|
||||
|
||||
static inline bool eval_candidate(int8_t x, int8_t y, hilbert_curve::callback_ptr func, void *data) {
|
||||
// The print bed likely has fewer points than the full Hilbert
|
||||
// curve, so cull unecessary points
|
||||
// curve, so cull unnecessary points
|
||||
return x < (GRID_MAX_POINTS_X) && y < (GRID_MAX_POINTS_Y) ? func(x, y, data) : false;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ uint8_t MCP4728::eepromWrite() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Write Voltage reference setting to all input regiters
|
||||
* Write Voltage reference setting to all input registers
|
||||
*/
|
||||
uint8_t MCP4728::setVref_all(const uint8_t value) {
|
||||
Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS));
|
||||
@@ -89,7 +89,7 @@ uint8_t MCP4728::setVref_all(const uint8_t value) {
|
||||
return Wire.endTransmission();
|
||||
}
|
||||
/**
|
||||
* Write Gain setting to all input regiters
|
||||
* Write Gain setting to all input registers
|
||||
*/
|
||||
uint8_t MCP4728::setGain_all(const uint8_t value) {
|
||||
Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS));
|
||||
@@ -129,7 +129,7 @@ void MCP4728::setDrvPct(xyze_uint_t &pct) {
|
||||
}
|
||||
|
||||
/**
|
||||
* FastWrite input register values - All DAC ouput update. refer to DATASHEET 5.6.1
|
||||
* FastWrite input register values - All DAC output update. refer to DATASHEET 5.6.1
|
||||
* DAC Input and PowerDown bits update.
|
||||
* No EEPROM update
|
||||
*/
|
||||
|
||||
@@ -94,7 +94,7 @@ void I2CPositionEncoder::update() {
|
||||
|
||||
SERIAL_ECHOLNPAIR("Untrusted encoder module on ", AS_CHAR(axis_codes[encoderAxis]), " axis has been fault-free for set duration, reinstating error correction.");
|
||||
|
||||
//the encoder likely lost its place when the error occured, so we'll reset and use the printer's
|
||||
//the encoder likely lost its place when the error occurred, so we'll reset and use the printer's
|
||||
//idea of where it the axis is to re-initialize
|
||||
const float pos = planner.get_axis_position_mm(encoderAxis);
|
||||
int32_t positionInTicks = pos * get_ticks_unit();
|
||||
|
||||
@@ -106,11 +106,32 @@ void Mixer::reset_vtools() {
|
||||
MIXER_STEPPER_LOOP(i)
|
||||
color[t][i] = (i == 0) ? COLOR_A_MASK : 0;
|
||||
#endif
|
||||
|
||||
// MIXING_PRESETS: Set a variety of obvious mixes as presets
|
||||
#if ENABLED(MIXING_PRESETS) && WITHIN(MIXING_STEPPERS, 2, 3)
|
||||
#if MIXING_STEPPERS == 2
|
||||
if (MIXING_VIRTUAL_TOOLS > 2) { collector[0] = 1; collector[1] = 1; mixer.normalize(2); } // 1:1
|
||||
if (MIXING_VIRTUAL_TOOLS > 3) { collector[0] = 3; mixer.normalize(3); } // 3:1
|
||||
if (MIXING_VIRTUAL_TOOLS > 4) { collector[0] = 1; collector[1] = 3; mixer.normalize(4); } // 1:3
|
||||
if (MIXING_VIRTUAL_TOOLS > 5) { collector[1] = 2; mixer.normalize(5); } // 1:2
|
||||
if (MIXING_VIRTUAL_TOOLS > 6) { collector[0] = 2; collector[1] = 1; mixer.normalize(6); } // 2:1
|
||||
if (MIXING_VIRTUAL_TOOLS > 7) { collector[0] = 3; collector[1] = 2; mixer.normalize(7); } // 3:2
|
||||
#else
|
||||
if (MIXING_VIRTUAL_TOOLS > 3) { collector[0] = 1; collector[1] = 1; collector[2] = 1; mixer.normalize(3); } // 1:1:1
|
||||
if (MIXING_VIRTUAL_TOOLS > 4) { collector[1] = 3; collector[2] = 0; mixer.normalize(4); } // 1:3:0
|
||||
if (MIXING_VIRTUAL_TOOLS > 5) { collector[0] = 0; collector[2] = 1; mixer.normalize(5); } // 0:3:1
|
||||
if (MIXING_VIRTUAL_TOOLS > 6) { collector[1] = 1; mixer.normalize(6); } // 0:1:1
|
||||
if (MIXING_VIRTUAL_TOOLS > 7) { collector[0] = 1; collector[2] = 0; mixer.normalize(7); } // 1:1:0
|
||||
#endif
|
||||
ZERO(collector);
|
||||
#endif
|
||||
}
|
||||
|
||||
// called at boot
|
||||
void Mixer::init() {
|
||||
|
||||
ZERO(collector);
|
||||
|
||||
reset_vtools();
|
||||
|
||||
#if HAS_MIXER_SYNC_CHANNEL
|
||||
@@ -119,8 +140,6 @@ void Mixer::init() {
|
||||
color[MIXER_AUTORETRACT_TOOL][i] = COLOR_A_MASK;
|
||||
#endif
|
||||
|
||||
ZERO(collector);
|
||||
|
||||
#if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX)
|
||||
update_mix_from_vtool();
|
||||
#endif
|
||||
|
||||
@@ -363,6 +363,8 @@ G29_TYPE GcodeSuite::G29() {
|
||||
#if ABL_USES_GRID
|
||||
|
||||
xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_FEEDRATE));
|
||||
if (!xy_probe_feedrate_mm_s) xy_probe_feedrate_mm_s = PLANNER_XY_FEEDRATE();
|
||||
NOLESS(xy_probe_feedrate_mm_s, planner.settings.min_feedrate_mm_s);
|
||||
|
||||
const float x_min = probe.min_x(), x_max = probe.max_x(),
|
||||
y_min = probe.min_y(), y_max = probe.max_y();
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
* Compensation values are deltas to first probe measurement at bed temp. = 60°C.
|
||||
* - The hotend will not be heated at any time.
|
||||
* - On my Průša MK3S clone I put a piece of paper between the probe and the hotend
|
||||
* so the hotend fan would not cool my probe constantly. Alternativly you could just
|
||||
* so the hotend fan would not cool my probe constantly. Alternatively you could just
|
||||
* make sure the fan is not running while running the calibration process.
|
||||
*
|
||||
* Probe calibration:
|
||||
|
||||
@@ -288,8 +288,8 @@ inline void servo_probe_test() {
|
||||
* S<pin> - Start Pin number. If not given, will default to 0
|
||||
* L<pin> - End Pin number. If not given, will default to last pin defined for this board
|
||||
* I<bool> - Flag to ignore Marlin's pin protection. Use with caution!!!!
|
||||
* R - Repeat pulses on each pin this number of times before continueing to next pin
|
||||
* W - Wait time (in miliseconds) between pulses. If not given will default to 500
|
||||
* R - Repeat pulses on each pin this number of times before continuing to next pin
|
||||
* W - Wait time (in milliseconds) between pulses. If not given will default to 500
|
||||
*
|
||||
* M43 S - Servo probe test
|
||||
* P<index> - Probe index (optional - defaults to 0
|
||||
|
||||
@@ -31,6 +31,13 @@
|
||||
#include "../../module/temperature.h"
|
||||
#endif
|
||||
|
||||
#ifdef MAPLE_STM32F1
|
||||
// these are enums on the F1...
|
||||
#define INPUT_PULLDOWN INPUT_PULLDOWN
|
||||
#define INPUT_ANALOG INPUT_ANALOG
|
||||
#define OUTPUT_OPEN_DRAIN OUTPUT_OPEN_DRAIN
|
||||
#endif
|
||||
|
||||
void protected_pin_err() {
|
||||
SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN);
|
||||
}
|
||||
@@ -55,13 +62,20 @@ void GcodeSuite::M42() {
|
||||
|
||||
if (!parser.boolval('I') && pin_is_protected(pin)) return protected_pin_err();
|
||||
|
||||
bool avoidWrite = false;
|
||||
if (parser.seenval('M')) {
|
||||
switch (parser.value_byte()) {
|
||||
case 0: pinMode(pin, INPUT); break;
|
||||
case 0: pinMode(pin, INPUT); avoidWrite = true; break;
|
||||
case 1: pinMode(pin, OUTPUT); break;
|
||||
case 2: pinMode(pin, INPUT_PULLUP); break;
|
||||
case 2: pinMode(pin, INPUT_PULLUP); avoidWrite = true; break;
|
||||
#ifdef INPUT_PULLDOWN
|
||||
case 3: pinMode(pin, INPUT_PULLDOWN); break;
|
||||
case 3: pinMode(pin, INPUT_PULLDOWN); avoidWrite = true; break;
|
||||
#endif
|
||||
#ifdef INPUT_ANALOG
|
||||
case 4: pinMode(pin, INPUT_ANALOG); avoidWrite = true; break;
|
||||
#endif
|
||||
#ifdef OUTPUT_OPEN_DRAIN
|
||||
case 5: pinMode(pin, OUTPUT_OPEN_DRAIN); break;
|
||||
#endif
|
||||
default: SERIAL_ECHOLNPGM("Invalid Pin Mode"); return;
|
||||
}
|
||||
@@ -99,8 +113,22 @@ void GcodeSuite::M42() {
|
||||
}
|
||||
#endif
|
||||
|
||||
pinMode(pin, OUTPUT);
|
||||
if (avoidWrite) {
|
||||
SERIAL_ECHOLNPGM("?Cannot write to INPUT");
|
||||
return;
|
||||
}
|
||||
|
||||
// An OUTPUT_OPEN_DRAIN should not be changed to normal OUTPUT (STM32)
|
||||
// Use M42 Px M1/5 S0/1 to set the output type and then set value
|
||||
#ifndef OUTPUT_OPEN_DRAIN
|
||||
pinMode(pin, OUTPUT);
|
||||
#endif
|
||||
extDigitalWrite(pin, pin_status);
|
||||
|
||||
#ifdef ARDUINO_ARCH_STM32
|
||||
// A simple I/O will be set to 0 by analogWrite()
|
||||
if (pin_status <= 1) return;
|
||||
#endif
|
||||
analogWrite(pin, pin_status);
|
||||
}
|
||||
|
||||
|
||||
@@ -212,7 +212,7 @@ void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) {
|
||||
* L6474 - current in mA (4A max)
|
||||
* All others - 0-255
|
||||
*
|
||||
* Sets KVAL_HOLD wich affects the current being driven through the stepper.
|
||||
* Sets KVAL_HOLD which affects the current being driven through the stepper.
|
||||
*
|
||||
* L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx
|
||||
* that affects the effective voltage seen by the stepper.
|
||||
|
||||
@@ -177,7 +177,7 @@ void GcodeSuite::M916() {
|
||||
if ((status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)))
|
||||
DEBUG_ECHOLNPGM(".\n.\nTest completed normally - Thermal warning/shutdown has occurred");
|
||||
else if (status_composite)
|
||||
DEBUG_ECHOLNPGM(".\n.\nTest completed abnormally - non-thermal error has occured");
|
||||
DEBUG_ECHOLNPGM(".\n.\nTest completed abnormally - non-thermal error has occurred");
|
||||
else
|
||||
DEBUG_ECHOLNPGM(".\n.\nTest completed normally - Unable to get to thermal warning/shutdown");
|
||||
|
||||
|
||||
@@ -729,6 +729,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||
case 250: M250(); break; // M250: Set LCD contrast
|
||||
#endif
|
||||
|
||||
#if HAS_LCD_BRIGHTNESS
|
||||
case 256: M256(); break; // M256: Set LCD brightness
|
||||
#endif
|
||||
|
||||
#if ENABLED(EXPERIMENTAL_I2CBUS)
|
||||
case 260: M260(); break; // M260: Send data to an i2c slave
|
||||
case 261: M261(); break; // M261: Request data from an i2c slave
|
||||
|
||||
@@ -191,6 +191,7 @@
|
||||
* M226 - Wait until a pin is in a given state: "M226 P<pin> S<state>" (Requires DIRECT_PIN_CONTROL)
|
||||
* M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE)
|
||||
* M250 - Set LCD contrast: "M250 C<contrast>" (0-63). (Requires LCD support)
|
||||
* M256 - Set LCD brightness: "M256 B<brightness>" (0-255). (Requires an LCD with brightness control)
|
||||
* M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS)
|
||||
* M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS)
|
||||
* M280 - Set servo position absolute: "M280 P<index> S<angle|µs>". (Requires servos)
|
||||
@@ -820,6 +821,10 @@ private:
|
||||
static void M250();
|
||||
#endif
|
||||
|
||||
#if HAS_LCD_BRIGHTNESS
|
||||
static void M256();
|
||||
#endif
|
||||
|
||||
#if ENABLED(EXPERIMENTAL_I2CBUS)
|
||||
static void M260();
|
||||
static void M261();
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if HAS_LCD_BRIGHTNESS
|
||||
|
||||
#include "../gcode.h"
|
||||
#include "../../lcd/marlinui.h"
|
||||
|
||||
/**
|
||||
* M256: Set the LCD brightness
|
||||
*/
|
||||
void GcodeSuite::M256() {
|
||||
if (parser.seenval('B')) ui.set_brightness(parser.value_int());
|
||||
SERIAL_ECHOLNPAIR("LCD Brightness: ", ui.brightness);
|
||||
}
|
||||
|
||||
#endif // HAS_LCD_BRIGHTNESS
|
||||
@@ -35,13 +35,13 @@
|
||||
* M73 P25 ; Set progress to 25%
|
||||
*/
|
||||
void GcodeSuite::M73() {
|
||||
if (parser.seen('P'))
|
||||
if (parser.seenval('P'))
|
||||
ui.set_progress((PROGRESS_SCALE) > 1
|
||||
? parser.value_float() * (PROGRESS_SCALE)
|
||||
: parser.value_byte()
|
||||
);
|
||||
#if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME)
|
||||
if (parser.seen('R')) ui.set_remaining_time(60 * parser.value_ulong());
|
||||
if (parser.seenval('R')) ui.set_remaining_time(60 * parser.value_ulong());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
#define LCD_PROGRESS_BAR
|
||||
#endif
|
||||
#if ENABLED(TFTGLCD_PANEL_I2C)
|
||||
#define LCD_I2C_ADDRESS 0x33 // Must be 0x33 for STM32 main boards and equal to panel's I2C slave addres
|
||||
#define LCD_I2C_ADDRESS 0x33 // Must be 0x33 for STM32 main boards and equal to panel's I2C slave address
|
||||
#endif
|
||||
#define LCD_USE_I2C_BUZZER // Enable buzzer on LCD, used for both I2C and SPI buses (LiquidTWI2 not required)
|
||||
#define STD_ENCODER_PULSES_PER_STEP 2
|
||||
@@ -771,7 +771,7 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Set flags for enabled probes
|
||||
* Set a flag for any type of bed probe, including the paper-test
|
||||
*/
|
||||
#if ANY(HAS_Z_SERVO_PROBE, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE)
|
||||
#define HAS_BED_PROBE 1
|
||||
@@ -913,7 +913,7 @@
|
||||
#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && !BOTH(DELTA, SENSORLESS_PROBING)
|
||||
#define USES_Z_MIN_PROBE_PIN 1
|
||||
#endif
|
||||
#if Z_HOME_TO_MIN && (!USES_Z_MIN_PROBE_PIN || ENABLED(USE_PROBE_FOR_Z_HOMING))
|
||||
#if Z_HOME_TO_MIN && TERN1(USES_Z_MIN_PROBE_PIN, ENABLED(USE_PROBE_FOR_Z_HOMING))
|
||||
#define HOMING_Z_WITH_PROBE 1
|
||||
#endif
|
||||
#ifndef Z_PROBE_LOW_POINT
|
||||
|
||||
@@ -1784,6 +1784,15 @@
|
||||
#if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4)
|
||||
#define Z4_SENSORLESS 1
|
||||
#endif
|
||||
#if defined(I_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(I)
|
||||
#define I_SENSORLESS 1
|
||||
#endif
|
||||
#if defined(J_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(J)
|
||||
#define J_SENSORLESS 1
|
||||
#endif
|
||||
#if defined(K_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(K)
|
||||
#define K_SENSORLESS 1
|
||||
#endif
|
||||
|
||||
#if AXIS_HAS_STEALTHCHOP(X)
|
||||
#define X_HAS_STEALTHCHOP 1
|
||||
@@ -1845,8 +1854,21 @@
|
||||
|
||||
#if ENABLED(SPI_ENDSTOPS)
|
||||
#define X_SPI_SENSORLESS X_SENSORLESS
|
||||
#define Y_SPI_SENSORLESS Y_SENSORLESS
|
||||
#define Z_SPI_SENSORLESS Z_SENSORLESS
|
||||
#if HAS_Y_AXIS
|
||||
#define Y_SPI_SENSORLESS Y_SENSORLESS
|
||||
#endif
|
||||
#if HAS_Z_AXIS
|
||||
#define Z_SPI_SENSORLESS Z_SENSORLESS
|
||||
#endif
|
||||
#if LINEAR_AXES >= 4
|
||||
#define I_SPI_SENSORLESS I_SENSORLESS
|
||||
#endif
|
||||
#if LINEAR_AXES >= 5
|
||||
#define J_SPI_SENSORLESS J_SENSORLESS
|
||||
#endif
|
||||
#if LINEAR_AXES >= 6
|
||||
#define K_SPI_SENSORLESS K_SENSORLESS
|
||||
#endif
|
||||
#endif
|
||||
#ifndef X_INTERPOLATE
|
||||
#define X_INTERPOLATE INTERPOLATE
|
||||
@@ -2100,73 +2122,80 @@
|
||||
#define IS_Z4_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && Z4_USE_ENDSTOP == _##A##M##_)
|
||||
|
||||
#define _HAS_STOP(A,M) (PIN_EXISTS(A##_##M) && !IS_PROBE_PIN(A,M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_ENDSTOP(A,M) && !IS_Z3_ENDSTOP(A,M) && !IS_Z4_ENDSTOP(A,M))
|
||||
#if _HAS_STOP(X,MIN)
|
||||
#if BOTH(X_HOME_TO_MIN, USE_XMIN_PLUG) && _HAS_STOP(X,MIN)
|
||||
#define HAS_X_MIN 1
|
||||
#endif
|
||||
#if _HAS_STOP(X,MAX)
|
||||
#if (BOTH(X_HOME_TO_MAX, USE_XMAX_PLUG) || ENABLED(DUAL_X_CARRIAGE)) && _HAS_STOP(X,MAX)
|
||||
#define HAS_X_MAX 1
|
||||
#endif
|
||||
#if HAS_Y_AXIS && _HAS_STOP(Y,MIN)
|
||||
#if ALL(HAS_Y_AXIS, Y_HOME_TO_MIN, USE_YMIN_PLUG) && _HAS_STOP(Y,MIN)
|
||||
#define HAS_Y_MIN 1
|
||||
#endif
|
||||
#if HAS_Y_AXIS && _HAS_STOP(Y,MAX)
|
||||
#if ALL(HAS_Y_AXIS, Y_HOME_TO_MAX, USE_YMAX_PLUG) && _HAS_STOP(Y,MAX)
|
||||
#define HAS_Y_MAX 1
|
||||
#endif
|
||||
#if BOTH(HAS_Z_AXIS, USE_ZMIN_PLUG) && _HAS_STOP(Z,MIN)
|
||||
#define HAS_Z_MIN 1
|
||||
#endif
|
||||
#if BOTH(HAS_Z_AXIS, USE_ZMAX_PLUG) && _HAS_STOP(Z,MAX)
|
||||
#if ALL(HAS_Z_AXIS, Z_HOME_TO_MAX, USE_ZMAX_PLUG) && _HAS_STOP(Z,MAX)
|
||||
#define HAS_Z_MAX 1
|
||||
#endif
|
||||
#if _HAS_STOP(I,MIN)
|
||||
#if LINEAR_AXES >= 4 && BOTH(I_HOME_TO_MIN, USE_IMIN_PLUG) && _HAS_STOP(I,MIN)
|
||||
#define HAS_I_MIN 1
|
||||
#endif
|
||||
#if _HAS_STOP(I,MAX)
|
||||
#if LINEAR_AXES >= 4 && BOTH(I_HOME_TO_MAX, USE_IMAX_PLUG) && _HAS_STOP(I,MAX)
|
||||
#define HAS_I_MAX 1
|
||||
#endif
|
||||
#if _HAS_STOP(J,MIN)
|
||||
#if LINEAR_AXES >= 5 && BOTH(J_HOME_TO_MIN, USE_JMIN_PLUG) && _HAS_STOP(J,MIN)
|
||||
#define HAS_J_MIN 1
|
||||
#endif
|
||||
#if _HAS_STOP(J,MAX)
|
||||
#if LINEAR_AXES >= 5 && BOTH(J_HOME_TO_MAX, USE_JMAX_PLUG) && _HAS_STOP(J,MAX)
|
||||
#define HAS_J_MAX 1
|
||||
#endif
|
||||
#if _HAS_STOP(K,MIN)
|
||||
#if LINEAR_AXES >= 6 && BOTH(K_HOME_TO_MIN, USE_KMIN_PLUG) && _HAS_STOP(K,MIN)
|
||||
#define HAS_K_MIN 1
|
||||
#endif
|
||||
#if _HAS_STOP(K,MAX)
|
||||
#if LINEAR_AXES >= 6 && BOTH(K_HOME_TO_MAX, USE_KMAX_PLUG) && _HAS_STOP(K,MAX)
|
||||
#define HAS_K_MAX 1
|
||||
#endif
|
||||
#if PIN_EXISTS(X2_MIN)
|
||||
#if BOTH(X_HOME_TO_MIN, X_DUAL_ENDSTOPS) && PIN_EXISTS(X2_MIN)
|
||||
#define HAS_X2_MIN 1
|
||||
#endif
|
||||
#if PIN_EXISTS(X2_MAX)
|
||||
#if BOTH(X_HOME_TO_MAX, X_DUAL_ENDSTOPS) && PIN_EXISTS(X2_MAX)
|
||||
#define HAS_X2_MAX 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Y2_MIN)
|
||||
#if BOTH(Y_HOME_TO_MIN, Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y2_MIN)
|
||||
#define HAS_Y2_MIN 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Y2_MAX)
|
||||
#if BOTH(Y_HOME_TO_MAX, Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y2_MAX)
|
||||
#define HAS_Y2_MAX 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Z2_MIN)
|
||||
#define HAS_Z2_MIN 1
|
||||
#if ENABLED(Z_MULTI_ENDSTOPS)
|
||||
#if Z_HOME_TO_MIN && PIN_EXISTS(Z2_MIN)
|
||||
#define HAS_Z2_MIN 1
|
||||
#endif
|
||||
#if Z_HOME_TO_MAX && PIN_EXISTS(Z2_MAX)
|
||||
#define HAS_Z2_MAX 1
|
||||
#endif
|
||||
#if NUM_Z_STEPPER_DRIVERS >= 3
|
||||
#if Z_HOME_TO_MIN && PIN_EXISTS(Z3_MIN)
|
||||
#define HAS_Z3_MIN 1
|
||||
#endif
|
||||
#if Z_HOME_TO_MAX && PIN_EXISTS(Z3_MAX)
|
||||
#define HAS_Z3_MAX 1
|
||||
#endif
|
||||
#if NUM_Z_STEPPER_DRIVERS >= 4
|
||||
#if Z_HOME_TO_MIN && PIN_EXISTS(Z4_MIN)
|
||||
#define HAS_Z4_MIN 1
|
||||
#endif
|
||||
#if Z_HOME_TO_MAX && PIN_EXISTS(Z4_MAX)
|
||||
#define HAS_Z4_MAX 1
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#if PIN_EXISTS(Z2_MAX)
|
||||
#define HAS_Z2_MAX 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Z3_MIN)
|
||||
#define HAS_Z3_MIN 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Z3_MAX)
|
||||
#define HAS_Z3_MAX 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Z4_MIN)
|
||||
#define HAS_Z4_MIN 1
|
||||
#endif
|
||||
#if PIN_EXISTS(Z4_MAX)
|
||||
#define HAS_Z4_MAX 1
|
||||
#endif
|
||||
#if BOTH(HAS_BED_PROBE, USES_Z_MIN_PROBE_PIN) && PIN_EXISTS(Z_MIN_PROBE)
|
||||
|
||||
#if HAS_BED_PROBE && PIN_EXISTS(Z_MIN_PROBE)
|
||||
#define HAS_Z_MIN_PROBE_PIN 1
|
||||
#endif
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2021-07-31"
|
||||
#define STRING_DISTRIBUTION_DATE "2021-08-05"
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -1321,7 +1321,7 @@ void MarlinUI::draw_status_screen() {
|
||||
y_map_pixels = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y); // Directions fit nicely
|
||||
|
||||
right_edge = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X) + 1; // Find location of right edge within the character cell
|
||||
bottom_line = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 1; // Find location of bottome line within the character cell
|
||||
bottom_line = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 1; // Find location of bottom line within the character cell
|
||||
|
||||
n_rows = bottom_line / (HD44780_CHAR_HEIGHT) + 1;
|
||||
n_cols = right_edge / (HD44780_CHAR_WIDTH) + 1;
|
||||
|
||||
@@ -98,7 +98,7 @@ TFTGLCD lcd;
|
||||
#define COLOR_EDIT '#'
|
||||
#define COLOR_ERROR '!'
|
||||
|
||||
#ifdef CONVERT_TO_EXT_ASCII //use standart pseudographic symbols in ASCII table
|
||||
#ifdef CONVERT_TO_EXT_ASCII //use standard pseudographic symbols in ASCII table
|
||||
#define LR 179 //vertical line
|
||||
#define TRC 191 //top right corner
|
||||
#define BLC 192 //bottom left corner
|
||||
@@ -401,7 +401,7 @@ static void center_text_P(PGM_P pstart, uint8_t y) {
|
||||
//
|
||||
uint8_t indent = (LCD_WIDTH - 8) / 2;
|
||||
// symbols 217 (bottom right corner) and 218 (top left corner) are using for letters in some languages
|
||||
// and they should be moved to begining ASCII table as spetial symbols
|
||||
// and they should be moved to beginning ASCII table as special symbols
|
||||
lcd.setCursor(indent, 0); lcd.write(TLC); lcd_put_u8str_P(PSTR("------")); lcd.write(TRC);
|
||||
lcd.setCursor(indent, 1); lcd.write(LR); lcd_put_u8str_P(PSTR("Marlin")); lcd.write(LR);
|
||||
lcd.setCursor(indent, 2); lcd.write(BLC); lcd_put_u8str_P(PSTR("------")); lcd.write(BRC);
|
||||
@@ -733,7 +733,7 @@ Equal to 20x10 text LCD
|
||||
| |
|
||||
| HE BED FAN |
|
||||
| ttc ttc % | ttc - current temperature
|
||||
| tts tts %%% | tts - setted temperature, %%% - percent for FAN
|
||||
| tts tts %%% | tts - set temperature, %%% - percent for FAN
|
||||
| ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines
|
||||
| ICO ICO ICO ICO | ICO
|
||||
|
||||
|
||||
@@ -447,7 +447,7 @@ void ST7920_Lite_Status_Screen::draw_static_elements() {
|
||||
* data buffer (DDRAM) to be used in conjunction with the graphics
|
||||
* bitmap buffer (CGRAM). The contents of the graphics buffer is
|
||||
* XORed with the data from the character generator. This allows
|
||||
* us to make the progess bar out of graphical data (the bar) and
|
||||
* us to make the progress bar out of graphical data (the bar) and
|
||||
* text data (the percentage).
|
||||
*/
|
||||
void ST7920_Lite_Status_Screen::draw_progress_bar(const uint8_t value) {
|
||||
|
||||
@@ -73,7 +73,7 @@ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = {
|
||||
0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0)
|
||||
0x00C, // display on, cursor & blink off; 0x08: all off
|
||||
0x006, // Entry mode: Cursor move to right, DDRAM address counter (AC) plus 1, no shift
|
||||
0x002, // disable scroll, enable CGRAM adress
|
||||
0x002, // disable scroll, enable CGRAM address
|
||||
0x001, // clear RAM, needs 1.6 ms
|
||||
U8G_ESC_DLY(100), // delay 100 ms
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ void ChironTFT::ConfirmationRequest(const char * const msg) {
|
||||
case AC_printer_resuming_from_power_outage:
|
||||
case AC_printer_printing:
|
||||
case AC_printer_paused: {
|
||||
// Heater timout, send acknowledgement
|
||||
// Heater timeout, send acknowledgement
|
||||
if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0) {
|
||||
pause_state = AC_paused_heater_timed_out;
|
||||
SendtoTFTLN(AC_msg_paused); // enable continue button
|
||||
@@ -248,7 +248,7 @@ void ChironTFT::StatusChange(const char * const msg) {
|
||||
printer_state = AC_printer_idle;
|
||||
msg_matched = true;
|
||||
}
|
||||
// If probing fails dont save the mesh raise the probe above the bad point
|
||||
// If probing fails don't save the mesh raise the probe above the bad point
|
||||
if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0) {
|
||||
PlayTune(BEEPER_PIN, BeepBeepBeeep, 1);
|
||||
injectCommands_P(PSTR("G1 Z50 F500"));
|
||||
@@ -622,7 +622,7 @@ void ChironTFT::PanelAction(uint8_t req) {
|
||||
break;
|
||||
|
||||
case 14: { // A14 Start Printing
|
||||
// Allows printer to restart the job if we dont want to recover
|
||||
// Allows printer to restart the job if we don't want to recover
|
||||
if (printer_state == AC_printer_resuming_from_power_outage) {
|
||||
injectCommands_P(PSTR("M1000 C")); // Cancel recovery
|
||||
printer_state = AC_printer_idle;
|
||||
|
||||
@@ -93,7 +93,7 @@ public:
|
||||
// Helper for users of this class to estimate if an interaction would be blocking.
|
||||
static size_t GetFreeTxBuffer();
|
||||
|
||||
// Checks two things: Can we confirm the presence of the display and has we initiliazed it.
|
||||
// Checks two things: Can we confirm the presence of the display and has we initialized it.
|
||||
// (both boils down that the display answered to our chatting)
|
||||
static inline bool isInitialized() { return Initialized; }
|
||||
|
||||
|
||||
@@ -559,7 +559,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo
|
||||
#endif
|
||||
#if ENABLED(PIDTEMPBED)
|
||||
case VP_PID_AUTOTUNE_BED:
|
||||
sprintf_P(buf, PSTR("M303 E-1 C5 S70 U1"));
|
||||
strcpy_P(buf, PSTR("M303 E-1 C5 S70 U1"));
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -466,7 +466,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
|
||||
VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay),
|
||||
#endif
|
||||
|
||||
// Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content.
|
||||
// Messages for the User, shared by the popup and the kill screen. They can't be autouploaded as we do not buffer content.
|
||||
{ .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
{ .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
{ .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
|
||||
@@ -282,7 +282,7 @@ constexpr uint16_t VP_BED_PID_P = 0x3710;
|
||||
constexpr uint16_t VP_BED_PID_I = 0x3712;
|
||||
constexpr uint16_t VP_BED_PID_D = 0x3714;
|
||||
|
||||
// Wating screen status
|
||||
// Waiting screen status
|
||||
constexpr uint16_t VP_WAITING_STATUS = 0x3800;
|
||||
|
||||
// SPs for certain variables...
|
||||
|
||||
@@ -161,7 +161,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
}
|
||||
#endif
|
||||
char axiscode;
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode.
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, don't hardcode.
|
||||
|
||||
switch (var.VP) {
|
||||
default: return;
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
static bool loop();
|
||||
|
||||
// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen
|
||||
// The bools specifing whether the strings are in RAM or FLASH.
|
||||
// The bools specifying whether the strings are in RAM or FLASH.
|
||||
static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
@@ -465,7 +465,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
|
||||
VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay),
|
||||
#endif
|
||||
|
||||
// Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content.
|
||||
// Messages for the User, shared by the popup and the kill screen. They can't be autouploaded as we do not buffer content.
|
||||
{ .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
{ .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
{ .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
|
||||
@@ -278,7 +278,7 @@ constexpr uint16_t VP_BED_PID_P = 0x3710;
|
||||
constexpr uint16_t VP_BED_PID_I = 0x3712;
|
||||
constexpr uint16_t VP_BED_PID_D = 0x3714;
|
||||
|
||||
// Wating screen status
|
||||
// Waiting screen status
|
||||
constexpr uint16_t VP_WAITING_STATUS = 0x3800;
|
||||
|
||||
// SPs for certain variables...
|
||||
|
||||
@@ -161,7 +161,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
}
|
||||
#endif
|
||||
char axiscode;
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode.
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, don't hardcode.
|
||||
|
||||
switch (var.VP) {
|
||||
default: return;
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
static bool loop();
|
||||
|
||||
// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen
|
||||
// The bools specifing whether the strings are in RAM or FLASH.
|
||||
// The bools specifying whether the strings are in RAM or FLASH.
|
||||
static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
@@ -785,7 +785,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
|
||||
VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay),
|
||||
#endif
|
||||
|
||||
// Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content.
|
||||
// Messages for the User, shared by the popup and the kill screen. They can't be autouploaded as we do not buffer content.
|
||||
//{.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM},
|
||||
//{.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM},
|
||||
//{.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM},
|
||||
|
||||
@@ -266,7 +266,7 @@ constexpr uint16_t VP_MOVE_OPTION = 0x3500;
|
||||
// constexpr uint16_t VP_BED_PID_I = 0x3712;
|
||||
// constexpr uint16_t VP_BED_PID_D = 0x3714;
|
||||
|
||||
// Wating screen status
|
||||
// Waiting screen status
|
||||
constexpr uint16_t VP_WAITING_STATUS = 0x3800;
|
||||
|
||||
// SPs for certain variables...
|
||||
|
||||
@@ -762,7 +762,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
return;
|
||||
|
||||
char axiscode;
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode.
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, don't hardcode.
|
||||
|
||||
switch (var.VP) { // switch X Y Z or Home
|
||||
default: return;
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
static bool loop();
|
||||
|
||||
// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen
|
||||
// The bools specifing whether the strings are in RAM or FLASH.
|
||||
// The bools specifying whether the strings are in RAM or FLASH.
|
||||
static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
@@ -267,7 +267,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
|
||||
VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay),
|
||||
#endif
|
||||
|
||||
// Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content.
|
||||
// Messages for the User, shared by the popup and the kill screen. They can't be autouploaded as we do not buffer content.
|
||||
{ .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
{ .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
{ .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplayPGM },
|
||||
|
||||
@@ -268,7 +268,7 @@ constexpr uint16_t VP_BED_PID_P = 0x3710;
|
||||
constexpr uint16_t VP_BED_PID_I = 0x3712;
|
||||
constexpr uint16_t VP_BED_PID_D = 0x3714;
|
||||
|
||||
// Wating screen status
|
||||
// Waiting screen status
|
||||
constexpr uint16_t VP_WAITING_STATUS = 0x3800;
|
||||
|
||||
// SPs for certain variables...
|
||||
|
||||
@@ -161,7 +161,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
|
||||
}
|
||||
#endif
|
||||
char axiscode;
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode.
|
||||
unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, don't hardcode.
|
||||
|
||||
switch (var.VP) {
|
||||
default: return;
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
static bool loop();
|
||||
|
||||
// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen
|
||||
// The bools specifing whether the strings are in RAM or FLASH.
|
||||
// The bools specifying whether the strings are in RAM or FLASH.
|
||||
static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
|
||||
|
||||
@@ -206,7 +206,7 @@ bool UIFlashStorage::is_present = false;
|
||||
|
||||
/* In order to provide some degree of wear leveling, each data write to the
|
||||
* SPI Flash chip is appended to data that was already written before, until
|
||||
* the data storage area is completely filled. New data is written preceeded
|
||||
* the data storage area is completely filled. New data is written preceded
|
||||
* with a 32-bit delimiter 'LULZ', so that we can distinguish written and
|
||||
* unwritten data:
|
||||
*
|
||||
|
||||
@@ -1079,7 +1079,7 @@ void CLCD::CommandFifo::str(progmem_str data) {
|
||||
|
||||
void CLCD::init() {
|
||||
spi_init(); // Set Up I/O Lines for SPI and FT800/810 Control
|
||||
ftdi_reset(); // Power down/up the FT8xx with the apropriate delays
|
||||
ftdi_reset(); // Power down/up the FT8xx with the appropriate delays
|
||||
|
||||
host_cmd(Use_Crystal ? CLKEXT : CLKINT, 0);
|
||||
host_cmd(FTDI::ACTIVE, 0); // Activate the System Clock
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
*
|
||||
* CommandFifo::fgcolor Set Graphic Item Foreground Color *
|
||||
* CommandFifo::bgcolor Set Graphic Item Background Color *
|
||||
* CommandFifo::begin() Begin Drawing a Primative *
|
||||
* CommandFifo::begin() Begin Drawing a Primitive *
|
||||
* CommandFifo::mem_copy() Copy a Block of Memory *
|
||||
* CommandFifo::append() Append Commands to Current DL *
|
||||
* CommandFifo::gradient_color() Set 3D Button Highlight Color *
|
||||
|
||||
@@ -65,7 +65,7 @@ class CommandProcessor : public CLCD::CommandFifo {
|
||||
uint8_t _style = 0;
|
||||
|
||||
protected:
|
||||
// Returns the cannonical thickness of a widget (i.e. the height of a toggle element)
|
||||
// Returns the canonical thickness of a widget (i.e. the height of a toggle element)
|
||||
uint16_t widget_thickness() {
|
||||
CLCD::FontMetrics fm(_font);
|
||||
return fm.height * 20.0/16;
|
||||
@@ -232,13 +232,11 @@ class CommandProcessor : public CLCD::CommandFifo {
|
||||
FORCEDINLINE CommandProcessor& toggle(int16_t x, int16_t y, int16_t w, int16_t h, T text, bool state, uint16_t options = FTDI::OPT_3D) {
|
||||
CLCD::FontMetrics fm(_font);
|
||||
const int16_t widget_h = fm.height * 20.0 / 16;
|
||||
//const int16_t outer_bar_r = widget_h / 2;
|
||||
//const int16_t knob_r = outer_bar_r - 1.5;
|
||||
// The y coordinate of the toggle is the baseline of the text,
|
||||
// so we must introduce a fudge factor based on the line height to
|
||||
// actually center the control.
|
||||
const int16_t fudge_y = fm.height * 5 / 16;
|
||||
CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state);
|
||||
CLCD::CommandFifo::toggle(x + widget_h, y + (h - widget_h) / 2 + fudge_y, w - widget_h, _font, options, state);
|
||||
CLCD::CommandFifo::str(text);
|
||||
return *this;
|
||||
}
|
||||
@@ -251,7 +249,7 @@ class CommandProcessor : public CLCD::CommandFifo {
|
||||
return toggle(x, y, w, h, text, state, options);
|
||||
}
|
||||
|
||||
// Contrained drawing routines. These constrain the widget inside a box for easier layout.
|
||||
// Constrained drawing routines. These constrain the widget inside a box for easier layout.
|
||||
// The FORCEDINLINE ensures that the code is inlined so that all the math is done at compile time.
|
||||
|
||||
FORCEDINLINE CommandProcessor& track_linear(int16_t x, int16_t y, int16_t w, int16_t h, int16_t tag) {
|
||||
|
||||
@@ -108,7 +108,7 @@ namespace FTDI {
|
||||
* - Dispatches onTouchStart and onTouchEnd events to the active screen.
|
||||
* - Handles auto-repetition by sending onTouchHeld to the active screen periodically.
|
||||
* - Plays touch feedback "click" sounds when appropriate.
|
||||
* - Performs debouncing to supress spurious touch events.
|
||||
* - Performs debouncing to suppress spurious touch events.
|
||||
*/
|
||||
void EventLoop::process_events() {
|
||||
// If the LCD is processing commands, don't check
|
||||
|
||||
@@ -272,7 +272,7 @@ class GenericPolyUI {
|
||||
if (clip) {
|
||||
// Clipping reduces the number of pixels that are
|
||||
// filled, allowing more complex shapes to be drawn
|
||||
// in the alloted time.
|
||||
// in the allotted time.
|
||||
bounds(r, x, y, w, h);
|
||||
cmd.cmd(SAVE_CONTEXT());
|
||||
cmd.cmd(SCISSOR_XY(x, y));
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
* ...
|
||||
* p.end_fill();
|
||||
*
|
||||
* Based on the example from "Applicaton Note AN_334, FT801 Polygon Application":
|
||||
* Based on the example from "Application Note AN_334, FT801 Polygon Application":
|
||||
*
|
||||
* https://brtchip.com/wp-content/uploads/Support/Documentation/Application_Notes/ICs/EVE/AN_334-FT801_Polygon_Application.pdf
|
||||
*/
|
||||
|
||||
@@ -152,7 +152,7 @@ class UIScreen {
|
||||
#define AT_SCREEN(screen) (current_screen.getType() == current_screen.lookupScreen(screen::onRedraw))
|
||||
#define IS_PARENT_SCREEN(screen) (current_screen.peek() == current_screen.lookupScreen(screen::onRedraw))
|
||||
|
||||
/************************** CACHED VS UNCHACHED SCREENS ***************************/
|
||||
/************************** CACHED VS UNCACHED SCREENS ***************************/
|
||||
|
||||
class UncachedScreen {
|
||||
public:
|
||||
|
||||
@@ -67,12 +67,12 @@ namespace FTDI {
|
||||
width = height = 0;
|
||||
for (;;) {
|
||||
const uint16_t line_width = find_line_break(utf8_fm, clcd_fm, wrap_width, line_start, line_end, use_utf8);
|
||||
if (line_end == line_start) break;
|
||||
width = max(width, line_width);
|
||||
height += utf8_fm.get_height();
|
||||
if (*line_end == '\n' || *line_end == ' ') line_end++;
|
||||
if (*line_end == '\0') break;
|
||||
if (line_end == line_start) break;
|
||||
line_start = line_end;
|
||||
if (*line_start == '\n' || *line_start == ' ') line_start++;
|
||||
if (*line_start == '\0') break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,7 +109,6 @@ namespace FTDI {
|
||||
const char *line_start = str, *line_end;
|
||||
for (;;) {
|
||||
find_line_break(utf8_fm, clcd_fm, w, line_start, line_end, use_utf8);
|
||||
if (line_end == line_start) break;
|
||||
|
||||
const size_t line_len = line_end - line_start;
|
||||
if (line_len) {
|
||||
@@ -125,9 +124,10 @@ namespace FTDI {
|
||||
}
|
||||
y += utf8_fm.get_height();
|
||||
|
||||
if (*line_end == '\n' || *line_end == ' ') line_end++;
|
||||
if (*line_end == '\0') break;
|
||||
if (line_end == line_start) break;
|
||||
line_start = line_end;
|
||||
if (*line_start == '\n' || *line_start == ' ') line_start++;
|
||||
if (*line_start == '\0') break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,30 +29,30 @@ namespace FTDI {
|
||||
* Helper function for drawing text with ellipses. The str buffer may be modified and should have space for up to two extra characters.
|
||||
*/
|
||||
static void _draw_text_with_ellipsis(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, char *str, uint16_t options, uint8_t font) {
|
||||
FontMetrics fm(font);
|
||||
const int16_t ellipsisWidth = fm.get_char_width('.') * 3;
|
||||
#if ENABLED(TOUCH_UI_USE_UTF8)
|
||||
const bool use_utf8 = has_utf8_chars(str);
|
||||
#define CHAR_WIDTH(c) use_utf8 ? utf8_fm.get_char_width(c) : clcd_fm.char_widths[(uint8_t)c]
|
||||
#else
|
||||
#define CHAR_WIDTH(c) utf8_fm.get_char_width(c)
|
||||
constexpr bool use_utf8 = false;
|
||||
#endif
|
||||
FontMetrics utf8_fm(font);
|
||||
CLCD::FontMetrics clcd_fm;
|
||||
clcd_fm.load(font);
|
||||
const int16_t ellipsisWidth = utf8_fm.get_char_width('.') * 3;
|
||||
|
||||
// Compute the total line length, as well as
|
||||
// the location in the string where it can
|
||||
// split and still allow the ellipsis to fit.
|
||||
int16_t lineWidth = 0;
|
||||
char *breakPoint = str;
|
||||
#ifdef TOUCH_UI_USE_UTF8
|
||||
char *tstr = str;
|
||||
while (*tstr) {
|
||||
breakPoint = tstr;
|
||||
const utf8_char_t c = get_utf8_char_and_inc(tstr);
|
||||
lineWidth += fm.get_char_width(c);
|
||||
if (lineWidth + ellipsisWidth < w)
|
||||
break;
|
||||
}
|
||||
#else
|
||||
for (char *c = str; *c; c++) {
|
||||
lineWidth += fm.get_char_width(*c);
|
||||
if (lineWidth + ellipsisWidth < w)
|
||||
breakPoint = c;
|
||||
}
|
||||
#endif
|
||||
char *breakPoint = str;
|
||||
char *next = str;
|
||||
while (*next) {
|
||||
const utf8_char_t c = get_utf8_char_and_inc(next);
|
||||
lineWidth += CHAR_WIDTH(c);
|
||||
if (lineWidth + ellipsisWidth < w)
|
||||
breakPoint = next;
|
||||
}
|
||||
|
||||
if (lineWidth > w) {
|
||||
*breakPoint = '\0';
|
||||
@@ -61,7 +61,7 @@ namespace FTDI {
|
||||
|
||||
cmd.apply_text_alignment(x, y, w, h, options);
|
||||
#if ENABLED(TOUCH_UI_USE_UTF8)
|
||||
if (has_utf8_chars(str)) {
|
||||
if (use_utf8) {
|
||||
draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options);
|
||||
} else
|
||||
#endif
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
/* tiny_interval_t downsamples a 32-bit millis() value
|
||||
into a 8-bit value which can record periods of
|
||||
a few seconds with a rougly 1/16th of second
|
||||
a few seconds with a roughly 1/16th of second
|
||||
resolution. This allows us to measure small
|
||||
intervals without needing to use four-byte counters.
|
||||
*/
|
||||
|
||||
@@ -164,7 +164,7 @@ class Parser:
|
||||
|
||||
def process_svg_path_data_cmd(self, id, cmd, a, b):
|
||||
"""Converts the various types of moves into L or M commands
|
||||
and dispatches to process_svg_path_L_or_M for futher processing."""
|
||||
and dispatches to process_svg_path_L_or_M for further processing."""
|
||||
if cmd == "Z" or cmd == "z":
|
||||
self.process_svg_path_L_or_M("L", self.initial_x, self.initial_y)
|
||||
elif cmd == "H":
|
||||
|
||||
@@ -39,7 +39,7 @@ void DialogBoxBaseClass::drawMessage(T message, int16_t font) {
|
||||
.cmd(CLEAR(true,true,true))
|
||||
.cmd(COLOR_RGB(bg_text_enabled))
|
||||
.tag(0);
|
||||
draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,3), message, OPT_CENTER, font ? font : font_large);
|
||||
draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,6), message, OPT_CENTER, font ? font : font_large);
|
||||
cmd.colors(normal_btn);
|
||||
}
|
||||
|
||||
@@ -69,12 +69,6 @@ void DialogBoxBaseClass::drawButton(T label) {
|
||||
template void DialogBoxBaseClass::drawButton(const char *);
|
||||
template void DialogBoxBaseClass::drawButton(progmem_str);
|
||||
|
||||
void DialogBoxBaseClass::drawSpinner() {
|
||||
CommandProcessor cmd;
|
||||
cmd.cmd(COLOR_RGB(bg_text_enabled))
|
||||
.spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute();
|
||||
}
|
||||
|
||||
bool DialogBoxBaseClass::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); return true;
|
||||
|
||||
@@ -31,7 +31,6 @@ class DialogBoxBaseClass : public BaseScreen {
|
||||
template<typename T> static void drawButton(T);
|
||||
static void drawYesNoButtons(uint8_t default_btn = 0);
|
||||
static void drawOkayButton();
|
||||
static void drawSpinner();
|
||||
|
||||
static void onRedraw(draw_mode_t) {};
|
||||
public:
|
||||
|
||||
@@ -104,8 +104,8 @@ void InterfaceSettingsScreen::onRedraw(draw_mode_t what) {
|
||||
#endif
|
||||
#undef EDGE_R
|
||||
#define EDGE_R 0
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
.colors(normal_btn)
|
||||
#if ENABLED(TOUCH_UI_PORTRAIT)
|
||||
.tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS))
|
||||
.colors(action_btn)
|
||||
.tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
|
||||
|
||||
@@ -74,8 +74,7 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) {
|
||||
#undef EDGE_R
|
||||
#define EDGE_R 30
|
||||
.font(font_small)
|
||||
.tag(0).text (BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY)
|
||||
.text (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_CLICK_SOUNDS), OPT_RIGHTX | OPT_CENTERY)
|
||||
.tag(0).text (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_CLICK_SOUNDS), OPT_RIGHTX | OPT_CENTERY)
|
||||
.text (BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_STARTING), OPT_RIGHTX | OPT_CENTERY)
|
||||
.text (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_FINISHED), OPT_RIGHTX | OPT_CENTERY)
|
||||
.text (BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_ERROR), OPT_RIGHTX | OPT_CENTERY);
|
||||
@@ -89,18 +88,16 @@ void InterfaceSoundsScreen::onRedraw(draw_mode_t what) {
|
||||
constexpr uint8_t w = 1;
|
||||
#endif
|
||||
|
||||
cmd.font(font_medium)
|
||||
.colors(ui_slider)
|
||||
cmd.font(font_small)
|
||||
#define EDGE_R 30
|
||||
.tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF)
|
||||
.colors(ui_toggle)
|
||||
.tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled())
|
||||
.tag(2).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled())
|
||||
#undef EDGE_R
|
||||
.colors(normal_btn)
|
||||
#define EDGE_R 0
|
||||
.tag(4).button (BTN_POS(3,5), BTN_SIZE(2,1), getSoundSelection(PRINTING_STARTED))
|
||||
.tag(5).button (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED))
|
||||
.tag(6).button (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED))
|
||||
.tag(3).button (BTN_POS(3,5), BTN_SIZE(2,1), getSoundSelection(PRINTING_STARTED))
|
||||
.tag(4).button (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED))
|
||||
.tag(5).button (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED))
|
||||
.colors(action_btn)
|
||||
.tag(1).button (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
|
||||
}
|
||||
@@ -114,10 +111,10 @@ void InterfaceSoundsScreen::onEntry() {
|
||||
bool InterfaceSoundsScreen::onTouchEnd(uint8_t tag) {
|
||||
switch (tag) {
|
||||
case 1: GOTO_PREVIOUS(); return true;
|
||||
case 3: UIData::enable_touch_sounds(!UIData::touch_sounds_enabled()); break;
|
||||
case 4: toggleSoundSelection(PRINTING_STARTED); break;
|
||||
case 5: toggleSoundSelection(PRINTING_FINISHED); break;
|
||||
case 6: toggleSoundSelection(PRINTING_FAILED); break;
|
||||
case 2: UIData::enable_touch_sounds(!UIData::touch_sounds_enabled()); break;
|
||||
case 3: toggleSoundSelection(PRINTING_STARTED); break;
|
||||
case 4: toggleSoundSelection(PRINTING_FINISHED); break;
|
||||
case 5: toggleSoundSelection(PRINTING_FAILED); break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -125,35 +122,4 @@ bool InterfaceSoundsScreen::onTouchEnd(uint8_t tag) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool InterfaceSoundsScreen::onTouchStart(uint8_t tag) {
|
||||
CommandProcessor cmd;
|
||||
#undef EDGE_R
|
||||
#define EDGE_R 30
|
||||
switch (tag) {
|
||||
case 2: cmd.track_linear(BTN_POS(3,2), BTN_SIZE(2,1), 2).execute(); break;
|
||||
default: break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void InterfaceSoundsScreen::onIdle() {
|
||||
if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) {
|
||||
refresh_timer.start();
|
||||
|
||||
uint16_t value;
|
||||
CommandProcessor cmd;
|
||||
switch (cmd.track_tag(value)) {
|
||||
case 2:
|
||||
screen_data.InterfaceSettingsScreen.volume = value >> 8;
|
||||
SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume);
|
||||
SaveSettingsDialogBox::settingsChanged();
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
onRefresh();
|
||||
}
|
||||
BaseScreen::onIdle();
|
||||
}
|
||||
|
||||
#endif // FTDI_INTERFACE_SOUNDS_SCREEN
|
||||
|
||||
@@ -51,7 +51,5 @@ class InterfaceSoundsScreen : public BaseScreen, public CachedScreen<INTERFACE_S
|
||||
|
||||
static void onEntry();
|
||||
static void onRedraw(draw_mode_t);
|
||||
static bool onTouchStart(uint8_t tag);
|
||||
static bool onTouchEnd(uint8_t tag);
|
||||
static void onIdle();
|
||||
};
|
||||
|
||||
@@ -26,8 +26,12 @@
|
||||
|
||||
#ifdef FTDI_SPINNER_DIALOG_BOX
|
||||
|
||||
#define GRID_COLS 2
|
||||
#define GRID_ROWS 8
|
||||
|
||||
using namespace FTDI;
|
||||
using namespace ExtUI;
|
||||
using namespace Theme;
|
||||
|
||||
constexpr static SpinnerDialogBoxData &mydata = screen_data.SpinnerDialogBox;
|
||||
|
||||
@@ -35,35 +39,65 @@ void SpinnerDialogBox::onEntry() {
|
||||
mydata.auto_hide = true;
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::onExit() {
|
||||
CommandProcessor cmd;
|
||||
cmd.stop().execute();
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::onRefresh() {
|
||||
using namespace FTDI;
|
||||
DLCache dlcache(SPINNER_CACHE);
|
||||
CommandProcessor cmd;
|
||||
cmd.cmd(CMD_DLSTART);
|
||||
if (dlcache.has_data())
|
||||
dlcache.append();
|
||||
else
|
||||
dlcache.store(SPINNER_DL_SIZE);
|
||||
cmd.spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute();
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::onRedraw(draw_mode_t) {
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::show(progmem_str message) {
|
||||
drawMessage(message);
|
||||
drawSpinner();
|
||||
storeBackground();
|
||||
GOTO_SCREEN(SpinnerDialogBox);
|
||||
CommandProcessor cmd;
|
||||
if (AT_SCREEN(SpinnerDialogBox)) cmd.stop().execute();
|
||||
cmd.cmd(CMD_DLSTART)
|
||||
.cmd(CLEAR_COLOR_RGB(bg_color))
|
||||
.cmd(CLEAR(true,true,true))
|
||||
.cmd(COLOR_RGB(bg_text_enabled))
|
||||
.tag(0);
|
||||
draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,3), message, OPT_CENTER, font_large);
|
||||
DLCache dlcache(SPINNER_CACHE);
|
||||
if (!dlcache.store(SPINNER_DL_SIZE)) {
|
||||
SERIAL_ECHO_MSG("CachedScreen::storeBackground() failed: not enough DL cache space");
|
||||
cmd.cmd(CMD_DLSTART).cmd(CLEAR(true,true,true));
|
||||
dlcache.store(SPINNER_DL_SIZE);
|
||||
}
|
||||
if (AT_SCREEN(SpinnerDialogBox))
|
||||
cmd.spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute();
|
||||
else
|
||||
GOTO_SCREEN(SpinnerDialogBox);
|
||||
mydata.auto_hide = false;
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::hide() {
|
||||
CommandProcessor cmd;
|
||||
cmd.stop().execute();
|
||||
GOTO_PREVIOUS();
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::enqueueAndWait(progmem_str message, progmem_str commands) {
|
||||
show(message);
|
||||
ExtUI::injectCommands_P((const char*)commands);
|
||||
mydata.auto_hide = true;
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::enqueueAndWait(progmem_str message, char *commands) {
|
||||
show(message);
|
||||
ExtUI::injectCommands(commands);
|
||||
mydata.auto_hide = true;
|
||||
}
|
||||
|
||||
void SpinnerDialogBox::onIdle() {
|
||||
reset_menu_timeout();
|
||||
if (mydata.auto_hide && !commandsInQueue()) {
|
||||
mydata.auto_hide = false;
|
||||
hide();
|
||||
|
||||
@@ -29,10 +29,12 @@ struct SpinnerDialogBoxData {
|
||||
bool auto_hide;
|
||||
};
|
||||
|
||||
class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen<SPINNER_CACHE,SPINNER_DL_SIZE> {
|
||||
class SpinnerDialogBox : public BaseScreen {
|
||||
public:
|
||||
static void onEntry();
|
||||
static void onExit();
|
||||
static void onRedraw(draw_mode_t);
|
||||
static void onRefresh();
|
||||
static void onIdle();
|
||||
|
||||
static void show(progmem_str);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user