Merge pull request #5668 from Bob-the-Kuhn/pinsDebug-PROGMEM

pinsDebug with more features, uses less RAM
master
Bob-the-Kuhn 8 years ago committed by GitHub
commit 3b6333c613

@ -20,649 +20,99 @@
* *
*/ */
#include "macros.h"
bool endstop_monitor_flag = false; bool endstop_monitor_flag = false;
#if !defined(TIMER1B) // working with Teensyduino extension so need to re-define some things #define NAME_FORMAT "%-28s" // one place to specify the format of all the sources of names
#include "pinsDebug_Teensyduino.h" // "-" left justify, "28" minimum width of name, pad with blanks
#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7)))
#define AVR_ATmega2560_FAMILY (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__))
#define AVR_AT90USB1286_FAMILY (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__))
#define AVR_ATmega1284_FAMILY (defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__))
/**
* This routine minimizes RAM usage by creating a FLASH resident array to
* store the pin names, pin numbers and analog/digital flag.
*
* Creating the array in FLASH is a two pass process. The first pass puts the
* name strings into FLASH. The second pass actually creates the array.
*
* Both passes use the same pin list. The list contains two macro names. The
* actual macro definitions are changed depending on which pass is being done.
*
*/
// first pass - put the name strings into FLASH
#define _ADD_PIN_2(PIN_NAME, ENTRY_NAME) static const unsigned char ENTRY_NAME[] PROGMEM = {PIN_NAME};
#define _ADD_PIN(PIN_NAME, COUNTER) _ADD_PIN_2(PIN_NAME, entry_NAME_##COUNTER)
#define REPORT_NAME_DIGITAL(NAME, COUNTER) _ADD_PIN(#NAME, COUNTER)
#define REPORT_NAME_ANALOG(NAME, COUNTER) _ADD_PIN(#NAME, COUNTER)
#line 0 // set __LINE__ to a known value for the first pass
#include "pinsDebug_list.h"
#line 59 // set __LINE__ to the correct line number or else compiler error messages don't make sense
// manually add pins that have names that are macros which don't play well with these macros
#if SERIAL_PORT == 0 && (AVR_ATmega2560_FAMILY || AVR_ATmega1284_FAMILY)
static const unsigned char RXD_NAME[] PROGMEM = {"RXD"};
static const unsigned char TXD_NAME[] PROGMEM = {"TXD"};
#endif #endif
#define NAME_FORMAT "%-28s" // one place to specify the format of all the sources of names /////////////////////////////////////////////////////////////////////////////
// "-" left justify, "28" minimum width of name, pad with blanks
#define _PIN_SAY(NAME) { sprintf(buffer, NAME_FORMAT, NAME); SERIAL_ECHO(buffer); return true; } // second pass - create the array
#define PIN_SAY(NAME) if (pin == NAME) _PIN_SAY(#NAME);
#define _ANALOG_PIN_SAY(NAME) { sprintf(buffer, NAME_FORMAT, NAME); SERIAL_ECHO(buffer); pin_is_analog = true; return true; } #undef _ADD_PIN_2
#define ANALOG_PIN_SAY(NAME) if (pin == analogInputToDigitalPin(NAME)) _ANALOG_PIN_SAY(#NAME); #undef _ADD_PIN
#undef REPORT_NAME_DIGITAL
#undef REPORT_NAME_ANALOG
#define IS_ANALOG(P) ( WITHIN(P, analogInputToDigitalPin(0), analogInputToDigitalPin(15)) || (P) <= analogInputToDigitalPin(5) ) #define _ADD_PIN_2( ENTRY_NAME, NAME, IS_DIGITAL) {(const char*) ENTRY_NAME, (const char*)NAME, (const char*)IS_DIGITAL},
#define _ADD_PIN( NAME, COUNTER, IS_DIGITAL) _ADD_PIN_2( entry_NAME_##COUNTER, NAME, IS_DIGITAL)
#define REPORT_NAME_DIGITAL(NAME, COUNTER) _ADD_PIN( NAME, COUNTER, (uint8_t)1)
#define REPORT_NAME_ANALOG(NAME, COUNTER) _ADD_PIN( analogInputToDigitalPin(NAME), COUNTER, 0)
int digitalRead_mod(int8_t pin) { // same as digitalRead except the PWM stop section has been removed
uint8_t port = digitalPinToPort(pin); const char* const pin_array[][3] PROGMEM = {
return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask(pin)) ? HIGH : LOW;
}
/** /**
* Report pin name for a given fastio digital pin index * [pin name] [pin number] [is digital or analog] 1 = digital, 0 = analog
* Each entry takes up 6 bytes in FLASH:
* 2 byte pointer to location of the name string
* 2 bytes containing the pin number
* analog pin numbers were convereted to digital when the array was created
* 2 bytes containing the digital/analog bool flag
*/ */
static bool report_pin_name(int8_t pin, bool &pin_is_analog) {
char buffer[30]; // for the sprintf statements // manually add pins ...
pin_is_analog = false; // default to digital pin #if SERIAL_PORT == 0
#if AVR_ATmega2560_FAMILY
if (IS_ANALOG(pin)) { {RXD_NAME, 0, 1},
sprintf(buffer, "(A%2d) ", int(pin - analogInputToDigitalPin(0))); {TXD_NAME, 1, 1},
SERIAL_ECHO(buffer); #elif AVR_ATmega1284_FAMILY
} {RXD_NAME, 8, 1},
else SERIAL_ECHOPGM(" "); {TXD_NAME, 9, 1},
#endif
#if defined(RXD) && RXD >= 0
if (pin == 0) { sprintf(buffer, NAME_FORMAT, "RXD"); SERIAL_ECHO(buffer); return true; }
#endif #endif
#if defined(TXD) && TXD >= 0 #line 0 // set __LINE__ to the SAME known value for the second pass
if (pin == 1) { sprintf(buffer, NAME_FORMAT, "TXD"); SERIAL_ECHO(buffer); return true; } #include "pinsDebug_list.h"
#endif
// Pin list updated from 7 OCT RCBugfix branch - max length of pin name is 24 }; // done populating the array
#if defined(__FD) && __FD >= 0
PIN_SAY(__FD)
#endif
#if defined(__FS) && __FS >= 0
PIN_SAY(__FS)
#endif
#if defined(__GD) && __GD >= 0
PIN_SAY(__GD)
#endif
#if defined(__GS) && __GS >= 0
PIN_SAY(__GS)
#endif
#if PIN_EXISTS(AVR_MISO) #line 109 // set __LINE__ to the correct line number or else compiler error messages don't make sense
PIN_SAY(AVR_MISO_PIN);
#endif
#if PIN_EXISTS(AVR_MOSI)
PIN_SAY(AVR_MOSI_PIN);
#endif
#if PIN_EXISTS(AVR_SCK)
PIN_SAY(AVR_SCK_PIN);
#endif
#if PIN_EXISTS(AVR_SS)
PIN_SAY(AVR_SS_PIN);
#endif
#if PIN_EXISTS(BEEPER)
PIN_SAY(BEEPER_PIN);
#endif
#if defined(BTN_CENTER) && BTN_CENTER >= 0
PIN_SAY(BTN_CENTER);
#endif
#if defined(BTN_DOWN) && BTN_DOWN >= 0
PIN_SAY(BTN_DOWN);
#endif
#if defined(BTN_DWN) && BTN_DWN >= 0
PIN_SAY(BTN_DWN);
#endif
#if defined(BTN_EN1) && BTN_EN1 >= 0
PIN_SAY(BTN_EN1);
#endif
#if defined(BTN_EN2) && BTN_EN2 >= 0
PIN_SAY(BTN_EN2);
#endif
#if defined(BTN_ENC) && BTN_ENC >= 0
PIN_SAY(BTN_ENC);
#endif
#if defined(BTN_HOME) && BTN_HOME >= 0
PIN_SAY(BTN_HOME);
#endif
#if defined(BTN_LEFT) && BTN_LEFT >= 0
PIN_SAY(BTN_LEFT);
#endif
#if defined(BTN_LFT) && BTN_LFT >= 0
PIN_SAY(BTN_LFT);
#endif
#if defined(BTN_RIGHT) && BTN_RIGHT >= 0
PIN_SAY(BTN_RIGHT);
#endif
#if defined(BTN_RT) && BTN_RT >= 0
PIN_SAY(BTN_RT);
#endif
#if defined(BTN_UP) && BTN_UP >= 0
PIN_SAY(BTN_UP);
#endif
#if PIN_EXISTS(CONTROLLERFAN)
PIN_SAY(CONTROLLERFAN_PIN);
#endif
#if PIN_EXISTS(DAC_DISABLE)
PIN_SAY(DAC_DISABLE_PIN);
#endif
#if defined(DAC_STEPPER_GAIN) && DAC_STEPPER_GAIN >= 0
PIN_SAY(DAC_STEPPER_GAIN);
#endif
#if defined(DAC_STEPPER_VREF) && DAC_STEPPER_VREF >= 0
PIN_SAY(DAC_STEPPER_VREF);
#endif
#if PIN_EXISTS(DEBUG)
PIN_SAY(DEBUG_PIN);
#endif
#if PIN_EXISTS(DIGIPOTSS)
PIN_SAY(DIGIPOTSS_PIN);
#endif
#if defined(DOGLCD_A0) && DOGLCD_A0 >= 0
PIN_SAY(DOGLCD_A0);
#endif
#if defined(DOGLCD_CS) && DOGLCD_CS >= 0
PIN_SAY(DOGLCD_CS);
#endif
#if defined(DOGLCD_MOSI) && DOGLCD_MOSI >= 0
PIN_SAY(DOGLCD_MOSI);
#endif
#if defined(DOGLCD_SCK) && DOGLCD_SCK >= 0
PIN_SAY(DOGLCD_SCK);
#endif
#if PIN_EXISTS(E0_ATT)
PIN_SAY(E0_ATT_PIN);
#endif
#if PIN_EXISTS(E0_AUTO_FAN)
PIN_SAY(E0_AUTO_FAN_PIN);
#endif
#if PIN_EXISTS(E1_AUTO_FAN)
PIN_SAY(E1_AUTO_FAN_PIN);
#endif
#if PIN_EXISTS(E2_AUTO_FAN)
PIN_SAY(E2_AUTO_FAN_PIN);
#endif
#if PIN_EXISTS(E3_AUTO_FAN)
PIN_SAY(E3_AUTO_FAN_PIN);
#endif
#if PIN_EXISTS(E0_DIR)
PIN_SAY(E0_DIR_PIN);
#endif
#if PIN_EXISTS(E0_ENABLE)
PIN_SAY(E0_ENABLE_PIN);
#endif
#if PIN_EXISTS(E0_MS1)
PIN_SAY(E0_MS1_PIN);
#endif
#if PIN_EXISTS(E0_MS2)
PIN_SAY(E0_MS2_PIN);
#endif
#if PIN_EXISTS(E0_STEP)
PIN_SAY(E0_STEP_PIN);
#endif
#if PIN_EXISTS(E1_DIR)
PIN_SAY(E1_DIR_PIN);
#endif
#if PIN_EXISTS(E1_ENABLE)
PIN_SAY(E1_ENABLE_PIN);
#endif
#if PIN_EXISTS(E1_MS1)
PIN_SAY(E1_MS1_PIN);
#endif
#if PIN_EXISTS(E1_MS2)
PIN_SAY(E1_MS2_PIN);
#endif
#if PIN_EXISTS(E1_STEP)
PIN_SAY(E1_STEP_PIN);
#endif
#if PIN_EXISTS(E2_DIR)
PIN_SAY(E2_DIR_PIN);
#endif
#if PIN_EXISTS(E2_ENABLE)
PIN_SAY(E2_ENABLE_PIN);
#endif
#if PIN_EXISTS(E2_STEP)
PIN_SAY(E2_STEP_PIN);
#endif
#if PIN_EXISTS(E3_DIR)
PIN_SAY(E3_DIR_PIN);
#endif
#if PIN_EXISTS(E3_ENABLE)
PIN_SAY(E3_ENABLE_PIN);
#endif
#if PIN_EXISTS(E3_STEP)
PIN_SAY(E3_STEP_PIN);
#endif
#if PIN_EXISTS(E4_DIR)
PIN_SAY(E4_DIR_PIN);
#endif
#if PIN_EXISTS(E4_ENABLE)
PIN_SAY(E4_ENABLE_PIN);
#endif
#if PIN_EXISTS(E4_STEP)
PIN_SAY(E4_STEP_PIN);
#endif
#if defined(encrot1) && encrot1 >= 0
PIN_SAY(encrot1);
#endif
#if defined(encrot2) && encrot2 >= 0
PIN_SAY(encrot2);
#endif
#if defined(encrot3) && encrot3 >= 0
PIN_SAY(encrot3);
#endif
#if defined(EXT_AUX_A0_IO) && EXT_AUX_A0_IO >= 0
PIN_SAY(EXT_AUX_A0_IO);
#endif
#if defined(EXT_AUX_A1) && EXT_AUX_A1 >= 0
PIN_SAY(EXT_AUX_A1);
#endif
#if defined(EXT_AUX_A1_IO) && EXT_AUX_A1_IO >= 0
PIN_SAY(EXT_AUX_A1_IO);
#endif
#if defined(EXT_AUX_A2) && EXT_AUX_A2 >= 0
PIN_SAY(EXT_AUX_A2);
#endif
#if defined(EXT_AUX_A2_IO) && EXT_AUX_A2_IO >= 0
PIN_SAY(EXT_AUX_A2_IO);
#endif
#if defined(EXT_AUX_A3) && EXT_AUX_A3 >= 0
PIN_SAY(EXT_AUX_A3);
#endif
#if defined(EXT_AUX_A3_IO) && EXT_AUX_A3_IO >= 0
PIN_SAY(EXT_AUX_A3_IO);
#endif
#if defined(EXT_AUX_A4) && EXT_AUX_A4 >= 0
PIN_SAY(EXT_AUX_A4);
#endif
#if defined(EXT_AUX_A4_IO) && EXT_AUX_A4_IO >= 0
PIN_SAY(EXT_AUX_A4_IO);
#endif
#if defined(EXT_AUX_PWM_D24) && EXT_AUX_PWM_D24 >= 0
PIN_SAY(EXT_AUX_PWM_D24);
#endif
#if defined(EXT_AUX_RX1_D2) && EXT_AUX_RX1_D2 >= 0
PIN_SAY(EXT_AUX_RX1_D2);
#endif
#if defined(EXT_AUX_SDA_D1) && EXT_AUX_SDA_D1 >= 0
PIN_SAY(EXT_AUX_SDA_D1);
#endif
#if defined(EXT_AUX_TX1_D3) && EXT_AUX_TX1_D3 >= 0
PIN_SAY(EXT_AUX_TX1_D3);
#endif
#if PIN_EXISTS(FAN) #define n_array (sizeof (pin_array) / sizeof (const char *))/3
PIN_SAY(FAN_PIN);
#endif
#if PIN_EXISTS(FAN1)
PIN_SAY(FAN1_PIN);
#endif
#if PIN_EXISTS(FAN2)
PIN_SAY(FAN2_PIN);
#endif
#if PIN_EXISTS(FIL_RUNOUT)
PIN_SAY(FIL_RUNOUT_PIN);
#endif
#if PIN_EXISTS(FILWIDTH)
ANALOG_PIN_SAY(FILWIDTH_PIN);
#endif
#if defined(GEN7_VERSION) && GEN7_VERSION >= 0
PIN_SAY(GEN7_VERSION);
#endif
#if PIN_EXISTS(HEATER_0)
PIN_SAY(HEATER_0_PIN);
#endif
#if PIN_EXISTS(HEATER_1)
PIN_SAY(HEATER_1_PIN);
#endif
#if PIN_EXISTS(HEATER_2)
PIN_SAY(HEATER_2_PIN);
#endif
#if PIN_EXISTS(HEATER_3)
PIN_SAY(HEATER_3_PIN);
#endif
#if PIN_EXISTS(HEATER_4)
PIN_SAY(HEATER_4_PIN);
#endif
#if PIN_EXISTS(HEATER_5)
PIN_SAY(HEATER_5_PIN);
#endif
#if PIN_EXISTS(HEATER_6)
PIN_SAY(HEATER_6_PIN);
#endif
#if PIN_EXISTS(HEATER_7)
PIN_SAY(HEATER_7_PIN);
#endif
#if PIN_EXISTS(HEATER_BED)
PIN_SAY(HEATER_BED_PIN);
#endif
#if defined(I2C_SCL) && I2C_SCL >= 0
PIN_SAY(I2C_SCL);
#endif
#if defined(I2C_SDA) && I2C_SDA >= 0
PIN_SAY(I2C_SDA);
#endif
#if PIN_EXISTS(KILL)
PIN_SAY(KILL_PIN);
#endif
#if PIN_EXISTS(LCD_BACKLIGHT)
PIN_SAY(LCD_BACKLIGHT_PIN);
#endif
#if defined(LCD_CONTRAST) && LCD_CONTRAST >= 0
PIN_SAY(LCD_CONTRAST);
#endif
#if defined(LCD_PINS_D4) && LCD_PINS_D4 >= 0
PIN_SAY(LCD_PINS_D4);
#endif
#if defined(LCD_PINS_D5) && LCD_PINS_D5 >= 0
PIN_SAY(LCD_PINS_D5);
#endif
#if defined(LCD_PINS_D6) && LCD_PINS_D6 >= 0
PIN_SAY(LCD_PINS_D6);
#endif
#if defined(LCD_PINS_D7) && LCD_PINS_D7 >= 0
PIN_SAY(LCD_PINS_D7);
#endif
#if defined(LCD_PINS_ENABLE) && LCD_PINS_ENABLE >= 0
PIN_SAY(LCD_PINS_ENABLE);
#endif
#if defined(LCD_PINS_RS) && LCD_PINS_RS >= 0
PIN_SAY(LCD_PINS_RS);
#endif
#if defined(LCD_SDSS) && LCD_SDSS >= 0
PIN_SAY(LCD_SDSS);
#endif
#if PIN_EXISTS(LED)
PIN_SAY(LED_PIN);
#endif
#if PIN_EXISTS(CASE_LIGHT)
PIN_SAY(CASE_LIGHT_PIN);
#endif
#if PIN_EXISTS(MAIN_VOLTAGE_MEASURE)
PIN_SAY(MAIN_VOLTAGE_MEASURE_PIN);
#endif
#if defined(MAX6675_SS) && MAX6675_SS >= 0
PIN_SAY(MAX6675_SS);
#endif
#if PIN_EXISTS(MISO)
PIN_SAY(MISO_PIN);
#endif
#if PIN_EXISTS(MOSFET_D)
PIN_SAY(MOSFET_D_PIN);
#endif
#if PIN_EXISTS(MOSI)
PIN_SAY(MOSI_PIN);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
PIN_SAY(MOTOR_CURRENT_PWM_E_PIN);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
PIN_SAY(MOTOR_CURRENT_PWM_XY_PIN);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
PIN_SAY(MOTOR_CURRENT_PWM_Z_PIN);
#endif
#if defined(NUM_TLCS) && NUM_TLCS >= 0
PIN_SAY(NUM_TLCS);
#endif
#if PIN_EXISTS(PHOTOGRAPH)
PIN_SAY(PHOTOGRAPH_PIN);
#endif
#if PIN_EXISTS(PS_ON)
PIN_SAY(PS_ON_PIN);
#endif
#if PIN_EXISTS(RAMPS_D10)
PIN_SAY(RAMPS_D10_PIN);
#endif
#if PIN_EXISTS(RAMPS_D8)
PIN_SAY(RAMPS_D8_PIN);
#endif
#if PIN_EXISTS(RAMPS_D9)
PIN_SAY(RAMPS_D9_PIN);
#endif
#if PIN_EXISTS(RX_ENABLE)
PIN_SAY(RX_ENABLE_PIN);
#endif
#if PIN_EXISTS(SAFETY_TRIGGERED)
PIN_SAY(SAFETY_TRIGGERED_PIN);
#endif
#if PIN_EXISTS(SCK)
PIN_SAY(SCK_PIN);
#endif
#if defined(SCL) && SCL >= 0
PIN_SAY(SCL);
#endif
#if PIN_EXISTS(SD_DETECT)
PIN_SAY(SD_DETECT_PIN);
#endif
#if defined(SDA) && SDA >= 0
PIN_SAY(SDA);
#endif
#if defined(SDPOWER) && SDPOWER >= 0
PIN_SAY(SDPOWER);
#endif
#if defined(SDSS) && SDSS >= 0
PIN_SAY(SDSS);
#endif
#if PIN_EXISTS(SERVO0)
PIN_SAY(SERVO0_PIN);
#endif
#if PIN_EXISTS(SERVO1)
PIN_SAY(SERVO1_PIN);
#endif
#if PIN_EXISTS(SERVO2)
PIN_SAY(SERVO2_PIN);
#endif
#if PIN_EXISTS(SERVO3)
PIN_SAY(SERVO3_PIN);
#endif
#if defined(SHIFT_CLK) && SHIFT_CLK >= 0
PIN_SAY(SHIFT_CLK);
#endif
#if defined(SHIFT_EN) && SHIFT_EN >= 0
PIN_SAY(SHIFT_EN);
#endif
#if defined(SHIFT_LD) && SHIFT_LD >= 0
PIN_SAY(SHIFT_LD);
#endif
#if defined(SHIFT_OUT) && SHIFT_OUT >= 0
PIN_SAY(SHIFT_OUT);
#endif
#if PIN_EXISTS(SLED)
PIN_SAY(SLED_PIN);
#endif
#if PIN_EXISTS(SLEEP_WAKE)
PIN_SAY(SLEEP_WAKE_PIN);
#endif
#if PIN_EXISTS(SOL1)
PIN_SAY(SOL1_PIN);
#endif
#if PIN_EXISTS(SOL2)
PIN_SAY(SOL2_PIN);
#endif
#if PIN_EXISTS(SPINDLE_ENABLE)
PIN_SAY(SPINDLE_ENABLE_PIN);
#endif
#if PIN_EXISTS(SPINDLE_SPEED)
PIN_SAY(SPINDLE_SPEED_PIN);
#endif
#if PIN_EXISTS(SS)
PIN_SAY(SS_PIN);
#endif
#if PIN_EXISTS(STAT_LED_BLUE)
PIN_SAY(STAT_LED_BLUE_PIN);
#endif
#if PIN_EXISTS(STAT_LED_RED)
PIN_SAY(STAT_LED_RED_PIN);
#endif
#if PIN_EXISTS(STEPPER_RESET)
PIN_SAY(STEPPER_RESET_PIN);
#endif
#if PIN_EXISTS(SUICIDE)
PIN_SAY(SUICIDE_PIN);
#endif
#if defined(TC1) && TC1 >= 0
ANALOG_PIN_SAY(TC1);
#endif
#if defined(TC2) && TC2 >= 0
ANALOG_PIN_SAY(TC2);
#endif
#if PIN_EXISTS(TEMP_0)
ANALOG_PIN_SAY(TEMP_0_PIN);
#endif
#if PIN_EXISTS(TEMP_1)
ANALOG_PIN_SAY(TEMP_1_PIN);
#endif
#if PIN_EXISTS(TEMP_2)
ANALOG_PIN_SAY(TEMP_2_PIN);
#endif
#if PIN_EXISTS(TEMP_3)
ANALOG_PIN_SAY(TEMP_3_PIN);
#endif
#if PIN_EXISTS(TEMP_4)
ANALOG_PIN_SAY(TEMP_4_PIN);
#endif
#if PIN_EXISTS(TEMP_BED)
ANALOG_PIN_SAY(TEMP_BED_PIN);
#endif
#if PIN_EXISTS(TEMP_X)
ANALOG_PIN_SAY(TEMP_X_PIN);
#endif
#if defined(TLC_BLANK_BIT) && TLC_BLANK_BIT >= 0
PIN_SAY(TLC_BLANK_BIT);
#endif
#if PIN_EXISTS(TLC_BLANK)
PIN_SAY(TLC_BLANK_PIN);
#endif
#if defined(TLC_CLOCK_BIT) && TLC_CLOCK_BIT >= 0
PIN_SAY(TLC_CLOCK_BIT);
#endif
#if PIN_EXISTS(TLC_CLOCK)
PIN_SAY(TLC_CLOCK_PIN);
#endif
#if defined(TLC_DATA_BIT) && TLC_DATA_BIT >= 0
PIN_SAY(TLC_DATA_BIT);
#endif
#if PIN_EXISTS(TLC_DATA)
PIN_SAY(TLC_DATA_PIN);
#endif
#if PIN_EXISTS(TLC_XLAT)
PIN_SAY(TLC_XLAT_PIN);
#endif
#if PIN_EXISTS(TX_ENABLE)
PIN_SAY(TX_ENABLE_PIN);
#endif
#if defined(UNUSED_PWM) && UNUSED_PWM >= 0
PIN_SAY(UNUSED_PWM);
#endif
#if PIN_EXISTS(X_ATT)
PIN_SAY(X_ATT_PIN);
#endif
#if PIN_EXISTS(X_DIR)
PIN_SAY(X_DIR_PIN);
#endif
#if PIN_EXISTS(X_ENABLE)
PIN_SAY(X_ENABLE_PIN);
#endif
#if PIN_EXISTS(X_MAX)
PIN_SAY(X_MAX_PIN);
#endif
#if PIN_EXISTS(X_MIN)
PIN_SAY(X_MIN_PIN);
#endif
#if PIN_EXISTS(X_MS1)
PIN_SAY(X_MS1_PIN);
#endif
#if PIN_EXISTS(X_MS2)
PIN_SAY(X_MS2_PIN);
#endif
#if PIN_EXISTS(X_STEP)
PIN_SAY(X_STEP_PIN);
#endif
#if PIN_EXISTS(X_STOP)
PIN_SAY(X_STOP_PIN);
#endif
#if PIN_EXISTS(X2_DIR)
PIN_SAY(X2_DIR_PIN);
#endif
#if PIN_EXISTS(X2_ENABLE)
PIN_SAY(X2_ENABLE_PIN);
#endif
#if PIN_EXISTS(X2_STEP)
PIN_SAY(X2_STEP_PIN);
#endif
#if PIN_EXISTS(Y_ATT)
PIN_SAY(Y_ATT_PIN);
#endif
#if PIN_EXISTS(Y_DIR)
PIN_SAY(Y_DIR_PIN);
#endif
#if PIN_EXISTS(Y_ENABLE)
PIN_SAY(Y_ENABLE_PIN);
#endif
#if PIN_EXISTS(Y_MAX)
PIN_SAY(Y_MAX_PIN);
#endif
#if PIN_EXISTS(Y_MIN)
PIN_SAY(Y_MIN_PIN);
#endif
#if PIN_EXISTS(Y_MS1)
PIN_SAY(Y_MS1_PIN);
#endif
#if PIN_EXISTS(Y_MS2)
PIN_SAY(Y_MS2_PIN);
#endif
#if PIN_EXISTS(Y_STEP)
PIN_SAY(Y_STEP_PIN);
#endif
#if PIN_EXISTS(Y_STOP)
PIN_SAY(Y_STOP_PIN);
#endif
#if PIN_EXISTS(Y2_DIR)
PIN_SAY(Y2_DIR_PIN);
#endif
#if PIN_EXISTS(Y2_ENABLE)
PIN_SAY(Y2_ENABLE_PIN);
#endif
#if PIN_EXISTS(Y2_STEP)
PIN_SAY(Y2_STEP_PIN);
#endif
#if PIN_EXISTS(Z_ATT)
PIN_SAY(Z_ATT_PIN);
#endif
#if PIN_EXISTS(Z_DIR)
PIN_SAY(Z_DIR_PIN);
#endif
#if PIN_EXISTS(Z_ENABLE)
PIN_SAY(Z_ENABLE_PIN);
#endif
#if PIN_EXISTS(Z_MAX)
PIN_SAY(Z_MAX_PIN);
#endif
#if PIN_EXISTS(Z_MIN)
PIN_SAY(Z_MIN_PIN);
#endif
#if PIN_EXISTS(Z_MIN_PROBE)
PIN_SAY(Z_MIN_PROBE_PIN);
#endif
#if PIN_EXISTS(Z_MS1)
PIN_SAY(Z_MS1_PIN);
#endif
#if PIN_EXISTS(Z_MS2)
PIN_SAY(Z_MS2_PIN);
#endif
#if PIN_EXISTS(Z_STEP)
PIN_SAY(Z_STEP_PIN);
#endif
#if PIN_EXISTS(Z_STOP)
PIN_SAY(Z_STOP_PIN);
#endif
#if PIN_EXISTS(Z2_DIR)
PIN_SAY(Z2_DIR_PIN);
#endif
#if PIN_EXISTS(Z2_ENABLE)
PIN_SAY(Z2_ENABLE_PIN);
#endif
#if PIN_EXISTS(Z2_STEP)
PIN_SAY(Z2_STEP_PIN);
#endif
sprintf(buffer, NAME_FORMAT, "<unused> "); #if !defined(TIMER1B) // working with Teensyduino extension so need to re-define some things
SERIAL_ECHO(buffer); #include "pinsDebug_Teensyduino.h"
#endif
return false;
} // report_pin_name
#define PWM_PRINT(V) do{ sprintf(buffer, "PWM: %4d", V); SERIAL_ECHO(buffer); }while(0) #define PWM_PRINT(V) do{ sprintf(buffer, "PWM: %4d", V); SERIAL_ECHO(buffer); }while(0)
#define PWM_CASE(N,Z) \ #define PWM_CASE(N,Z) \
@ -682,16 +132,18 @@ static bool pwm_status(uint8_t pin) {
switch(digitalPinToTimer(pin)) { switch(digitalPinToTimer(pin)) {
#if defined(TCCR0A) && defined(COM0A1) #if defined(TCCR0A) && defined(COM0A1)
PWM_CASE(0,A); #if defined (TIMER0A)
PWM_CASE(0,A);
#endif
PWM_CASE(0,B); PWM_CASE(0,B);
#endif #endif
#if defined(TCCR1A) && defined(COM1A1) #if defined(TCCR1A) && defined(COM1A1)
PWM_CASE(1,A); PWM_CASE(1,A);
PWM_CASE(1,B); PWM_CASE(1,B);
#if defined(COM1C1) && defined(TIMER1C) #if defined(COM1C1) && defined (TIMER1C)
PWM_CASE(1,C); PWM_CASE(1,C);
#endif #endif
#endif #endif
#if defined(TCCR2A) && defined(COM2A1) #if defined(TCCR2A) && defined(COM2A1)
@ -726,167 +178,230 @@ static bool pwm_status(uint8_t pin) {
SERIAL_PROTOCOLPGM(" "); SERIAL_PROTOCOLPGM(" ");
} // pwm_status } // pwm_status
#define WGM_MAKE3(N) (((TCCR##N##B & _BV(WGM##N##2)) >> 1) | (TCCR##N##A & (_BV(WGM##N##0) | _BV(WGM##N##1))))
#define WGM_MAKE4(N) (WGM_MAKE3(N) | (TCCR##N##B & _BV(WGM##N##3)) >> 1)
#define TIMER_PREFIX(T,L,N) do{ \
WGM = WGM_MAKE##N(T); \
SERIAL_PROTOCOLPGM(" TIMER"); \
SERIAL_PROTOCOLPGM(STRINGIFY(T) STRINGIFY(L)); \
SERIAL_PROTOCOLPAIR(" WGM: ", WGM); \
SERIAL_PROTOCOLPAIR(" TIMSK" STRINGIFY(T) ": ", TIMSK##T); \
}while(0)
#define WGM_TEST1 (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6)
#define WGM_TEST2 (WGM == 0 || WGM == 4 || WGM == 12 || WGM == 13) const uint8_t* const PWM_other[][3] PROGMEM = {
{&TCCR0A, &TCCR0B, &TIMSK0},
{&TCCR1A, &TCCR1B, &TIMSK1},
#if defined(TCCR2A) && defined(COM2A1)
{&TCCR2A, &TCCR2B, &TIMSK2},
#endif
#if defined(TCCR3A) && defined(COM3A1)
{&TCCR3A, &TCCR3B, &TIMSK3},
#endif
#ifdef TCCR4A
{&TCCR4A, &TCCR4B, &TIMSK4},
#endif
#if defined(TCCR5A) && defined(COM5A1)
{&TCCR5A, &TCCR5B, &TIMSK5},
#endif
};
const uint8_t* const PWM_OCR[][3] PROGMEM = {
#if defined (TIMER0A)
{&OCR0A,&OCR0B,0},
#else
{0,&OCR0B,0},
#endif
#if defined(COM1C1) && defined (TIMER1C)
{ (const uint8_t*) &OCR1A, (const uint8_t*) &OCR1B, (const uint8_t*) &OCR1C},
#else
{ (const uint8_t*) &OCR1A, (const uint8_t*) &OCR1B,0},
#endif
#if defined(TCCR2A) && defined(COM2A1)
{&OCR2A,&OCR2B,0},
#endif
#if defined(TCCR3A) && defined(COM3A1)
#if defined(COM3C1)
{ (const uint8_t*) &OCR3A, (const uint8_t*) &OCR3B, (const uint8_t*) &OCR3C},
#else
{ (const uint8_t*) &OCR3A, (const uint8_t*) &OCR3B,0},
#endif
#endif
#ifdef TCCR4A
{ (const uint8_t*) &OCR4A, (const uint8_t*) &OCR4B, (const uint8_t*) &OCR4C},
#endif
#if defined(TCCR5A) && defined(COM5A1)
{ (const uint8_t*) &OCR5A, (const uint8_t*) &OCR5B, (const uint8_t*) &OCR5C},
#endif
};
#define TCCR_A(T) pgm_read_word(&PWM_other[T][0])
#define TCCR_B(T) pgm_read_word(&PWM_other[T][1])
#define TIMSK(T) pgm_read_word(&PWM_other[T][2])
#define CS_0 0
#define CS_1 1
#define CS_2 2
#define WGM_0 0
#define WGM_1 1
#define WGM_2 3
#define WGM_3 4
#define TOIE 0
#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L])
static void err_is_counter() { static void err_is_counter() {
SERIAL_PROTOCOLPGM(" Can't be used as a PWM because of counter mode"); SERIAL_PROTOCOLPGM(" non-standard PWM mode");
} }
static void err_is_interrupt() { static void err_is_interrupt() {
SERIAL_PROTOCOLPGM(" Can't be used as a PWM because it's being used as an interrupt"); SERIAL_PROTOCOLPGM(" compare interrupt enabled ");
} }
static void err_prob_interrupt() { static void err_prob_interrupt() {
SERIAL_PROTOCOLPGM(" Probably can't be used as a PWM because counter/timer is being used as an interrupt"); SERIAL_PROTOCOLPGM(" overflow interrupt enabled");
} }
static void can_be_used() { SERIAL_PROTOCOLPGM(" can be used as PWM "); } static void can_be_used() { SERIAL_PROTOCOLPGM(" can be used as PWM "); }
static void pwm_details(uint8_t pin) { void com_print(uint8_t N, uint8_t Z) {
uint8_t *TCCRA = (uint8_t*) TCCR_A(N);
SERIAL_PROTOCOLPGM(" COM");
SERIAL_PROTOCOLCHAR(N + '0');
switch(Z) {
case 'A' :
SERIAL_PROTOCOLPAIR("A: ", ((*TCCRA & (_BV(7) | _BV(6))) >> 6));
break;
case 'B' :
SERIAL_PROTOCOLPAIR("B: ", ((*TCCRA & (_BV(5) | _BV(4))) >> 4));
break;
case 'C' :
SERIAL_PROTOCOLPAIR("C: ", ((*TCCRA & (_BV(3) | _BV(2))) >> 2));
break;
}
}
void timer_prefix(uint8_t T, char L, uint8_t N){ // T - timer L - pwm n - WGM bit layout
char buffer[20]; // for the sprintf statements
uint8_t *TCCRB = (uint8_t*) TCCR_B(T);
uint8_t *TCCRA = (uint8_t*) TCCR_A(T);
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
SERIAL_PROTOCOLPGM(" TIMER");
SERIAL_PROTOCOLCHAR(T + '0');
SERIAL_PROTOCOLCHAR(L);
SERIAL_PROTOCOLPGM(" ");
if (N == 3) {
uint8_t *OCRVAL8 = (uint8_t*) OCR_VAL(T, L - 'A');
PWM_PRINT(*OCRVAL8);
}
else {
uint16_t *OCRVAL16 = (uint16_t*) OCR_VAL(T, L - 'A');
PWM_PRINT(*OCRVAL16);
}
SERIAL_PROTOCOLPAIR(" WGM: ", WGM);
com_print(T,L);
SERIAL_PROTOCOLPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
SERIAL_PROTOCOLPGM(" TCCR");
SERIAL_PROTOCOLCHAR(T + '0');
SERIAL_PROTOCOLPAIR("A: ", *TCCRA);
SERIAL_PROTOCOLPGM(" TCCR");
SERIAL_PROTOCOLCHAR(T + '0');
SERIAL_PROTOCOLPAIR("B: ", *TCCRB);
uint8_t *TMSK = (uint8_t*) TIMSK(T);
SERIAL_PROTOCOLPGM(" TIMSK");
SERIAL_PROTOCOLCHAR(T + '0');
SERIAL_PROTOCOLPAIR(": ", *TMSK);
uint8_t OCIE = L - 'A' + 1;
if (N == 3) {if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter();}
else {if (WGM == 0 || WGM == 4 || WGM == 12 || WGM == 13) err_is_counter();}
if (TEST(*TMSK, OCIE)) err_is_interrupt();
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
}
static void pwm_details(uint8_t pin) {
char buffer[20]; // for the sprintf statements
uint8_t WGM; uint8_t WGM;
switch(digitalPinToTimer(pin)) { switch(digitalPinToTimer(pin)) {
#if defined(TCCR0A) && defined(COM0A1) #if defined(TCCR0A) && defined(COM0A1)
case TIMER0A:
TIMER_PREFIX(0,A,3); #if defined (TIMER0A)
if (WGM_TEST1) err_is_counter(); case TIMER0A:
else if (TEST(TIMSK0, OCIE0A)) err_is_interrupt(); timer_prefix(0,'A',3);
else if (TEST(TIMSK0, TOIE0)) err_prob_interrupt(); break;
else can_be_used(); #endif
break;
case TIMER0B: case TIMER0B:
TIMER_PREFIX(0,B,3); timer_prefix(0,'B',3);
if (WGM_TEST1) err_is_counter();
else if (TEST(TIMSK0, OCIE0B)) err_is_interrupt();
else if (TEST(TIMSK0, TOIE0)) err_prob_interrupt();
else can_be_used();
break; break;
#endif #endif
#if defined(TCCR1A) && defined(COM1A1) #if defined(TCCR1A) && defined(COM1A1)
case TIMER1A: case TIMER1A:
TIMER_PREFIX(1,A,4); timer_prefix(1,'A',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK1, OCIE1A)) err_is_interrupt();
else if (TIMSK1 & (_BV(TOIE1) | _BV(ICIE1))) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER1B: case TIMER1B:
TIMER_PREFIX(1,B,4); timer_prefix(1,'B',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK1, OCIE1B)) err_is_interrupt();
else if (TIMSK1 & (_BV(TOIE1) | _BV(ICIE1))) err_prob_interrupt();
else can_be_used();
break; break;
#if defined(COM1C1) && defined(TIMER1C) #if defined(COM1C1) && defined (TIMER1C)
case TIMER1C: case TIMER1C:
TIMER_PREFIX(1,C,4); timer_prefix(1,'C',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK1, OCIE1C)) err_is_interrupt();
else if (TIMSK1 & (_BV(TOIE1) | _BV(ICIE1))) err_prob_interrupt();
else can_be_used();
break; break;
#endif #endif
#endif #endif
#if defined(TCCR2A) && defined(COM2A1) #if defined(TCCR2A) && defined(COM2A1)
case TIMER2A: case TIMER2A:
TIMER_PREFIX(2,A,3); timer_prefix(2,'A',3);
if (WGM_TEST1) err_is_counter();
else if (TIMSK2 & (_BV(TOIE2) | _BV(OCIE2A))) err_is_interrupt();
else if (TEST(TIMSK2, TOIE2)) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER2B: case TIMER2B:
TIMER_PREFIX(2,B,3); timer_prefix(2,'B',3);
if (WGM_TEST1) err_is_counter();
else if (TEST(TIMSK2, OCIE2B)) err_is_interrupt();
else if (TEST(TIMSK2, TOIE2)) err_prob_interrupt();
else can_be_used();
break; break;
#endif #endif
#if defined(TCCR3A) && defined(COM3A1) #if defined(TCCR3A) && defined(COM3A1)
case TIMER3A: case TIMER3A:
TIMER_PREFIX(3,A,3); timer_prefix(3,'A',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK3, OCIE3A)) err_is_interrupt();
else if (TIMSK3 & (_BV(TOIE3) | _BV(ICIE3))) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER3B: case TIMER3B:
TIMER_PREFIX(3,B,3); timer_prefix(3,'B',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK3, OCIE3B)) err_is_interrupt();
else if (TIMSK3 & (_BV(TOIE3) | _BV(ICIE3))) err_prob_interrupt();
else can_be_used();
break;
#ifdef COM3C1
case TIMER3C:
TIMER_PREFIX(3,C,3);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK3, OCIE3C)) err_is_interrupt();
else if (TIMSK3 & (_BV(TOIE3) | _BV(ICIE3))) err_prob_interrupt();
else can_be_used();
break; break;
#if defined(COM3C1)
case TIMER3C:
timer_prefix(3,'C',4);
break;
#endif #endif
#endif #endif
#ifdef TCCR4A #ifdef TCCR4A
case TIMER4A: case TIMER4A:
TIMER_PREFIX(4,A,4); timer_prefix(4,'A',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK4, OCIE4A)) err_is_interrupt();
else if (TIMSK4 & (_BV(TOIE4) | _BV(ICIE4))) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER4B: case TIMER4B:
TIMER_PREFIX(4,B,4); timer_prefix(4,'B',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK4, OCIE4B)) err_is_interrupt();
else if (TIMSK4 & (_BV(TOIE4) | _BV(ICIE4))) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER4C: case TIMER4C:
TIMER_PREFIX(4,C,4); timer_prefix(4,'C',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK4, OCIE4C)) err_is_interrupt();
else if (TIMSK4 & (_BV(TOIE4) | _BV(ICIE4))) err_prob_interrupt();
else can_be_used();
break; break;
#endif #endif
#if defined(TCCR5A) && defined(COM5A1) #if defined(TCCR5A) && defined(COM5A1)
case TIMER5A: case TIMER5A:
TIMER_PREFIX(5,A,4); timer_prefix(5,'A',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK5, OCIE5A)) err_is_interrupt();
else if (TIMSK5 & (_BV(TOIE5) | _BV(ICIE5))) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER5B: case TIMER5B:
TIMER_PREFIX(5,B,4); timer_prefix(5,'B',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK5, OCIE5B)) err_is_interrupt();
else if (TIMSK5 & (_BV(TOIE5) | _BV(ICIE5))) err_prob_interrupt();
else can_be_used();
break; break;
case TIMER5C: case TIMER5C:
TIMER_PREFIX(5,C,4); timer_prefix(5,'C',4);
if (WGM_TEST2) err_is_counter();
else if (TEST(TIMSK5, OCIE5C)) err_is_interrupt();
else if (TIMSK5 & (_BV(TOIE5) | _BV(ICIE5))) err_prob_interrupt();
else can_be_used();
break; break;
#endif #endif
@ -894,65 +409,136 @@ static void pwm_details(uint8_t pin) {
} }
SERIAL_PROTOCOLPGM(" "); SERIAL_PROTOCOLPGM(" ");
} // pwm_details
inline void report_pin_state(int8_t pin) { // on pins that have two PWMs, print info on second PWM
SERIAL_ECHO((int)pin); #if AVR_ATmega2560_FAMILY || AVR_AT90USB1286_FAMILY
SERIAL_CHAR(' '); // looking for port B7 - PWMs 0A and 1C
bool dummy; if ( ('B' == digitalPinToPort(pin) + 64) && (0x80 == digitalPinToBitMask(pin))) {
if (report_pin_name(pin, dummy)) { #if !defined(TEENSYDUINO_IDE)
if (pin_is_protected(pin)) SERIAL_EOL;
SERIAL_ECHOPGM(" (protected)"); SERIAL_PROTOCOLPGM (" . TIMER1C is also tied to this pin ");
else { timer_prefix(1,'C',4);
SERIAL_ECHOPGM(" = "); #else
pinMode(pin, INPUT_PULLUP); SERIAL_EOL;
SERIAL_ECHO(digitalRead(pin)); SERIAL_PROTOCOLPGM (" . TIMER0A is also tied to this pin ");
if (IS_ANALOG(pin)) { timer_prefix(0,'A',3);
SERIAL_CHAR(' '); SERIAL_CHAR('('); #endif
SERIAL_ECHO(analogRead(pin - analogInputToDigitalPin(0)));
SERIAL_CHAR(')');
}
} }
} #endif
SERIAL_EOL; } // pwm_details
}
bool get_pinMode(int8_t pin) { return *portModeRegister(digitalPinToPort(pin)) & digitalPinToBitMask(pin); } bool get_pinMode(int8_t pin) { return *portModeRegister(digitalPinToPort(pin)) & digitalPinToBitMask(pin); }
// pretty report with PWM info #if !defined(digitalRead_mod) // use Teensyduino's version of digitalRead - it doesn't disable the PWMs
inline void report_pin_state_extended(int8_t pin, bool ignore) { int digitalRead_mod(int8_t pin) { // same as digitalRead except the PWM stop section has been removed
uint8_t port = digitalPinToPort(pin);
return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask(pin)) ? HIGH : LOW;
}
#endif
char buffer[30]; // for the sprintf statements void print_port(int8_t pin) { // print port number
#if defined(digitalPinToPort)
SERIAL_PROTOCOLPGM(" Port: ");
uint8_t x = digitalPinToPort(pin) + 64;
SERIAL_CHAR(x);
uint8_t temp = digitalPinToBitMask(pin);
for (x = '0'; (x < '9' && !(temp == 1)); x++){
temp = temp >> 1;
}
SERIAL_CHAR(x);
#else
SERIAL_PROTOCOLPGM(" ")
#endif
}
// report pin number
sprintf(buffer, "PIN:% 3d ", pin);
SERIAL_ECHO(buffer);
// report pin name // pretty report with PWM info
bool analog_pin; inline void report_pin_state_extended(int8_t pin, bool ignore, bool extended = true) {
report_pin_name(pin, analog_pin); uint8_t temp_char;
char *name_mem_pointer;
char buffer[30]; // for the sprintf statements
bool found = false;
bool multi_name_pin = false;
for (uint8_t x = 0; x < n_array; x++) { // scan entire array and report all instances of this pin
if (pgm_read_byte(&pin_array[x][1]) == pin) {
if (found == true) multi_name_pin = true;
found = true;
if (multi_name_pin == false) { // report digitial and analog pin number only on the first time through
sprintf(buffer, "PIN:% 3d ", pin); // digital pin number
SERIAL_ECHO(buffer);
print_port(pin);
if (IS_ANALOG(pin)) {
sprintf(buffer, " (A%2d) ", int(pin - analogInputToDigitalPin(0))); // analog pin number
SERIAL_ECHO(buffer);
}
else SERIAL_ECHOPGM(" "); // add padding if not an analog pin
}
else SERIAL_ECHOPGM(". "); // add padding if not the first instance found
name_mem_pointer = (char*) pgm_read_word(&pin_array[x][0]);
for (uint8_t y = 0; y < 28; y++) { // always print pin name
temp_char = pgm_read_byte(name_mem_pointer + y);
if (temp_char != 0) MYSERIAL.write(temp_char);
else {
for (uint8_t i = 0; i < 28 - y; i++) MYSERIAL.write(" ");
break;
}
}
if (pin_is_protected(pin) && !ignore)
SERIAL_ECHOPGM("protected ");
else {
if (!(pgm_read_byte(&pin_array[x][2]))) {
sprintf(buffer, "Analog in =% 5d", analogRead(pin - analogInputToDigitalPin(0)));
SERIAL_ECHO(buffer);
}
else {
if (!get_pinMode(pin)) {
// pinMode(pin, INPUT_PULLUP); // make sure input isn't floating - stopped doing this
// because this could interfere with inductive/capacitive
// sensors (high impedance voltage divider) and with PT100 amplifier
SERIAL_PROTOCOLPAIR("Input = ", digitalRead_mod(pin));
}
else if (pwm_status(pin)) {
// do nothing
}
else SERIAL_PROTOCOLPAIR("Output = ", digitalRead_mod(pin));
}
if (multi_name_pin == false && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report
}
SERIAL_EOL;
} // end of IF
} // end of for loop
// report pin state if (found == false) {
if (pin_is_protected(pin) && !ignore) sprintf(buffer, "PIN:% 3d ", pin);
SERIAL_ECHOPGM("protected "); SERIAL_ECHO(buffer);
else { print_port(pin);
if (analog_pin) { if (IS_ANALOG(pin)) {
sprintf(buffer, "Analog in =% 5d", analogRead(pin - analogInputToDigitalPin(0))); sprintf(buffer, " (A%2d) ", int(pin - analogInputToDigitalPin(0))); // analog pin number
SERIAL_ECHO(buffer); SERIAL_ECHO(buffer);
} }
else SERIAL_ECHOPGM(" "); // add padding if not an analog pin
SERIAL_ECHOPGM("<unused/unknown>");
if (get_pinMode(pin)) {
SERIAL_PROTOCOLPAIR(" Output = ", digitalRead_mod(pin));
}
else { else {
if (!get_pinMode(pin)) { if (IS_ANALOG(pin)) {
pinMode(pin, INPUT_PULLUP); // make sure input isn't floating sprintf(buffer, " Analog in =% 5d", analogRead(pin - analogInputToDigitalPin(0)));
SERIAL_PROTOCOLPAIR("Input = ", digitalRead_mod(pin)); SERIAL_ECHO(buffer);
}
else if (pwm_status(pin)) {
// do nothing
} }
else SERIAL_PROTOCOLPAIR("Output = ", digitalRead_mod(pin)); else {
} SERIAL_ECHOPGM(" "); // add padding if not an analog pin
}
SERIAL_PROTOCOLPAIR(" Input = ", digitalRead_mod(pin));
}
// if (!pwm_status(pin)) SERIAL_ECHOPGM(" "); // add padding if it's not a PWM pin
if (extended) pwm_details(pin); // report PWM capabilities only if doing an extended report
SERIAL_EOL;
} }
}
inline void report_pin_state(int8_t pin) {
report_pin_state_extended(pin, false, false);
// report PWM capabilities
pwm_details(pin);
SERIAL_EOL;
} }

@ -0,0 +1,775 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
*
*/
// Please update this list when adding new pins to Marlin.
// The order doesn't matter.
// Following this pattern is a must.
// If the new pin name is over 28 characters long then pinsDebug.h will need to be modified.
// Pin list updated from 18 FEB 2017 RCBugfix branch - max length of pin name is 24
#if defined(__FD) && __FD >= 0
REPORT_NAME_DIGITAL(__FD, __LINE__ )
#endif
#if defined(__FS) && __FS >= 0
REPORT_NAME_DIGITAL(__FS, __LINE__ )
#endif
#if defined(__GD) && __GD >= 0
REPORT_NAME_DIGITAL(__GD, __LINE__ )
#endif
#if defined(__GS) && __GS >= 0
REPORT_NAME_DIGITAL(__GS, __LINE__ )
#endif
#if PIN_EXISTS(AVR_MISO)
REPORT_NAME_DIGITAL(AVR_MISO_PIN, __LINE__ )
#endif
#if PIN_EXISTS(AVR_MOSI)
REPORT_NAME_DIGITAL(AVR_MOSI_PIN, __LINE__ )
#endif
#if PIN_EXISTS(AVR_SCK)
REPORT_NAME_DIGITAL(AVR_SCK_PIN, __LINE__ )
#endif
#if PIN_EXISTS(AVR_SS)
REPORT_NAME_DIGITAL(AVR_SS_PIN, __LINE__ )
#endif
#if PIN_EXISTS(BEEPER)
REPORT_NAME_DIGITAL(BEEPER_PIN, __LINE__ )
#endif
#if defined(BTN_CENTER) && BTN_CENTER >= 0
REPORT_NAME_DIGITAL(BTN_CENTER, __LINE__ )
#endif
#if defined(BTN_DOWN) && BTN_DOWN >= 0
REPORT_NAME_DIGITAL(BTN_DOWN, __LINE__ )
#endif
#if defined(BTN_DWN) && BTN_DWN >= 0
REPORT_NAME_DIGITAL(BTN_DWN, __LINE__ )
#endif
#if defined(BTN_EN1) && BTN_EN1 >= 0
REPORT_NAME_DIGITAL(BTN_EN1, __LINE__ )
#endif
#if defined(BTN_EN2) && BTN_EN2 >= 0
REPORT_NAME_DIGITAL(BTN_EN2, __LINE__ )
#endif
#if defined(BTN_ENC) && BTN_ENC >= 0
REPORT_NAME_DIGITAL(BTN_ENC, __LINE__ )
#endif
#if defined(BTN_HOME) && BTN_HOME >= 0
REPORT_NAME_DIGITAL(BTN_HOME, __LINE__ )
#endif
#if defined(BTN_LEFT) && BTN_LEFT >= 0
REPORT_NAME_DIGITAL(BTN_LEFT, __LINE__ )
#endif
#if defined(BTN_LFT) && BTN_LFT >= 0
REPORT_NAME_DIGITAL(BTN_LFT, __LINE__ )
#endif
#if defined(BTN_RIGHT) && BTN_RIGHT >= 0
REPORT_NAME_DIGITAL(BTN_RIGHT, __LINE__ )
#endif
#if defined(BTN_RT) && BTN_RT >= 0
REPORT_NAME_DIGITAL(BTN_RT, __LINE__ )
#endif
#if defined(BTN_UP) && BTN_UP >= 0
REPORT_NAME_DIGITAL(BTN_UP, __LINE__ )
#endif
#if PIN_EXISTS(CASE_LIGHT)
REPORT_NAME_DIGITAL(CASE_LIGHT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(CONTROLLERFAN)
REPORT_NAME_DIGITAL(CONTROLLERFAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(CUTOFF_RESET)
REPORT_NAME_DIGITAL(CUTOFF_RESET_PIN, __LINE__ )
#endif
#if PIN_EXISTS(CUTOFF_TEST)
REPORT_NAME_DIGITAL(CUTOFF_TEST_PIN, __LINE__ )
#endif
#if PIN_EXISTS(DAC_DISABLE)
REPORT_NAME_DIGITAL(DAC_DISABLE_PIN, __LINE__ )
#endif
#if defined(DAC_STEPPER_VREF) && DAC_STEPPER_VREF >= 0
REPORT_NAME_DIGITAL(DAC_STEPPER_VREF, __LINE__ )
#endif
#if PIN_EXISTS(DEBUG)
REPORT_NAME_DIGITAL(DEBUG_PIN, __LINE__ )
#endif
#if defined(DIGIPOTS_I2C_SCL) && DIGIPOTS_I2C_SCL >= 0
REPORT_NAME_DIGITAL(DIGIPOTS_I2C_SCL, __LINE__ )
#endif
#if defined(DIGIPOTS_I2C_SDA_E0) && DIGIPOTS_I2C_SDA_E0 >= 0
REPORT_NAME_DIGITAL(DIGIPOTS_I2C_SDA_E0, __LINE__ )
#endif
#if defined(DIGIPOTS_I2C_SDA_E1) && DIGIPOTS_I2C_SDA_E1 >= 0
REPORT_NAME_DIGITAL(DIGIPOTS_I2C_SDA_E1, __LINE__ )
#endif
#if defined(DIGIPOTS_I2C_SDA_X) && DIGIPOTS_I2C_SDA_X >= 0
REPORT_NAME_DIGITAL(DIGIPOTS_I2C_SDA_X, __LINE__ )
#endif
#if defined(DIGIPOTS_I2C_SDA_Y) && DIGIPOTS_I2C_SDA_Y >= 0
REPORT_NAME_DIGITAL(DIGIPOTS_I2C_SDA_Y, __LINE__ )
#endif
#if defined(DIGIPOTS_I2C_SDA_Z) && DIGIPOTS_I2C_SDA_Z >= 0
REPORT_NAME_DIGITAL(DIGIPOTS_I2C_SDA_Z, __LINE__ )
#endif
#if PIN_EXISTS(DIGIPOTSS)
REPORT_NAME_DIGITAL(DIGIPOTSS_PIN, __LINE__ )
#endif
#if defined(DOGLCD_A0) && DOGLCD_A0 >= 0
REPORT_NAME_DIGITAL(DOGLCD_A0, __LINE__ )
#endif
#if defined(DOGLCD_CS) && DOGLCD_CS >= 0
REPORT_NAME_DIGITAL(DOGLCD_CS, __LINE__ )
#endif
#if defined(DOGLCD_MOSI) && DOGLCD_MOSI >= 0
REPORT_NAME_DIGITAL(DOGLCD_MOSI, __LINE__ )
#endif
#if defined(DOGLCD_SCK) && DOGLCD_SCK >= 0
REPORT_NAME_DIGITAL(DOGLCD_SCK, __LINE__ )
#endif
#if PIN_EXISTS(E0_ATT)
REPORT_NAME_DIGITAL(E0_ATT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_AUTO_FAN)
REPORT_NAME_DIGITAL(E0_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_CS)
REPORT_NAME_DIGITAL(E0_CS_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_DIR)
REPORT_NAME_DIGITAL(E0_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_ENABLE)
REPORT_NAME_DIGITAL(E0_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_MS1)
REPORT_NAME_DIGITAL(E0_MS1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_MS2)
REPORT_NAME_DIGITAL(E0_MS2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E0_STEP)
REPORT_NAME_DIGITAL(E0_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_AUTO_FAN)
REPORT_NAME_DIGITAL(E1_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_CS)
REPORT_NAME_DIGITAL(E1_CS_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_DIR)
REPORT_NAME_DIGITAL(E1_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_ENABLE)
REPORT_NAME_DIGITAL(E1_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_MS1)
REPORT_NAME_DIGITAL(E1_MS1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_MS2)
REPORT_NAME_DIGITAL(E1_MS2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E1_STEP)
REPORT_NAME_DIGITAL(E1_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E2_AUTO_FAN)
REPORT_NAME_DIGITAL(E2_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E2_DIR)
REPORT_NAME_DIGITAL(E2_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E2_ENABLE)
REPORT_NAME_DIGITAL(E2_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E2_STEP)
REPORT_NAME_DIGITAL(E2_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E3_AUTO_FAN)
REPORT_NAME_DIGITAL(E3_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E3_DIR)
REPORT_NAME_DIGITAL(E3_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E3_ENABLE)
REPORT_NAME_DIGITAL(E3_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E3_STEP)
REPORT_NAME_DIGITAL(E3_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E4_DIR)
REPORT_NAME_DIGITAL(E4_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E4_ENABLE)
REPORT_NAME_DIGITAL(E4_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(E4_STEP)
REPORT_NAME_DIGITAL(E4_STEP_PIN, __LINE__ )
#endif
#if defined(encrot0) && encrot0 >= 0
REPORT_NAME_DIGITAL(encrot0, __LINE__ )
#endif
#if defined(encrot1) && encrot1 >= 0
REPORT_NAME_DIGITAL(encrot1, __LINE__ )
#endif
#if defined(encrot2) && encrot2 >= 0
REPORT_NAME_DIGITAL(encrot2, __LINE__ )
#endif
#if defined(encrot3) && encrot3 >= 0
REPORT_NAME_DIGITAL(encrot3, __LINE__ )
#endif
#if defined(EXT_AUX_A0) && EXT_AUX_A0 >= 0 && EXT_AUX_A0 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(EXT_AUX_A0, __LINE__ )
#endif
#if defined(EXT_AUX_A0) && EXT_AUX_A0 >= 0 && EXT_AUX_A0 >= NUM_ANALOG_INPUTS
REPORT_NAME_DIGITAL(EXT_AUX_A0, __LINE__ )
#endif
#if defined(EXT_AUX_A0_IO) && EXT_AUX_A0_IO >= 0
REPORT_NAME_DIGITAL(EXT_AUX_A0_IO, __LINE__ )
#endif
#if defined(EXT_AUX_A1) && EXT_AUX_A1 >= 0 && EXT_AUX_A1 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(EXT_AUX_A1, __LINE__ )
#endif
#if defined(EXT_AUX_A1) && EXT_AUX_A1 >= 0 && EXT_AUX_A1 >= NUM_ANALOG_INPUTS
REPORT_NAME_DIGITAL(EXT_AUX_A1, __LINE__ )
#endif
#if defined(EXT_AUX_A1_IO) && EXT_AUX_A1_IO >= 0
REPORT_NAME_DIGITAL(EXT_AUX_A1_IO, __LINE__ )
#endif
#if defined(EXT_AUX_A2) && EXT_AUX_A2 >= 0 && EXT_AUX_A2 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(EXT_AUX_A2, __LINE__ )
#endif
#if defined(EXT_AUX_A2) && EXT_AUX_A2 >= 0 && EXT_AUX_A2 >= NUM_ANALOG_INPUTS
REPORT_NAME_DIGITAL(EXT_AUX_A2, __LINE__ )
#endif
#if defined(EXT_AUX_A2_IO) && EXT_AUX_A2_IO >= 0
REPORT_NAME_DIGITAL(EXT_AUX_A2_IO, __LINE__ )
#endif
#if defined(EXT_AUX_A3) && EXT_AUX_A3 >= 0 && EXT_AUX_A3 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(EXT_AUX_A3, __LINE__ )
#endif
#if defined(EXT_AUX_A3) && EXT_AUX_A3 >= 0 && EXT_AUX_A3 >= NUM_ANALOG_INPUTS
REPORT_NAME_DIGITAL(EXT_AUX_A3, __LINE__ )
#endif
#if defined(EXT_AUX_A3_IO) && EXT_AUX_A3_IO >= 0
REPORT_NAME_DIGITAL(EXT_AUX_A3_IO, __LINE__ )
#endif
#if defined(EXT_AUX_A4) && EXT_AUX_A4 >= 0 && EXT_AUX_A4 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(EXT_AUX_A4, __LINE__ )
#endif
#if defined(EXT_AUX_A4) && EXT_AUX_A4 >= 0 && EXT_AUX_A4 >= NUM_ANALOG_INPUTS
REPORT_NAME_DIGITAL(EXT_AUX_A4, __LINE__ )
#endif
#if defined(EXT_AUX_A4_IO) && EXT_AUX_A4_IO >= 0
REPORT_NAME_DIGITAL(EXT_AUX_A4_IO, __LINE__ )
#endif
#if defined(EXT_AUX_PWM_D24) && EXT_AUX_PWM_D24 >= 0
REPORT_NAME_DIGITAL(EXT_AUX_PWM_D24, __LINE__ )
#endif
#if defined(EXT_AUX_RX1_D2) && EXT_AUX_RX1_D2 >= 0
REPORT_NAME_DIGITAL(EXT_AUX_RX1_D2, __LINE__ )
#endif
#if defined(EXT_AUX_SCL_D0) && EXT_AUX_SCL_D0 >= 0
REPORT_NAME_DIGITAL(EXT_AUX_SCL_D0, __LINE__ )
#endif
#if defined(EXT_AUX_SDA_D1) && EXT_AUX_SDA_D1 >= 0
REPORT_NAME_DIGITAL(EXT_AUX_SDA_D1, __LINE__ )
#endif
#if defined(EXT_AUX_TX1_D3) && EXT_AUX_TX1_D3 >= 0
REPORT_NAME_DIGITAL(EXT_AUX_TX1_D3, __LINE__ )
#endif
#if defined(EXTRUDER_0_AUTO_FAN) && EXTRUDER_0_AUTO_FAN >= 0
REPORT_NAME_DIGITAL(EXTRUDER_0_AUTO_FAN, __LINE__ )
#endif
#if defined(EXTRUDER_1_AUTO_FAN) && EXTRUDER_1_AUTO_FAN >= 0
REPORT_NAME_DIGITAL(EXTRUDER_1_AUTO_FAN, __LINE__ )
#endif
#if PIN_EXISTS(FAN)
REPORT_NAME_DIGITAL(FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(FAN1)
REPORT_NAME_DIGITAL(FAN1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(FAN2)
REPORT_NAME_DIGITAL(FAN2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(FIL_RUNOUT)
REPORT_NAME_DIGITAL(FIL_RUNOUT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(FILWIDTH) && FILWIDTH_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(FILWIDTH_PIN, __LINE__ )
#endif
#if defined(GEN7_VERSION) && GEN7_VERSION >= 0
REPORT_NAME_DIGITAL(GEN7_VERSION, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_0)
REPORT_NAME_DIGITAL(HEATER_0_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_1)
REPORT_NAME_DIGITAL(HEATER_1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_2)
REPORT_NAME_DIGITAL(HEATER_2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_3)
REPORT_NAME_DIGITAL(HEATER_3_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_4)
REPORT_NAME_DIGITAL(HEATER_4_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_5)
REPORT_NAME_DIGITAL(HEATER_5_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_6)
REPORT_NAME_DIGITAL(HEATER_6_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_7)
REPORT_NAME_DIGITAL(HEATER_7_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HEATER_BED)
REPORT_NAME_DIGITAL(HEATER_BED_PIN, __LINE__ )
#endif
#if PIN_EXISTS(HOME)
REPORT_NAME_DIGITAL(HOME_PIN, __LINE__ )
#endif
#if defined(I2C_SCL) && I2C_SCL >= 0
REPORT_NAME_DIGITAL(I2C_SCL, __LINE__ )
#endif
#if defined(I2C_SDA) && I2C_SDA >= 0
REPORT_NAME_DIGITAL(I2C_SDA, __LINE__ )
#endif
#if PIN_EXISTS(KILL)
REPORT_NAME_DIGITAL(KILL_PIN, __LINE__ )
#endif
#if PIN_EXISTS(LCD_BACKLIGHT)
REPORT_NAME_DIGITAL(LCD_BACKLIGHT_PIN, __LINE__ )
#endif
#if defined(LCD_CONTRAST) && LCD_CONTRAST >= 0
REPORT_NAME_DIGITAL(LCD_CONTRAST, __LINE__ )
#endif
#if PIN_EXISTS(LCD)
REPORT_NAME_DIGITAL(LCD_PINS_D4, __LINE__ )
#endif
#if PIN_EXISTS(LCD)
REPORT_NAME_DIGITAL(LCD_PINS_D5, __LINE__ )
#endif
#if PIN_EXISTS(LCD)
REPORT_NAME_DIGITAL(LCD_PINS_D6, __LINE__ )
#endif
#if PIN_EXISTS(LCD)
REPORT_NAME_DIGITAL(LCD_PINS_D7, __LINE__ )
#endif
#if PIN_EXISTS(LCD)
REPORT_NAME_DIGITAL(LCD_PINS_ENABLE, __LINE__ )
#endif
#if PIN_EXISTS(LCD)
REPORT_NAME_DIGITAL(LCD_PINS_RS, __LINE__ )
#endif
#if defined(LCD_SDSS) && LCD_SDSS >= 0
REPORT_NAME_DIGITAL(LCD_SDSS, __LINE__ )
#endif
#if PIN_EXISTS(LED)
REPORT_NAME_DIGITAL(LED_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MAIN_VOLTAGE_MEASURE) && MAIN_VOLTAGE_MEASURE_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(MAIN_VOLTAGE_MEASURE_PIN, __LINE__ )
#endif
#if defined(MAX6675_SS) && MAX6675_SS >= 0
REPORT_NAME_DIGITAL(MAX6675_SS, __LINE__ )
#endif
#if PIN_EXISTS(MISO)
REPORT_NAME_DIGITAL(MISO_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOSFET_A)
REPORT_NAME_DIGITAL(MOSFET_A_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOSFET_B)
REPORT_NAME_DIGITAL(MOSFET_B_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOSFET_C)
REPORT_NAME_DIGITAL(MOSFET_C_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOSFET_D)
REPORT_NAME_DIGITAL(MOSFET_D_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOSI)
REPORT_NAME_DIGITAL(MOSI_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
REPORT_NAME_DIGITAL(MOTOR_CURRENT_PWM_E_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
REPORT_NAME_DIGITAL(MOTOR_CURRENT_PWM_XY_PIN, __LINE__ )
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
REPORT_NAME_DIGITAL(MOTOR_CURRENT_PWM_Z_PIN, __LINE__ )
#endif
#if defined(NUM_TLCS) && NUM_TLCS >= 0
REPORT_NAME_DIGITAL(NUM_TLCS, __LINE__ )
#endif
#if PIN_EXISTS(ORIG_E0_AUTO_FAN)
REPORT_NAME_DIGITAL(ORIG_E0_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(ORIG_E1_AUTO_FAN)
REPORT_NAME_DIGITAL(ORIG_E1_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(ORIG_E2_AUTO_FAN)
REPORT_NAME_DIGITAL(ORIG_E2_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(ORIG_E3_AUTO_FAN)
REPORT_NAME_DIGITAL(ORIG_E3_AUTO_FAN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(PHOTOGRAPH)
REPORT_NAME_DIGITAL(PHOTOGRAPH_PIN, __LINE__ )
#endif
#if PIN_EXISTS(PS_ON)
REPORT_NAME_DIGITAL(PS_ON_PIN, __LINE__ )
#endif
#if PIN_EXISTS(PWM_1)
REPORT_NAME_DIGITAL(PWM_1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(PWM_2)
REPORT_NAME_DIGITAL(PWM_2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(RAMPS_D10)
REPORT_NAME_DIGITAL(RAMPS_D10_PIN, __LINE__ )
#endif
#if PIN_EXISTS(RAMPS_D8)
REPORT_NAME_DIGITAL(RAMPS_D8_PIN, __LINE__ )
#endif
#if PIN_EXISTS(RAMPS_D9)
REPORT_NAME_DIGITAL(RAMPS_D9_PIN, __LINE__ )
#endif
#if PIN_EXISTS(RX_ENABLE)
REPORT_NAME_DIGITAL(RX_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SAFETY_TRIGGERED)
REPORT_NAME_DIGITAL(SAFETY_TRIGGERED_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SCK)
REPORT_NAME_DIGITAL(SCK_PIN, __LINE__ )
#endif
#if defined(SCL) && SCL >= 0
REPORT_NAME_DIGITAL(SCL, __LINE__ )
#endif
#if PIN_EXISTS(SD_DETECT)
REPORT_NAME_DIGITAL(SD_DETECT_PIN, __LINE__ )
#endif
#if defined(SDA) && SDA >= 0
REPORT_NAME_DIGITAL(SDA, __LINE__ )
#endif
#if defined(SDPOWER) && SDPOWER >= 0
REPORT_NAME_DIGITAL(SDPOWER, __LINE__ )
#endif
#if defined(SDSS) && SDSS >= 0
REPORT_NAME_DIGITAL(SDSS, __LINE__ )
#endif
#if PIN_EXISTS(SERVO0)
REPORT_NAME_DIGITAL(SERVO0_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SERVO1)
REPORT_NAME_DIGITAL(SERVO1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SERVO2)
REPORT_NAME_DIGITAL(SERVO2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SERVO3)
REPORT_NAME_DIGITAL(SERVO3_PIN, __LINE__ )
#endif
#if defined(SHIFT_CLK) && SHIFT_CLK >= 0
REPORT_NAME_DIGITAL(SHIFT_CLK, __LINE__ )
#endif
#if defined(SHIFT_EN) && SHIFT_EN >= 0
REPORT_NAME_DIGITAL(SHIFT_EN, __LINE__ )
#endif
#if defined(SHIFT_LD) && SHIFT_LD >= 0
REPORT_NAME_DIGITAL(SHIFT_LD, __LINE__ )
#endif
#if defined(SHIFT_OUT) && SHIFT_OUT >= 0
REPORT_NAME_DIGITAL(SHIFT_OUT, __LINE__ )
#endif
#if PIN_EXISTS(SLED)
REPORT_NAME_DIGITAL(SLED_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SLEEP_WAKE)
REPORT_NAME_DIGITAL(SLEEP_WAKE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SOL1)
REPORT_NAME_DIGITAL(SOL1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SOL2)
REPORT_NAME_DIGITAL(SOL2_PIN, __LINE__ )
#endif
#if defined(SPARE_IO) && SPARE_IO >= 0
REPORT_NAME_DIGITAL(SPARE_IO, __LINE__ )
#endif
#if PIN_EXISTS(SPINDLE_DIR)
REPORT_NAME_DIGITAL(SPINDLE_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SPINDLE_LASER_ENABLE)
REPORT_NAME_DIGITAL(SPINDLE_LASER_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SPINDLE_SPEED_LASER_POWER)
REPORT_NAME_DIGITAL(SPINDLE_SPEED_LASER_POWER_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SR_CLK)
REPORT_NAME_DIGITAL(SR_CLK_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SR_DATA)
REPORT_NAME_DIGITAL(SR_DATA_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SR_STROBE)
REPORT_NAME_DIGITAL(SR_STROBE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SS)
REPORT_NAME_DIGITAL(SS_PIN, __LINE__ )
#endif
#if defined(STAT_LED_BLUE) && STAT_LED_BLUE >= 0
REPORT_NAME_DIGITAL(STAT_LED_BLUE, __LINE__ )
#endif
#if PIN_EXISTS(STAT_LED_BLUE)
REPORT_NAME_DIGITAL(STAT_LED_BLUE_PIN, __LINE__ )
#endif
#if defined(STAT_LED_RED) && STAT_LED_RED >= 0
REPORT_NAME_DIGITAL(STAT_LED_RED, __LINE__ )
#endif
#if PIN_EXISTS(STAT_LED_RED)
REPORT_NAME_DIGITAL(STAT_LED_RED_PIN, __LINE__ )
#endif
#if PIN_EXISTS(STEPPER_RESET)
REPORT_NAME_DIGITAL(STEPPER_RESET_PIN, __LINE__ )
#endif
#if PIN_EXISTS(SUICIDE)
REPORT_NAME_DIGITAL(SUICIDE_PIN, __LINE__ )
#endif
#if defined(TC1) && TC1 >= 0 && TC1 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TC1, __LINE__ )
#endif
#if defined(TC2) && TC2 >= 0 && TC2 < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TC2, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_0) && TEMP_0_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_0_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_1) && TEMP_1_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_2) && TEMP_2_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_3) && TEMP_3_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_3_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_4) && TEMP_4_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_4_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_BED) && TEMP_BED_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_BED_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_CHAMBER) && TEMP_CHAMBER_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_CHAMBER_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TEMP_X) && TEMP_X_PIN < NUM_ANALOG_INPUTS
REPORT_NAME_ANALOG(TEMP_X_PIN, __LINE__ )
#endif
#if PIN_EXISTS(THERMO_DO)
REPORT_NAME_DIGITAL(THERMO_DO_PIN, __LINE__ )
#endif
#if PIN_EXISTS(THERMO_SCK)
REPORT_NAME_DIGITAL(THERMO_SCK_PIN, __LINE__ )
#endif
#if defined(TLC_BLANK_BIT) && TLC_BLANK_BIT >= 0
REPORT_NAME_DIGITAL(TLC_BLANK_BIT, __LINE__ )
#endif
#if PIN_EXISTS(TLC_BLANK)
REPORT_NAME_DIGITAL(TLC_BLANK_PIN, __LINE__ )
#endif
#if defined(TLC_CLOCK_BIT) && TLC_CLOCK_BIT >= 0
REPORT_NAME_DIGITAL(TLC_CLOCK_BIT, __LINE__ )
#endif
#if PIN_EXISTS(TLC_CLOCK)
REPORT_NAME_DIGITAL(TLC_CLOCK_PIN, __LINE__ )
#endif
#if defined(TLC_DATA_BIT) && TLC_DATA_BIT >= 0
REPORT_NAME_DIGITAL(TLC_DATA_BIT, __LINE__ )
#endif
#if PIN_EXISTS(TLC_DATA)
REPORT_NAME_DIGITAL(TLC_DATA_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TLC_XLAT)
REPORT_NAME_DIGITAL(TLC_XLAT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_0)
REPORT_NAME_DIGITAL(TOOL_0_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_0_PWM)
REPORT_NAME_DIGITAL(TOOL_0_PWM_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_1)
REPORT_NAME_DIGITAL(TOOL_1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_1_PWM)
REPORT_NAME_DIGITAL(TOOL_1_PWM_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_2)
REPORT_NAME_DIGITAL(TOOL_2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_2_PWM)
REPORT_NAME_DIGITAL(TOOL_2_PWM_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_3)
REPORT_NAME_DIGITAL(TOOL_3_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_3_PWM)
REPORT_NAME_DIGITAL(TOOL_3_PWM_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TOOL_PWM)
REPORT_NAME_DIGITAL(TOOL_PWM_PIN, __LINE__ )
#endif
#if PIN_EXISTS(TX_ENABLE)
REPORT_NAME_DIGITAL(TX_ENABLE_PIN, __LINE__ )
#endif
#if defined(UI1) && UI1 >= 0
REPORT_NAME_DIGITAL(UI1, __LINE__ )
#endif
#if defined(UI2) && UI2 >= 0
REPORT_NAME_DIGITAL(UI2, __LINE__ )
#endif
#if defined(UNUSED_PWM) && UNUSED_PWM >= 0
REPORT_NAME_DIGITAL(UNUSED_PWM, __LINE__ )
#endif
#if PIN_EXISTS(X_ATT)
REPORT_NAME_DIGITAL(X_ATT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_CS)
REPORT_NAME_DIGITAL(X_CS_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_DIR)
REPORT_NAME_DIGITAL(X_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_ENABLE)
REPORT_NAME_DIGITAL(X_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_MAX)
REPORT_NAME_DIGITAL(X_MAX_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_MIN)
REPORT_NAME_DIGITAL(X_MIN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_MS1)
REPORT_NAME_DIGITAL(X_MS1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_MS2)
REPORT_NAME_DIGITAL(X_MS2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_STEP)
REPORT_NAME_DIGITAL(X_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X_STOP)
REPORT_NAME_DIGITAL(X_STOP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X2_DIR)
REPORT_NAME_DIGITAL(X2_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X2_ENABLE)
REPORT_NAME_DIGITAL(X2_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(X2_STEP)
REPORT_NAME_DIGITAL(X2_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_ATT)
REPORT_NAME_DIGITAL(Y_ATT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_CS)
REPORT_NAME_DIGITAL(Y_CS_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_DIR)
REPORT_NAME_DIGITAL(Y_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_ENABLE)
REPORT_NAME_DIGITAL(Y_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_MAX)
REPORT_NAME_DIGITAL(Y_MAX_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_MIN)
REPORT_NAME_DIGITAL(Y_MIN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_MS1)
REPORT_NAME_DIGITAL(Y_MS1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_MS2)
REPORT_NAME_DIGITAL(Y_MS2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_STEP)
REPORT_NAME_DIGITAL(Y_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y_STOP)
REPORT_NAME_DIGITAL(Y_STOP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y2_DIR)
REPORT_NAME_DIGITAL(Y2_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y2_ENABLE)
REPORT_NAME_DIGITAL(Y2_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Y2_STEP)
REPORT_NAME_DIGITAL(Y2_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_ATT)
REPORT_NAME_DIGITAL(Z_ATT_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_CS)
REPORT_NAME_DIGITAL(Z_CS_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_DIR)
REPORT_NAME_DIGITAL(Z_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_ENABLE)
REPORT_NAME_DIGITAL(Z_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_MAX)
REPORT_NAME_DIGITAL(Z_MAX_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_MIN)
REPORT_NAME_DIGITAL(Z_MIN_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_MIN_PROBE)
REPORT_NAME_DIGITAL(Z_MIN_PROBE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_MS1)
REPORT_NAME_DIGITAL(Z_MS1_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_MS2)
REPORT_NAME_DIGITAL(Z_MS2_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_STEP)
REPORT_NAME_DIGITAL(Z_STEP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z_STOP)
REPORT_NAME_DIGITAL(Z_STOP_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z2_DIR)
REPORT_NAME_DIGITAL(Z2_DIR_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z2_ENABLE)
REPORT_NAME_DIGITAL(Z2_ENABLE_PIN, __LINE__ )
#endif
#if PIN_EXISTS(Z2_STEP)
REPORT_NAME_DIGITAL(Z2_STEP_PIN, __LINE__ )
#endif
Loading…
Cancel
Save