nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Files at this revision

API Documentation at this revision

Comitter:
bkc_mbed
Date:
Mon May 19 03:10:50 2014 +0000
Parent:
0:2053640461b5
Child:
2:f0b7779b03c7
Commit message:
ver 1.04

Changed in this revision

lcd.cpp Show annotated file Show diff for this revision Revisions of this file
lcd.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/lcd.cpp	Sat May 17 12:54:13 2014 +0000
+++ b/lcd.cpp	Mon May 19 03:10:50 2014 +0000
@@ -31,13 +31,15 @@
 
 void lcd_printStr(const char *s)
 {
-  while(*s) {
+  int idx = 0;
+  while(*s && idx < 8) {
     if(*(s + 1)) {
       lcd_contdata(*s);
     } else {
       lcd_lastdata(*s);
     }
     s++;
+    idx++;
   }
 }
 
@@ -78,6 +80,36 @@
   lcd_cmd(0x80 | (y * 0x40 + x));
 }
 
+
+void lcd_printStrY(int y,const char *s)
+{
+  lcd_setCursor(0,y);
+  lcd_printStr(s);
+}
+
+void lcd_printStrYscr(int y,const char *s)
+{
+  int cnt = strlen(s) - 7;
+  if (cnt <= 0)
+    cnt = 1;
+    
+  for(int i = 0; i < cnt; i++)
+  {   
+    lcd_setCursor(0, y);
+    lcd_printStr(s + i);
+    wait(0.5);
+  }
+}
+
+
+void lcd_printStr2(const char *s, const char *s2)
+{
+  lcd_setCursor(0,0);
+  lcd_printStr(s);
+  lcd_setCursor(0,1);
+  lcd_printStr(s2);
+}
+
 void lcd_cls(void)
 {
     lcd_setCursor(0, 0);
--- a/lcd.h	Sat May 17 12:54:13 2014 +0000
+++ b/lcd.h	Mon May 19 03:10:50 2014 +0000
@@ -6,5 +6,8 @@
 void lcd_setCursor(unsigned char x,unsigned char y);
 void lcd_cls(void);
 void lcd_init();
+void lcd_printStr2(const char *s, const char *s2);
+void lcd_printStrY(int y,const char *s);
+void lcd_printStrYscr(int y,const char *s);
 
 #endif
--- a/main.cpp	Sat May 17 12:54:13 2014 +0000
+++ b/main.cpp	Mon May 19 03:10:50 2014 +0000
@@ -10,6 +10,8 @@
 DigitalIn sw_play(dp24,PullUp);
 DigitalIn sw_next(dp10,PullUp);
 
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
 
 // MOSI, MISO, SCLK, CS
 SDFileSystem sd(dp2, dp1, dp6, dp25, "sd"); 
@@ -106,7 +108,7 @@
     
     /* チップ側の処理を待つ */
     if (!(select & CS_PSG))
-        wait_us(8);
+        wait_us(10);
         
     
     /* データを出力 */
@@ -117,7 +119,7 @@
 
     /* wait if FM */
     if (!(select & CS_PSG))
-        wait_us(8);
+        wait_us(10);
 }
 
 /* PSG出力 */
@@ -165,13 +167,14 @@
 /* ボード初期化 */
 void boardInit(void)
 {
+    wait_ms(20);
     /* ICLのみをLOW(アクティブ)にする */
     ioShiftOut(ACTLOW & ~(ICL));    
-    wait_us(200);
+    wait_ms(50);
     
     /* 元に戻す */
     ioShiftOut(ACTLOW);
-    wait_us(200);
+    wait_ms(10);
 }
 
 typedef unsigned char  byte;
@@ -213,11 +216,11 @@
         ((dword)p[3])<<24;
 }
 
-byte nlg_hdr[0x80];
-
 // NLGファイルを開く
 int OpenNLG(const char *file)
 {    
+    byte nlg_hdr[0x80];
+
     nlg_file = fopen(file, "rb");
         
     if (!nlg_file)
@@ -420,6 +423,10 @@
     int irq_count;
     int irq_loop;
     long loop_address;
+    int irq_counter;
+    int irq_counter2;
+    
+    int song_no;
     
 } NLG_R;
 
@@ -453,6 +460,8 @@
     np->irq_count = 0;
     np->irq_loop = GetLoopPtrNLG();
     np->loop_address = -1;
+    np->irq_counter = 0;
+    np->irq_counter2 = 0;
 
     return 0;
 }
@@ -479,14 +488,13 @@
 
 void DispNLG(NLG_R *np)
 {
-    printf("Time %02d:%02d\r",np->total_sec / 60, np->total_sec % 60);
-    fflush(stdout);
+    // printf("Time %02d:%02d\r",np->total_sec / 60, np->total_sec % 60);
+    // fflush(stdout);
     
     char buf[16];
-    sprintf(buf, "%02d:%02d",np->total_sec / 60, np->total_sec % 60);
+    sprintf(buf, "%d.%02d:%02d",np->song_no, np->total_sec / 60, np->total_sec % 60);
     
-    lcd_setCursor(0,1);
-    lcd_printStr(buf);
+    lcd_printStrY(1, buf);
 }
 
 /* NLGの再生 */
@@ -505,12 +513,8 @@
     t.start();
     total_us = 0;
     
-    printf("wait button release\n");
-
     // wait until release buttons
     while(!sw_next || !sw_play);
-
-    printf("ok\n");
     
     DispNLG(np);
 
@@ -527,7 +531,6 @@
             break;
         }
 
-
         /* ウエイトの処理 */
         while (np->tick >= us_tick)
         {
@@ -592,6 +595,19 @@
                     np->loop_address = TellNLG();
                     np->loop_address -= 1;
                 }
+                np->irq_counter++;
+                if (np->irq_counter >= 48)
+                {
+                    np->irq_counter = 0;
+                    led1 = !led1;
+
+                    np->irq_counter2++;
+                    if (np->irq_counter2 >= 4)
+                    {
+                        np->irq_counter2 = 0;
+                        led2 = !led2;
+                    }
+                }
             break;
             case CMD_CTC0:
                 SetCTC0_NLG(ReadNLG());
@@ -600,7 +616,6 @@
                 SetCTC3_NLG(ReadNLG());
             break;
                 
-                
         }
         /* 秒情報の表示 */
         while (np->tick_sec >= np->base_clk)
@@ -615,14 +630,11 @@
     return result;
 }
 
-DigitalOut led1(LED1);
-
 NLG_R n;
 
-int nlg_play(const char *nlg_file)
+int nlg_play(const char *nlg_file,int song_no)
 {
-
-    printf("init nlg:%s\n",nlg_file);
+    printf("nlg_play:%s\n",nlg_file);
 
        /* NLGの初期化 */
     if (initNLG(&n, nlg_file) < 0)
@@ -634,18 +646,13 @@
         return -1;
     }
     
-    printf("Init board\n");
-
+    n.song_no = song_no;
+    
     /* 再生する */
-    printf("PlayNLG\n");
     PlayNLG(&n, 360);
     printf("\n");
     
-    printf("mute\n");
-
     boardMute();
-
-    printf("close\n");
     
     /* NLGファイルを閉じる */
     CloseNLG();
@@ -710,6 +717,8 @@
     char path[64];
     
     led1 = 0;
+    led2 = 0;
+    
     lcd_init();
     
     boardInit();
@@ -718,7 +727,6 @@
     int disp_mode = 0;
 
     if (!sw_next)
-    
         disp_mode = 1;
     
     files = get_nlg_file(file, -1);
@@ -726,31 +734,28 @@
     if (disp_mode) 
     {
         char buf[16];
-        
-        lcd_setCursor(0,0);
-        lcd_printStr("NBCTRL");
-        lcd_setCursor(0,1);
-        lcd_printStr("Ver 1.0 ");
+        printf("DATE:%s\nTIME:%s", __DATE__, __TIME__);
+        lcd_printStr2("NBCTRL", "Ver 1.04");
         wait(3);
-        sprintf(buf, "%s", __DATE__); 
-        lcd_setCursor(0,0);
-        lcd_printStr("DATE");
-        lcd_setCursor(0,1);
-        lcd_printStr(buf);
+        sprintf(buf, "%8s", __DATE__); 
+        lcd_printStrYscr(1, buf);
+        wait(3);
+        sprintf(buf, "%8s", __TIME__); 
+        lcd_printStrY(1, buf);
         wait(3);
 
-        lcd_setCursor(0,1);
         if (files < 0)
-            lcd_printStr("NO FILES");
+            lcd_printStrY(1, "NO FILES");
         else
         {
             char buf[16];
-            sprintf(buf, "%d files", files);    
-            lcd_printStr(buf);
+            sprintf(buf, "%3dfiles", files);    
+            lcd_printStrY(1, buf);
         }
         wait(3);
         lcd_cls();
     }
+    
     int idx = 0;
     while(files > 0)
     {
@@ -759,34 +764,55 @@
         sprintf(path, "/sd/%s", file);
         printf("path=%s\n",path);
         
-        lcd_setCursor(0, 0);
-        lcd_printStr(file);
+        lcd_printStrY(0, file);
 
-        nlg_play(path);
+        nlg_play(path, idx);
         
+        // wait for chattering 
+        wait(0.25);
         // wait release
         while(!sw_play || !sw_next);
         
+        bool prev_flag = false;
+        
         if (g_stop)
         {
-            lcd_setCursor(0, 1);
-            lcd_printStr("STOP    ");
-                
+            lcd_printStrY(1, "STOP    ");
+
+            // wait push
             while(sw_play && sw_next);
+            
+            if (!sw_play)   
+                prev_flag = true;
+            
+            // wait release
             while(!sw_play || !sw_next);
             g_stop = 0;
+            
+            // reset board
+            boardInit();
         }
-        
-        if (idx + 1 < files)
-            idx++;
+        if (prev_flag)
+        {
+            if (idx - 1 >= 0)
+                idx--;
+            else
+                idx = files - 1;
+        }
         else
-            idx = 0;
+        {
+            if (idx + 1 < files)
+                idx++;
+            else
+                idx = 0;
+        }
     }
 
-    while(1) {
+/*    while(1) {
         led1 = 1;
         wait(1);
         led1 = 0;
         wait(1);
     }
+*/
 }