Browse Source

implement writing of an alarm to RTC

Helmut Pozimski 5 years ago
parent
commit
48c37b9901
1 changed files with 85 additions and 27 deletions
  1. 85 27
      jsonrtc/src/jsonrtc.c

+ 85 - 27
jsonrtc/src/jsonrtc.c

@@ -20,15 +20,35 @@ page(struct http_request *req)
 	return (KORE_RESULT_OK);
 }
 
+static char * read_body(struct http_request *req) {
+	int ret;
+	struct kore_buf * buf;
+	u_int8_t data[128];
+	char * body;
+	buf = kore_buf_alloc(128);
+	while(1) {
+		ret = http_body_read(req, data, sizeof(data));
+		if (ret == -1) {
+			kore_buf_free(buf);
+			return NULL;
+                } else if (ret == 0) {
+			break;
+                }
+			kore_buf_append(buf,data,ret);
+	}
+	body = kore_buf_stringify(buf, NULL);
+        kore_buf_free(buf);
+	return body;
+}
+
 int handle_time(struct http_request *req) {
 	int fdesc;
 	struct rtc_time time;
 	int ret;
-	char *msg;
+	char *result_string;
 	cJSON *time_json, *json_min, *json_hour, *json_mday,
 		*json_mon, *json_year, *json_sec, *json_wday;
 	if(req->method == HTTP_METHOD_GET) {
-		char *result_string;
 		time_json = cJSON_CreateObject();
 		fdesc = open("/dev/rtc", O_RDONLY);
 		ret = ioctl(fdesc, RTC_RD_TIME, &time);
@@ -55,33 +75,21 @@ int handle_time(struct http_request *req) {
 			return KORE_RESULT_OK;
 		}
 		cJSON_Delete(time_json);
-		msg = "Error: could not get time from /dev/rtc\n";
-		http_response(req, 500, msg, strlen(msg));
+		result_string = "Error: could not get time from /dev/rtc\n";
+		http_response(req, 500, result_string, strlen(result_string));
 		return KORE_RESULT_OK;
 	} else if (req->method == HTTP_METHOD_POST) {
-		struct kore_buf * buf;
-		u_int8_t data[128];
 		char * body;
-		buf = kore_buf_alloc(128);
-		while(1) {
-			ret = http_body_read(req, data, sizeof(data));
-			if (ret == -1) {
-				kore_buf_free(buf);
-				msg = "Error: could not read body data\n";
-				http_response(req, 500, msg, strlen(msg));
-				return (KORE_RESULT_OK);
-			}
-			if (ret == 0) {
-				break;
-			}
-			kore_buf_append(buf,data,ret);
+		body = read_body(req);
+		if (body == NULL) {
+			result_string = "Error: could not read request body\n";
+			http_response(req, 500, result_string, strlen(result_string));
+			return (KORE_RESULT_OK);
 		}
-		body = kore_buf_stringify(buf, NULL);
-		kore_buf_free(buf);
 		time_json = cJSON_Parse(body);
 		if (time_json == NULL) {
-			msg = "Error: could not parse json\n";
-			http_response(req, 500, msg, strlen(msg));
+			result_string = "Error: could not parse json\n";
+			http_response(req, 500, result_string, strlen(result_string));
 			return (KORE_RESULT_OK);
 		}
 		json_sec = cJSON_GetObjectItemCaseSensitive(time_json, "seconds");
@@ -103,8 +111,8 @@ int handle_time(struct http_request *req) {
 			time.tm_wday = json_wday->valueint;
 		} else {
 			cJSON_Delete(time_json);
-			msg = "Error: invalid or missing values in json object\n";
-			http_response(req, 500, msg, strlen(msg));
+			result_string = "Error: invalid or missing values in json object\n";
+			http_response(req, 500, result_string, strlen(result_string));
                         return (KORE_RESULT_OK);
 		}
 		cJSON_Delete(time_json);
@@ -112,8 +120,8 @@ int handle_time(struct http_request *req) {
 		ret = ioctl(fdesc, RTC_SET_TIME, &time);
 		close(fdesc);
 		if (ret) {
-			msg = "Error: Could not set time via /dev/rtc\n";
-			http_response(req, 500, msg, strlen(msg));
+			result_string = "Error: Could not set time via /dev/rtc\n";
+			http_response(req, 500, result_string, strlen(result_string));
                         return (KORE_RESULT_OK);
 		}
                 http_response(req, 200, NULL, 0);
@@ -165,6 +173,56 @@ int handle_wkalrm(struct http_request *req) {
                 result_string = "Error: could not get alarm from /dev/rtc\n";
                 http_response(req, 500, result_string, strlen(result_string));
                 return KORE_RESULT_OK;
+	} else if (req->method == HTTP_METHOD_POST) {
+		char * body = read_body(req);
+		if (body == NULL) {
+			result_string = "Error: could not read request body\n";
+			http_response(req, 500, result_string, strlen(result_string));
+			return (KORE_RESULT_OK);
+                }
+		alarm_json = cJSON_Parse(body);
+		if (alarm_json == NULL) {
+                        result_string = "Error: could not parse json\n";
+                        http_response(req, 500, result_string, strlen(result_string));
+                        return (KORE_RESULT_OK);
+                }
+		json_sec = cJSON_GetObjectItemCaseSensitive(alarm_json, "seconds");
+                json_min = cJSON_GetObjectItemCaseSensitive(alarm_json, "minutes");
+                json_hour = cJSON_GetObjectItemCaseSensitive(alarm_json, "hour");
+                json_mday = cJSON_GetObjectItemCaseSensitive(alarm_json, "mday");
+                json_mon = cJSON_GetObjectItemCaseSensitive(alarm_json, "month");
+                json_year = cJSON_GetObjectItemCaseSensitive(alarm_json, "year");
+                json_wday = cJSON_GetObjectItemCaseSensitive(alarm_json, "wday");
+		json_enabled = cJSON_GetObjectItemCaseSensitive(alarm_json, "enabled");
+		if (cJSON_IsNumber(json_sec) && cJSON_IsNumber(json_min) && cJSON_IsNumber(json_hour) &&
+                        cJSON_IsNumber(json_mday) && cJSON_IsNumber(json_mon) &&
+                        cJSON_IsNumber(json_year) && cJSON_IsNumber(json_wday) &&
+			cJSON_IsNumber(json_enabled)) {
+                        alarm.time.tm_sec = json_sec->valueint;
+                        alarm.time.tm_min = json_min->valueint;
+                        alarm.time.tm_hour = json_hour->valueint;
+                        alarm.time.tm_mday = json_mday->valueint;
+                        alarm.time.tm_mon = json_mon->valueint;
+                        alarm.time.tm_year = json_year->valueint;
+                        alarm.time.tm_wday = json_wday->valueint;
+			alarm.enabled = json_enabled->valueint;
+                } else {
+                        cJSON_Delete(alarm_json);
+                        result_string = "Error: invalid or missing values in json object\n";
+                        http_response(req, 500, result_string, strlen(result_string));
+                        return (KORE_RESULT_OK);
+                }
+		cJSON_Delete(alarm_json);
+                fdesc = open("/dev/rtc", O_WRONLY);
+                ret = ioctl(fdesc, RTC_WKALM_SET, &alarm);
+                close(fdesc);
+                if (ret) {
+                        result_string = "Error: Could not set alarm via /dev/rtc\n";
+                        http_response(req, 500, result_string, strlen(result_string));
+                        return (KORE_RESULT_OK);
+                }
+                http_response(req, 200, NULL, 0);
+                return KORE_RESULT_OK;
 	} else {
                 http_response(req, HTTP_STATUS_METHOD_NOT_ALLOWED, NULL, 0);
                 return (KORE_RESULT_OK);