فهرست منبع

Most things working. Alarm now syncing with webserver (with simple id check). Stream will play if alarm triggers

jancoow 10 سال پیش
والد
کامیت
4e5b728959
8فایلهای تغییر یافته به همراه97 افزوده شده و 19 حذف شده
  1. 22 6
      alarm.c
  2. 4 2
      alarm.h
  3. 2 0
      displayHandler.c
  4. 7 0
      jsmn.c
  5. 5 0
      jsmn.h
  6. 3 3
      main.c
  7. 53 7
      network.c
  8. 1 1
      vs10xx.c

+ 22 - 6
alarm.c

@@ -3,12 +3,13 @@
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
+#include <assert.h>
 
 #include "log.h"
 #include "rtc.h"
 #include "alarm.h"
 
-#define n 3
+#define n 5
 
 
 struct _snooze
@@ -37,6 +38,16 @@ int checkAlarms(){
 	return 0;
 }
 
+int alarmExist(int id){
+	int g;
+	for (g = 0; g < n; g++){
+		if (alarm[g].id == id){
+			return g;
+		}
+	}
+	return -1;
+}
+
 struct _alarm getAlarm(int idx){
 	return alarm[idx];
 }
@@ -45,6 +56,10 @@ int getState(int idx){
 	return alarm[idx].state;
 }
 
+int maxAlarms(){
+	return n;
+}
+
 void setState(int idx){
 	struct _tm ct;
 	X12RtcGetClock(&ct);
@@ -74,15 +89,16 @@ void setState(int idx){
 	}
 }*/
 
-void setAlarm(struct _tm time, char* name, char* ip, u_short port, int snooze, int type, int idx){
+void setAlarm(struct _tm time, char* name, char* ip, u_short port, char* url, int snooze, int id, int idx){
 	alarm[idx].time = time;
 	
 	strncpy(alarm[idx].name, name, sizeof(alarm[idx].name));
-	strncpy(alarm[idx].ip, name, sizeof(alarm[idx].ip));
+	strncpy(alarm[idx].ip, ip, sizeof(alarm[idx].ip));
 	alarm[idx].port = port;
-	
+	strncpy(alarm[idx].url, url, sizeof(alarm[idx].url));
+
 	alarm[idx].snooze = snooze;
-	alarm[idx].type = type;
+	alarm[idx].id = id;
 	alarm[idx].state = 0;
 
 	//snooze[idx].snoozeStart = time;
@@ -97,7 +113,7 @@ void deleteAlarm(int idx){
 	alarm[idx].time = tm;
 	alarm[idx].port = 0;
 	alarm[idx].snooze = 5;
-	alarm[idx].type = -1;
+	alarm[idx].id = -1;
 	alarm[idx].state = -1;
 }
 

+ 4 - 2
alarm.h

@@ -10,9 +10,10 @@ struct _alarm
 	struct _tm time;
 	char ip[24];
 	u_short port;
+	char url[24];
 	char name[16];
 	int snooze;
-	int type;
+	int id;
 	int state;
 };
 #define _ALARM_DEFINED
@@ -20,7 +21,8 @@ struct _alarm
 
 void handleAlarm(int idx);
 int checkAlarms(void);
-void setAlarm(struct _tm time, char* name, char* ip, u_short port, int snooze, int type, int idx);
+void setAlarm(struct _tm time, char* name, char* ip, u_short port, char* url, int snooze, int id, int idx);
+int alarmExist(int id);
 void deleteAlarm(int idx);
 int compareTime(tm t1, tm t2);
 void setState(int idx);

+ 2 - 0
displayHandler.c

@@ -14,6 +14,7 @@
 #include "rtc.h"
 #include "alarm.h"
 #include "network.h"
+#include "httpstream.h"
 
 #define MONTH_OFFSET 1
 #define YEAR_OFFSET 1900
@@ -68,6 +69,7 @@ void displayAlarm(int line_number, int line_numberTwo, int idx)
     if (line_number > -1 && line_number < 2){
         (*write_display_ptr[line_number])(str, 12);
     }
+    playStream(am.ip, am.port, am.url);
 
     char str2[16];
 	for(i = 0; i < 17; i++){

+ 7 - 0
jsmn.c

@@ -327,4 +327,11 @@ int getIntegerToken(const char *json, jsmntok_t *tok){
 	char s[ ((tok->end - tok->start) + 1) ];
 	sprintf(s, "%.*s", tok->end - tok->start, json + tok->start);
 	return atoi(s);
+}
+
+/**
+ * Get the value of the token in a char[] format.
+ */
+void getStringToken(const char *json, jsmntok_t *tok, char *res){
+	sprintf(res, "%.*s", tok->end - tok->start, json + tok->start);
 }

+ 5 - 0
jsmn.h

@@ -72,6 +72,11 @@ int jsoneq(const char *json, jsmntok_t *tok, const char *s);
  */
 int getIntegerToken(const char *json, jsmntok_t *tok);
 
+/**
+ * Get the value of the token in a string format.
+ */
+void getStringToken(const char *json, jsmntok_t *tok, char* res);
+
 /**
  * Run JSON parser. It parses a JSON data string into and array of tokens, each describing
  * a single JSON object.

+ 3 - 3
main.c

@@ -222,7 +222,6 @@ THREAD(AlarmSync, arg)
 {
     for(;;)
     {
-        printf("tset");
         if(initialized && (hasNetworkConnection() == true))
         {
             isAlarmSyncing = 1;
@@ -231,7 +230,7 @@ THREAD(AlarmSync, arg)
             free(content);
             isAlarmSyncing = 0;
         }
-        NutSleep(30000);
+        NutSleep(3000);
     }
     NutThreadExit();
 }
@@ -292,7 +291,7 @@ int main(void)
 
     NutThreadCreate("BackgroundThread", StartupInit, NULL, 1024);
     NutThreadCreate("BackgroundThread", AlarmSync, NULL, 2500);
-    NutThreadCreate("BackgroundThread", NTPSync, NULL, 1024);
+    NutThreadCreate("BackgroundThread", NTPSync, NULL, 700);
     /** Quick fix for turning off the display after 10 seconds boot */
 
     RcInit();
@@ -372,6 +371,7 @@ int main(void)
 						handleAlarm(idx);
 						NutDelay(50);
 						LcdBackLight(LCD_BACKLIGHT_OFF);
+                        stopStream();
 					}
 				}
 			}

+ 53 - 7
network.c

@@ -115,7 +115,7 @@ void parseAlarmJson(char* content){
     int r;
     int i;
     jsmn_parser p;
-    jsmntok_t token[300]; /* We expect no more than 128 tokens */
+    jsmntok_t token[100]; /* We expect no more than 128 tokens */
 
     jsmn_init(&p);
     r = jsmn_parse(&p, content, strlen(content), token, sizeof(token)/sizeof(token[0]));
@@ -128,10 +128,20 @@ void parseAlarmJson(char* content){
 
 
     int start = 0;
+    int usedAlarms[maxAlarms()];
+    int j;
+    for(j = 0; j < maxAlarms(); j++){
+        usedAlarms[j] = 0;
+    }
     for(i = 1; i < r; i++)
     {
         struct _tm time = GetRTCTime();
-        for (i = i; !((i + start) % 21 == 0); i++) {
+        u_short port;
+        char url[24];
+        char ip[24];
+        char name[16];
+        int id;
+        for (i = i; !((i + start) % 22 == 0); i++) {
             if (jsoneq(content, &token[i], "YYYY") == 0) {
                 time.tm_year= getIntegerToken(content, &token[i + 1]) - 1900;
                 i++;
@@ -150,15 +160,51 @@ void parseAlarmJson(char* content){
             }else if (jsoneq(content, &token[i], "ss") == 0) {
                 time.tm_sec = getIntegerToken(content, &token[i + 1]);
                 i++;
+            }else if (jsoneq(content, &token[i], "id") == 0) {
+                id = getIntegerToken(content, &token[i + 1]);
+                i++;
+            }else if (jsoneq(content, &token[i], "port") == 0) {
+                port = getIntegerToken(content, &token[i + 1]);
+                i++;
+            }else if (jsoneq(content, &token[i], "ip") == 0) {
+                getStringToken(content, &token[i + 1], ip);
+                i++;
+            }else if (jsoneq(content, &token[i], "url") == 0) {
+                getStringToken(content, &token[i + 1], url);
+                i++;
+            }else if (jsoneq(content, &token[i], "name") == 0) {
+                getStringToken(name, &token[i + 1], name);
+                i++;
             }
-            start = 1;
         }
-        printf("Alarm time is: %02d:%02d:%02d\n", time.tm_hour, time.tm_min, time.tm_sec);
-        printf("Alarm date is: %02d.%02d.%02d\n\n", time.tm_mday, (time.tm_mon + 1), (time.tm_year + 1900));
-
-        X12RtcSetAlarm(0,&time,0b11111111);
+        start = 1;
+
+        int idx = alarmExist(id);
+        if(idx == -1){
+            printf("New alarm found!\n");
+            printf("Alarm time is: %02d:%02d:%02d\n", time.tm_hour, time.tm_min, time.tm_sec);
+            printf("Alarm date is: %02d.%02d.%02d\n", time.tm_mday, (time.tm_mon + 1), (time.tm_year + 1900));
+            printf("Alarm stream data is: %s:%d%s\n", ip, port, url);
+            printf("Alarm id and name is: %d %s\n\n", id, name);
+
+            //zoek naar een vrije plaats in de alarm array
+            for(j = 0; j < maxAlarms(); j++){
+                if(usedAlarms[j] == 0){ //Dit is een lege plaats, hier kunnen we ons nieuwe alarm plaatsen
+                    setAlarm(time, name, ip, port, url, 5, id, j);
+                    usedAlarms[j] = 1;
+                    j = 10;
+                }
+            }
+        }else{
+            usedAlarms[idx] = 1; //Alarm bestaat al, dus we houden deze plaats vrij voor dat alarm
+        }
         NutDelay(1000);
     }
+    for(j = 0; j < maxAlarms(); j++){ //Alle overige plaatsen, die wij niet gezet hebben, verwijderen.
+        if(usedAlarms[j] == 0){
+            deleteAlarm(j);
+        };
+    }
 }
 
 bool NetworkIsReceiving(void){

+ 1 - 1
vs10xx.c

@@ -513,7 +513,7 @@ int VsPlayerKick(void)
 //        LogMsg_P(LOG_DEBUG,PSTR("Kick: CLOCKF = [0x%02X]"),VsRegRead(VS_CLOCKF_REG));
 //        LogMsg_P(LOG_DEBUG,PSTR("Kick: CLOCKF = [0x%02X]"),VsRegRead(VS_CLOCKF_REG));
 
-        VsLoadProgramCode();
+        //VsLoadProgramCode();
         vs_status = VS_STATUS_RUNNING;
         VsPlayerFeed(NULL);
         VsPlayerInterrupts(1);