Эх сурвалжийг харах

Merge pull request #24 from jancoow/Autosyncing

Autosyncing
Janco Kock 9 жил өмнө
parent
commit
40efce8da4
8 өөрчлөгдсөн 128 нэмэгдсэн , 44 устгасан
  1. 23 6
      alarm.c
  2. 4 2
      alarm.h
  3. 2 0
      displayHandler.c
  4. 7 0
      jsmn.c
  5. 5 0
      jsmn.h
  6. 4 4
      main.c
  7. 82 31
      network.c
  8. 1 1
      vs10xx.c

+ 23 - 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 2
 
 
 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;
@@ -94,10 +110,11 @@ void setAlarm(struct _tm time, char* name, char* ip, u_short port, int snooze, i
 
 void deleteAlarm(int idx){
 	struct _tm tm;
+	tm.tm_year = 0;
 	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.

+ 4 - 4
main.c

@@ -230,7 +230,7 @@ THREAD(AlarmSync, arg)
             free(content);
             isAlarmSyncing = 0;
         }
-        NutSleep(30000);
+        NutSleep(3000);
     }
     NutThreadExit();
 }
@@ -290,8 +290,8 @@ int main(void)
     NtpInit();
 
     NutThreadCreate("BackgroundThread", StartupInit, NULL, 1024);
-    NutThreadCreate("BackgroundThread", AlarmSync, NULL, 1024);
-    NutThreadCreate("BackgroundThread", NTPSync, NULL, 1024);
+    NutThreadCreate("BackgroundThread", AlarmSync, NULL, 2500);
+    NutThreadCreate("BackgroundThread", NTPSync, NULL, 700);
     /** Quick fix for turning off the display after 10 seconds boot */
 
     RcInit();
@@ -371,6 +371,7 @@ int main(void)
 						handleAlarm(idx);
 						NutDelay(50);
 						LcdBackLight(LCD_BACKLIGHT_OFF);
+                        stopStream();
 					}
 				}
 			}
@@ -383,6 +384,5 @@ int main(void)
         VOL2 = VOL;
         WatchDogRestart();
     }
-
     return(0);
 }

+ 82 - 31
network.c

@@ -56,8 +56,8 @@ char* httpGet(char address[]){
     sprintf(http, "GET %s HTTP/1.1\r\nHost: saltyradio.jancokock.me \r\n\r\n", address);
     int len = sizeof(http);
 
-    char buffer[300];
-    memset(buffer, 0, 300);
+    char buffer[800];
+    memset(buffer, 0, 800);
 
     if (NutTcpConnect(sock, inet_addr("62.195.226.247"), 80)) {
         printf("Can't connect to server\n");
@@ -72,7 +72,7 @@ char* httpGet(char address[]){
             NutDelay(1000);
             NutTcpReceive(sock, buffer, sizeof(buffer));
             //fread(buffer, 1, sizeof(buffer), stream);
-            NutDelay(1000);
+            NutDelay(1200);
             printf(buffer);
         };
         //fclose(stream);
@@ -115,7 +115,7 @@ void parseAlarmJson(char* content){
     int r;
     int i;
     jsmn_parser p;
-    jsmntok_t token[50]; /* 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]));
@@ -125,35 +125,86 @@ void parseAlarmJson(char* content){
         printf("Aantal tokens found: %d \n", r);
     }
 
-    struct _tm time = GetRTCTime();
-
-    for (i = 1; i < r; i++) {
-        if (jsoneq(content, &token[i], "YYYY") == 0) {
-            time.tm_year= getIntegerToken(content, &token[i + 1]) - 1900;
-            i++;
-        }else if (jsoneq(content, &token[i], "MM") == 0) {
-            time.tm_mon=  getIntegerToken(content, &token[i + 1]) - 1;
-            i++;
-        }else if (jsoneq(content, &token[i], "DD") == 0) {
-            time.tm_mday =  getIntegerToken(content, &token[i + 1]);
-            i++;
-        }else if (jsoneq(content, &token[i], "hh") == 0) {
-            time.tm_hour = 	getIntegerToken(content, &token[i + 1]);
-            i++;
-        }else if (jsoneq(content, &token[i], "mm") == 0) {
-            time.tm_min = getIntegerToken(content, &token[i + 1]);
-            i++;
-        }else if (jsoneq(content, &token[i], "ss") == 0) {
-            time.tm_sec = getIntegerToken(content, &token[i + 1]);
-            i++;
-        }
-    }
 
-    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);
-    NutDelay(1000);
+    int start = 1;
+    int usedAlarms[maxAlarms()];
+    int j;
+    for(j = 0; j < maxAlarms(); j++){
+        usedAlarms[j] = 0;
+    }
+    for(i = 1; i < r; i++)
+    {
+        struct _tm time = GetRTCTime();
+        u_short port;
+        char url[24];
+        char ip[24];
+        char name[16];
+        int id;
+        for (i = i; !((i + start) % 23 == 0); i++) {
+            if (jsoneq(content, &token[i], "YYYY") == 0) {
+                time.tm_year= getIntegerToken(content, &token[i + 1]) - 1900;
+                i++;
+            }else if (jsoneq(content, &token[i], "MM") == 0) {
+                time.tm_mon=  getIntegerToken(content, &token[i + 1]) - 1;
+                i++;
+            }else if (jsoneq(content, &token[i], "DD") == 0) {
+                time.tm_mday =  getIntegerToken(content, &token[i + 1]);
+                i++;
+            }else if (jsoneq(content, &token[i], "hh") == 0) {
+                time.tm_hour = 	getIntegerToken(content, &token[i + 1]);
+                i++;
+            }else if (jsoneq(content, &token[i], "mm") == 0) {
+                time.tm_min = getIntegerToken(content, &token[i + 1]);
+                i++;
+            }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 = 0;
+
+        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);