]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
added CW vox
authorc vw <dl1ycf@darc.de>
Mon, 6 Aug 2018 17:12:23 +0000 (19:12 +0200)
committerc vw <dl1ycf@darc.de>
Mon, 6 Aug 2018 17:12:23 +0000 (19:12 +0200)
gpio.c
iambic.c

diff --git a/gpio.c b/gpio.c
index 2e6590b40f6468f266f16d05e0aab5ccdcf259bb..089f0faa8cd6cf13886489a7a3528cebc0bfa4f9 100644 (file)
--- a/gpio.c
+++ b/gpio.c
@@ -974,8 +974,12 @@ fprintf(stderr,"setup_encoder_pin: pin=%d updown=%d\n",pin,up_down);
 
 #ifdef LOCALCW
 
+// Note we cannot use debouncing, as after the first interrupt,
+// we might read the wrong level. So we forward all CW interrupts
+// to the keyer.
+
 static void setup_cw_pin(int pin, void(*pAlert)(void)) {
-fprintf(stderr,"setup_cw_pin: pin=%d \n",pin);
+   fprintf(stderr,"setup_cw_pin: pin=%d \n",pin);
    pinMode(pin,INPUT);
    pullUpDnControl(pin,PUD_UP);
    usleep(10000);
@@ -983,19 +987,19 @@ fprintf(stderr,"setup_cw_pin: pin=%d \n",pin);
 }
 
 static void cwAlert_left() {
-       int level=digitalRead(CWL_BUTTON);
-       //fprintf(stderr,"cwl button : level=%d \n",level);
-   if (cw_keyer_internal == 0 ){
-      keyer_event(CWL_BUTTON, cw_active_level == 0 ? level : (level==0));
-   }
+    int level;
+    if (cw_keyer_internal != 0) return; // as quickly as possible
+    level=digitalRead(CWL_BUTTON);
+    //fprintf(stderr,"cwl button : level=%d \n",level);
+    keyer_event(CWL_BUTTON, cw_active_level == 0 ? level : (level==0));
 }
 
 static void cwAlert_right() {
-       int level=digitalRead(CWR_BUTTON);
-       //fprintf(stderr,"cwr button : level=%d \n",level);
-   if (cw_keyer_internal == 0 ){
-      keyer_event(CWR_BUTTON, cw_active_level == 0 ? level : (level==0));
-   }
+    int level;
+    if (cw_keyer_internal != 0) return; // as quickly as possible
+    level=digitalRead(CWR_BUTTON);
+    //fprintf(stderr,"cwr button : level=%d \n",level);
+     keyer_event(CWR_BUTTON, cw_active_level == 0 ? level : (level==0));
 }
 
 #endif
index 5cd0307c1adf070cc8db7f8e565150276a7d1490..0f5bf4789184a76c310170fbdfe61ee10a1e51e4 100644 (file)
--- a/iambic.c
+++ b/iambic.c
@@ -78,6 +78,7 @@
 #include "new_protocol.h"
 #include "iambic.h"
 #include "transmitter.h"
+#include "ext.h"
 
 static void* keyer_thread(void *arg);
 static pthread_t keyer_thread_id;
@@ -122,6 +123,8 @@ static sem_t *cw_event;
 static sem_t cw_event;
 #endif
 
+static int cwvox = 0;
+
 int keyer_out = 0;
 
 // using clock_nanosleep of librt
@@ -158,14 +161,22 @@ void keyer_update() {
 void keyer_event(int gpio, int level) {
     int state = (level == 0);
 
-    // This is for aborting CAT CW messages if the key is hit.
     if (state) {
+        // This is for aborting CAT CW messages if the key is hit.
        cw_key_hit = 1;
+        // we do PTT as soon as possible ...
+        if (running && !cwvox) {
+          g_idle_add(ext_mox_update, (gpointer)(long) 1);
+           cwvox=(int) vox_hang;
+       }
     }
-    if (gpio == CWL_BUTTON)
+    if (gpio == CWL_BUTTON) {
         kcwl = state;
-    else  // CWR_BUTTON
+        //fprintf(stderr,"L=%d\n",state);   
+    } else { // CWR_BUTTON
         kcwr = state;
+        //fprintf(stderr,"R=%d\n",state);   
+    }
 
     if (state || cw_keyer_mode == KEYER_STRAIGHT) {
 #ifdef __APPLE__
@@ -189,7 +200,7 @@ void set_keyer_out(int state) {
        //         MOX before starting local CW.
         keyer_out = state;
         if(protocol==NEW_PROTOCOL) schedule_high_priority(9);
-               fprintf(stderr,"set_keyer_out keyer_out= %d\n", keyer_out);
+               //fprintf(stderr,"set_keyer_out keyer_out= %d\n", keyer_out);
         if (state) {
            // DL1YCF: we must call cw_hold_key in *any* case, else no
            //         CW signal will be produced. We certainly do not
@@ -222,9 +233,21 @@ fprintf(stderr,"keyer_thread  state running= %d\n", running);
 
         key_state = CHECK;
 
-        while (key_state != EXITLOOP) {
-            switch(key_state) {
+       // If MOX still hanging, continue spinnning/checking and decrement cwvox
+
+        while (key_state != EXITLOOP || cwvox > 0) {
+          if (cwvox > 0 && key_state != EXITLOOP && key_state != CHECK) cwvox=(int) vox_hang;
+         switch (key_state) {
+           case EXITLOOP:
+               if (cwvox >0) cwvox--;
+                if (cwvox == 0) {
+                   g_idle_add(ext_mox_update,(gpointer)(long) 0);
+               } else {
+                   key_state=CHECK;
+               }
+               break;
             case CHECK: // check for key press
+               if (cwvox > 1) cwvox--;
                 if (cw_keyer_mode == KEYER_STRAIGHT) {       // Straight/External key or bug
                     if (*kdash) {                  // send manual dashes
                         set_keyer_out(1);