Use dbg_logic logging

and improve the variadic version used to print formatted
text at some spots in previous commits
pull/126/head
D.R.racer 2021-09-27 11:45:00 +02:00 committed by DRracer
parent a13f3b8a2d
commit 236a40c6ef
9 changed files with 62 additions and 137 deletions

View File

@ -31,6 +31,15 @@ void dbg_usart_P(const char *layer_P, const char *s_P) {
hu::usart1.puts_P(s_P); hu::usart1.puts_P(s_P);
} }
void dbg_usart_sprintf_P(const char *fmt_P, ...) {
char tmp[30];
va_list argptr;
va_start(argptr, fmt_P);
vsprintf(tmp, fmt_P, argptr);
va_end(argptr);
dbg_logic(tmp);
}
} // namespace debug } // namespace debug
#endif #endif

View File

@ -5,24 +5,31 @@
#define DEBUG_LOGIC #define DEBUG_LOGIC
/// Enable DEBUG_LOGIC to compile debugging and error messages (beware of code base size ;) ) for the logic layer /// Enable DEBUG_LOGIC to compile debugging and error messages (beware of code base size ;) ) for the logic layer
#define DEBUG_MODULES //#define DEBUG_MODULES
/// Enable DEBUG_HAL to compile debugging and error messages (beware of code base size ;) ) for the logic layer /// Enable DEBUG_HAL to compile debugging and error messages (beware of code base size ;) ) for the logic layer
#define DEBUG_HAL //#define DEBUG_HAL
// workaround non-standard PSTR definition on non-AVR platforms
#ifndef __AVR__
#define PSTR(x) x
#endif
/// Debugging macros and tools /// Debugging macros and tools
namespace debug { namespace debug {
#ifdef DEBUG_LOGIC #if defined(DEBUG_LOGIC) && defined(__AVR__)
extern const char logic[]; extern const char logic[];
#define dbg_logic(x) debug::dbg_usart(debug::logic, x) #define dbg_logic(x) debug::dbg_usart(debug::logic, x)
#define dbg_logic_P(x) debug::dbg_usart_P(debug::logic, x) #define dbg_logic_P(x) debug::dbg_usart_P(debug::logic, x)
#define dbg_logic_sprintf_P(fmt, ...) debug::dbg_usart_sprintf_P(fmt, __VA_ARGS__)
#else #else
#define dbg_logic(x) /* */ #define dbg_logic(x) /* */
#define dbg_logic_P(x) /* */ #define dbg_logic_P(x) /* */
#define dbg_logic_sprintf_P(fmt, ...) /* */
#endif #endif
#ifdef DEBUG_MODULES #if defined(DEBUG_MODULES) && defined(__AVR__)
extern const char modules[]; extern const char modules[];
#define dbg_modules(x) debug::dbg_usart(debug::modules, x) #define dbg_modules(x) debug::dbg_usart(debug::modules, x)
#define dbg_modules_P(x) debug::dbg_usart_P(debug::modules, x) #define dbg_modules_P(x) debug::dbg_usart_P(debug::modules, x)
@ -31,7 +38,7 @@ extern const char modules[];
#define dbg_modules_P(x) /* */ #define dbg_modules_P(x) /* */
#endif #endif
#ifdef DEBUG_HAL #if defined(DEBUG_HAL) && defined(__AVR__)
extern const char hal[]; extern const char hal[];
#define dbg_hal(x) debug::dbg_usart(debug::hal, x) #define dbg_hal(x) debug::dbg_usart(debug::hal, x)
#define dbg_hal_P(x) debug::dbg_usart_P(debug::hal, x) #define dbg_hal_P(x) debug::dbg_usart_P(debug::hal, x)
@ -50,6 +57,10 @@ void dbg_usart(const char *layer_P, const char *s);
/// @param layer PROGMEM string /// @param layer PROGMEM string
/// @param s PROGMEM string to be printed /// @param s PROGMEM string to be printed
void dbg_usart_P(const char *layer_P, const char *s_P); void dbg_usart_P(const char *layer_P, const char *s_P);
/// Dump an error message onto the USART with sprintf-like formatting
/// @param fmt_P PROGMEM format string
void dbg_usart_sprintf_P(const char *fmt_P, ...);
#endif #endif
} // namespace debug } // namespace debug

View File

@ -6,18 +6,12 @@
#include "../modules/leds.h" #include "../modules/leds.h"
#include "../modules/motion.h" #include "../modules/motion.h"
#include "../modules/permanent_storage.h" #include "../modules/permanent_storage.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
namespace logic { namespace logic {
void FeedToBondtech::Reset(uint8_t maxRetries) { void FeedToBondtech::Reset(uint8_t maxRetries) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("\nFeed to Bondtech\n\n"));
hu::usart1.puts("\nFeed to Bondtech\n\n");
#endif //DEBUG_LOGIC
state = EngagingIdler; state = EngagingIdler;
this->maxRetries = maxRetries; this->maxRetries = maxRetries;
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::blink0); ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::blink0);
@ -28,21 +22,14 @@ bool FeedToBondtech::Step() {
switch (state) { switch (state) {
case EngagingIdler: case EngagingIdler:
if (mi::idler.Engaged()) { if (mi::idler.Engaged()) {
#ifdef DEBUG_LOGIC dbg_logic_sprintf_P(PSTR("\nPulley start steps %u\n\n"), mm::motion.CurPosition(mm::Pulley));
uint16_t startSteps = mm::motion.CurPosition(mm::Pulley);
char str[30];
sprintf_P(str, PSTR("\nPulley start steps %u\n\n"), startSteps);
hu::usart1.puts(str);
#endif //DEBUG_LOGIC
state = PushingFilament; state = PushingFilament;
mm::motion.PlanMove<mm::Pulley>(config::defaultBowdenLength, config::pulleyFeedrate); //@@TODO constants - there was some strange acceleration sequence in the original FW, mm::motion.PlanMove<mm::Pulley>(config::defaultBowdenLength, config::pulleyFeedrate); //@@TODO constants - there was some strange acceleration sequence in the original FW,
// we can probably hand over some array of constants for hand-tuned acceleration + leverage some smoothing in the stepper as well // we can probably hand over some array of constants for hand-tuned acceleration + leverage some smoothing in the stepper as well
} }
return false; return false;
case PushingFilament: case PushingFilament:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("\nFeed to Bondtech --> Pushing\n\n"));
hu::usart1.puts("\nFeed to Bondtech --> Pushing\n\n");
#endif //DEBUG_LOGIC
if (mfs::fsensor.Pressed()) { if (mfs::fsensor.Pressed()) {
mm::motion.AbortPlannedMoves(); // stop pushing filament mm::motion.AbortPlannedMoves(); // stop pushing filament
mi::idler.Disengage(); mi::idler.Disengage();
@ -55,22 +42,16 @@ bool FeedToBondtech::Step() {
} }
return false; return false;
case DisengagingIdler: case DisengagingIdler:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("\nFeed to Bondtech --> DisengagingIdler\n\n"));
hu::usart1.puts("\nFeed to Bondtech --> DisengagingIdler\n\n");
#endif //DEBUG_LOGIC
if (!mi::idler.Engaged()) { if (!mi::idler.Engaged()) {
state = OK; state = OK;
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::on); ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::on);
} }
return false; return false;
case OK: case OK:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("\nFeed to Bondtech\n\n"));
hu::usart1.puts("\nFeed to Bondtech\n\n");
#endif //DEBUG_LOGIC
case Failed: case Failed:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("\nFeed to Bondtech FAILED\n\n"));
hu::usart1.puts("\nFeed to Bondtech FAILED\n\n");
#endif //DEBUG_LOGIC
default: default:
return true; return true;
} }

View File

@ -7,11 +7,7 @@
#include "../modules/permanent_storage.h" #include "../modules/permanent_storage.h"
#include "../modules/selector.h" #include "../modules/selector.h"
#include "../modules/user_input.h" #include "../modules/user_input.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
namespace logic { namespace logic {
@ -21,9 +17,7 @@ void LoadFilament::Reset(uint8_t param) {
if (!CheckToolIndex(param)) { if (!CheckToolIndex(param)) {
return; return;
} }
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Load Filament\n\n"));
hu::usart1.puts("Load Filament\n\n");
#endif //DEBUG_LOGIC
state = ProgressCode::EngagingIdler; state = ProgressCode::EngagingIdler;
error = ErrorCode::RUNNING; error = ErrorCode::RUNNING;
mg::globals.SetActiveSlot(param); mg::globals.SetActiveSlot(param);

View File

@ -8,11 +8,7 @@
#include "../modules/permanent_storage.h" #include "../modules/permanent_storage.h"
#include "../modules/selector.h" #include "../modules/selector.h"
#include "../modules/user_input.h" #include "../modules/user_input.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
namespace logic { namespace logic {
@ -24,10 +20,8 @@ void ToolChange::Reset(uint8_t param) {
} }
if (param == mg::globals.ActiveSlot() && mg::globals.FilamentLoaded()) { if (param == mg::globals.ActiveSlot() && mg::globals.FilamentLoaded()) {
// we are already at the correct slot and the filament is loaded - nothing to do // we are already at the correct slot and the filament is loaded - nothing to do
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("we are already at the correct slot and the filament is loaded - nothing to do\n"));
hu::usart1.puts("we are already at the correct slot and the filament is loaded - nothing to do\n");
#endif //DEBUG_LOGIC
return; return;
} }
@ -36,17 +30,13 @@ void ToolChange::Reset(uint8_t param) {
plannedSlot = param; plannedSlot = param;
if (mg::globals.FilamentLoaded()) { if (mg::globals.FilamentLoaded()) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Filament is loaded --> unload\n"));
hu::usart1.puts("Filament is loaded --> unload\n");
#endif //DEBUG_LOGIC
state = ProgressCode::UnloadingFilament; state = ProgressCode::UnloadingFilament;
unl.Reset(mg::globals.ActiveSlot()); unl.Reset(mg::globals.ActiveSlot());
} else { } else {
state = ProgressCode::FeedingToFinda; state = ProgressCode::FeedingToFinda;
error = ErrorCode::RUNNING; error = ErrorCode::RUNNING;
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Filament is not loaded --> load\n"));
hu::usart1.puts("Filament is not loaded --> load\n");
#endif //DEBUG_LOGIC
mg::globals.SetActiveSlot(plannedSlot); mg::globals.SetActiveSlot(plannedSlot);
feed.Reset(true); feed.Reset(true);
} }

View File

@ -6,11 +6,7 @@
#include "../modules/motion.h" #include "../modules/motion.h"
#include "../modules/permanent_storage.h" #include "../modules/permanent_storage.h"
#include "../modules/user_input.h" #include "../modules/user_input.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
namespace logic { namespace logic {

View File

@ -3,11 +3,7 @@
#include "leds.h" #include "leds.h"
#include "motion.h" #include "motion.h"
#include "permanent_storage.h" #include "permanent_storage.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
namespace modules { namespace modules {
namespace idler { namespace idler {
@ -16,34 +12,24 @@ Idler idler;
void Idler::PrepareMoveToPlannedSlot() { void Idler::PrepareMoveToPlannedSlot() {
mm::motion.PlanMoveTo<mm::Idler>(SlotPosition(plannedSlot), mm::unitToAxisUnit<mm::I_speed_t>(config::idlerFeedrate)); mm::motion.PlanMoveTo<mm::Idler>(SlotPosition(plannedSlot), mm::unitToAxisUnit<mm::I_speed_t>(config::idlerFeedrate));
#ifdef DEBUG_LOGIC dbg_logic_sprintf_P(PSTR("Prepare Move Idler slot %d\n"), plannedSlot);
char str[30];
sprintf_P(str, PSTR("Prepare Move Idler slot %d\n"), plannedSlot);
hu::usart1.puts(str);
#endif //DEBUG_LOGIC
} }
void Idler::PlanHomingMove() { void Idler::PlanHomingMove() {
mm::motion.PlanMove<mm::Idler>(mm::unitToAxisUnit<mm::I_pos_t>(-config::idlerLimits.lenght * 2), mm::unitToAxisUnit<mm::I_speed_t>(config::idlerFeedrate)); mm::motion.PlanMove<mm::Idler>(mm::unitToAxisUnit<mm::I_pos_t>(-config::idlerLimits.lenght * 2), mm::unitToAxisUnit<mm::I_speed_t>(config::idlerFeedrate));
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Plan Homing Idler\n"));
hu::usart1.puts("Plan Homing Idler\n");
#endif //DEBUG_LOGIC
} }
Idler::OperationResult Idler::Disengage() { Idler::OperationResult Idler::Disengage() {
if (state == Moving) { if (state == Moving) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Moving --> Disengage refused\n"));
hu::usart1.puts("Moving --> Disengage refused\n");
#endif //DEBUG_LOGIC
return OperationResult::Refused; return OperationResult::Refused;
} }
plannedSlot = IdleSlotIndex(); plannedSlot = IdleSlotIndex();
plannedEngage = false; plannedEngage = false;
if (!Engaged()) { if (!Engaged()) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Disengage Idler\n"));
hu::usart1.puts("Disengage Idler\n");
#endif //DEBUG_LOGIC
return OperationResult::Accepted; return OperationResult::Accepted;
} }
return InitMovement(mm::Idler); return InitMovement(mm::Idler);
@ -51,9 +37,7 @@ Idler::OperationResult Idler::Disengage() {
Idler::OperationResult Idler::Engage(uint8_t slot) { Idler::OperationResult Idler::Engage(uint8_t slot) {
if (state == Moving) { if (state == Moving) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Moving --> Engage refused\n"));
hu::usart1.puts("Moving --> Engage refused\n");
#endif //DEBUG_LOGIC
return OperationResult::Refused; return OperationResult::Refused;
} }
@ -61,9 +45,7 @@ Idler::OperationResult Idler::Engage(uint8_t slot) {
plannedEngage = true; plannedEngage = true;
if (Engaged()) { if (Engaged()) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Engage Idler\n"));
hu::usart1.puts("Engage Idler\n");
#endif //DEBUG_LOGIC
return OperationResult::Accepted; return OperationResult::Accepted;
} }
@ -81,21 +63,15 @@ bool Idler::Home() {
bool Idler::Step() { bool Idler::Step() {
switch (state) { switch (state) {
case Moving: case Moving:
#ifdef DEBUG_LOGIC // dbg_logic_P(PSTR("Moving Idler\n"));
//hu::usart1.puts("Moving Idler\n");
#endif //DEBUG_LOGIC
PerformMove(mm::Idler); PerformMove(mm::Idler);
return false; return false;
case Homing: case Homing:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Homing Idler\n"));
hu::usart1.puts("Homing Idler\n");
#endif //DEBUG_LOGIC
PerformHome(mm::Idler); PerformHome(mm::Idler);
return false; return false;
case Ready: case Ready:
#ifdef DEBUG_LOGIC // dbg_logic_P(PSTR("Idler Ready\n"));
//hu::usart1.puts("Idler Ready\n");
#endif //DEBUG_LOGIC
currentlyEngaged = plannedEngage; currentlyEngaged = plannedEngage;
currentSlot = plannedSlot; currentSlot = plannedSlot;
@ -104,9 +80,7 @@ bool Idler::Step() {
return true; return true;
case Failed: case Failed:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Idler Failed\n"));
hu::usart1.puts("Idler Failed\n");
#endif //DEBUG_LOGIC
default: default:
return true; return true;
} }

View File

@ -1,10 +1,6 @@
#include "motion.h" #include "motion.h"
#include "../panic.h" #include "../panic.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
// TODO: use proper timer abstraction // TODO: use proper timer abstraction
#ifdef __AVR__ #ifdef __AVR__
@ -50,11 +46,7 @@ void Motion::StallGuardReset(Axis axis) {
} }
void Motion::PlanMoveTo(Axis axis, pos_t pos, steps_t feed_rate, steps_t end_rate) { void Motion::PlanMoveTo(Axis axis, pos_t pos, steps_t feed_rate, steps_t end_rate) {
#ifdef DEBUG_LOGIC dbg_logic_sprintf_P(PSTR("Move axis %d to %u\n"), axis, pos);
char str[30];
sprintf_P(str, PSTR("Move axis %d to %u\n"), axis, pos);
hu::usart1.puts(str);
#endif //DEBUG_LOGIC
if (axisData[axis].ctrl.PlanMoveTo(pos, feed_rate, end_rate)) { if (axisData[axis].ctrl.PlanMoveTo(pos, feed_rate, end_rate)) {
// move was queued, prepare the axis // move was queued, prepare the axis

View File

@ -3,11 +3,7 @@
#include "leds.h" #include "leds.h"
#include "motion.h" #include "motion.h"
#include "permanent_storage.h" #include "permanent_storage.h"
#ifdef DEBUG_LOGIC #include "../debug.h"
#include "../hal/usart.h"
#include <string.h>
#include <stdio.h>
#endif //DEBUG_LOGIC
namespace modules { namespace modules {
namespace selector { namespace selector {
@ -16,33 +12,23 @@ Selector selector;
void Selector::PrepareMoveToPlannedSlot() { void Selector::PrepareMoveToPlannedSlot() {
mm::motion.PlanMoveTo<mm::Selector>(SlotPosition(plannedSlot), mm::unitToAxisUnit<mm::S_speed_t>(config::selectorFeedrate)); mm::motion.PlanMoveTo<mm::Selector>(SlotPosition(plannedSlot), mm::unitToAxisUnit<mm::S_speed_t>(config::selectorFeedrate));
#ifdef DEBUG_LOGIC dbg_logic_sprintf_P(PSTR("Prepare Move Selector slot %d\n"), plannedSlot);
char str[30];
sprintf_P(str, PSTR("Prepare Move Selector slot %d\n"), plannedSlot);
hu::usart1.puts(str);
#endif //DEBUG_LOGIC
} }
void Selector::PlanHomingMove() { void Selector::PlanHomingMove() {
mm::motion.PlanMove<mm::Selector>(mm::unitToAxisUnit<mm::S_pos_t>(config::selectorLimits.lenght * 2), mm::unitToAxisUnit<mm::S_speed_t>(config::selectorFeedrate)); mm::motion.PlanMove<mm::Selector>(mm::unitToAxisUnit<mm::S_pos_t>(config::selectorLimits.lenght * 2), mm::unitToAxisUnit<mm::S_speed_t>(config::selectorFeedrate));
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Plan Homing Selector\n"));
hu::usart1.puts("Plan Homing Selector\n");
#endif //DEBUG_LOGIC
} }
Selector::OperationResult Selector::MoveToSlot(uint8_t slot) { Selector::OperationResult Selector::MoveToSlot(uint8_t slot) {
if (state == Moving) { if (state == Moving) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Moving --> Selector refused\n"));
hu::usart1.puts("Moving --> Selector refused\n");
#endif //DEBUG_LOGIC
return OperationResult::Refused; return OperationResult::Refused;
} }
plannedSlot = slot; plannedSlot = slot;
if (currentSlot == slot) { if (currentSlot == slot) {
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Moving Selector\n"));
hu::usart1.puts("Moving Selector\n");
#endif //DEBUG_LOGIC
return OperationResult::Accepted; return OperationResult::Accepted;
} }
return InitMovement(mm::Selector); return InitMovement(mm::Selector);
@ -59,27 +45,19 @@ bool Selector::Step() {
switch (state) { switch (state) {
case Moving: case Moving:
PerformMove(mm::Selector); PerformMove(mm::Selector);
#ifdef DEBUG_LOGIC //dbg_logic_P(PSTR("Moving Selector\n"));
//hu::usart1.puts("Moving Selector\n");
#endif //DEBUG_LOGIC
return false; return false;
case Homing: case Homing:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Homing Selector\n"));
hu::usart1.puts("Homing Selector\n");
#endif //DEBUG_LOGIC
PerformHome(mm::Selector); PerformHome(mm::Selector);
return false; return false;
case Ready: case Ready:
#ifdef DEBUG_LOGIC //dbg_logic_P(PSTR("Selector Ready\n"));
//hu::usart1.puts("Selector Ready\n");
#endif //DEBUG_LOGIC
currentSlot = plannedSlot; currentSlot = plannedSlot;
mm::motion.Disable(mm::Selector); // turn off selector motor's power every time mm::motion.Disable(mm::Selector); // turn off selector motor's power every time
return true; return true;
case Failed: case Failed:
#ifdef DEBUG_LOGIC dbg_logic_P(PSTR("Selector Failed\n"));
hu::usart1.puts("Selector Failed\n");
#endif //DEBUG_LOGIC
default: default:
return true; return true;
} }