Gnuk->NeuG
[gnuk/neug.git] / src / main.c
index 321d068..8a7dec1 100644 (file)
@@ -13,7 +13,7 @@
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
- * Gnuk is distributed in the hope that it will be useful, but WITHOUT
+ * NeuG is distributed in the hope that it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
  * License for more details.
@@ -30,6 +30,7 @@
 #include "neug.h"
 #include "usb_lld.h"
 #include "sys.h"
+#include "adc.h"
 
 /*
  * We are trying to avoid dependency to C library. 
@@ -230,6 +231,7 @@ static const uint8_t *const mem_info[] = { &_regnual_start,  &__heap_end__, };
 #define USB_FSIJ_MEMINFO         0
 #define USB_FSIJ_DOWNLOAD        1
 #define USB_FSIJ_EXEC            2
+#define USB_NEUG_GET_ERR_COUNT 254
 #define USB_NEUG_EXIT          255 /* Ask to exit and to receive reGNUal */
 
 enum {
@@ -288,15 +290,15 @@ static void neug_ctrl_write_finish (uint8_t req, uint8_t req_no,
        }
       else if (req_no == USB_NEUG_EXIT)
        {
+         chSysLockFromIsr ();
          if (neug_state == NEUG_WAIT_FOR_TX_READY)
            {
-             chSysLockFromIsr ();
              main_thread->p_u.rdymsg = RDY_OK;
              chSchReadyI (main_thread);
-             chSysUnlockFromIsr ();
            }
          else
            chEvtSignalFlagsI (main_thread, 1);
+         chSysUnlockFromIsr ();
        }
     }
 }
@@ -350,13 +352,13 @@ vcom_port_data_setup (uint8_t req, uint8_t req_no, uint16_t value)
                {
                  /* Close call */
                  connected = 0;
+                 chSysLockFromIsr ();
                  if (neug_state == NEUG_WAIT_FOR_TX_READY)
                    {
-                     chSysLockFromIsr ();
                      main_thread->p_u.rdymsg = RDY_OK;
                      chSchReadyI (main_thread);
-                     chSysUnlockFromIsr ();
                    }
+                 chSysUnlockFromIsr ();
                }
            }
 
@@ -382,6 +384,13 @@ neug_setup (uint8_t req, uint8_t req_no,
              usb_lld_set_data_to_send (mem_info, sizeof (mem_info));
              return USB_SUCCESS;
            }
+         else if (req_no == USB_NEUG_GET_ERR_COUNT)
+           {
+             extern uint16_t neug_err_count;
+
+             usb_lld_set_data_to_send (&neug_err_count, sizeof (uint16_t));
+             return USB_SUCCESS;
+           }
        }
       else /* SETUP_SET */
        {
@@ -602,13 +611,13 @@ CH_IRQ_HANDLER (Vector90)
 void
 EP1_IN_Callback (void)
 {
-  if (main_thread != NULL)
+  chSysLockFromIsr ();
+  if (main_thread != NULL && neug_state == NEUG_WAIT_FOR_TX_READY)
     {
-      chSysLockFromIsr ();
       main_thread->p_u.rdymsg = RDY_OK;
       chSchReadyI (main_thread);
-      chSysUnlockFromIsr ();
     }
+  chSysUnlockFromIsr ();
 }
 
 void
@@ -669,8 +678,6 @@ static msg_t led_blinker (void *arg)
 #define RANDOM_BYTES_LENGTH 32
 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)];
 
-extern void adc2_init (void);
-
 /*
  * Entry point.
  *
@@ -685,7 +692,7 @@ main (int argc, char **argv)
   fill_serial_no_by_unique_id ();
 
   halInit ();
-  adc2_init ();
+  adc_init ();
   chSysInit ();
 
   main_thread = chThdSelf ();
@@ -737,7 +744,7 @@ main (int argc, char **argv)
        * No parity is standard.  It means to provide conditioned output.
        * When parity enabled, it means to provide raw output.
        */
-      neug_select (line_coding.paritytype != 0);
+      neug_mode_select (line_coding.paritytype); /* 0: None, 1: Odd, 2: Even */
 
       while (1)
        {