OSDN Git Service

[v2.0] Update gitlog.
[openi2cradio/OpenI2CRadio.git] / menu.c
diff --git a/menu.c b/menu.c
index d61b38d..523e996 100644 (file)
--- a/menu.c
+++ b/menu.c
  */
 
 #include "menu.h"
+#include "menu_memoryfreq.h"
 #include "power.h"
+#include "commondef.h"
+#include "backlight.h"
 
 void toggle_amfm(void)
 {
-    if(fm != 0){
-        fm = 0;
-        akc6955_chg_fm(fm);
-        akc6955_set_amband(amband);
-        akc6955_set_freq(amfreq);
+    unsigned int freq;
+    if(setup.fm != 0){
+        setup.fm = 0;
+        setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
+  //      akc6955_set_amband(amband);
+        freq = setup.amfreq_bank[setup.amband];
     } else {
-        fm = 0xff;
-        akc6955_chg_fm(fm);
-        akc6955_set_fmband(fmband);
-        akc6955_set_freq(fmfreq);
+        setup.fm = 0xff;
+        setup.amfreq_bank[setup.amband] = setup.amfreq;
+//        akc6955_set_fmband(fmband);
+        freq = setup.fmfreq_bank[setup.fmband];
     }
+    akc6955_chg_fm(setup.fm, freq);
+    idle_time_ms(500);
+//    akc6955_set_freq(freq);
 }
 
-void set_thresh(void)
-{
-    unsigned char c;
-    unsigned char a;
-    a = 0;
-    _CLS();
-    _LOCATE(0,0);
-    printstr("CNR Threshold");
-    _LOCATE(4,0);
-    printstr("FM Tun");
-    _LOCATE(0,1);
-    printstr("1-4 F=exit");
-    do {
-        c = pollkey_single();
-        if(c == charcode_f) return;
-    } while((c < charcode_1) && (c>charcode_4));
-    a |= ((c - charcode_1) << 6);
-    _LOCATE(4,0);
-    printstr("AM Tun");
-    do {
-        c = pollkey_single();
-        if(c == charcode_f) return;
-    } while((c < charcode_1) && (c>charcode_4));
-    a |= ((c - charcode_1) << 4);
-    _LOCATE(4,0);
-    printstr("Diff  ");
-    do {
-        c = pollkey_single();
-        if(c == charcode_f) return;
-    } while((c < charcode_1) && (c>charcode_4));
-    a |= ((c - charcode_1) << 2);
-    _LOCATE(4,0);
-    printstr("Stereo");
-    do {
-        c = pollkey_single();
-        if(c == charcode_f) return;
-    } while((c < charcode_1) && (c>charcode_4));
-    a |= (c - charcode_1);
-    akc6955_writecmd(AKC6955_THRESH, a);
-}
+
 
 void set_stereomode(void)
 {
-    unsigned char mode = 0x00;
-    switch(stereo){
-        case 0x00:
-            mode = 0b00000001; // Force mono
-            break;
-        case 0xff:
-            mode = 0x00000000;
-            break;
-        default:
-            mode = 0b00000010; // Force stereo
-            break;
+    __bitops_t mode;
+    mode.byte = 0x00;
+    if(setup.stereo == 0x00){
+            mode.b0 = 1; // Force mono
+    } else if(setup.stereo < 0x80){
+            mode.b1 = 1; // Force stereo
     }
-    akc6955_set_stereomode(mode);
+    akc6955_set_stereomode(mode.byte);
 }
 
 void set_stereo(void)
 {
-    if(stereo == 0xff) {// Force Mono
-        stereo = 0x00;
-    } else if(stereo == 0x00) { //Mono->Stereo
-        stereo = 0x7f;
+    
+    if(setup.stereo == 0xff) {// Force Mono
+        setup.stereo = 0x00;
+    } else if(setup.stereo == 0x00) { //Mono->Stereo
+        setup.stereo = 0x7f;
     } else { // Default, Stereo->auto
-        stereo = 0xff;
+        setup.stereo = 0xff;
     }
     set_stereomode();
 }
@@ -119,119 +83,131 @@ void set_volume(void)
 {
     unsigned char c;
     unsigned char d;
-    unsigned char p;
+    unsigned char fact;
+    unsigned char dispf = 0xff;
 
     _CLS();
     do {
-     d = akc6955_getvolumemode();
+        if(dispf != 0) {
+            _LOCATE(0,0);
+             d = akc6955_getvolumemode();
+            if(d == 0){
+                 _PUTCHAR('D');
+            } else {
+                 _PUTCHAR('K');
+            }
+            printstr(" Vol:");
+            print_numeric_nosupress(setup.volume, 2);
+            printstr("  F:Exit");
+            _LOCATE(0,1);
+            printstr("Pre:");
+            _PUTCHAR('0' + (setup.prevolume & 3));
+            _LOCATE(16-4, 1);
+            if(setup.lowboost == 0x00){
+                 printstr("   ");
+            } else {
+                 printstr("LOW");
+         }
+            _HOME();
+        }
+     c = pollkey_single_timeout(41, 1); // 943ms
+     backlight_reset(c);
+     dispf = backlight_dec(dispf);
 
-      _LOCATE(0,0);
-      if(d == 0){
-         _PUTCHAR('D');
-       } else {
-         _PUTCHAR('K');
-       }
-     printstr(" F:Exit");
-     _LOCATE(0,1);
-     printstr("Vol:");
-     print_numeric_nosupress(volume, 2);
-     printstr(" Pre:");
-     _PUTCHAR('0' + (prevolume & 3));
-     if(lowboost == 0x00){
-         printstr("    ");
-     } else {
-         printstr(" LOW");
-     }
-     c = pollkeys(pollkeybuf, 60, 1);
-     p = 0;
-     while(c > 0) {
-    _LOCATE(0,1);
-         switch(pollkeybuf[p]) {
+     switch(c) {
              case charcode_6:
-                 volume++;
-                 if(volume > 63) volume = 63;
+                 setup.volume++;
+                 if(setup.volume > 63) setup.volume = 63;
+                 akc6955_setvolume(setup.volume);
                  break;
              case charcode_4:
-                 volume--;
-                 if(volume < 23) volume = 23;
+                 setup.volume--;
+                 if(setup.volume < 23) setup.volume = 23;
+                 akc6955_setvolume(setup.volume);
                  break;
              case charcode_f:
+                 _CLS();
                  return;
              case charcode_a:
-                 if(d == 0){
-                     akc6955_setvolumemode(0xff);
-                 } else {
-                     akc6955_setvolumemode(0x00);
+                 fact = 0xff;
+                 if(d != 0){
+                     fact = 0x00;
                  }
+                 akc6955_setvolumemode(fact);
+                 akc6955_setvolume(setup.volume);
                  break;
              case charcode_b:
-                 prevolume++;
-                 if(prevolume > 3) prevolume = 0;
-                 akc6955_set_prevolume(prevolume);
+                 setup.prevolume++;
+                 if(setup.prevolume > 3) setup.prevolume = 0;
+                 akc6955_set_prevolume(setup.prevolume);
+                 akc6955_setvolume(setup.volume);
                  break;
              case charcode_d:
-                 if(lowboost == 0x00){
-                     lowboost = 0xff;
-                 } else {
-                     lowboost = 0x00;
+                 fact = 0x00;
+                 if(setup.lowboost == 0x00){
+                     fact = 0xff;
                  }
-                 akc6955_set_lowboost(lowboost);
+                 setup.lowboost = fact;
+                 akc6955_set_lowboost(setup.lowboost);
+                 akc6955_setvolume(setup.volume);
                  break;
              default:
                  break;
          }
-         c--;
-         p++;
+         if(setup.volume < 24){
+             set_examp_mute(1);
+        } else {
+             set_examp_mute(0);
         }
-     if(volume < 24){
-         set_examp_mute(1);
-     } else {
-         set_examp_mute(0);
-     }
-     akc6955_setvolume(volume);
+        idle_time_ms(9); // Pad.
     } while(1);
 }
 
+
 void scan_start(void)
 {
     unsigned char c;
-
+    unsigned char cc;
+    unsigned char n;
+    _CLS();
+    scanflag = 0;
     do {
-        _CLS();
-        _LOCATE(0,0);
-        printstr("Scan A/U=6/D=4");
-        print_freq(1);
-        c = pollkey_single();
-        if(scanflag == 0){
-            scanflag = 0xff;
-        } else {
-            if((c == charcode_a) || (c == charcode_4) || (c == charcode_6)) {
-                akc6955_abort_scan();
-                idle_time_62_5ms();
+        do {
+             c = pollkey_single_timeout(20, 0) ; // 23*20 = 460ms
+             if(chk_powerbutton() != 0) shutdown(1);
+            update_status();
+            cc = ' ';
+            if((akc6955_chk_donescan() == 0) && (scanflag != 0)){
+                cc = '>';
             }
-        }
-       // New Scan
-       if(c == charcode_6){
-           akc6955_do_scan(0xff);
-       } else if(c == charcode_4){
-           akc6955_do_scan(0);
-       } else if(c == charcode_a){
-           break;
-       } else {
-              // Not Exit
-//           break;
-       }
-       scanflag = 0xff;
-
-       if(akc6955_chk_donescan() != 0) {
-           _CLS();
-           _LOCATE(0,0);
-           printstr("Scan completed");
-           print_freq(1);
-           idle_time_ms(ui_idlecount);
+            _PUTCHAR(cc);
+            printstr("Scan A/4/6/F");
+            print_freq(1);
+            _HOME();
+        } while(c == charcode_null);
+      // New Scan
+       switch(c){
+           case charcode_6:
+               scanflag = 0xff;
+               akc6955_do_scan(0xff);
+               break;
+           case charcode_4:
+               scanflag = 0xff;
+               akc6955_do_scan(0);
+               break;
+           case charcode_a:
+               akc6955_abort_scan();
+               goto _l0;
+               break;
+           case charcode_f:
+               goto _l0;
+               break;
+           default:
+               break;
        }
     } while(1);
-    scanflag=0;
+_l0:
+    _CLS();
 }
 
 void setfreq_direct(void)
@@ -241,18 +217,18 @@ void setfreq_direct(void)
     _LOCATE(0,0);
     printstr("Set Freq:");
     _LOCATE(0,1);
-    if(fm != 0){
+    if(setup.fm != 0){
         // FM
         printstr("FM ");
-        val = fmfreq;
+        val = setup.fmfreq;
         val = read_numeric(val, 5, 7, 1);
-        fmfreq = val;
+        setup.fmfreq = val;
     } else {
         // FM
         printstr("AM ");
-        val = amfreq;
+        val = setup.amfreq;
         val = read_numeric(val, 5, 7, 1);
-        amfreq = val;
+        setup.amfreq = val;
     }
     akc6955_set_freq(val);
 }
@@ -260,50 +236,96 @@ void setfreq_direct(void)
 void setband_direct(void)
 {
     unsigned int band;
+    unsigned int freq;
     _CLS();
     _LOCATE(0,0);
-    if(fm != 0){
+    if(setup.fm != 0){
         printstr("Set Band:FM#");
-        band = fmband & 7;
-        fmband = read_numeric(band, 2, 7, 1);
-        akc6955_set_fmband(fmband);
-        akc6955_do_tune();
+        band = setup.fmband & 7;
+        setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
+        setup.fmband = read_numeric(band, 2, 7, 1);
+        setup.fmfreq = setup.fmfreq_bank[setup.fmband];
+        akc6955_set_fmband(setup.fmband);
+        freq = setup.fmfreq;
     } else {
         printstr("Set Band:AM#");
-        band = amband & 0x1f;
-        amband = read_numeric(band, 2, 7, 1);
-        akc6955_set_amband(amband);
-        akc6955_do_tune();
+        band = setup.amband & 0x1f;
+        setup.amfreq_bank[setup.amband] = setup.amfreq;
+        setup.amband = read_numeric(band, 2, 7, 1);
+        setup.amfreq = setup.amfreq_bank[setup.amband];
+        switch(band) {
+        case AKC6955_BAND_LW:
+        case AKC6955_BAND_MW2:
+          setup.am_mode3k = 0xff;
+          break;
+        case AKC6955_BAND_MW1:
+        case AKC6955_BAND_MW3:
+        case AKC6955_BAND_MW4:
+          setup.am_mode3k = 0x00;
+          break;
+        default:
+          break;
+       }
+       
+        akc6955_set_amband(setup.amband);
+        freq = setup.amfreq;
     }
+    akc6955_do_tune();
+    akc6955_set_freq(freq);
 }
 
 void call_userband(unsigned char num)
 {
     unsigned int freq;
     unsigned int ch;
+    unsigned char start;
+    unsigned char end;
+    unsigned char mode3k;
+    unsigned char freq2;
+    _userband_t *p;
+
     if(num >= USER_BAND_NUM) return;
-    if(fm != 0){
-        freq = fm_usrbands[num].freq;
-        ch = ((freq - 3000) / 25) * 10;
-        akc6955_set_userband(fm_usrbands[num].start, fm_usrbands[num].stop, ch,
-                            fm_usrbands[num].mode3k);
-        fmband = AKC6955_BAND_AMUSER;
+    
+    p = &(setup.am_usrbands[num]);
+    if(setup.fm != 0){
+        p = &(setup.fm_usrbands[num]);
+    }
+    freq = p->freq;
+    start = p->start;
+    end = p->stop;
+    mode3k = p->mode3k;
+    if(setup.fm != 0) {
+        ch = ((freq - 3000) / 5) * 2;
+        setup.fmband = AKC6955_BAND_FMUSER;
     } else {
-        unsigned int p = 5;
-        if(am_usrbands[num].mode3k != 0) p = 3;
-        freq = am_usrbands[num].freq;
-        ch = freq / p;
-        akc6955_set_userband(am_usrbands[num].start, am_usrbands[num].stop, ch,
-                            am_usrbands[num].mode3k);
-        amband = AKC6955_BAND_AMUSER;
+        unsigned int q = 5;
+        if(mode3k != 0) q = 3;
+        ch = freq / q;
+        setup.amband = AKC6955_BAND_AMUSER;
+    }
+
+    if(start > end) {
+        unsigned char tmp;
+        tmp = start;
+        start = end;
+        end = tmp;
     }
+    
+    freq2 = ch / 32;
+    if(freq2 > end) {
+        ch = end * 32;
+    }
+    if(freq2 < start){
+        ch = start * 32;
+    }
+    akc6955_set_userband(start, end, ch, mode3k);
 }
 
 void set_userband(void)
 {
     unsigned int from,to;
     unsigned char c;
-    unsigned char p;
+    unsigned char pp;
     unsigned char mode3k;
     char cc;
 
@@ -320,28 +342,31 @@ void set_userband(void)
         c = c - charcode_1 + 1;
     }
     if(c >= USER_BAND_NUM) return;
-    if(fm != 0){
-        from = fm_usrbands[c].start * 80 + 3000; // 32*25/10
-        to = fm_usrbands[c].stop * 80 + 3000;
+
+    if(setup.fm != 0){
+        from = setup.fm_usrbands[c].start * 80 + 3000; // 32*25/10
+        to = setup.fm_usrbands[c].stop * 80 + 3000;
         _CLS();
         _LOCATE(0,0);
+        _LOCATE(0,0);
         printstr("FM#");
         print_numeric_nosupress(c, 1);
+        _LOCATE(0,1);
         printstr(" From:");
         from = read_numeric(from, 5, 7, 1);
-        _LOCATE(6,1);
-        printstr("To:");
+        _LOCATE(0,1);
+        printstr(" To:  ");
         to = read_numeric(to, 5, 7, 1);
-        fm_usrbands[c].start = (from - 3000) / 80;
-        fm_usrbands[c].stop = (to - 3000) / 80;
-        fm_usrbands[c].freq = from * 80 + 3000;
-        fm_userbandnum = c;
+        setup.fm_usrbands[c].start = (from - 3000) / 80;
+        setup.fm_usrbands[c].stop = (to - 3000) / 80;
+        setup.fm_usrbands[c].freq = from * 80 + 3000;
+        setup.fm_userbandnum = c;
     } else {
-        mode3k = am_usrbands[c].mode3k;
-        p = 96; // 3*32
-        if(mode3k == 0) p = 160; // 5*32
-        from = am_usrbands[c].start * p;
-        to = am_usrbands[c].stop * p;
+        mode3k = setup.am_usrbands[c].mode3k;
+        pp = 96; // 3*32
+        if(mode3k == 0) pp = 160; // 5*32
+        from = setup.am_usrbands[c].start * pp;
+        to = setup.am_usrbands[c].stop * pp;
         _CLS();
         _LOCATE(0,0);
         printstr("AM#");
@@ -351,153 +376,67 @@ void set_userband(void)
         printstr("0=3k 1=5k");
         cc = pollkey_single();
         if(cc == charcode_0){
-            p = 96;
+            pp = 96;
             mode3k = 0xff;
         } else if(cc = charcode_1) {
-            p = 160;
+            pp = 160;
             mode3k = 0;
         }
         _CLS();
         _LOCATE(0,0);
         printstr("AM#");
         print_numeric_nosupress(c, 1);
+        _LOCATE(0,1);
         printstr(" From:");
         from = read_numeric(from, 5, 7, 1);
-        _LOCATE(6, 1);
-        printstr(" To:");
+        _LOCATE(0,1);
+        printstr(" To:  ");
         to = read_numeric(to, 5, 7, 1);
-        am_usrbands[c].start = from / p;
-        am_usrbands[c].stop = to  / p;
-        am_usrbands[c].mode3k = mode3k;
-        am_usrbands[c].freq = from * p;
-        am_userbandnum = c;
+        setup.am_usrbands[c].start = from / pp;
+        setup.am_usrbands[c].stop = to  / pp;
+        setup.am_usrbands[c].mode3k = mode3k;
+        setup.am_usrbands[c].freq = from * pp;
+        setup.am_userbandnum = c;
     }
     call_userband(c);
+    _CLS();
 }
 
 void input_userband(void)
 {
     unsigned char c;
     do{
-    _CLS();
-    _LOCATE(0,0);
-    printstr("User Band");
-    _LOCATE(0,1);
-    printstr("   #");
-    c = pollkey_single();
+      c = printhelp_2lines("User Band", "   #");
 
-    if((c >= charcode_a) && (c <= charcode_f)){
-        break;
-    }
-    if(c == charcode_0) {
-        _PUTCHAR('0');
-        if(fm != 0){
-           fm_userbandnum = 0;
-        } else {
-           am_userbandnum = 0;
-        }
-        call_userband(0);
-    } else {
-        c = c - charcode_1 + 1;
-        if(c < USER_BAND_NUM) {
-            _PUTCHAR(c + '0');
-            if(fm != 0){
-               fm_userbandnum = c;
+
+       if((c >= charcode_a) && (c <= charcode_f)){
+         break;
+       }
+       if(c == charcode_0) {
+         _PUTCHAR('0');
+         if(setup.fm != 0){
+            setup.fm_userbandnum = 0;
+         } else {
+            setup.am_userbandnum = 0;
+         }
+         call_userband(0);
+       } else {
+         c = c - charcode_1 + 1;
+         if(c < USER_BAND_NUM) {
+            _PUTCHAR(c + '0');
+            if(setup.fm != 0){
+               setup.fm_userbandnum = c;
             } else {
-                am_userbandnum = c;
+               setup.am_userbandnum = c;
             }
             call_userband(c);
         }
-    }
-    idle(ui_idlecount);
+       }
+       idle(setup.ui_idlecount);
     } while(1);
     _CLS();
 }
 
-unsigned char printhelp_2lines(char *l1, char *l2)
-{
-    _CLS();
-    _LOCATE(0,0);
-    printstr(l1);
-    _LOCATE(0,1);
-    printstr(l2);
-    _HOME();
-    return pollkey_single();
-}
-
-unsigned char numeric_help(void)
-{
-    unsigned char c;
-    c = printhelp_2lines("On numeric input", " ");
-    if(c == charcode_f) return c;
-    c = printhelp_2lines("0-9: Numeric", "f: enter");
-    if(c == charcode_f) return c;
-    c = printhelp_2lines("a: Delete", "b: Reset value");
-    if(c == charcode_f) return c;
-    c = printhelp_2lines("d: Left", "e: Right");
-    if(c == charcode_f) return c;
-    c = printhelp_2lines("Press any key", " to continue.");
-    return c;
-}
-
-void mainmenu_help(void)
-{
-    unsigned char c;
-    
-    do {
-        c = printhelp_2lines("Help", "F=exit any=continue");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("0: Setup", "1: Reserve");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("2: Band", "3: Freq");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("4: Reserve", "5: Scan");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("6: Gain", "7: Volume");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("8: FM Wide/Narrow", "9: NF");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("a: PowOFF", "b: Cancel");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("c: Set user", "d: Input user");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("e: AM/FM", "f: (Exit) Help");
-        if(c == charcode_f) return;
-        c = numeric_help();
-        if(c == charcode_f) return;
-
-    } while(1);
-}
-
-void updown_help(void)
-{
-    unsigned char c;
-
-    do {
-        c = printhelp_2lines("Help", "F=exit any=continue");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("5: Menu", " ");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("1: Slow Down", "3: Slow Up");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("4: Down", "6: Up");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("7: Fast Down", "9: Fast Up");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("2: Band Down", "8: Band Up");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("0: Mode3K", " ");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("a: AM/FM", "b: Volume");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("c: Scan", "d: Stereo mode");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("e: Backlight", "f: (Exit) Help");
-        if(c == charcode_f) return;
-        c = numeric_help();
-        if(c == charcode_f) return;
-    } while(1);
-}
 
 void menu_poweroff(void)
 {
@@ -510,23 +449,29 @@ void menu_poweroff(void)
 
 void setup_akc6955(void)
 {
-    akc6955_chg_fm(fm); // Set to AM
-
-    if(fm == 0) {
-        akc6955_set_amband(amband);
-        if(amband == AKC6955_BAND_AMUSER) call_userband(am_userbandnum);
-        amfreq = amfreq_bank[amband];
-        akc6955_set_freq(amfreq);
+    akc6955_writecmd(AKC6955_POWER, 0xc0);  // You musto *not* mute, set b2 to '0".
+    akc6955_writecmd(AKC6955_VOLUME, 0xc0); // You must select to radio(b1 = '0).
+    if(setup.fm == 0) {
+        akc6955_set_amband(setup.amband);
+        if(setup.amband == AKC6955_BAND_AMUSER) call_userband(setup.am_userbandnum);
+        setup.amfreq = setup.amfreq_bank[setup.amband];
+        akc6955_chg_fm(0, setup.amfreq); // Set to AM
+        akc6955_set_freq(setup.amfreq);
     } else {
-        akc6955_set_fmband(fmband);
-        if(fmband == AKC6955_BAND_FMUSER) call_userband(fm_userbandnum);
-        fmfreq = fmfreq_bank[fmband];
-        akc6955_set_freq(fmfreq);
+        akc6955_set_fmband(setup.fmband);
+        if(setup.fmband == AKC6955_BAND_FMUSER) call_userband(setup.fm_userbandnum);
+        setup.fmfreq = setup.fmfreq_bank[setup.fmband];
+        akc6955_chg_fm(0xff, setup.fmfreq); // Set to AM
+        akc6955_set_freq(setup.fmfreq);
     }// Dummy, TBS (954KHz)
-    //akc6955_set_power(0xff); // Power ON
+    akc6955_set_power(0xff); // Power ON
     akc6955_setvolume(36); // Temporally
-    akc6955_writecmd(AKC6955_THRESH, threshold);
-    akc6955_set_lowboost(lowboost);
+    akc6955_set_thresh_fmcnr(setup.threshold_fmcnr);
+    akc6955_set_thresh_amcnr(setup.threshold_amcnr);
+    akc6955_set_thresh_width(setup.threshold_width);
+    akc6955_set_thresh_fmstereo(setup.threshold_fmstereo);
+    akc6955_setvolumemode(0);
+    akc6955_set_lowboost(setup.lowboost);
     set_stereomode();
 }
 
@@ -561,59 +506,81 @@ void menu_load(void)
     }
 }
 
-void setup_help(void)
-{
-    unsigned char c;
-
-    do {
-        c = printhelp_2lines("Help", "F=exit any=continue");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("0: Power OFF", "C: Save status");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("d: Reset default", "E: BL time");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("A: Load", "2: Threshold");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("3: Reserve", "4: Reserve");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("6: Reserve", "7: Reserve");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("8: Reserve", "9: Reserve");
-        if(c == charcode_f) return;
-        c = printhelp_2lines("5: Cancel", "f: (Exit) Help");
-        if(c == charcode_f) return;
-        c = numeric_help();
-        if(c == charcode_f) return;
-    } while(1);
-    
-}
 void setup_menu(void)
 {
     unsigned char c;
+    unsigned int val;
 
     c = printhelp_2lines("Setup F=HELP", "5=Return");
     switch(c){
-        case charcode_f:
-            setup_help();
+        case charcode_3:
+            _CLS();
+            _LOCATE(0,0);
+            printstr("BL Level:");
+            val = read_numeric(setup.backlight_level, 3, 0,1);
+            if(val > 255) val = 255;
+            if(val < 10) val = 15;
+            setup.backlight_level = (unsigned char)val;
+            break;
+        case charcode_4:
+            _CLS();
+            _LOCATE(0,0);
+            printstr("FM Bandwidth:");
+            akc6955_get_fmbandwidth(val);
+            val = read_numeric(val, 1, 0, 1) & 3;
+            setup.fmbandwidth = (unsigned char)val;
+            akc6955_set_fmbandwidth(setup.fmbandwidth);
             break;
         case charcode_5:
             break;
+        case charcode_7:
+            _CLS();
+            _LOCATE(0,0);
+            printstr("FM-CNR threshold:");
+            val = setup.threshold_fmcnr;
+            val = read_numeric(val, 1, 0, 1);
+            akc6955_set_thresh_fmcnr((unsigned char)val);
+            break;
+        case charcode_8:
+            _CLS();
+            _LOCATE(0,0);
+            printstr("AM-CNR threshold:");
+            val = setup.threshold_amcnr;
+            val = read_numeric(val, 1, 0, 1);
+            akc6955_set_thresh_amcnr((unsigned char)val);
+            break;
+        case charcode_9:
+            _CLS();
+            _LOCATE(0,0);
+            printstr("Stereo threshold:");
+            val = setup.threshold_fmstereo;
+            val = read_numeric(val, 1, 0, 1);
+            akc6955_set_thresh_fmstereo((unsigned char)val);
+            break;
         case charcode_0:
             menu_poweroff();
             break;
-        case charcode_c:
-            menu_save();
-            break;
         case charcode_a:
             menu_load();
             break;
+        case charcode_c:
+            menu_save();
+            break;
         case charcode_d:
             setdefault();
             break;
         case charcode_e:
+            _CLS();
+            _LOCATE(0,0);
+            printstr("BL Long:");
+            val = read_numeric(setup.backlight_long, 3, 0,1);
+            if(val > 999) val = 999;
+            setup.backlight_long = val;
+            break;
+        case charcode_f:
+            setup_help();
             break;
-        case charcode_2:
-            set_thresh();
+        default:
             break;
     }
 }
@@ -623,62 +590,52 @@ void setup_menu(void)
 void main_menu(void)
 {
     unsigned char c;
-    unsigned char p;
-    unsigned char n;
-    _CLS();
-    _HOME();
-    _LOCATE(0,0);
-    printstr("Menu:F=HELP");
-    _LOCATE(0,1);
-    printstr("B=CANCEL");
-       do {
-           n = pollkeys(pollkeybuf, 60, 1);
-       } while(n == 0);
-       p = 0;
-       c = pollkeybuf[0];
-        if(c == charcode_f){
-            mainmenu_help();
-            // HELP
-        } else if(c == charcode_b){
-            // Cancel
-        } else if(c == charcode_1){
-            
-        } else if(c == charcode_2){
+    unsigned int val;
+
+    printhelp_2lines("Menu:F=HELP", "B=CANCEL");
+    c = pollkey_single(); // 1012ms
+        if(c == charcode_1){
             // Band
             setband_direct();
         } else if(c == charcode_3){
             // Band
             setfreq_direct();
-        } else if(c == charcode_a){
-            menu_poweroff();
-        } else if(c == charcode_5){
-            scan_start();
+        }else if(c == charcode_4){
+            on_call_userfreq();
+            // Scan
+        }else if(c == charcode_5){
+         //   scan_start();
+            // Scan
+        }else if(c == charcode_6){
+            on_set_userfreq();
             // Scan
-        } else if(c == charcode_6){
-            
-        } else if(c == charcode_4){
-
         } else if(c == charcode_7){
+            menu_poweroff();
+        } else if(c == charcode_8){
             // Set volume
             set_volume();
-        } else if(c == charcode_8){
-            // Set sensitivity
-            fmbandwidth++;
-            if(fmbandwidth > 3) fmbandwidth = 0;
-            akc6955_set_fmbandwidth(fmbandwidth);
         } else if(c == charcode_9){
+            _CLS();
+            _LOCATE(0,0);
+            printstr("Sig width:");
+            val = setup.threshold_width;
+            val = read_numeric(val, 1, 0, 1);
+            akc6955_set_thresh_width((unsigned char)val);
             // Set NF
         } else if(c == charcode_0){
             // Setup Menu
             setup_menu();
-        } else if(c == charcode_d){
-            // Call userband
-            input_userband();
+        } else if(c == charcode_a){
+            toggle_amfm();
         } else if(c == charcode_c){
             // Set userband
             set_userband();
-        } else if(c == charcode_e){
-            toggle_amfm();
+        } else if(c == charcode_d){
+            // Call userband
+            input_userband();
+        } else if (c == charcode_f){
+            mainmenu_help();
+            // HELP
         }
        _CLS();
        _LOCATE(0,0);