#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
#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
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
}\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
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
// 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
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
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
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
// 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
}\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
}\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
}\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
}\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
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
}\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
}\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
#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
#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
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
else\r
return (char *) (getFilterHigh() - getFilterLow());\r
}\r
-\r
+*/\r
\r
void launch_rigctl () {\r
int err;\r
}\r
fprintf(stderr,"RIGCTL: Connection accepted\n");\r
}\r
-\r
+/*\r
int rigctlGetFilterLow() {\r
int lookup;\r
int rval;\r
}\r
return rval;\r
}\r
+*/\r
int rigctlGetMode() {\r
BANDSTACK_ENTRY *entry;\r
entry= (BANDSTACK_ENTRY *) \r