USBSerial: marshall attach/detach operations to idle event
authorMichael Moon <triffid.hunter@gmail.com>
Thu, 24 Jan 2013 14:50:34 +0000 (01:50 +1100)
committerMichael Moon <triffid.hunter@gmail.com>
Thu, 24 Jan 2013 14:50:34 +0000 (01:50 +1100)
src/libs/USBDevice/USBSerial/USBSerial.cpp
src/libs/USBDevice/USBSerial/USBSerial.h

index 7272ca8..94f031f 100644 (file)
@@ -33,11 +33,13 @@ USBSerial::USBSerial(USB *u): USBCDC(u), rxbuf(128), txbuf(128)
 {\r
     usb = u;\r
     nl_in_rx = 0;\r
+    attach = attached = false;\r
 }\r
 \r
 int USBSerial::_putc(int c)\r
 {\r
-//     send((uint8_t *)&c, 1);\r
+    if (!attached)\r
+        return 1;\r
     if (c == '\r')\r
         return 1;\r
     if (txbuf.free())\r
@@ -50,6 +52,8 @@ int USBSerial::_putc(int c)
 \r
 int USBSerial::_getc()\r
 {\r
+    if (!attached)\r
+        return 0;\r
     uint8_t c = 0;\r
     setled(4, 1); while (rxbuf.isEmpty()); setled(4, 0);\r
     rxbuf.dequeue(&c);\r
@@ -68,6 +72,8 @@ int USBSerial::_getc()
 \r
 int USBSerial::puts(const char *str)\r
 {\r
+    if (!attached)\r
+        return strlen(str);\r
     int i = 0;\r
     while (*str)\r
     {\r
@@ -84,6 +90,8 @@ int USBSerial::puts(const char *str)
 \r
 uint16_t USBSerial::writeBlock(uint8_t * buf, uint16_t size)\r
 {\r
+    if (!attached)\r
+        return size;\r
     if (size > txbuf.free())\r
     {\r
         size = txbuf.free();\r
@@ -236,13 +244,28 @@ uint8_t USBSerial::available()
 \r
 void USBSerial::on_module_loaded()\r
 {\r
-    this->register_for_event(ON_MAIN_LOOP);\r
-//     this->kernel->streams->append_stream(this);\r
+    this->register_for_event(ON_IDLE);\r
 }\r
 \r
-void USBSerial::on_main_loop(void *argument)\r
+void USBSerial::on_idle(void *argument)\r
 {\r
-//     this->kernel->streams->printf("!");\r
+    if (attach != attached)\r
+    {\r
+        if (attach)\r
+        {\r
+            attached = true;\r
+            kernel->streams->append_stream(this);\r
+            writeBlock((uint8_t *) "Smoothie\nok\n", 12);\r
+        }\r
+        else\r
+        {\r
+            attached = false;\r
+            kernel->streams->remove_stream(this);\r
+            txbuf.flush();\r
+            rxbuf.flush();\r
+            nl_in_rx = 0;\r
+        }\r
+    }\r
     if (nl_in_rx)\r
     {\r
         string received;\r
@@ -268,14 +291,10 @@ void USBSerial::on_main_loop(void *argument)
 \r
 void USBSerial::on_attach()\r
 {\r
-    this->kernel->streams->append_stream(this);\r
-    writeBlock((uint8_t *) "Smoothie\nok\n", 12);\r
+    attach = true;\r
 }\r
 \r
 void USBSerial::on_detach()\r
 {\r
-    this->kernel->streams->remove_stream(this);\r
-    txbuf.flush();\r
-    rxbuf.flush();\r
-    nl_in_rx = 0;\r
+    attach = false;\r
 }\r
index 34a47c9..61bb14d 100644 (file)
@@ -35,9 +35,9 @@ class USBSerial: public USBCDC, public USBSerial_Receiver, public Module, public
 public:\r
     USBSerial(USB *);\r
 \r
-    virtual int _putc(int c);\r
-    virtual int _getc();\r
-    virtual int puts(const char *);\r
+    int _putc(int c);\r
+    int _getc();\r
+    int puts(const char *);\r
 \r
     uint8_t available();\r
 \r
@@ -46,8 +46,8 @@ public:
     CircBuffer<uint8_t> rxbuf;\r
     CircBuffer<uint8_t> txbuf;\r
 \r
-    virtual void on_module_loaded(void);\r
-    virtual void on_main_loop(void *);\r
+    void on_module_loaded(void);\r
+    void on_idle(void *);\r
 \r
 protected:\r
 //     virtual bool EpCallback(uint8_t, uint8_t);\r
@@ -59,6 +59,9 @@ protected:
     virtual void on_attach(void);\r
     virtual void on_detach(void);\r
 \r
+    volatile bool attach;\r
+    bool attached;\r
+\r
     volatile int nl_in_rx;\r
 private:\r
     USB *usb;\r