Category: General LinuxCNC Questions
Hello everyone,
I have a strange problem with LinuxCNC on a machine that has been configured for a long time and was working perfectly.
Until a few days ago, everything was working fine. Then I modified my Python Touchy GUI file (adding dynamic multi-language translation using `set_label` on some buttons), and from that moment the problem appeared:
> "joint 0 following error" immediately after clicking "Start".
The problem still remains even if I completely delete all the translation modifications (`LABELS` and `on_combo_language_changed`);
Code I had added:
LABELS = {
"en": {
"title": "Industry 4.0 Monitoring",
"total_time": "Total machine work time:",
"current_job": "Current job time:",
"next_greaser": "Next greaser in:",
"time_monitoring": "<b>Time Monitoring</b>",
"email_section": "<b>Email Notification Management</b>",
"history_section": "<b>Job History</b>",
"email": "Email:",
"add": "Add",
"remove": "Remove",
"close_door": "Close Door",
"open_door": "Open Door",
"machine_on": "Machine On",
"machine_off": "Machine Off",
"home_all": "Home All",
"pause": "Pause",
"start": "Start",
"feed_fast": "Fast",
"feed_slow": "Slow",
"feed_override": "Feed Override"
},
"it": {
"title": "Monitoraggio Industria 4.0",
"total_time": "Tempo totale macchina:",
"current_job": "Tempo job corrente:",
"next_greaser": "Prossima lubrificazione in:",
"time_monitoring": "<b>Monitoraggio Tempo</b>",
"email_section": "<b>Gestione Notifiche Email</b>",
"history_section": "<b>Storico Lavorazioni</b>",
"email": "Email:",
"add": "Aggiungi",
"remove": "Rimuovi",
"close_door": "Chiudi Porta",
"open_door": "Apri Porta",
"machine_on": "Macchina On",
"machine_off": "Macchina Off",
"home_all": "Home Tutti",
"pause": "Pausa",
"start": "Avvio",
"feed_fast": "Veloce",
"feed_slow": "Lento",
"feed_override": "Regolazione Avanzamento"
}
}
def on_combo_language_changed(self, combo):
lang = combo.get_active_id() or "en"
texts = LABELS.get(lang, LABELS["en"])
# Main Industry 4.0 labels
self.builder.get_object("title_industria40").set_markup(f"<span size='xx-large' weight='bold'>{texts}</span>")
self.builder.get_object("label_tempo_totale").set_text(texts["total_time"])
self.builder.get_object("label_tempo_job_corrente").set_text(texts["current_job"])
self.builder.get_object("label_tempo_prossimo_greaser").set_text(texts["next_greaser"])
self.builder.get_object("frame_label_tempo").set_markup(texts["time_monitoring"])
self.builder.get_object("frame_label_email").set_markup(texts["email_section"])
self.builder.get_object("frame_label_lavorazioni").set_markup(texts["history_section"])
self.builder.get_object("label_email").set_text(texts["email"])
self.builder.get_object("button_add_email").set_label(texts["add"])
self.builder.get_object("button_remove_email").set_label(texts["remove"])
# Startup tab buttons
self.builder.get_object("estop_reset").set_label(texts["close_door"])
self.builder.get_object("estop").set_label(texts["open_door"])
self.builder.get_object("machine_on").set_label(texts["machine_on"])
self.builder.get_object("machine_off").set_label(texts["machine_off"])
self.builder.get_object("home_all").set_label(texts["home_all"])
self.builder.get_object("cycle_pausee").set_label(texts["pause"])
self.builder.get_object("cycle_startt").set_label(texts["start"])
self.builder.get_object("feed_override_plus").set_label(texts["feed_fast"])
self.builder.get_object("feed_override_minus").set_label(texts["feed_slow"])
# Feed Override label, keeping the percentage value
current_text = self.builder.get_object("feed_override_label").get_text()
percentage_part = current_text.split(":")[1] if ":" in current_text else " 100%"
self.builder.get_object("feed_override_label").set_text(f"{texts}: {percentage_part}")