Bläddra i källkod

Wrote the new displayhandler. Not perfecting, but working with simple switch between screens.

jancoow 9 år sedan
förälder
incheckning
bcfd2ef7f3
7 ändrade filer med 152 tillägg och 165 borttagningar
  1. 15 9
      alarm.c
  2. 2 1
      alarm.h
  3. 63 46
      displayHandler.c
  4. 15 4
      displayHandler.h
  5. 47 97
      main.c
  6. 7 6
      mp3stream.c
  7. 3 2
      mp3stream.h

+ 15 - 9
alarm.c

@@ -28,9 +28,10 @@ int checkAlarms(){
 	int i = 0;
 	int check = 0;
 	for (i = 0; i < n; i++){
-		setState(i);
 		if (alarm[i].time.tm_year == 0){
 			alarm[i].state = 0;
+		}else{
+			setState(i);
 		}
 		if (alarm[i].state == 1){
 			check = 1;
@@ -53,8 +54,18 @@ int alarmExist(int id){
 	return -1;
 }
 
-struct _alarm getAlarm(int idx){
-	return alarm[idx];
+struct _alarm* getAlarm(int idx){
+	return &alarm[idx];
+}
+
+char getRunningAlarmID(){
+	char idx;
+	for (idx = 0; idx < 5; idx++) {
+		if (getState(idx) == 1) {
+			return idx;
+		}
+	}
+	return -1;
 }
 
 int getState(int idx){
@@ -165,12 +176,7 @@ void setState(int idx){
 	}
 }
 
-/*void getAlarm(struct _alarm *am){
-	int i = 0;
-	for (i = 0; i < n; i++){
-		am[i] = alarm[i]; 
-	}
-}*/
+
 
 void setAlarm(struct _tm time, char* name, char* ip, u_short port, char* url, int snooze, int id, int idx){
 	alarm[idx].time = time;

+ 2 - 1
alarm.h

@@ -22,7 +22,8 @@ void deleteAlarm(int idx);
 int compareTime(tm t1, tm t2);
 void setState(int idx);
 int getState(int idx);
-struct _alarm getAlarm(int idx);
+struct _alarm* getAlarm(int idx);
+char getRunningAlarmID();
 int maxAlarms(void);
 int isLeapYear(int y);
 void setSnooze(int idx);

+ 63 - 46
displayHandler.c

@@ -1,8 +1,6 @@
 //
 // Created by Jordy Sipkema on 26/02/16.
 //
-#define LOG_MODULE  LOG_MAIN_MODULE
-
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
@@ -11,71 +9,94 @@
 #include "displayHandler.h"
 #include "ntp.h"
 #include "log.h"
+#include "mp3stream.h"
 #include "rtc.h"
 #include "alarm.h"
 #include "network.h"
 
-#define MONTH_OFFSET 1
-#define YEAR_OFFSET 1900
+struct _tm lastDisplayTime;
+viewDisplays currentViewDisplay;
+u_long displayTime;
 
-void (*write_display_ptr[2])(char*, int) = {LcdArrayLineOne, LcdArrayLineTwo};
+void setCurrentDisplay(viewDisplays d, u_long dt){
+    X12RtcGetClock(&lastDisplayTime);
+    LcdBackLight(LCD_BACKLIGHT_ON);
+    currentViewDisplay = d;
+    displayTime = dt;
+}
 
-void displayTime(int line_number){
-    tm time;
-    X12RtcGetClock(&time);
+viewDisplays getCurrentDisplay(void){
+    return currentViewDisplay;
+}
 
-    char str[16];
-    if (1){
-        sprintf(str, "    %02d:%02d:%02d    ", time.tm_hour, time.tm_min, time.tm_sec);
-    }else {
-        sprintf(str, "    ??:??:??    ");
+void refreshScreen(){
+    if(timerStruct(lastDisplayTime) > displayTime){
+        currentViewDisplay = DISPLAY_DateTime;
+        LcdBackLight(LCD_BACKLIGHT_OFF);
     }
 
-    if (line_number > -1 && line_number < 2){
-        (*write_display_ptr[line_number])(str, 16);
+    if(currentViewDisplay == DISPLAY_DateTime){
+        displayDateTime();
+    }else if(currentViewDisplay == DISPLAY_Volume){
+        displayVolume();
+    }else if(currentViewDisplay == DISPLAY_Alarm){
+        displayAlarm(getRunningAlarmID());
     }
 }
 
-void displayDate(int line_number) {
-    tm *time;
-    X12RtcGetClock(time);
+long timerStruct(struct _tm s){
+    struct _tm ct;
+    X12RtcGetClock(&ct);
 
-    char str[16];
+    long stime = (s.tm_hour * 3600) + (s.tm_min * 60) + s.tm_sec;
+    long ctime = (ct.tm_hour * 3600) + (ct.tm_min * 60) + ct.tm_sec;
 
-    if (1) {
-        sprintf(str, "   %02d-%02d-%04d      ", time->tm_mday, time->tm_mon + MONTH_OFFSET, time->tm_year + YEAR_OFFSET);
-    } else {
-        sprintf(str, "   ??-??-????      ");
-    }
+    return ctime - stime;
+}
+
+void (*write_display_ptr[2])(char*, int) = {LcdArrayLineOne, LcdArrayLineTwo};
 
+void displayDateTime(void){
+    tm time;
+    X12RtcGetClock(&time);
+
+    char str1[16];
+    char str2[16];
+    if (1){
+        sprintf(str1, "    %02d:%02d:%02d    ", time.tm_hour, time.tm_min, time.tm_sec);
+        sprintf(str2, "   %02d-%02d-%04d      ", time.tm_mday, time.tm_mon + MONTH_OFFSET, time.tm_year + YEAR_OFFSET);
+    }else {
+        sprintf(str1, "    ??:??:??    ");
+        sprintf(str2, "    ??:??:??    ");
+    }
     if (NtpIsSyncing()) {
-       str[1] = 'S';
+        str2[1] = 'S';
     }else if(NetworkIsReceiving()){
-        str[1] = 'N';
+        str2[1] = 'N';
     }
 
-    if (line_number > -1 && line_number < 2){
-        (*write_display_ptr[line_number])(str, 16);
-    }
+    (*write_display_ptr[0])(str1, 16);
+    (*write_display_ptr[1])(str2, 16);
 }
 
-void displayAlarm(int line_number, int line_numberTwo, int idx)
+void displayAlarm(char idx)
 {
+    if(idx == -1){
+        currentViewDisplay = DISPLAY_DateTime;
+    }
 	int i;
 	int j;
 	int startidx;
     char str[16];
-	struct _alarm am = getAlarm(idx);
+    struct _alarm *am = getAlarm(idx);
 
-    sprintf(str, "    %02d:%02d:%02d    ", am.time.tm_hour, am.time.tm_min, am.time.tm_sec);
-    if (line_number > -1 && line_number < 2){
-        (*write_display_ptr[line_number])(str, 16);
-    }
+    sprintf(str, "    %02d:%02d:%02d    ", am->time.tm_hour, am->time.tm_min, am->time.tm_sec);
+    (*write_display_ptr[0])(str, 16);
 
 	j = 0;
     char str2[16];
 	for (i = 0; i < 16;i++){
-		if (am.name[i] != 0){
+		if (am->name[i] != 0){
 			j = j + 1;
 		}
 	}
@@ -86,8 +107,8 @@ void displayAlarm(int line_number, int line_numberTwo, int idx)
 	j = 0;
 	for(i = 0; i < 16; i++){
 		if (i >= startidx){
-			if (am.name[j] != 0){
-				str2[i] = am.name[j];
+			if (am->name[j] != 0){
+				str2[i] = am->name[j];
 			} else {
 				str2[i] = ' ';
 			}
@@ -96,16 +117,12 @@ void displayAlarm(int line_number, int line_numberTwo, int idx)
 			str2[i] = ' ';
 		}
 	}
-    if (line_numberTwo > -1 && line_numberTwo < 2){
-        (*write_display_ptr[line_numberTwo])(str2, 16);
-        LcdBackLight(LCD_BACKLIGHT_ON);
-    }
-
-
+    (*write_display_ptr[1])(str2, 16);
 }
 
-void displayVolume(int pos)
+void displayVolume()
 {
+    u_char pos = getVolume();
     ClearLcd();
     int i;
     LcdArrayLineOne("     Volume     ", 16);
@@ -116,7 +133,7 @@ void displayVolume(int pos)
     {
         characters[i] = 0xFF;
     }
-        LcdArrayLineTwo(characters,pos);
+    LcdArrayLineTwo(characters,pos);
 }
 
 

+ 15 - 4
displayHandler.h

@@ -5,9 +5,20 @@
 #ifndef MUTLI_OS_BUILD_DISPLAYHANDLER_H
 #define MUTLI_OS_BUILD_DISPLAYHANDLER_H
 
-void displayTime(int);
-void displayDate(int);
-void displayAlarm(int line_number, int line_numberTwo, int idx);
-void displayVolume(int pos);
+#include <time.h>
+#include "alarm.h"
+#define MONTH_OFFSET 1
+#define YEAR_OFFSET 1900
+
+typedef enum {DISPLAY_DateTime, DISPLAY_Alarm, DISPLAY_Volume, DISPLAY_Twitch, DISPLAY_Twitter} viewDisplays;
+
+long timerStruct(struct _tm s);
+void setCurrentDisplay(viewDisplays d, u_long dt);
+viewDisplays getCurrentDisplay(void);
+void refreshScreen(void);
+
+void displayDateTime(void);
+void displayAlarm(char idx);
+void displayVolume();
 
 #endif //MUTLI_OS_BUILD_DISPLAYHANDLER_H

+ 47 - 97
main.c

@@ -70,6 +70,12 @@ static void SysControlMainBeat(u_char);
 /*                         start of code                                   */
 /*-------------------------------------------------------------------------*/
 
+/*-------------------------------------------------------------------------*/
+/* global variable definitions                                             */
+/*-------------------------------------------------------------------------*/
+bool isAlarmSyncing = false;
+bool initialized = false;
+bool running = false;
 
 /*!
  * \brief ISR MainBeat Timer Interrupt (Timer 2 for Mega128, Timer 0 for Mega256).
@@ -172,14 +178,6 @@ static void SysControlMainBeat(u_char OnOff)
     }
 }
 
-
-/*-------------------------------------------------------------------------*/
-/* global variable definitions                                             */
-/*-------------------------------------------------------------------------*/
-bool isAlarmSyncing = false;
-bool initialized = false;
-bool running = false;
-
 /*-------------------------------------------------------------------------*/
 /* local variable definitions                                              */
 /*-------------------------------------------------------------------------*/
@@ -198,6 +196,18 @@ THREAD(StartupInit, arg)
     NutThreadExit();
 }
 
+THREAD(AlarmCheck, arg)
+{
+    NutThreadSetPriority(100);
+    for(;;){
+        if(checkAlarms() == 1){
+          setCurrentDisplay(DISPLAY_Alarm, 1000);
+        }
+        NutSleep(1000);
+    }
+
+}
+
 THREAD(AlarmSync, arg)
 {
     NutThreadSetPriority(50);
@@ -236,32 +246,9 @@ int timer(time_t start){
     return diff;
 }
 
-long timerStruct(struct _tm s){
-	struct _tm ct;
-	X12RtcGetClock(&ct);
-	
-	long stime = (s.tm_hour * 3600) + (s.tm_min * 60) + s.tm_sec;
-	long ctime = (ct.tm_hour * 3600) + (ct.tm_min * 60) + ct.tm_sec;
-	
-	return ctime - stime;
-}
-
-int checkOffPressed(){
-    if (KbGetKey() != KEY_UNDEFINED){
-        LcdBackLight(LCD_BACKLIGHT_ON);
-        return 1;
-    } else {
-        return 0;
-    }
-}
-
-
-
 int main(void)
 {
     struct _tm timeCheck;
-	struct _tm start;
-	int idx = 0;
 
     WatchDogDisable();
 
@@ -287,7 +274,7 @@ int main(void)
 
     NutThreadCreate("BackgroundThread", StartupInit, NULL, 1024);
     NutThreadCreate("BackgroundThread", AlarmSync, NULL, 2500);
-    //NutThreadCreate("BackgroundThread", NTPSync, NULL, 700);
+    NutThreadCreate("BackgroundThread", AlarmCheck, NULL, 256);
     /** Quick fix for turning off the display after 10 seconds boot */
 
 	KbInit();
@@ -302,77 +289,40 @@ int main(void)
 	/* Enable global interrupts */
 	sei();
 	
-	LcdBackLight(LCD_BACKLIGHT_OFF);
-	X12RtcGetClock(&timeCheck);
-	X12RtcGetClock(&start);
+	LcdBackLight(LCD_BACKLIGHT_ON);
+    setCurrentDisplay(DISPLAY_DateTime, 5);
+
+    X12RtcGetClock(&timeCheck);
 
     for (;;)
     {
-		//printf("running = %d, time = %d\n", running, timerStruct(start));
-		
-		if (timerStruct(start) < 0){
-			X12RtcGetClock(&start);
-		}
-		
-		if (timerStruct(timeCheck) < 0){
-			X12RtcGetClock(&timeCheck);
-		}
-		
-		//Check if a button is pressed
-		if (checkOffPressed() == 1){
-			X12RtcGetClock(&start);
-			running = true;
+        //Key detecten
+        if(KbGetKey() != KEY_UNDEFINED){
+            //Backlight aanzetten.
             LcdBackLight(LCD_BACKLIGHT_ON);
-		}
-
-		//Check if background LED is on, and compare to timer
-		if (running == true){
-			if (timerStruct(start) >= 10){
-				running = false;
-				LcdBackLight(LCD_BACKLIGHT_OFF);
-			}
-		}
-
-        if(KbGetKey() == KEY_DOWN)
-        {
-            NutSleep(150);
-            X12RtcGetClock(&timeCheck);
-
-            u_char newVolume = volumeDown();
-            displayVolume((int)newVolume);
+            if(getCurrentDisplay() == DISPLAY_Alarm){
+                if(KbGetKey() == KEY_01 || KbGetKey() == KEY_02 || KbGetKey() == KEY_03 || KbGetKey() == KEY_04 || KbGetKey() == KEY_05 || KbGetKey() == KEY_ALT){
+                    setSnooze(getRunningAlarmID());
+                    killPlayerThread();
+                    setCurrentDisplay(DISPLAY_DateTime, 2);
+                }else if(KbGetKey() == KEY_ESC){
+                    handleAlarm(getRunningAlarmID());
+                    killPlayerThread();
+                    setCurrentDisplay(DISPLAY_DateTime, 5);
+                }
+            }else{
+                if(KbGetKey() == KEY_DOWN){
+                    setCurrentDisplay(DISPLAY_Volume, 5);
+                    volumeDown();
+                }else if(KbGetKey() == KEY_UP){
+                    setCurrentDisplay(DISPLAY_Volume, 5);
+                    volumeUp();
+                }
+            }
         }
-        else if(KbGetKey() == KEY_UP)
-        {
-            NutSleep(150);
-            X12RtcGetClock(&timeCheck);
-
-            u_char newVolume = volumeUp();
-            displayVolume((int)newVolume);
-        }
-        else if(timerStruct(timeCheck) >= 5 && checkAlarms() == 1)
-        {
-			for (idx = 0; idx < 5; idx++){
-				if (getState(idx) == 1){
-					displayAlarm(0,1,idx);
-					if (KbGetKey() == KEY_ESC){
-						//NutDelay(50);
-						handleAlarm(idx);
-						//NutDelay(50);
-						LcdBackLight(LCD_BACKLIGHT_OFF);
-                    } else if (KbGetKey() == KEY_01 || KbGetKey() == KEY_02 || KbGetKey() == KEY_03 || KbGetKey() == KEY_04 || KbGetKey() == KEY_05 || KbGetKey() == KEY_ALT){
-						setSnooze(idx);
-						LcdBackLight(LCD_BACKLIGHT_OFF);
-                        killPlayerThread();
-                    }
-				}
-			}
-		}
-		else if (timerStruct(timeCheck) >= 5){
-            displayTime(0);
-            displayDate(1);
-		}
-
+        refreshScreen();
         WatchDogRestart();
+        NutSleep(100);
     }
     return(0);
 }

+ 7 - 6
mp3stream.c

@@ -122,7 +122,7 @@ bool play()
     return true;
 }
 
-u_char volumeUp(void)
+void volumeUp(void)
 {
     if (VS_volume >= 16)
         return VS_volume;
@@ -131,11 +131,9 @@ u_char volumeUp(void)
     ++VS_volume;
     VS_volume = VS_volume % 17;
     setVolume();
-
-    return VS_volume;
 }
 
-u_char volumeDown(void)
+void volumeDown(void)
 {
     if (VS_volume <= 0)
         return VS_volume;
@@ -144,8 +142,6 @@ u_char volumeDown(void)
     --VS_volume;
     VS_volume = VS_volume % 17;
     setVolume();
-
-    return VS_volume;
 }
 
 void setVolume(void){
@@ -154,6 +150,11 @@ void setVolume(void){
     printf("- VS_volume level: %d/16\n", VS_volume);
 }
 
+u_char getVolume(void){
+    return VS_volume;
+}
+
+
 void killPlayerThread(void)
 {
     printf("Signal to stop the stream sent.\n");

+ 3 - 2
mp3stream.h

@@ -17,9 +17,10 @@ bool play(void);
 bool connectToStream(char* ipaddr, u_short port, char *radioUrl);
 void killPlayerThread(void);
 
-u_char volumeUp(void);
-u_char volumeDown(void);
+void volumeUp(void);
+void volumeDown(void);
 void setVolume(void); // Do not use this one, this is invoked by volumeUp/Down
+u_char getVolume(void);
 
 
 #endif //MUTLI_OS_BUILD_MP3STREAM_H