iModela(iM-01) de sakusei sita PCB no kitchenTimer wo clock ni henko sita monodesu.

Dependencies:   SevenSegLed SwDigital mbed Sound

Revision:
1:fe97b047f96b
Parent:
0:b7cdbc649bd3
--- a/main.cpp	Sun Apr 08 03:36:28 2012 +0000
+++ b/main.cpp	Sun Apr 22 11:30:33 2012 +0000
@@ -5,6 +5,7 @@
 // 24h display clock
 //
 // V1.0 120402
+// V2.0 120422 : melody and chime no henko. hyoji no kaizen
 // 
 // <schematic>
 // 1.seven segment numeric LED Display : OSL40562-LR
@@ -69,11 +70,6 @@
 #include "Sound.h"
 #include "SwDigital.h"
 
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
-
 Ticker timeout100ms;     // 100ms interrupt
 
 Sound sound(p21, p22);
@@ -87,11 +83,10 @@
     aSw
 };
 
-//SevenSegLed sevenSegLed(1, 1, p19, p7, p10, p12, p13, p20, p9, p11, p18, p5, p6, p8);   // OSL40562-LR(schematic bug)
 SevenSegLed sevenSegLed(1, 0, p19, p5, p10, p12, p13, p18, p9, p11, p20, p7, p6, p8);   // OSL40562-LR(seikiban)
 
 uint8_t D_7seg[4] = {0, 0, 0, 0};
-uint8_t D_dot[4] = {0, 1, 0, 0};
+uint8_t D_dot[4]  = {0, 1, 0, 0};
 
 uint8_t C_flicker; // timer setti ji no henko keta flicker kyoka (100[ms]/count) 0:flicker request ohter:kinsi
 #define Z_flicker (5 * 10)
@@ -101,12 +96,10 @@
 
 enum timer_t{
     stop,
-    set1min,
-    set10min,
+    setMin,
+    setHore,
     count,
-    chime,
-    timeup
-};
+ };
 timer_t M_timer = stop;
 
 uint8_t F_flip100ms;    // 100ms keika goto ni 0 or 1 
@@ -114,22 +107,50 @@
 
 time_t seconds;
 struct tm  *A_time;   // genzai jikoku
-#define Z_japanOffset   (9 * 60 * 60)   // japan time offset (utc + 9h)
 
-
+//===================================
+// beep (sw sosa ji no oto)
+//===================================
 void beep(void){
 // tone1 
     Sound::sound_t oto = {1,0x95,200,100};
     sound.sound_sound(oto);
 }
 
-void beep2(void){
-// tone1 
-    Sound::sound_t oto = {1,0xA4,1200,1000};
-    sound.sound_sound(oto);
+//**********************************************************
+// chime
+//**********************************************************
+uint8_t C_chime;    // chime kaisuu 1 - 255 (1/1[kai]/count)
+
+//=====================================================
+// chime request
+//      no : chime no kaisuu 1 - 255 ( 1/1 [kai]/count)
+//=====================================================
+void chimeSet(uint8_t no){
+    C_chime = no;
 }
 
+//====================================
+// chime check and output
+//    10 - 100 ms syuuki de call suru
+//====================================
+void chimeCheck(void){
+    if(C_chime > 0){
+        if((sound.sound_sound() == false) && (sound.sound_enso() == false)) {
+            Sound::sound_t oto = {1,0xF4,2500,1500};
+            sound.sound_sound(oto);
+            C_chime--;
+        }
+    }
+}
+
+//***************************************************
+// melody data tabel
+//***************************************************
+
+//================================
 // "westminster chime" merody data
+//================================
     const Sound::sound_t WESTMINSTER[] =     {
     //  onkai,hatuon jikan[ms]
         {1,0xA4,1200,1000},
@@ -154,7 +175,10 @@
                
         {1,0xFF,1000,0},    // end
     };
+
+//==========================
 // "ramen chime" merody data
+//==========================
     const Sound::sound_t RAMEN[] =     {
     //  onkai,hatuon jikan[ms]
         {1,0xC5,300,500},
@@ -174,7 +198,9 @@
         {1,0xFF,1000,500},    // end
     };
 
+//=============================
 // "demekin no uta" merody data
+//=============================
     const Sound::sound_t DEMEKIN[] =     {
     //  onkai,hatuon jikan[ms]
         {1,0xC5,600,500},     // de
@@ -220,27 +246,6 @@
 };
 
 //=============================
-// clock 
-//=============================
-/*
-    time_t ctTime;
-    struct tm *jst_time;
-    
-    _JIKOKU wk = *j;
-
-
-    ctTime = time(NULL);
-    ctTime += 32400;
-    jst_time = localtime(&ctTime);
-
-    
-    wk.sec  = jst_time->tm_sec;
-    wk.min  = jst_time->tm_min;
-    wk.hour = jst_time->tm_hour;
-*/    
-
-
-//=============================
 // timer SW seni
 //=============================
 void timerSeni(void){
@@ -248,15 +253,15 @@
 
     // aSw(settei SW)
     if(sw.checkEdgeOn(aSw) == 1){
-        if((M_timer != set1min) && (M_timer != set10min)){
+        if((M_timer != setMin) && (M_timer != setHore)){
             beep();
-            M_timer = set1min;
+            M_timer = setMin;
             
             // genzai jikoku kakuno
             seconds = time(NULL);
             A_time = localtime(&seconds);
         }
-        else if((M_timer == set1min) || (M_timer == set10min)){
+        else if((M_timer == setMin) || (M_timer == setHore)){
             beep();
             M_timer = count;
             
@@ -278,14 +283,14 @@
 
     switch(M_timer){
     case stop:
-        // other aSw,bSw then set1min
+        // other aSw,bSw then setMin
         if((sw.checkEdgeOn(upSw) == 1)
          ||(sw.checkEdgeOn(downSw) == 1)
          ||(sw.checkEdgeOn(leftSw) == 1)
          ||(sw.checkEdgeOn(rightSw) == 1)
          ){
             beep();
-            M_timer = set1min;
+            M_timer = setMin;
             C_flicker = 0;
             
             // genzai jikoku kakuno
@@ -293,17 +298,17 @@
             A_time = localtime(&seconds);
         }
         break;
-    case set1min:
+    case setMin:
         if(sw.checkEdgeOn(leftSw) == 1){
             beep();
-            M_timer = set10min;
+            M_timer = setHore;
             C_flicker = 0;
         }
         break;
-    case set10min:
+    case setHore:
         if(sw.checkEdgeOn(rightSw) == 1){
             beep();
-            M_timer = set1min;
+            M_timer = setMin;
             C_flicker = 0;
         }
         break;
@@ -313,75 +318,57 @@
         
         // 59 kara 0 byo ni nattara melody wo narasu
         if((B_timesec == 59) && (A_time->tm_sec == 0)){
-        
+            // jikoku chime no kaisuu set
+            uint8_t C_chime = A_time->tm_hour;
+            if(C_chime == 0){
+                C_chime = 12;
+            }
+            else if(C_chime > 12){
+                C_chime -= 12;
+            }
+
+            // jikoku no melody and chime
             if(A_time->tm_min == 0){
                 if(A_time->tm_hour == 12){
                     sound.sound_enso((Sound::sound_t*)RAMEN);
                     sound.sound_enso(true);
+                    chimeSet(C_chime);
                 }
                 else {
                     sound.sound_enso((Sound::sound_t*)WESTMINSTER);
                     sound.sound_enso(true);
+                    chimeSet(C_chime);
                 }
             }
-                           
+            
+            // 30min no chime               
             if(A_time->tm_min == 30){
-                sound.sound_enso((Sound::sound_t*)DEMEKIN);
-                sound.sound_enso(true);
+                chimeSet(2);
             }
-         
+            
+            // 15min or 45min no chime
             if((A_time->tm_min == 15) || (A_time->tm_min == 45)){
-                beep2();
+                chimeSet(1);
             }
          }
-        B_timesec = A_time->tm_sec;
+        B_timesec = A_time->tm_sec; // jikai hikaku yo time data kioku
       break;
     
-    case chime: // 120115 bug fix
-/*
-        if(D_timerSec == (3 * 60)){
-            sound.sound_enso((Sound::sound_t*)RAMEN);
-        }
-        else if(D_timerSec < (60 * 60)){
-            sound.sound_enso((Sound::sound_t*)WESTMINSTER);
-        }
-        else{
-            sound.sound_enso((Sound::sound_t*)DEMEKIN);
-        }
-            
-        sound.sound_enso(true);
-        M_timer = timeup;
-*/        
-        break;
-/*    
-    case timeup:
-        // other aSw,bSw then set1min
-        if((sw.checkEdgeOn(upSw) == 1)
-         ||(sw.checkEdgeOn(downSw) == 1)
-         ||(sw.checkEdgeOn(leftSw) == 1)
-         ||(sw.checkEdgeOn(rightSw) == 1)
-         ){
-            beep();
-            M_timer = set1min;
-            C_flicker = 0;
-        }    
-        break;
- */ 
-    default:
+     default:
+        // nothing
         break;
     }
 
 }
 //============================
-// timer set
+// time set
 //============================
 void timerSet(void){
-//    int16_t work;
 
     switch(M_timer){
     case stop:
         break;
-    case set1min:
+    case setMin:
         if(sw.checkEdgeOn(upSw) == 1){
             beep();
             if(A_time->tm_min < 59){
@@ -404,7 +391,7 @@
             C_flicker = Z_flicker;
         }
         break;
-    case set10min:
+    case setHore:
         if(sw.checkEdgeOn(upSw) == 1){
             beep();
             if(A_time->tm_hour < 23){
@@ -428,12 +415,10 @@
         }
         break;
     case count:
-        break;
-    case chime:
-        break;
-    case timeup:
+        // nothing
         break;
     default:
+        // nothing
         break;
     }
     
@@ -460,8 +445,9 @@
         D_dot[3] = 0;
         
         break;
-    case set1min:
-    case set10min:
+    case setMin:    // setHore to onaji
+    case setHore:
+        sevenSegLed.smoothSet(1);   // hyoji hard
         D_7seg[0] = A_time->tm_hour / 10;
         D_7seg[1] = A_time->tm_hour % 10;
         D_7seg[2] = A_time->tm_min / 10;
@@ -469,7 +455,7 @@
 
         // settei basyo no tenmetu        
         if((C_flicker == 0) && (F_flip500ms == 0)){
-            if(M_timer == set1min){
+            if(M_timer == setMin){
                 D_7seg[2] = 0x10;
                 D_7seg[3] = 0x10;
             }
@@ -486,6 +472,7 @@
 
         break;
     case count:
+        sevenSegLed.smoothSet(0);   // hyoji smooth
         seconds = time(NULL);
         A_time = localtime(&seconds);
         
@@ -493,64 +480,30 @@
         D_7seg[1] = A_time->tm_hour % 10;
         D_7seg[2] = A_time->tm_min / 10;
         D_7seg[3] = A_time->tm_min % 10;
-/*
-        D_7seg[0] = A_time->tm_min / 10;
-        D_7seg[1] = A_time->tm_min % 10;
-        D_7seg[2] = A_time->tm_sec / 10;
-        D_7seg[3] = A_time->tm_sec % 10;
- */
+
         D_dot[0] = 0;
         D_dot[1] = 1;
         D_dot[2] = 0;
-   
+
+        // byo no dot no tenmetu   
         if((A_time->tm_sec % 2) == 0){
             D_dot[3] = 0;
         }
         else{
             D_dot[3] = 1;
         }
-
         break;
-    case chime: // same "timeup"
-
-#ifdef debug
-    D_7seg[0] = 0x0E;
-    D_7seg[1] = 0x10;
-    D_7seg[2] = 0x10;
-    D_7seg[3] = 0x10;
-    break;
-#endif //debug
 
-    case timeup:
-        if(F_flip500ms == 1){
-            D_7seg[0] = 0x0f;
-            D_7seg[1] = 0x0f;
-            D_7seg[2] = 0x0f;
-            D_7seg[3] = 0x0f;
-        }
-        else{
-            D_7seg[0] = 0x10;
-            D_7seg[1] = 0x10;
-            D_7seg[2] = 0x10;
-            D_7seg[3] = 0x10;
-        }
-        
-        D_dot[0] = 0;
-        D_dot[1] = 0;
-        D_dot[2] = 0;
-        D_dot[3] = 0;
-        break;
     default:
         break;
     }
-    sevenSegLed.SevenSegLed_main(D_7seg, D_dot);
+    sevenSegLed.SevenSegLed_main(D_7seg, D_dot);    // 7segment hyoji
 }
 
 //================================
 // 100ms interrupt
 //================================
 void interrupt100ms(void){
-//    led2 = !led2;
     static uint8_t C_100ms = 0;
     
     C_100ms++;
@@ -587,18 +540,6 @@
         timerSeni();
         timerSet();
         sevenSegDisplay();
-/*
-        // debug code
-        if((sw.checkEdgeOn(leftSw) == 1)
-         ||(sw.checkEdgeOn(rightSw) == 1)
-         ||(sw.checkEdgeOn(upSw) == 1)
-         ||(sw.checkEdgeOn(downSw) == 1)
-         ||(sw.checkEdgeOn(aSw) == 1)
-         ||(sw.checkEdgeOn(bSw) == 1)
-        ){
-            led1 = !led1;
-        }
- */       
- 
+        chimeCheck();
     }
 }