diff options
| Commit | 51bc164433b6c85349b4005754d1d5a83faca84f (patch) | |
|---|---|---|
| Author | 2024-05-05 16:11:13 +0300 | |
| Committer | 2024-05-05 16:11:13 +0300 | |
| Files | 27a769ed1a0d1a871f4ab3b0a453b84b58f1b77d | |
| uni-projects-51bc164433b6c85349b4005754d1d5a83faca84f.tar uni-projects-51bc164433b6c85349b4005754d1d5a83faca84f.tar.gz uni-projects-51bc164433b6c85349b4005754d1d5a83faca84f.zip | ||
| Parent | 58c66096783cb51ac8b7df846c383135f765f4f1 (diff) | |
[iot/goam] Cleaned up ptc06 implementation
3 files changed, 111 insertions, 230 deletions
| -rw-r--r-- | Year 3/Internet of things/goam/main/main.c | 2 | ||||
| -rw-r--r-- | Year 3/Internet of things/goam/main/ptc06.c | 337 | ||||
| -rw-r--r-- | Year 3/Internet of things/goam/main/ptc06.h | 2 |
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); |
