Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit51bc164433b6c85349b4005754d1d5a83faca84f (patch)
Author
 Syndamia <kamen@syndamia.com>
2024-05-05 16:11:13 +0300
Committer
 Syndamia <kamen@syndamia.com>
2024-05-05 16:11:13 +0300
Files27a769ed1a0d1a871f4ab3b0a453b84b58f1b77d
uni-projects-51bc164433b6c85349b4005754d1d5a83faca84f.tar
uni-projects-51bc164433b6c85349b4005754d1d5a83faca84f.tar.gz
uni-projects-51bc164433b6c85349b4005754d1d5a83faca84f.zip
Parent58c66096783cb51ac8b7df846c383135f765f4f1 (diff)
[iot/goam] Cleaned up ptc06 implementation
diff --git a/Year 3/Internet of things/goam/main/main.c b/Year 3/Internet of things/goam/main/main.c
index 5e8e49f..0903ff5 100644
--- a/Year 3/Internet of things/goam/main/main.c
+++ b/Year 3/Internet of things/goam/main/main.c
@@ -76,7 +76,7 @@ void app_main(void)
ptc06_init();
char* image;
- size_t length = ptc06_shoot_photo(&image);
+ size_t length = ptc06_get_image(&image);
for (int i = 0; i < length; i++) {
printf("%d ", image[i]);
if (i % 12 == 0)
diff --git a/Year 3/Internet of things/goam/main/ptc06.c b/Year 3/Internet of things/goam/main/ptc06.c
index c73227a..60a12fc 100644
--- a/Year 3/Internet of things/goam/main/ptc06.c
+++ b/Year 3/Internet of things/goam/main/ptc06.c
@@ -7,8 +7,44 @@
#include "ptc06.h"
#include <string.h>
+/*
+ * Helpers
+ */
+
+static void append(char* container, const char* data, size_t dataLen) {
+ for (size_t i = 0; i < dataLen; i++)
+ container[i] = data[i];
+}
+
+static size_t arr2ToNum(const char arr[2]) {
+ return (arr[0] << 8) | arr[1];
+}
+
+static size_t arr4ToNum(const char arr[4]) {
+ return (arr2ToNum(arr) << 16) | arr2ToNum(arr+2);
+}
+
+#define min(a, b) (a < b) ? (a) : (b)
#define wait(milliseconds) vTaskDelay(milliseconds / portTICK_PERIOD_MS);
+/*
+ * Logging
+ */
+
+static const char* TAG = "ptc06";
+
+static void debug_print(const char* prepend, char* message, size_t size) {
+ printf("%s: ", prepend);
+ for (int i = 0; i < size; i++) {
+ printf("%X ", message[i]);
+ }
+ printf("\n");
+}
+
+/*
+ * UART settings
+ */
+
#define UART_NUM UART_NUM_2
#define UART_TX 17
#define UART_RX 16
@@ -17,49 +53,8 @@
// Setup UART buffered IO with event queue
static QueueHandle_t uart_queue;
#define QUEUE_SIZE 10
-static size_t serial_num = 0x00;
-
-static const char* TAG = "ptc06";
-
-#define VARP 0xFA
-static const char comm_reset[] = { 0x56, 0x00, 0x26, 0x00 };
-static const char resp_reset[] = { 0x76, 0x00, 0x26, 0x00 };
-static const char comm_capture[] = { 0x56, 0x00, 0x36, 0x01, 0x00 };
-static const char resp_capture[] = { 0x76, 0x00, 0x36, 0x00, 0x00 };
-static const char comm_data_len[] = { 0x56, 0x00, 0x34, 0x01, 0x00 };
-static const char resp_data_len[] = { 0x76, 0x00, 0x34, 0x00, 0x04, 0x00, 0x00, VARP, VARP };
-static const char comm_read_data[] = { 0x56, 0x00, 0x32, 0x0C, 0x00, 0x0F, 0x00, 0x00, VARP, VARP, 0x00, 0x00, VARP, VARP, 0x30, 0x00 };
-static const char resp_read_data[] = { 0x76, 0x00, 0x32, 0x00, 0x00 };
-static const char comm_stop_cap[] = { 0x56, 0x00, 0x36, 0x01, 0x03 };
-static const char resp_stop_cap[] = { 0x76, 0x00, 0x36, 0x00, 0x00 };
-static const char comm_set_compress[] = { 0x56, 0x00, 0x31, 0x05, 0x01, 0x01, 0x12, 0x04, VARP };
-static const char resp_set_compress[] = { 0x76, 0x00, 0x31, 0x00, 0x00 };
-static const char comm_set_res[] = { 0x56, 0x00, 0x31, 0x05, 0x04, 0x01, 0x00, 0x19, VARP };
-static const char resp_set_res[] = { 0x76, 0x00, 0x31, 0x00, 0x00 };
-/* static const char comm_set_baud[] = { 0x56, 0x00, 0x31, 0x06, 0x04, 0x02, 0x00, 0x08, VARP, VARP }; */
-/* static const char resp_set_baud[] = { 0x76, 0x00, 0x31, 0x00 }; */
-static size_t size(const char* a) {
- if (a == comm_reset ) return 4;
- if (a == resp_reset ) return 4;
- if (a == comm_capture ) return 5;
- if (a == resp_capture ) return 5;
- if (a == comm_data_len ) return 5;
- if (a == resp_data_len ) return 9;
- if (a == comm_read_data ) return 16;
- if (a == resp_read_data ) return 5;
- if (a == comm_stop_cap ) return 5;
- if (a == resp_stop_cap ) return 5;
- if (a == comm_set_compress) return 9;
- if (a == resp_set_compress) return 5;
- if (a == comm_set_res ) return 9;
- if (a == resp_set_res ) return 5;
- return 0;
-}
-
-/*
- * UART settings
- */
+static size_t serial_num = 0x00;
static void init_uart() {
// HS_UART
@@ -94,23 +89,19 @@ static void dynamic_flush_uart() {
}
}
-static void fully_flush_uart() {
- dynamic_flush_uart();
-}
-
/*
* Camera special
*/
static void init_camera() {
- vTaskDelay(2500 / portTICK_PERIOD_MS);
+ wait(2500);
}
/*
- * UART communiction
+ * Generic UART communiction
*/
-static enum COMMAND {
+enum Command {
GEN_VERSION = 0x11,
SYSTEM_RESET = 0x26,
READ_FBUF = 0x32,
@@ -118,30 +109,22 @@ static enum COMMAND {
FBUF_CTRL = 0x36
};
-void debug_print(const char* prepend, char* message, size_t size) {
- printf("%s: ", prepend);
- for (int i = 0; i < size; i++) {
- printf("%X ", message[i]);
- }
- printf("\n");
-}
-
-static void send(enum COMMAND comm_byte, char data_lengths, char data[16]) {
+static void send(enum Command comm_byte, const char data_lengths, char data[16]) {
char command[20] = { 0x56, serial_num, comm_byte, data_lengths, };
- for (int i = 0; i < data_lengths; i++)
- command[4 + i] = data[i];
- debug_print("send", command, 4+data_lengths);
+ append(command + 4, data, data_lengths);
+
+ debug_print("sent", command, 4+data_lengths);
uart_write_bytes(UART_NUM, command, 4 + data_lengths);
ESP_ERROR_CHECK(uart_wait_tx_done(UART_NUM, 100));
}
-#define byte_check(varname, compare) esp_err_t varname = (compare) ? ESP_OK : ESP_ERR_INVALID_RESPONSE; \
- ESP_ERROR_CHECK(varname);
+#define byte_check(varname, compare) esp_err_t varname = (compare) ? ESP_OK : ESP_ERR_INVALID_RESPONSE; ESP_ERROR_CHECK(varname);
-static void recv(enum COMMAND comm_byte, char expectedDataSize, char ack[21]) {
+static void recv(enum Command comm_byte, const char expectedDataSize, char ack[21]) {
uart_read_bytes(UART_NUM, ack, 5 + expectedDataSize, 100);
ESP_ERROR_CHECK(uart_wait_tx_done(UART_NUM, 100));
+
debug_print("recv", ack, 5+expectedDataSize);
byte_check(BAD_RETURN_SIGN, ack[0] == 0x76);
@@ -157,58 +140,56 @@ static void recv(enum COMMAND comm_byte, char expectedDataSize, char ack[21]) {
static char temp_ack[21], temp_data[16];
-void ptc06_system_reset() {
- dynamic_flush_uart(); // ignore "basic configuration information"
+static void vc0706_system_reset() {
+ dynamic_flush_uart();
send(SYSTEM_RESET, 0, NULL);
recv(SYSTEM_RESET, 0, temp_ack);
wait(20);
dynamic_flush_uart(); // ignore "basic configuration information"
}
-enum control_flag {
- stop_current_frame = 0,
- stop_next_frame = 1,
- resume_frame = 2,
- step_frame = 3
+enum ControlFlag {
+ STOP_CURRENT_FRAME = 0,
+ STOP_NEXT_FRAME = 1,
+ RESUME_FRAME = 2,
+ STEP_FRAME = 3
};
-void ptc06_fbuf_ctrl(enum control_flag cf_byte) {
+
+static void vc0706_fbuf_ctrl(enum ControlFlag cf_byte) {
temp_data[0] = cf_byte;
send(FBUF_CTRL, 0x01, temp_data);
recv(FBUF_CTRL, 0, temp_ack);
}
-enum fbuf_type {
- current_frame = 0,
- next_frame = 1
+enum FBufType {
+ CURRENT_FRAME = 0,
+ NEXT_FRAME = 1
};
-void ptc06_get_fbuf_len(enum fbuf_type type_byte) {
- temp_data[0] = type_byte;
+
+static void vc0706_get_fbuf_len(enum FBufType fbt_byte) {
+ temp_data[0] = fbt_byte;
send(GET_FBUF_LEN, 0x01, temp_data);
recv(GET_FBUF_LEN, 4, temp_ack);
}
-#define min(a, b) (a < b) ? (a) : (b)
-
-enum control_mode {
- mcu = 0xFE,
- dma = 0x0A
+enum ControlMode {
+ MCU = 0xFE,
+ DMA = 0x0A
};
-size_t ptc06_read_fbuf(enum fbuf_type type_byte, enum control_mode cm_byte, char start[4], char data_length[4], char delay[2], char** image) {
- temp_data[0] = type_byte;
- temp_data[1] = cm_byte;
- for (int i = 0; i < 4; i++)
- temp_data[2+i] = start[i];
- for (int i = 0; i < 4; i++)
- temp_data[6+i] = data_length[i];
- temp_data[10] = delay[0];
- temp_data[11] = delay[1];
- size_t delayby = (delay[0] << 8) | delay[1];
- size_t length = (data_length[2] << 8) | data_length[3];
- printf("%d\n", length);
+static size_t vc0706_read_fbuf(enum FBufType fbt_byte, enum ControlMode cm_byte, const char start[4], const char data_length[4], const char delay[2], char** image) {
+ size_t delayby = arr2ToNum(delay);
+ size_t length = arr4ToNum(data_length);
+ /* printf("%d\n", length); */
*image = (char*)malloc(length);
- memset(*image, 0xFA, length);
+ memset(*image, 0xFA, length); // So it's easily recogniseable if the whole array wasn't filled with anything
+
+ temp_data[0] = fbt_byte;
+ temp_data[1] = cm_byte;
+ append(temp_data + 2, start, 4);
+ append(temp_data + 6, data_length, 4);
+ append(temp_data + 10, delay, 2);
send(READ_FBUF, 0x0C, temp_data);
@@ -219,10 +200,10 @@ size_t ptc06_read_fbuf(enum fbuf_type type_byte, enum control_mode cm_byte, char
size_t available = 1;
while (current < length) {
ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM, &available));
- size_t old = current;
+ /* size_t old = current; */
current += uart_read_bytes(UART_NUM, *image + current, min(available, length - current), 500);
- debug_print("image", *image + old, current - old);
- printf("%d %d\n", current, available);
+ /* debug_print("image", *image + old, current - old); */
+ /* printf("%d %d\n", current, available); */
ESP_ERROR_CHECK(uart_wait_tx_done(UART_NUM, 500));
wait(20);
}
@@ -233,96 +214,42 @@ size_t ptc06_read_fbuf(enum fbuf_type type_byte, enum control_mode cm_byte, char
return length;
}
+/*
+ * Public interface
+ */
+void ptc06_init() {
+ init_uart();
+ init_camera();
+ vc0706_system_reset();
+
+ /* ptc06_set_resolution(); */
+ /* ptc06_set_compressibility(); */
+
+ ESP_LOGI(TAG, "Initialized ptc06 successfully. UART tx: %d, rx: %d", UART_TX, UART_RX);
+}
void ptc06_reset() {
- ptc06_system_reset();
+ vc0706_system_reset();
}
-size_t ptc06_shoot_photo(char** image) {
- ptc06_fbuf_ctrl(stop_current_frame);
+size_t ptc06_get_image(char** image) {
+ vc0706_fbuf_ctrl(STOP_CURRENT_FRAME);
wait(1000);
- ptc06_get_fbuf_len(current_frame);
+
+ vc0706_get_fbuf_len(CURRENT_FRAME);
char start[4] = { 0x00 };
char delay[2] = { 0x30, 0x00 };
- size_t length = ptc06_read_fbuf(current_frame, dma, start, temp_ack + 5, delay, image);
- ptc06_fbuf_ctrl(resume_frame);
- return length;
-}
-
-
-
-
-#include <stdio.h>
+ size_t length = vc0706_read_fbuf(CURRENT_FRAME, DMA, start, temp_ack + 5, delay, image);
-static bool resp_eq(const char a[], size_t sizea, const char b[], size_t sizeb) {
- /* printf("%d\n", sizeof(a)); */
- if (sizea != sizeb) {
- return false;
- }
-
- for (size_t i = 0; i < sizea; i++) {
- if (a[i] != VARP && b[i] != VARP && a[i] != b[i])
- return false;
- }
- return true;
-}
-
-static void send_commSIZE(const char comm[], size_t size) {
- uart_write_bytes(UART_NUM, comm, size);
- ESP_ERROR_CHECK(uart_wait_tx_done(UART_NUM, 100));
-}
-
-static void send_comm(const char comm[]) {
- send_commSIZE(comm, size(comm));
+ vc0706_fbuf_ctrl(RESUME_FRAME);
+ return length;
}
-static void send_commVARS(const char comm[], const char vars[]) {
- size_t commsize = size(comm);
- char copy[commsize];
- printf("send: ");
- size_t varsi = 0;
- for (size_t i = 0; i < commsize; i++) {
- if (comm[i] == VARP) {
- copy[i] = vars[varsi++];
- }
- else {
- copy[i] = comm[i];
- }
- printf("%X ", copy[i]);
- }
- printf("\n");
- send_commSIZE(copy, commsize);
-}
-static void recv_ackXXYY(const char ack[], char* XX, char* YY) {
- char data[size(ack)];
- int read = uart_read_bytes(UART_NUM, data, size(ack), 100);
- printf("recv: ");
- for (int i = 0; i < size(ack); i++) {
- printf("%X ", data[i]);
- }
- printf("\n");
- ESP_ERROR_CHECK(read < 0 ? ESP_FAIL : ESP_OK);
- esp_err_t RESPONSE_WAS_NOT_THE_EXPECTED_ONE = !resp_eq(data, size(ack), ack, size(ack)) ? ESP_ERR_INVALID_STATE : ESP_OK;
- ESP_ERROR_CHECK(RESPONSE_WAS_NOT_THE_EXPECTED_ONE);
-
- if (XX) *XX = data[size(ack)-2];
- if (YY) *YY = data[size(ack)-1];
-}
-
-static void recv_ack(const char ack[]) {
- recv_ackXXYY(ack, NULL, NULL);
-}
-
-/* void ptc06_reset() { */
-/* fully_flush_uart(); */
-/* send_comm(comm_reset); */
-/* recv_ack(resp_reset); */
-/* fully_flush_uart(); */
-/* } */
+/*
static void ptc06_set_resolution() {
char res[] = { 0x22 };
send_commVARS(comm_set_res, res);
@@ -351,58 +278,12 @@ static void ptc06_read_image_length(char* XX, char* YY) {
ESP_LOGI(TAG, "Read length");
}
-static char* ptc06_read_image_data(const char XX, const char YY) {
- size_t length = (XX << 8) | YY;
- char* image = (char*)malloc(length * sizeof(char));
- printf("%d\n", length);
-
- char vars[] = { 0x00, 0x00, XX, YY };
- send_commVARS(comm_read_data, vars);
-
- recv_ack(resp_read_data);
- /* vTaskDelay(123 / portTICK_PERIOD_MS); */
-
- int current = 0;
- size_t available = 1;
- while (current < length && available > 0) {
- ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM, &available));
- current += uart_read_bytes(UART_NUM, image + current, available, 100);
- vTaskDelay(1 / portTICK_PERIOD_MS);
- }
- for (int i = 0; i < 10; i++)
- printf("%d\n", image[i]);
- printf("\n");
-
- recv_ack(resp_read_data);
- fully_flush_uart();
-
- ESP_LOGI(TAG, "Read image");
- return image;
+char* ptc06_shoot_photo() {
+ ptc06_capture();
+ char XX, YY;
+ ptc06_read_image_length(&XX, &YY);
+ char* img = ptc06_read_image_data(XX, YY);
+ ptc06_stop_capture();
+ return img;
}
-
-static void ptc06_stop_capture() {
- send_comm(comm_stop_cap);
- recv_ack(resp_stop_cap);
- fully_flush_uart();
- ESP_LOGI(TAG, "Stopped capture");
-}
-
-void ptc06_init() {
- init_uart();
- init_camera();
- ptc06_reset();
-
- /* ptc06_set_resolution(); */
- /* ptc06_set_compressibility(); */
-
- ESP_LOGI(TAG, "Initialized ptc06 successfully. UART tx: %d, rx: %d", UART_TX, UART_RX);
-}
-
-/* char* ptc06_shoot_photo() { */
-/* ptc06_capture(); */
-/* char XX, YY; */
-/* ptc06_read_image_length(&XX, &YY); */
-/* char* img = ptc06_read_image_data(XX, YY); */
-/* ptc06_stop_capture(); */
-/* return img; */
-/* } */
+*/
diff --git a/Year 3/Internet of things/goam/main/ptc06.h b/Year 3/Internet of things/goam/main/ptc06.h
index f9b00cb..17816a9 100644
--- a/Year 3/Internet of things/goam/main/ptc06.h
+++ b/Year 3/Internet of things/goam/main/ptc06.h
@@ -2,4 +2,4 @@
void ptc06_init();
void ptc06_reset();
-size_t ptc06_shoot_photo(char** image);
+size_t ptc06_get_image(char** image);