Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitd82ab1114579f5561df1485f321f4ba50f30195e (patch)
Author
 Syndamia <kamen@syndamia.com>
2024-05-28 09:05:01 +0300
Committer
 Syndamia <kamen@syndamia.com>
2024-05-28 09:05:01 +0300
Files6e3c5c112d058973ed13983e5cf8a101b656a991
uni-projects-d82ab1114579f5561df1485f321f4ba50f30195e.tar
uni-projects-d82ab1114579f5561df1485f321f4ba50f30195e.tar.gz
uni-projects-d82ab1114579f5561df1485f321f4ba50f30195e.zip
Parent303d774212a4dd4e960a75774e9580b8ea7f597b (diff)
[iot/goam] Implemented setting to save/send images only/both to spiffs/ws
diff --git a/Year 3/Internet of things/goam/main/main.c b/Year 3/Internet of things/goam/main/main.c
index 82cebe0..8de110f 100644
--- a/Year 3/Internet of things/goam/main/main.c
+++ b/Year 3/Internet of things/goam/main/main.c
@@ -53,6 +53,22 @@ void print_chip_data() {
}
/*
+ * Public interface (settings functions)
+ */
+
+#define SPIFFS_ONLY 0
+#define WS_ONLY 1
+#define BOTH 2
+
+static int32_t is = BOTH;
+
+void main_store_saveimage(int32_t value) {
+ if (value < 0 && value > BOTH) return;
+ nvs_write_i32("imagesave", value);
+ is = value;
+}
+
+/*
* On button press
*/
@@ -73,8 +89,12 @@ void take_photo() {
ptc06_set_image_resolution(RES_640X480);
char* image;
size_t length = ptc06_get_image(&image);
- spiffs_write(SPIFFS_PREFIX "/capture.jpeg", image, length);
- ws_send_bin(image, length);
+ if (is != WS_ONLY) {
+ spiffs_write(SPIFFS_PREFIX "/capture.jpeg", image, length);
+ }
+ if (is != SPIFFS_ONLY) {
+ ws_send_bin(image, length);
+ }
display_printon(DCHAR_CAMERA, 1);
free(image);
@@ -90,6 +110,7 @@ static TaskHandle_t main_handle = NULL;
static void init_camera(void*) {
ptc06_init();
+ nvs_read_i32("imagesave", &is);
if (xTaskNotify(main_handle, INIT_CAMERA_BIT, eSetBits) != pdPASS) {
ESP_LOGE(TAG, "Couldnt't notify main of camera init, software will hang");
diff --git a/Year 3/Internet of things/goam/main/main.h b/Year 3/Internet of things/goam/main/main.h
new file mode 100644
index 0000000..d6a232d
--- /dev/null
+++ b/Year 3/Internet of things/goam/main/main.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void main_store_saveimage(uint32_t value);
diff --git a/Year 3/Internet of things/goam/main/nvs.c b/Year 3/Internet of things/goam/main/nvs.c
index 6f894db..27b805a 100644
--- a/Year 3/Internet of things/goam/main/nvs.c
+++ b/Year 3/Internet of things/goam/main/nvs.c
@@ -63,3 +63,31 @@ void nvs_read(const char* key, char** output) {
nvs_close(inHandle);
}
+
+void nvs_write_i32(const char* key, int32_t value) {
+ nvs_handle_t outHandle;
+ ESP_ERROR_CHECK(nvs_open(NVS_GOAM_NAMESPACE, NVS_READWRITE, &outHandle));
+
+ ESP_ERROR_CHECK(nvs_set_i32(outHandle, key, value));
+
+ ESP_ERROR_CHECK(nvs_commit(outHandle));
+ nvs_close(outHandle);
+}
+
+void nvs_read_i32(const char* key, int32_t* output) {
+ nvs_handle_t inHandle;
+ esp_err_t err = nvs_open(NVS_GOAM_NAMESPACE, NVS_READONLY, &inHandle);
+ if (err == ESP_ERR_NVS_NOT_FOUND) {
+ nvs_close(inHandle);
+ return;
+ }
+ ESP_ERROR_CHECK(err);
+
+ err = nvs_get_i32(inHandle, key, output);
+ if (err != ESP_OK) {
+ nvs_close(inHandle);
+ return;
+ }
+
+ nvs_close(inHandle);
+}
diff --git a/Year 3/Internet of things/goam/main/nvs.h b/Year 3/Internet of things/goam/main/nvs.h
index 12aa477..1afd8f7 100644
--- a/Year 3/Internet of things/goam/main/nvs.h
+++ b/Year 3/Internet of things/goam/main/nvs.h
@@ -3,3 +3,5 @@
void nvs_init();
void nvs_write(const char* key, const char* value);
void nvs_read(const char* key, char** output);
+void nvs_write_i32(const char* key, int32_t value);
+void nvs_read_i32(const char* key, int32_t* output);
diff --git a/Year 3/Internet of things/goam/main/webserver.c b/Year 3/Internet of things/goam/main/webserver.c
index 5163647..dc28e31 100644
--- a/Year 3/Internet of things/goam/main/webserver.c
+++ b/Year 3/Internet of things/goam/main/webserver.c
@@ -15,6 +15,7 @@
#include "webserver.h"
#include "spiffs.h"
#include "wifi.h"
+#include "main.h"
static const char *TAG = "webserver";
#define MAX_CLIENTS 4
@@ -114,6 +115,24 @@ static const httpd_uri_t post_network = {
.handler = post_network_handler,
};
+static esp_err_t post_imagesave_handler(httpd_req_t *req) {
+ char* buffer = malloc(req->content_len + 1);
+ httpd_req_recv(req, buffer, req->content_len);
+
+ main_store_saveimage((int32_t)(*(strchr(buffer, '=') + 1) - '0'));
+
+ httpd_resp_send(req, "", 0);
+ free(buffer);
+
+ logi_post(req);
+ return ESP_OK;
+}
+static const httpd_uri_t post_imagesave = {
+ .uri = "/imagesave",
+ .method = HTTP_POST,
+ .handler = post_imagesave_handler,
+};
+
static esp_err_t ws_camera_handler(httpd_req_t *req) {
if (req->method == HTTP_GET) {
ESP_LOGI(TAG, "Established websocket connection");
@@ -194,6 +213,7 @@ void webserver_start()
httpd_register_uri_handler(server, &get_index);
httpd_register_uri_handler(server, &get_image);
httpd_register_uri_handler(server, &post_network);
+ httpd_register_uri_handler(server, &post_imagesave);
httpd_register_uri_handler(server, &ws_camera);
ESP_LOGI(TAG, "Started server on port %d", config.httpd.server_port);
diff --git a/Year 3/Internet of things/goam/webserver/index.html b/Year 3/Internet of things/goam/webserver/index.html
index 13a2bbc..c607453 100644
--- a/Year 3/Internet of things/goam/webserver/index.html
+++ b/Year 3/Internet of things/goam/webserver/index.html
@@ -27,7 +27,7 @@ article {
img {
max-width: calc(100vw - 16px - 2em);
}
-.button, input {
+.button, form > * {
border: 0.25em solid gray;
padding: 0.25em;
background-color: lightgray;
@@ -52,12 +52,23 @@ iframe {
<img src="/spiffs/capture.jpeg"/>
<a class="button full-width" href="/spiffs/capture.jpeg" download="capture.jpeg">Click to Download</a>
- <h1>Configure static network</h1>
<iframe id="dummyframe" name="dummyframe" hidden></iframe>
+
+ <h1>Configure static network</h1>
<form action="/network" target="dummyframe" method="POST">
<input id="network-ssid" name="ssid" type="text" placeholder="Name (SSID)">
<input id="network-pass" name="pass" type="text" placeholder="Password">
- <input id="network-submit" class="button" type="submit" value="Save">
+ <input class="button" type="submit" value="Save">
+ </form>
+
+ <h1>Configure other options</h1>
+ <form action="/imagesave" target="dummyframe" method="POST">
+ <select name="imagesave">
+ <option value="0">Only save to camera</option>
+ <option value="1">Only send to <code>/camera</code> listeners</option>
+ <option value="2" selected>Save and send</option>
+ </select>
+ <input class="button" type="submit" value="Save">
</form>
</article>
<script>