]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
updated rigctl.c from Steve
authorJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Sun, 11 Dec 2016 22:28:15 +0000 (22:28 +0000)
committerJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Sun, 11 Dec 2016 22:28:15 +0000 (22:28 +0000)
rigctl.c

index 6292200492cb57031f7a1edb8dfcf92455c66d2f..736caa2da71823d343b15bda432d04fc1d32cae0 100644 (file)
--- a/rigctl.c
+++ b/rigctl.c
@@ -35,6 +35,7 @@
 #include "mode.h"\r
 #include "filter.h"\r
 #include "wdsp_init.h"\r
+#include "band.h"\r
 #include "bandstack.h"\r
 #include "vfo.h"\r
 #include "sliders.h"\r
@@ -45,7 +46,7 @@
 #include<sys/socket.h>\r
 #include<arpa/inet.h> //inet_addr\r
 \r
-#undef RIGCTL_DEBUG\r
+#define RIGCTL_DEBUG\r
 \r
 // the port client will be connecting to\r
 #define TELNET_PORT 19090  // This is the HAMLIB port\r
@@ -59,6 +60,9 @@ int rigctlGetFilterHigh();
 int rigctlSetFilterLow(int val);\r
 int rigctlSetFilterHigh(int val);\r
 int new_level;\r
+void parse_cmd ( char *,int );\r
+\r
+extern int enable_tx_equalizer;\r
 \r
 typedef struct com_list {\r
      char  cmd_string[80];\r
@@ -143,46 +147,65 @@ char * cmd_lookup (int index_num) {
 }\r
 \r
 static void * rigctl (void * arg) {\r
-   int work_int;     \r
    int len;\r
    init_server();\r
-   double meter;\r
    int save_flag = 0; // Used to concatenate two cmd lines together\r
+   int semi_number = 0;\r
+   int i;\r
+   char * work_ptr;\r
 \r
   for(;;) {\r
     fprintf(stderr,"RIGCTL - New run\n");\r
-    while((numbytes=recv(client_sock , cmd_input , 1000 , 0)) > 0 ) {\r
-       \r
-        if(cmd_input[numbytes-1] != ';') {  // Got here because the command line is short\r
+    while((numbytes=recv(client_sock , cmd_input , MAXDATASIZE-2 , 0)) > 0 ) {\r
+         cmd_input[numbytes+1]='\0'; // Turn into a C string\r
+         i=strlen(cmd_input);\r
+         #ifdef RIGCTL_DEBUG\r
+         fprintf(stderr,"RIGCTL: RCVD=%s  NB=%d LEN=%d\n",cmd_input,numbytes,i);\r
+         #endif\r
+        \r
+        // Need to handle two cases\r
+        // 1. Command is short, i.e. no semicolon - that will set save_flag=1 and\r
+        //    read another line..\r
+        // 2. 1 to N commands per line. Turns out N1MM sends multiple commands per line\r
+         \r
+        if(save_flag == 0) { // Count the number of semicolons if we aren't already in mode 1.\r
+          semi_number = 0;\r
+          for(i=0;i<numbytes;i++) {\r
+             if(cmd_input[i] == ';') { semi_number++;};\r
+          } \r
+        }\r
+        if((save_flag == 0) && (semi_number == 0)) {\r
            cmd_input[numbytes] = '\0';      // Turn it into a C string\r
            strcpy(cmd_save,cmd_input);      // And save a copy of it till next time through\r
            save_flag = 1;\r
-           #ifdef RIGCTL_DEBUG\r
-           fprintf(stderr,"RIGCTL: CMD_SAVE=%s  LEN=%d\n",cmd_save,numbytes);\r
-           #endif\r
         } else if(save_flag == 1) {\r
            save_flag = 0;\r
            cmd_input[numbytes] = '\0';      // Turn it into a C string\r
            strcat(cmd_save,cmd_input);\r
            strcpy(cmd_input,cmd_save);      // Cat them together and replace cmd_input\r
            numbytes = strlen(cmd_input);\r
-           #ifdef RIGCTL_DEBUG\r
-            fprintf(stderr,"RIGCTL: CMD_INPUT=%s LEN=%d\n",cmd_input,numbytes);\r
-           #endif\r
-        } else {\r
-           #ifdef RIGCTL_DEBUG\r
-           fprintf(stderr,"RIGCTL: CMD_NORM=%s  NUMBYTES=%d\n",cmd_input,numbytes);\r
-           #endif\r
+        } \r
+        if(save_flag != 1) {\r
+           work_ptr = strtok(cmd_input,";");\r
+           while(work_ptr != NULL) {\r
+               parse_cmd(work_ptr,strlen(work_ptr));\r
+               work_ptr = strtok(NULL,";");\r
+           }\r
         }\r
+       // Got here because pipe closed \r
+    }\r
+    if(numbytes == 0) {\r
+         fprintf(stderr,"RIGCTL: Client disconnected\n");\r
+         close(client_sock);\r
+         sleep(1);\r
+         client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);\r
+    }\r
+ }\r
+}\r
 \r
-        cmd_input[numbytes-1] = '\0';  // Turn it into a C string.\r
-        len = strlen(cmd_input);\r
-           #ifdef RIGCTL_DEBUG\r
-           fprintf(stderr,"RIGCTL: CMD_AFTER=%s  LEN=%d\n",cmd_input,len);\r
-           #endif\r
-        #ifdef RIGCTL_DEBUG\r
-        fprintf(stderr,"RIGCTL: RCVD=%s  LENGTH=%d\n",cmd_input,len);\r
-        #endif\r
+void parse_cmd ( char * cmd_input,int len) {\r
+        int work_int;     \r
+        double meter;\r
         // Parse the cmd_input\r
         //int space = command.indexOf(' ');\r
         //char cmd_char = com_head->cmd_string[0]; // Assume the command is first thing!\r
@@ -206,7 +229,7 @@ static void * rigctl (void * arg) {
                                                volume = (double) atoi(&cmd_input[3])/260; \r
                                                g_idle_add(update_af_gain,NULL);               \r
                                             } else { // Read Audio Gain\r
-                                              sprintf(msg,"AG0%03d;",2.6 * volume);\r
+                                              sprintf(msg,"AG0%03d;",(int) (2.6 * volume));\r
                                               send_resp(msg);\r
                                               #ifdef RIGCTL_DEBUG\r
                                               fprintf(stderr,":%s\n",msg);\r
@@ -242,7 +265,7 @@ static void * rigctl (void * arg) {
                                              // AS<P1><2xP2><11P3><P4>;\r
                                              // AS<P1><2xP2><11P3><P4>;\r
                                              if(len < 6) {  \r
-                                                sprintf(msg,"AS%1d%02d%011d%01d;",\r
+                                                sprintf(msg,"AS%1d%02d%011lld%01d;",\r
                                                              0, // P1\r
                                                              0, // Automode \r
                                                              getFrequency(),\r
@@ -336,7 +359,7 @@ static void * rigctl (void * arg) {
                                                g_idle_add(vfo_update,NULL);\r
                                             } else {\r
                                                if(len==2) {\r
-                                                  sprintf(msg,"FA%011d;",getFrequency());\r
+                                                  sprintf(msg,"FA%011lld;",getFrequency());\r
                                                   send_resp(msg);\r
                                                }\r
                                             }\r
@@ -347,7 +370,7 @@ static void * rigctl (void * arg) {
                                                setFrequency(new_freqA);\r
                                                g_idle_add(vfo_update,NULL);\r
                                             } else if(len == 2) {\r
-                                               sprintf(msg,"FB%011d;",getFrequency());\r
+                                               sprintf(msg,"FB%011lld;",getFrequency());\r
                                                send_resp(msg);\r
                                             }\r
                                          }\r
@@ -359,7 +382,7 @@ static void * rigctl (void * arg) {
                                                long long new_freqA = atoll(&cmd_input[2]);              \r
                                                //setFrequency(new_freqA);\r
                                             } else {\r
-                                               sprintf(msg,"FC%011d;",getFrequency());\r
+                                               sprintf(msg,"FC%011lld;",getFrequency());\r
 /*\r
                                                send_resp(msg);\r
 */\r
@@ -413,7 +436,7 @@ static void * rigctl (void * arg) {
                                             //   0           - 1 char - CTCSS tone - not used\r
                                             //   00          - 2 char - More tone control\r
                                             //   0           - 1 char - Shift status\r
-                                            sprintf(msg,"IF%011d%04d%06d%1d%1d%1d%02d%01d%01d%01d%01d%01d%01d%02d%01d;",\r
+                                            sprintf(msg,"IF%011lld%04d%06d%1d%1d%1d%02d%01d%01d%01d%01d%01d%01d%02d%01d;",\r
                                                          getFrequency(),\r
                                                          0,  // Shift Offset\r
                                                          0,  // Rit Freq\r
@@ -590,7 +613,7 @@ static void * rigctl (void * arg) {
                                              }\r
                                          }\r
         else if(strcmp(cmd_str,"MR")==0) {  // Read Memory Channel data\r
-                                             sprintf(msg,"MR%1d%02d%02d%011d%1d%1d%1d%02d%02d%03d%1d%1d%09d%02d%1d%08d;",\r
+                                             sprintf(msg,"MR%1d%02d%02d%011lld%1d%1d%1d%02d%02d%03d%1d%1d%09d%02d%1d%08d;",\r
                                                       0, // P1 - Rx Freq - 1 Tx Freq\r
                                                       0, // P2 Bankd and channel number -- see MC comment\r
                                                       0, // P3 - see MC comment \r
@@ -618,7 +641,20 @@ static void * rigctl (void * arg) {
                                          }\r
         else if(strcmp(cmd_str,"NB")==0) {  // Set/Read Noise Blanker func status (on/off)\r
                                              if(len <=2) {\r
-                                               send_resp("NB0;"); \r
+                                               sprintf(msg,"NB%1d;",snb);\r
+                                               send_resp(msg);\r
+                                             } else {\r
+                                               if(cmd_input[2]=='0') { // Turn off ANF\r
+                                                  snb=0;\r
+                                               } else { // Turn on ANF\r
+                                                  snb=1;\r
+                                               }\r
+                                               // Update ALL the filters\r
+                                               SetRXAANRRun(CHANNEL_RX0, nr);\r
+                                               SetRXAEMNRRun(CHANNEL_RX0, nr2);\r
+                                               SetRXAANFRun(CHANNEL_RX0, anf);\r
+                                               SetRXASNBARun(CHANNEL_RX0, snb);\r
+                                               g_idle_add(vfo_update,NULL);\r
                                              }\r
                                          }\r
         else if(strcmp(cmd_str,"NL")==0) {  // Set/Read Noise Reduction  Level\r
@@ -628,13 +664,50 @@ static void * rigctl (void * arg) {
                                          }\r
         else if(strcmp(cmd_str,"NR")==0) {  // Set/Read Noise Reduction function status\r
                                              if(len <=2) {\r
-                                               send_resp("NR0;"); \r
-                                             }\r
+                                               if(nr_none == 1) {\r
+                                                   send_resp("NR0;"); \r
+                                               } else if ((nr_none == 0) && (nr==1)) { \r
+                                                   send_resp("NR1;"); \r
+                                               } else if (nr2 == 1) { \r
+                                                   send_resp("NR2;"); \r
+                                               }\r
+                                             } else {\r
+                                               if(cmd_input[2] == '0') {\r
+                                                  nr_none = 1;\r
+                                                  nr = 0;\r
+                                                  nr2 = 0;\r
+                                               } else if(cmd_input[2] == '1') {\r
+                                                  nr_none = 0;\r
+                                                  nr = 1;\r
+                                                  nr2 = 0;\r
+                                               } else if(cmd_input[2] == '2') {\r
+                                                  nr_none = 0;\r
+                                                  nr = 0;\r
+                                                  nr2 = 1;\r
+                                             } \r
+                                             SetRXAANRRun(CHANNEL_RX0, nr_none);\r
+                                             SetRXAEMNRRun(CHANNEL_RX0, nr2);\r
+                                             SetRXAANFRun(CHANNEL_RX0, anf);\r
+                                             SetRXASNBARun(CHANNEL_RX0, snb);\r
+                                             g_idle_add(vfo_update,NULL);\r
+                                            }\r
                                          }\r
         else if(strcmp(cmd_str,"NT")==0) {  // Set/Read autonotch function\r
                                              if(len <=2) {\r
-                                               send_resp("NT0;"); \r
+                                               sprintf(msg,"NT%1d;",anf);\r
+                                               send_resp(msg);\r
+                                             } else {\r
+                                               if(cmd_input[2] == '0') { // Clear ANF\r
+                                                 anf = 0;\r
+                                               } else { // Set ANF\r
+                                                 anf = 1;\r
+                                               }\r
                                              }\r
+                                             SetRXAANRRun(CHANNEL_RX0, nr_none);\r
+                                             SetRXAEMNRRun(CHANNEL_RX0, nr2);\r
+                                             SetRXAANFRun(CHANNEL_RX0, anf);\r
+                                             SetRXASNBARun(CHANNEL_RX0, snb);\r
+                                             g_idle_add(vfo_update,NULL);\r
                                          }\r
         else if(strcmp(cmd_str,"OF")==0) {  // Set/Read Offset freq (9 digits - hz)\r
                                              if(len <=2) {\r
@@ -643,7 +716,7 @@ static void * rigctl (void * arg) {
                                          }\r
         else if(strcmp(cmd_str,"OI")==0) {  // Read Memory Channel Data\r
                                              if(len <=2) {\r
-                                               sprintf(msg,"OI%011d%04d%06d%1d%1d%1d%02d%1d%1d%1d%1d%1d%1d%02d%1d;",\r
+                                               sprintf(msg,"OI%011lld%04d%06d%1d%1d%1d%02d%1d%1d%1d%1d%1d%1d%02d%1d;",\r
                                                   getFrequency(),\r
                                                   0, // P2 - Freq Step size\r
                                                   0, // P3 - Rit/Xit Freq \r
@@ -656,8 +729,8 @@ static void * rigctl (void * arg) {
                                                   0, // P11 - SC command\r
                                                   0, // P12 Split op - SP command\r
                                                   0, // P13 Off, 1, 2, \r
-                                                  0, // P14 Tone freq - See TN command\r
-                                                  0);\r
+                                                  0,// P14 Tone freq - See TN command\r
+                                                  0,0);\r
                                                send_resp(msg);\r
                                              }\r
                                          }\r
@@ -668,7 +741,16 @@ static void * rigctl (void * arg) {
                                          }\r
         else if(strcmp(cmd_str,"PA")==0) {  // Set/Read Preamp function status\r
                                              if(len <=2) {\r
-                                               send_resp("PA00;"); \r
+                                               sprintf(msg,"PA0%1d;",enable_tx_equalizer);\r
+                                               send_resp(msg);\r
+                                             } else {\r
+                                                if(cmd_input[2] =='0') {\r
+                                                  enable_tx_equalizer=0;\r
+                                                  SetTXAEQRun(CHANNEL_TX, enable_tx_equalizer);\r
+                                                } else {\r
+                                                  enable_tx_equalizer=1;\r
+                                                  SetTXAEQRun(CHANNEL_TX, enable_tx_equalizer);\r
+                                                }\r
                                              }\r
                                          }\r
         else if(strcmp(cmd_str,"PB")==0) {  // Set/Read DRU-3A Playback status\r
@@ -825,22 +907,35 @@ static void * rigctl (void * arg) {
                                          }\r
         else if(strcmp(cmd_str,"SL")==0) {  // Set/read the DSP filter settings - this appears twice? See SH\r
                                              if(len <=2) {\r
-                                               send_resp("SL00;"); \r
-                                             }\r
+                                               send_resp("SL00;");\r
+                                             } \r
                                          }\r
         else if(strcmp(cmd_str,"SM")==0) {  // Read SMETER\r
                                             // SMx;  x=0 RX1, x=1 RX2 \r
                                             // meter is in dbm - value will be 0<260\r
                                             // Translate to 00-30 for main, 0-15 fo sub\r
                                             // Resp= SMxAABB; \r
-                                            // \r
+                                            //  Received range from the SMeter can be -127 for S0, S9 is -73, and S9+60=-13.;\r
+                                            //  PowerSDR returns S9=0015 code. \r
+                                            //  Let's make S9 half scale or a value of 70.  \r
                                             double level;\r
                                             level = GetRXAMeter(CHANNEL_RX0, smeter); \r
-                                            level = level + (double) get_attenuation();\r
-                                            level = level + 90;\r
-                                            new_level = (int) (level)/2;            \r
-                                            if(new_level < 0) { new_level = 0; }\r
-                                            if(new_level > 30) { new_level = 30;}\r
+                                            // Determine how high above 127 we are..making a range of 114 from S0 to S9+60db\r
+                                            // 5 is a fugdge factor that shouldn't be there - but seems to get us to S9=SM015\r
+                                            level =  abs(127+(level + (double) get_attenuation()))+5;\r
+                                         \r
+                                            // Clip the value just in case\r
+                                            if(cmd_input[2] == '0') { \r
+                                               new_level = (int) ((level * 30.0)/114.0);\r
+                                               // Do saturation check\r
+                                               if(new_level < 0) { new_level = 0; }\r
+                                               if(new_level > 30) { new_level = 30;}\r
+                                            } else { //Assume we are using sub receiver where range is 0-15\r
+                                               new_level = (int) ((level * 15.0)/114.0);\r
+                                               // Do saturation check\r
+                                               if(new_level < 0) { new_level = 0; }\r
+                                               if(new_level > 15) { new_level = 15;}\r
+                                            }\r
                                             #ifdef RIGCTL_DEBUG\r
                                             fprintf(stderr,"RIGCTL: SM level=%.21f new_level=%d\n",\r
                                                         level,new_level);\r
@@ -953,9 +1048,9 @@ static void * rigctl (void * arg) {
                                                #endif\r
                                             } else {\r
                                                if(digl_pol==1) { // Nah - its a read\r
-                                                 sprintf(msg,"RL1%04d;");\r
+                                                 sprintf(msg,"RL1%04d;",0);\r
                                                } else {\r
-                                                 sprintf(msg,"RL0%04d;");\r
+                                                 sprintf(msg,"RL0%04d;",0);\r
                                                }         \r
                                                send_resp(msg);\r
                                                #ifdef RIGCTL_DEBUG\r
@@ -974,9 +1069,9 @@ static void * rigctl (void * arg) {
                                                #endif\r
                                             } else {\r
                                                if(digl_pol==1) { // Nah - its a read\r
-                                                 sprintf(msg,"RL1%04d;");\r
+                                                 sprintf(msg,"RL1%04d;",0);\r
                                                } else {\r
-                                                 sprintf(msg,"RL0%04d;");\r
+                                                 sprintf(msg,"RL0%04d;",0);\r
                                                }         \r
                                                send_resp(msg);\r
                                                #ifdef RIGCTL_DEBUG\r
@@ -987,17 +1082,11 @@ static void * rigctl (void * arg) {
         else                             {\r
                                             fprintf(stderr,"RIGCTL: UNKNOWN\n");\r
                                          }\r
-   } \r
-    // Got here because pipe closed \r
-   if(numbytes == 0) {\r
-         fprintf(stderr,"RIGCTL: Client disconnected\n");\r
-         close(client_sock);\r
-         sleep(1);\r
-         client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);\r
-   }\r
- }\r
 }\r
-\r
+//\r
+// End of Parser\r
+// \r
+/*\r
 char * rigctlGetFilter()\r
 {\r
    \r
@@ -1013,7 +1102,7 @@ char * rigctlGetFilter()
     else\r
     return (char *) (getFilterHigh() - getFilterLow());\r
 }\r
-\r
+*/\r
 \r
 void launch_rigctl () {\r
    int err;\r
@@ -1071,7 +1160,7 @@ int init_server () {
     }\r
     fprintf(stderr,"RIGCTL: Connection accepted\n");\r
 }\r
-\r
+/*\r
 int rigctlGetFilterLow() {\r
    int lookup;\r
    int rval;\r
@@ -1109,6 +1198,7 @@ int rigctlGetFilterHigh() {
    }\r
    return rval;\r
 }\r
+*/\r
 int rigctlGetMode()  {\r
         BANDSTACK_ENTRY *entry;\r
         entry= (BANDSTACK_ENTRY *) \r