OSDN Git Service

[UI][USERBAND][SAVE] Save userbands to external eeprom.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 24 Sep 2013 23:55:14 +0000 (08:55 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 24 Sep 2013 23:55:14 +0000 (08:55 +0900)
[UI] Set limit of frequencies.

akc6955.c
menu.c
menu.h
menu_defs.c
menu_userband.c
nbproject/Makefile-genesis.properties
power.c
ui_updown.c

index 55f79d6..24f3581 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
@@ -166,6 +166,7 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     __bitops_t b;
     unsigned int i = ch;
     unsigned char comp;
+    unsigned int start, stop;
 
     do { // Wait for before completed
         comp = akc6955_chk_donescan();
@@ -175,15 +176,31 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     band = 0;
     if(!f.b6){
         akc6955_get_amband(band);
+        start = ambands[band].start;
+        stop  = ambands[band].end;
+        if(band == AKC6955_BAND_AMUSER){
+            start = userband.am_usrbands[setup.am_userbandnum].start * 32;
+            stop = userband.am_usrbands[setup.am_userbandnum].stop * 32;
+        } else {
+            if(mode_3k != 0) {
+               start = start / 3; // See datasheet.
+               stop = stop / 3;
+            } else {
+                start = start / 5;
+                stop = stop / 5;
+            }
+        }
+    } else {
+        akc6955_get_fmband(band);
+        start = ((fmbands[band].start - 3000) * 2) / 5;
+        stop = ((fmbands[band].end - 3000) * 2) / 5;;
+        if(band == AKC6955_BAND_FMUSER){
+            start = userband.fm_usrbands[setup.fm_userbandnum].start * 32;
+            stop = userband.fm_usrbands[setup.fm_userbandnum].stop * 32;
+        }
     }
-
-    if(band == AKC6955_BAND_MW2){
-        // BAND=AM && MW2
-        i = ch / 3; // On MW2, Channnel must be multiple of 3.
-        i = i * 3; // i = (i/3) * 3
-    }
-    if(i > 0x1fff) i = 0x1fff;
-    //i = ch & 0x1fff;
+    if(i > stop) i = stop; // ADD
+    if(i < start) i = start;
 
     b.byte = i & 0xff;
     akc6955_writecmd(AKC6955_CH_LO, b.byte);
@@ -312,38 +329,19 @@ void akc6955_set_freq(unsigned int freq)
     if(f.b6) { // FM
         akc6955_get_fmband(band);
 //        band &= 7;
-        if(band == AKC6955_BAND_FMUSER){
-            start = userband.fm_usrbands[setup.fm_userbandnum].start * 32;
-            stop = userband.fm_usrbands[setup.fm_userbandnum].stop * 32;
-        } else {
-            start = fmbands[band].start;
-            stop = fmbands[band].end;
-        }
-        ch = freq - 3000;
-        ch = (ch << 2) / 10;
+        ch = ((freq - 3000) * 4) / 10;
     } else {
         akc6955_get_amband(band);
 //        if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
-        if(band == AKC6955_BAND_AMUSER){
-            start = userband.am_usrbands[setup.am_userbandnum].start * 32;
-            stop = userband.am_usrbands[setup.am_userbandnum].stop * 32;
-        } else {
-            start = ambands[band].start;
-            stop = ambands[band].end;
-        }
         mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
         if(band == AKC6955_BAND_MW2) {
             ch = (freq / 9) * 3; // See datasheet.
-        } else if(band == AKC6955_BAND_MW3) {
-            ch = freq / 5;
         } else  if(mode3k.b7){
             ch = freq / 3;
         } else {
             ch = freq / 5;
         }
     }
-    if(freq <  start) freq = start;
-    if(freq >= stop)   freq = stop - 1;
     akc6955_set_tune(mode3k.b7, ch);
 }
 
@@ -449,6 +447,7 @@ void akc6955_down_freq(unsigned int step)
 {
     unsigned int freq;
     __bitops_t mode3k;
+    unsigned int start;
 
     freq = akc6955_get_channel();
     if(freq <= step) return;
diff --git a/menu.c b/menu.c
index 5b57701..f498458 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -108,45 +108,57 @@ void setband_direct(void)
     unsigned long band;
     unsigned char band2;
     unsigned int freq;
+    unsigned char mode3k;
+
     _CLS();
     _LOCATE(0,0);
     if(setup.fm != 0){
         printstr("Set Band:FM#");
         band2 = setup.fmband & 7;
+        if(band2 == AKC6955_BAND_FMUSER) {
+            userband.fm_usrbands[setup.fm_userbandnum].freq = setup.fmfreq;
+        }
         setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
         band2 = pollkey_numeric(band2);
-        if(band2 < 8) {
-            setup.fmband = band2 & 7;
-            setup.fmfreq = setup.fmfreq_bank[setup.fmband];
-            akc6955_set_fmband(setup.fmband);
-            freq = setup.fmfreq;
+        band2 &= 7;
+        if(band2 == AKC6955_BAND_FMUSER) {
+            call_userband(setup.fm_userbandnum);
+            freq = userband.fm_usrbands[setup.fm_userbandnum].freq;
+        } else {
+            freq = setup.fmfreq_bank[band2];
         }
-        akc6955_set_fmband(setup.fmband);
-        freq = setup.fmfreq;
+        setup.fmband = band2;
+        akc6955_set_fmband(band2);
+        setup.fmfreq = freq;
     } else {
         printstr("Set Band:AM#");
         band = setup.amband & 0x1f;
-        setup.amfreq_bank[setup.amband] = setup.amfreq;
+        setup.amfreq_bank[band] = setup.amfreq;
+        if(band == AKC6955_BAND_AMUSER) {
+            userband.am_usrbands[setup.am_userbandnum].freq = setup.amfreq;
+        }
         band = read_numeric(band, 2, 7, 1);
         if((band & 0x80000000) != 0) return;
-        setup.amband = band & 0x1f;
-        setup.amfreq = setup.amfreq_bank[setup.amband];
+        band &= 0x1f;
+        setup.amband = band;
+        freq = 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;
+          mode3k = 0xff;
           break;
+         case AKC6955_BAND_AMUSER:
+            call_userband(setup.am_userbandnum);
+            mode3k = userband.am_usrbands[setup.am_userbandnum].mode3k;
+            freq = userband.am_usrbands[setup.am_userbandnum].freq;
+            break;
         default:
+            mode3k = 0x00;
           break;
        }
-
-        akc6955_set_amband(setup.amband);
-        freq = setup.amfreq;
+        akc6955_set_amband(band);
+        setup.amfreq = freq;
+        setup.am_mode3k = mode3k;
     }
     akc6955_do_tune();
     akc6955_set_freq(freq);
diff --git a/menu.h b/menu.h
index 3889854..fee0df7 100644 (file)
--- a/menu.h
+++ b/menu.h
@@ -68,6 +68,24 @@ extern "C" {
     /*
      * main.c
      */
+
+typedef struct {
+        unsigned char mode3k; // mode3k if am
+        unsigned char start;
+        unsigned char stop;
+        unsigned int freq;
+        unsigned char reserve[3];
+} _userband_t;
+
+#define USER_BAND_NUM 10
+typedef struct {
+    unsigned int magic;
+    unsigned int version;
+    _userband_t am_usrbands[USER_BAND_NUM];
+    _userband_t fm_usrbands[USER_BAND_NUM];
+    unsigned int checksum;
+} __userband_t_t;
+
 // Frequencyset of 1Sector.
 // Below v1.0.
 typedef struct {
@@ -93,8 +111,8 @@ typedef struct {
     unsigned char threshold_fmcnr; // Reg 0x08
     unsigned char threshold_width; // Reg 0x08
     unsigned char threshold_fmstereo; // Reg 0x08
-//    banddesc am_userband_freq[USER_BAND_NUM];
-//    banddesc fm_userband_freq[USER_BAND_NUM];
+    banddesc am_userband_freq[USER_BAND_NUM];
+    banddesc fm_userband_freq[USER_BAND_NUM];
     unsigned char stereo;
     unsigned char volume;
     unsigned char prevolume;
@@ -108,28 +126,13 @@ typedef struct {
     unsigned int pagenum;
 } __radioset_t;
 
-typedef struct {
-        unsigned char mode3k; // mode3k if am
-        unsigned char start;
-        unsigned char stop;
-        unsigned int freq;
-        unsigned char reserve[3];
-} _userband_t;
-
-#define USER_BAND_NUM 10
-typedef struct {
-    unsigned int magic;
-    unsigned int version;
-    _userband_t am_usrbands[USER_BAND_NUM];
-    _userband_t fm_usrbands[USER_BAND_NUM];
-    unsigned int checksum;
-} __userband_t_t;
-   
 
     extern __radioset_t setup;
     extern __freqset_t freqset;
     extern __freqset_t freqset_temp;
     extern __userband_t_t userband;
+    extern const banddesc ambands[19];
+    extern const banddesc fmbands[8];
     extern unsigned char scanflag;
 
     extern unsigned char stereoflag;
index 1fa3206..03906fc 100644 (file)
@@ -54,7 +54,8 @@
 
 
 const banddesc ambands[19] = {
-    {150,285},
+//    {150,285},
+    {100,522}, // Extend LW.
     {520,1710},
     {522,1620},
     {520,1710},
@@ -115,8 +116,6 @@ void setdefault(void)
     for(i = 0; i < USER_BAND_NUM; i++){
         userband.am_usrbands[i].start = 0x19;
         userband.am_usrbands[i].stop  = 0x32;
-    }
-    for(i = 0; i < USER_BAND_NUM; i++){
         userband.fm_usrbands[i].start = 0x19;
         userband.fm_usrbands[i].stop  = 0x32;
     }
@@ -153,10 +152,6 @@ void valinit(void)
     recv_signal = 103;
     battlevel = 0;
     batlevel_6955 = 330; // 3.30V(temporally).
-    if(setup.amband > 18) setup.amband = 18;
-    if(setup.fmband > 7) setup.fmband = 7;
-    if(setup.am_userbandnum >= USER_BAND_NUM) setup.am_userbandnum = USER_BAND_NUM - 1;
-    if(setup.fm_userbandnum >= USER_BAND_NUM) setup.fm_userbandnum = USER_BAND_NUM - 1;
     setup.volume = 36;
     setup.prevolume = 3;
     setup.fmbandwidth = 0;
index c55d4cd..49fcb1a 100644 (file)
@@ -31,7 +31,7 @@
 #include "power.h"
 #include "commondef.h"
 #include "backlight.h"
-
+#include "eeprom_util.h"
 
 void call_userband(unsigned char num)
 {
@@ -40,49 +40,39 @@ void call_userband(unsigned char num)
     unsigned char start;
     unsigned char end;
     unsigned char mode3k;
-    unsigned char freq2;
+    unsigned int q;
     _userband_t *p;
 
     if(num >= USER_BAND_NUM) return;
 
-    p = &(userband.am_usrbands[num]);
     if(setup.fm != 0){
         p = &(userband.fm_usrbands[num]);
-    }
-    freq = p->freq;
-    start = p->start;
-    end = p->stop;
-    mode3k = p->mode3k;
-    if(setup.fm != 0) {
+        freq = p->freq;
+        mode3k = 0;
         ch = ((freq - 3000) / 5) * 2;
         setup.fmband = AKC6955_BAND_FMUSER;
+        setup.fmfreq = freq;
     } else {
-        unsigned int q = 5;
+        p = &(userband.am_usrbands[num]);
+        freq = p->freq;
+        mode3k = p->mode3k;
+        q = 5;
         if(mode3k != 0) q = 3;
         ch = freq / q;
         setup.amband = AKC6955_BAND_AMUSER;
+        setup.amfreq = freq;
+        setup.am_mode3k = mode3k;
     }
+    start = p->start;
+    end = p->stop;
 
-    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 long from,to;
+    unsigned long from,to, tmp;
     unsigned char c;
     unsigned char pp;
     unsigned char mode3k;
@@ -110,8 +100,13 @@ void set_userband(void)
         printstr(" To:  ");
         to = read_numeric(to, 5, 7, 1);
         if((to & 0x80000000) != 0) goto _l0;
+        if(from > to){
+            tmp = to;
+            to = from;
+            from = tmp;
+        }
         userband.fm_usrbands[c].start = (from - 3000) / 80;
-        userband.fm_usrbands[c].stop = (to - 3000) / 80;
+        userband.fm_usrbands[c].stop = (to - 3000) / 80 + 1;
         userband.fm_usrbands[c].freq = from;
         setup.fm_userbandnum = c;
     } else {
@@ -147,12 +142,18 @@ void set_userband(void)
         printstr(" To:  ");
         to = read_numeric(to, 5, 7, 1);
         if((to & 0x80000000) != 0) goto _l0;
+        if(from > to){
+            tmp = to;
+            to = from;
+            from = tmp;
+        }
         userband.am_usrbands[c].start = from / pp;
-        userband.am_usrbands[c].stop = to  / pp;
+        userband.am_usrbands[c].stop = to  / pp + 1;
         userband.am_usrbands[c].mode3k = mode3k;
         userband.am_usrbands[c].freq = from;
         setup.am_userbandnum = c;
     }
+    save_userbands();
     call_userband(c);
 _l0:
     _CLS();
@@ -161,33 +162,26 @@ _l0:
 void input_userband(void)
 {
     unsigned char c;
-    do{
-    c = printhelp_2lines("User Band", "   #");
-    if((c >= charcode_a) && (c <= charcode_f)){
-        break;
-    }
-    if(c == charcode_0) {
-        _PUTCHAR('0');
-        if(setup.fm != 0){
-           setup.fm_userbandnum = 0;
+    char d;
+        c = printhelp_2lines("User Band", "   #");
+        if((c > charcode_a) && (c <= charcode_f)){
+            goto _l0;
+         }
+        if(c == charcode_a){
+            d = load_userbands();
+            if(d < 0) format_userbands();
+
         } else {
-           setup.am_userbandnum = 0;
-        }
-        call_userband(0);
-    } else {
-        c = c - charcode_1 + 1;
-        if(c < USER_BAND_NUM) {
-            _PUTCHAR(c + '0');
+            c = c % 10;
+            _PUTCHAR('0' + c);
             if(setup.fm != 0){
-               setup.fm_userbandnum = c;
+                setup.fm_userbandnum = c;
             } else {
                 setup.am_userbandnum = c;
             }
             call_userband(c);
         }
-    }
-    idle(setup.ui_idlecount);
-    } while(1);
+_l0:
     _CLS();
 }
 
index 8cad10e..d75047a 100644 (file)
@@ -1,5 +1,5 @@
 #
-#Tue Sep 24 14:03:48 JST 2013
+#Wed Sep 25 08:07:51 JST 2013
 default.languagetoolchain.dir=/opt/microchip/xc8/v1.20/bin
 com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=1c49f19f6a43b876c317e0d8d41c0854
 default.languagetoolchain.version=1.20
diff --git a/power.c b/power.c
index a87854c..5cd64c7 100644 (file)
--- a/power.c
+++ b/power.c
@@ -150,7 +150,7 @@ void power_off(unsigned char save)
 
     if(save != 0) {
         save_eeprom();
-//        save_frequencies();
+        save_userbands();
     }
     lcd_setbacklight(0, 0);
     set_powerlamp(0);
index 6f3bbbb..1c484bf 100644 (file)
@@ -109,10 +109,6 @@ static void setband_updown(unsigned char updown)
         default:
           break;
        }
-        if(setup.amband == AKC6955_BAND_AMUSER){
-//            amfreq = am_usrbands[am_userbandnum].freq;
-            call_userband(setup.am_userbandnum);
-        }
         setfreq_updown_amsub();
     } else { // FM
         if(setup.fmband == AKC6955_BAND_FMUSER){
@@ -138,6 +134,7 @@ static void setband_updown(unsigned char updown)
 void setfreq_updown(unsigned char ctlword)
 {
     unsigned int freq;
+    unsigned int start, end;
 
     backlight_reset(ctlword);
 
@@ -221,9 +218,7 @@ void setfreq_updown(unsigned char ctlword)
                 freq = 1; // 5KHz or 3KHz
                 if(setup.amband == AKC6955_BAND_MW2) {
                     freq = 3; // 9KHz
-                } else if(setup.amband == AKC6955_BAND_MW3) {
-                    freq = 2; // 10KHz
-                } else if(setup.amband == AKC6955_BAND_MW4) {
+                } else if((setup.amband == AKC6955_BAND_MW3) || (setup.amband == AKC6955_BAND_MW4)) {
                     freq = 2; // 10KHz
                 }
            }