Dont enable any tool by default.
authorJoseph Coffland <joseph@cauldrondevelopment.com>
Wed, 28 Feb 2018 23:27:41 +0000 (15:27 -0800)
committerJoseph Coffland <joseph@cauldrondevelopment.com>
Wed, 28 Feb 2018 23:27:41 +0000 (15:27 -0800)
CHANGELOG.md
package.json
src/avr/src/huanyang.c
src/avr/src/huanyang.h
src/avr/src/pwm_spindle.c
src/avr/src/pwm_spindle.h
src/avr/src/spindle.c
src/avr/src/vars.def
src/resources/config-template.json

index 5daaefa4a27ae26dd3ccb92c3e40145cfe823787..642ed8068454b11f722894214630f33aa7855816 100644 (file)
@@ -1,6 +1,9 @@
 Buildbotics CNC Controller Firmware Change Log
 ==============================================
 
+## v0.3.18
+ - Don't enable any tool by default.
+
 ## v0.3.17
  - Fixed pausing fail near end of run bug.
  - Show "Upgrading firmware" when upgrading.
index c0187130812c546cdaa6da2965b31d674c80a40e..4bee5173c8a9526cacd9a5a54eed7ea073ea5f94 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "bbctrl",
-  "version": "0.3.17",
+  "version": "0.3.18",
   "homepage": "http://buildbotics.com/",
   "repository": "https://github.com/buildbotics/bbctrl-firmware",
   "license": "GPL-3.0+",
index 207f73622b5d639ca0dfb34ef39eaadffb10abdb..547332a500f7738e7a8b24c49983602f55d2bf37 100644 (file)
@@ -123,6 +123,7 @@ typedef struct {
   uint32_t last;
   uint8_t retry;
 
+  uint8_t shutdown;
   bool connected;
   bool changed;
   float speed;
@@ -238,8 +239,10 @@ static bool _update(int index) {
   switch (index) {
   case 0: { // Update direction
     uint8_t state = HUANYANG_STOP;
-    if (0 < ha.speed) state = HUANYANG_RUN;
-    else if (ha.speed < 0) state = HUANYANG_RUN | HUANYANG_REV_FWD;
+    if (!ha.shutdown) {
+      if (0 < ha.speed) state = HUANYANG_RUN;
+      else if (ha.speed < 0) state = HUANYANG_RUN | HUANYANG_REV_FWD;
+    }
 
     _set_command1(HUANYANG_CTRL_WRITE, state);
 
@@ -257,11 +260,14 @@ static bool _update(int index) {
     // Clamp frequency
     if (ha.max_freq < freq) freq = ha.max_freq;
     if (freq < ha.min_freq) freq = ha.min_freq;
+    if (ha.shutdown) freq = 0;
 
     // Frequency write command
     uint16_t f = freq * 100;
     _set_command2(HUANYANG_FREQ_WRITE, f >> 8, f);
 
+    if (1 < ha.shutdown) ha.shutdown--;
+
     return true;
   }
 
@@ -308,7 +314,7 @@ static void _next_command();
 
 
 static void _next_state() {
-  if (ha.changed) {
+  if (ha.changed || ha.shutdown) {
     ha.next_command_cb = _update;
     ha.changed = false;
 
@@ -342,7 +348,51 @@ static bool _check_response() {
 }
 
 
+static void _reset(bool halt) {
+  _set_dre_interrupt(false);
+  _set_txc_interrupt(false);
+  _set_rxc_interrupt(false);
+  _set_write(true); // RS485 write mode
+
+  // Flush USART
+  uint8_t x = HUANYANG_PORT.DATA;
+  x = HUANYANG_PORT.STATUS;
+  x = x;
+
+  // Save settings
+  uint8_t id = ha.id;
+  float speed = ha.speed;
+  bool debug = ha.debug;
+
+  // Clear state
+  memset(&ha, 0, sizeof(ha));
+
+  // Restore settings
+  ha.id = id;
+  ha.speed = speed;
+  ha.debug = debug;
+  ha.changed = true;
+
+  if (!halt) _next_state();
+}
+
+
 static void _next_command() {
+  if (ha.shutdown == 1) {
+    _reset(true);
+
+    // Disable USART
+    HUANYANG_PORT.CTRLA = 0;
+    HUANYANG_PORT.CTRLC = 0;
+    HUANYANG_PORT.CTRLB = 0;
+
+    // Float write pins
+    DIRCLR_PIN(RS485_DI_PIN);
+    DIRCLR_PIN(RS485_RW_PIN);
+
+    return;
+  }
+
   if (ha.next_command_cb && ha.next_command_cb(ha.command_index++)) {
     ha.response_length = _response_length(ha.command[1]);
 
@@ -400,7 +450,7 @@ ISR(HUANYANG_TXC_vect) {
 
 // Data received interrupt
 ISR(HUANYANG_RXC_vect) {
-  ha.response[ha.current_offset++] = USARTD1.DATA;
+  ha.response[ha.current_offset++] = HUANYANG_PORT.DATA;
 
   if (ha.current_offset == ha.response_length) {
     _set_rxc_interrupt(false);
@@ -430,17 +480,20 @@ void hy_init() {
   _set_baud(3325, 0b1101); // 9600 @ 32MHz with 2x USART
 
   // No parity, 8 data bits, 1 stop bit
-  USARTD1.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc |
+  HUANYANG_PORT.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc |
     USART_CHSIZE_8BIT_gc;
 
   // Configure receiver and transmitter
-  USARTD1.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
+  HUANYANG_PORT.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
 
   ha.id = HUANYANG_ID;
   hy_reset();
 }
 
 
+void hy_deinit() {ha.shutdown = 5;}
+
+
 void hy_set(float speed) {
   if (ha.speed != speed) {
     if (ha.debug) STATUS_DEBUG("huanyang: speed=%0.2f", speed);
@@ -450,33 +503,7 @@ void hy_set(float speed) {
 }
 
 
-void hy_reset() {
-  _set_dre_interrupt(false);
-  _set_txc_interrupt(false);
-  _set_rxc_interrupt(false);
-  _set_write(true); // RS485 write mode
-
-  // Flush USART
-  uint8_t x = USARTD1.DATA;
-  x = USARTD1.STATUS;
-  x = x;
-
-  // Save settings
-  uint8_t id = ha.id;
-  float speed = ha.speed;
-  bool debug = ha.debug;
-
-  // Clear state
-  memset(&ha, 0, sizeof(ha));
-
-  // Restore settings
-  ha.id = id;
-  ha.speed = speed;
-  ha.debug = debug;
-  ha.changed = true;
-
-  _next_state();
-}
+void hy_reset() {_reset(false);}
 
 
 void hy_rtc_callback() {
index fdc44ffa069e234d25746ce3757265e1ec43dcc7..ae0cfa79eb44ee2e2f107c6af0507c09ed9661c8 100644 (file)
@@ -31,6 +31,7 @@
 
 
 void hy_init();
+void hy_deinit();
 void hy_set(float speed);
 void hy_reset();
 void hy_rtc_callback();
index 942f40b14b443dcf17e8540eb03d9e6d5b3dcb0c..f93a9cf32f64c1abbc9d1d6acb594e4d8b8394cf 100644 (file)
@@ -126,6 +126,17 @@ void pwm_spindle_init() {
 }
 
 
+void pwm_spindle_deinit() {
+  _set_enable(false);
+
+  // Float PWM output pin
+  DIRCLR_PIN(SPIN_PWM_PIN);
+
+  // Disable clock
+  TIMER_PWM.CTRLA = 0;
+}
+
+
 void pwm_spindle_set(float speed) {
   if (speed) _set_dir(0 < speed);
   spindle.speed = fabs(speed);
index 13580624d95199c7d4f1238b80e86a356365d121..301694ed0b0482ff2ed380ec975fceb493468610 100644 (file)
@@ -31,5 +31,6 @@
 
 
 void pwm_spindle_init();
+void pwm_spindle_deinit();
 void pwm_spindle_set(float speed);
 void pwm_spindle_stop();
index ee3730eb3ed054418fb6917e5395816170ebe623..d9d53f81165333bba78eb46a0865d4c22f1cc2f9 100644 (file)
@@ -34,8 +34,9 @@
 
 
 typedef enum {
-  SPINDLE_TYPE_HUANYANG,
+  SPINDLE_TYPE_DISABLED,
   SPINDLE_TYPE_PWM,
+  SPINDLE_TYPE_HUANYANG,
 } spindle_type_t;
 
 
@@ -46,13 +47,10 @@ typedef struct {
 } spindle_t;
 
 
-static spindle_t spindle = {0};
+static spindle_t spindle = {SPINDLE_TYPE_DISABLED,};
 
 
-void spindle_init() {
-  pwm_spindle_init();
-  hy_init();
-}
+void spindle_init() {}
 
 
 void spindle_set_speed(float speed) {
@@ -61,6 +59,7 @@ void spindle_set_speed(float speed) {
   if (spindle.reversed) speed = -speed;
 
   switch (spindle.type) {
+  case SPINDLE_TYPE_DISABLED: break;
   case SPINDLE_TYPE_PWM: pwm_spindle_set(speed); break;
   case SPINDLE_TYPE_HUANYANG: hy_set(speed); break;
   }
@@ -72,6 +71,7 @@ float spindle_get_speed() {return spindle.speed;}
 
 void spindle_stop() {
   switch (spindle.type) {
+  case SPINDLE_TYPE_DISABLED: break;
   case SPINDLE_TYPE_PWM: pwm_spindle_stop(); break;
   case SPINDLE_TYPE_HUANYANG: hy_stop(); break;
   }
@@ -85,8 +85,20 @@ void set_spindle_type(uint8_t value) {
   if (value != spindle.type) {
     float speed = spindle.speed;
 
-    spindle_set_speed(0);
+    switch (spindle.type) {
+    case SPINDLE_TYPE_DISABLED: break;
+    case SPINDLE_TYPE_PWM: pwm_spindle_deinit(); break;
+    case SPINDLE_TYPE_HUANYANG: hy_deinit(); break;
+    }
+
     spindle.type = value;
+
+    switch (spindle.type) {
+    case SPINDLE_TYPE_DISABLED: break;
+    case SPINDLE_TYPE_PWM: pwm_spindle_init(); break;
+    case SPINDLE_TYPE_HUANYANG: hy_init(); break;
+    }
+
     spindle_set_speed(speed);
   }
 }
index 7fb8edb8224ff676e62ec3bf8128c4e1fe244cdd..b681d0c29c80700fa83b51365f763bc651190049 100644 (file)
@@ -82,7 +82,7 @@ VAR(output_mode,     om, u8,    OUTS,   1, 1, "Output pin mode")
 VAR(analog_input,    ai, f32,   ANALOG, 0, 0, "Analog input pins")
 
 // Spindle
-VAR(spindle_type,    st, u8,    0,      1, 1, "PWM=0 or HUANYANG=1")
+VAR(spindle_type,    st, u8,    0,      1, 1, "DISABLED=0, PWM=1 or HUANYANG=2")
 VAR(spin_reversed,   sr, bool,  0,      1, 1, "Reverse spin")
 VAR(max_spin,        sx, f32,   0,      1, 1, "Maximum spindle speed")
 VAR(min_spin,        sm, f32,   0,      1, 1, "Minimum spindle speed")
index b05111baed028a5f1b18d46a2b661c63968936e6..15623b465499bad9803c01f0df64da414e62b55d 100644 (file)
   "tool": {
     "spindle-type": {
       "type": "enum",
-      "values": ["HUANYANG", "PWM"],
-      "default": "HUANYANG",
+      "values": ["DISABLED", "PWM", "HUANYANG"],
+      "default": "DISABLED",
       "code": "st"
     },
     "spin-reversed": {