 	ticker_but.attach_ms(50, ticker_button_task, nd);
 }
 
+static void reboot(struct neurite_data_s *nd)
+{
+	log_info("rebooting...\n\r");
+	stop_ticker_but(nd);
+	stop_ticker_mon(nd);
+	stop_ticker_worker(nd);
+	stop_ticker_led(nd);
+	stop_ticker_cmd(nd);
+	ESP.restart();
+}
+
 static void cmd_completed_cb(struct cmd_parser_s *cp)
 {
 	struct neurite_data_s *nd = &g_nd;

static void button_hold_handler(struct neurite_data_s *nd, int dts)
{
	if (dts > 5000) {
		if (SPIFFS.remove(NEURITE_CFG_PATH))
			log_dbg("%s removed\n\r", NEURITE_CFG_PATH);
		else
			log_err("%s failed to remove\n\r", NEURITE_CFG_PATH);
	}
}


StaticJsonBuffer<NEURITE_CFG_SIZE> json_buf;
static char cfg_buf[NEURITE_CFG_SIZE];

static void reboot(struct neurite_data_s *nd);

enum {
	WORKER_ST_0 = 0,
