From d19b5ad980abe006d270b34a321c0875c703d65b Mon Sep 17 00:00:00 2001
From: Ramakrishnan Muthukrishnan <ram@rkrishnan.org>
Date: Sun, 22 Oct 2023 13:09:52 +0530
Subject: [PATCH] rigctl: revamp NR command handling

There is no more ZZNS command. ZZNR handles NR/NR1/NR2/NR3.

ZZNR; => gets the status returns ZZNRx; where x is 0-4.
ZZNRx; where x is 0-4 sets one of NR/NR2/NR3/NR4 or nothing
---
 rigctl.c | 85 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 64 insertions(+), 21 deletions(-)

diff --git a/rigctl.c b/rigctl.c
index 4edd8fc..d453960 100644
--- a/rigctl.c
+++ b/rigctl.c
@@ -1987,32 +1987,75 @@ gboolean parse_extended_cmd(char *command, CLIENT *client) {
       case 'R': // ZZNR
           // set/read RX1 NR
           if (command[4] == ';') {
-              sprintf(reply, "ZZNR%d;", receiver[0]->nr);
+	      // reply with 0 if none of the NR/NR2/NR3/NR4 are off
+	      // or with 1 if nr is on, 2 if nr2 ...
+	      int nr_bitmap = (receiver[0]->nr << 0) |
+		  (receiver[0]->nr2 << 1) |
+		  (receiver[0]->nr3 << 2) |
+		  (receiver[0]->nr4 << 3);
+	      switch (nr_bitmap) {
+	      case 0:
+		  // none of the NR algorithms is set
+		  sprintf(reply, "ZZNR%d;", 0);
+		  break;
+	      case 1:
+		  // NR is set
+		  sprintf(reply, "ZZNR%d;", 1);
+		  break;
+	      case 2:
+		  // NR2 is set, others are off
+		  sprintf(reply, "ZZNR%d;", 2);
+		  break;
+	      case 4:
+		  // NR3 is set
+		  sprintf(reply, "ZZNR%d;", 3);
+		  break;
+	      case 8:
+		  // NR4 is set
+		  sprintf(reply, "ZZNR%d;", 4);
+		  break;
+	      }
               send_resp(client->fd, reply);
           } else if (command[5] == ';') {
-              receiver[0]->nr = atoi(&command[4]);
-              if (receiver[0]->nr) {
-                  receiver[0]->nr2 = 0;
-                  receiver[0]->nr3 = 0;
-                  receiver[0]->nr4 = 0;
-              }
+	      int nr_algo_set = atoi(&command[4]);
+	      switch (nr_algo_set) {
+	      case 0:
+		  // no NR is set
+		  receiver[0]->nr = 0;
+		  receiver[0]->nr2 = 0;
+		  receiver[0]->nr3 = 0;
+		  receiver[0]->nr4 = 0;
+		  break;
+	      case 1:
+		  receiver[0]->nr = 1;
+		  receiver[0]->nr2 = 0;
+		  receiver[0]->nr3 = 0;
+		  receiver[0]->nr4 = 0;
+		  break;
+	      case 2:
+		  receiver[0]->nr = 0;
+		  receiver[0]->nr2 = 1;
+		  receiver[0]->nr3 = 0;
+		  receiver[0]->nr4 = 0;
+		  break;
+	      case 3:
+		  receiver[0]->nr = 0;
+		  receiver[0]->nr2 = 0;
+		  receiver[0]->nr3 = 1;
+		  receiver[0]->nr4 = 0;
+		  break;
+	      case 4:
+		  receiver[0]->nr = 0;
+		  receiver[0]->nr2 = 0;
+		  receiver[0]->nr3 = 0;
+		  receiver[0]->nr4 = 1;
+		  break;
+	      }
               update_noise();
-          }
+	  }
           break;
       case 'S': // ZZNS
-          // set/read RX1 NR2
-          if (command[4] == ';') {
-              sprintf(reply, "ZZNS%d;", receiver[0]->nr2);
-              send_resp(client->fd, reply);
-          } else if (command[5] == ';') {
-              receiver[0]->nr2 = atoi(&command[4]);
-              if (receiver[0]->nr2) {
-                  receiver[0]->nr = 0;
-                  receiver[0]->nr3 = 0;
-                  receiver[0]->nr4 = 0;
-              }
-              update_noise();
-          }
+	  // No-op
           break;
       case 'T': // ZZNT
           // set/read RX1 ANF
-- 
2.45.2