update
This commit is contained in:
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@@ -5,7 +5,7 @@
|
|||||||
"idf.openOcdConfigs": [
|
"idf.openOcdConfigs": [
|
||||||
"board/esp32s3-builtin.cfg"
|
"board/esp32s3-builtin.cfg"
|
||||||
],
|
],
|
||||||
"idf.port": "/dev/ttyUSB0",
|
"idf.port": "/dev/ttyUSB1",
|
||||||
"idf.toolsPath": "/home/bruno/.espressif",
|
"idf.toolsPath": "/home/bruno/.espressif",
|
||||||
"idf.customExtraVars": {
|
"idf.customExtraVars": {
|
||||||
"IDF_TARGET": "esp32s3"
|
"IDF_TARGET": "esp32s3"
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
"**/debian/*.install": "plain",
|
"**/debian/*.install": "plain",
|
||||||
"condition_variable": "c",
|
"condition_variable": "c",
|
||||||
"ctime": "c",
|
"ctime": "c",
|
||||||
"mutex": "c"
|
"mutex": "c",
|
||||||
|
"cstdint": "c"
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
idf_component_register(SRCS "main.c"
|
idf_component_register(SRCS "main.c"
|
||||||
"lipton/cci.cpp"
|
"lipton/cci.c"
|
||||||
"lipton/i2c.cpp"
|
|
||||||
"lipton/lepton_system.cpp"
|
|
||||||
"lipton/lepton_utilities.cpp"
|
|
||||||
"lipton/vospi.cpp"
|
|
||||||
"lipton/cci.h"
|
"lipton/cci.h"
|
||||||
|
"lipton/i2c.c"
|
||||||
"lipton/i2c.h"
|
"lipton/i2c.h"
|
||||||
|
"lipton/lepton_system.c"
|
||||||
"lipton/lepton_system.h"
|
"lipton/lepton_system.h"
|
||||||
|
"lipton/lepton_utilities.c"
|
||||||
"lipton/lepton_utilities.h"
|
"lipton/lepton_utilities.h"
|
||||||
|
"lipton/vospi.c"
|
||||||
"lipton/vospi.h"
|
"lipton/vospi.h"
|
||||||
INCLUDE_DIRS ".")
|
INCLUDE_DIRS ".")
|
@@ -631,10 +631,10 @@ static int cci_write_register(uint16_t reg, uint16_t value)
|
|||||||
{
|
{
|
||||||
// Write the register address and value
|
// Write the register address and value
|
||||||
uint8_t write_buf[4] = {
|
uint8_t write_buf[4] = {
|
||||||
uint8_t (reg >> 8 & 0xff),
|
(uint8_t) (reg >> 8 & 0xff),
|
||||||
uint8_t (reg & 0xff),
|
(uint8_t) (reg & 0xff),
|
||||||
uint8_t (value >> 8 & 0xff),
|
(uint8_t) (value >> 8 & 0xff),
|
||||||
uint8_t (value & 0xff)
|
(uint8_t) (value & 0xff)
|
||||||
};
|
};
|
||||||
if (i2c_master_write_slave(CCI_ADDRESS, write_buf, sizeof(write_buf)) != ESP_OK) {
|
if (i2c_master_write_slave(CCI_ADDRESS, write_buf, sizeof(write_buf)) != ESP_OK) {
|
||||||
printf("[CCI] Error: failed to write CCI register %02x with value %02x\n", reg, value);
|
printf("[CCI] Error: failed to write CCI register %02x with value %02x\n", reg, value);
|
@@ -6,7 +6,7 @@
|
|||||||
#include "lepton_utilities.h"
|
#include "lepton_utilities.h"
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
#include "vospi.h"
|
#include "vospi.h"
|
||||||
#include <cstring>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
// lepton image and telem buffer
|
// lepton image and telem buffer
|
198
main/main.c
198
main/main.c
@@ -1,5 +1,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define LEPTON_ENABLE
|
||||||
|
|
||||||
|
#include "mbedtls/base64.h"
|
||||||
|
|
||||||
|
|
||||||
#define TAG "CAM"
|
#define TAG "CAM"
|
||||||
#include "esp_camera.h"
|
#include "esp_camera.h"
|
||||||
#define PWDN_GPIO_NUM -1
|
#define PWDN_GPIO_NUM -1
|
||||||
@@ -27,6 +32,8 @@
|
|||||||
|
|
||||||
#define MAX_PAYLOAD_SIZE 1472
|
#define MAX_PAYLOAD_SIZE 1472
|
||||||
|
|
||||||
|
// uint8_t hehe[10000];
|
||||||
|
|
||||||
#include "esp_event.h"
|
#include "esp_event.h"
|
||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "esp_event.h"
|
#include "esp_event.h"
|
||||||
@@ -41,6 +48,8 @@
|
|||||||
#include "lipton/vospi.h"
|
#include "lipton/vospi.h"
|
||||||
#include "lipton/lepton_system.h"
|
#include "lipton/lepton_system.h"
|
||||||
#include "lipton/lepton_utilities.h"
|
#include "lipton/lepton_utilities.h"
|
||||||
|
#include <driver/uart.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
// Number of consecutive VoSPI resynchronization attempts before attempting to reset
|
// Number of consecutive VoSPI resynchronization attempts before attempting to reset
|
||||||
#define LEP_SYNC_FAIL_FAULT_LIMIT 10
|
#define LEP_SYNC_FAIL_FAULT_LIMIT 10
|
||||||
@@ -48,6 +57,13 @@
|
|||||||
// Reset fail delay before attempting a re-init (seconds)
|
// Reset fail delay before attempting a re-init (seconds)
|
||||||
#define LEP_RESET_FAIL_RETRY_SECS 5
|
#define LEP_RESET_FAIL_RETRY_SECS 5
|
||||||
|
|
||||||
|
#define BUF_SIZE 20000
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x, y, width, height;
|
||||||
|
} Rectangle;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Code start
|
// Code start
|
||||||
//
|
//
|
||||||
@@ -176,7 +192,7 @@ void send_data_frame(uint8_t type, uint8_t *data, size_t len)
|
|||||||
ESP_LOGI(TAG, "TxTarget: %d bytes", full_len);
|
ESP_LOGI(TAG, "TxTarget: %d bytes", full_len);
|
||||||
full_packet[full_len] = 0;
|
full_packet[full_len] = 0;
|
||||||
esp_err_t ret = tx_with_retry(WIFI_IF, full_packet, full_len + 2, true);
|
esp_err_t ret = tx_with_retry(WIFI_IF, full_packet, full_len + 2, true);
|
||||||
//ESP_LOG_BUFFER_HEXDUMP(TAG, full_packet, full_len, ESP_LOG_INFO);
|
// ESP_LOG_BUFFER_HEXDUMP(TAG, full_packet, full_len, ESP_LOG_INFO);
|
||||||
|
|
||||||
if (ret == ESP_OK)
|
if (ret == ESP_OK)
|
||||||
{
|
{
|
||||||
@@ -188,7 +204,7 @@ void send_data_frame(uint8_t type, uint8_t *data, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(full_packet);
|
free(full_packet);
|
||||||
vTaskDelay(60 / portTICK_PERIOD_MS);
|
vTaskDelay(80 / portTICK_PERIOD_MS);
|
||||||
offset += chunk_size;
|
offset += chunk_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -298,21 +314,103 @@ esp_err_t camera_capture()
|
|||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t *take_picture()
|
||||||
|
{
|
||||||
|
gpio_set_level(LEP_CSN_PIN, 0);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
// Spin waiting for vsync to be asserted
|
||||||
|
int t = 0;
|
||||||
|
while (gpio_get_level(LEP_VSYNC_PIN) == 0 && t++ < 11000)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
vsyncDetectedUsec = esp_timer_get_time();
|
||||||
|
|
||||||
|
// Attempt to process a segment
|
||||||
|
if (t >= 22000 || vospi_transfer_segment(vsyncDetectedUsec))
|
||||||
|
{
|
||||||
|
// Got image
|
||||||
|
vsync_count = 0;
|
||||||
|
if (t >= 11000)
|
||||||
|
printf("LEPOVF%d\n", t);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("LEPNOVF%d\n", t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the frame to the current half of the shared buffer and let rsp_task know
|
||||||
|
vospi_get_frame(&rsp_lep_buffer);
|
||||||
|
|
||||||
|
// Hold fault counters reset while operating
|
||||||
|
sync_fail_count = 0;
|
||||||
|
|
||||||
|
// disable lepton again
|
||||||
|
gpio_set_level(LEP_CSN_PIN, 1);
|
||||||
|
return rsp_lep_buffer.lep_bufferP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (++vsync_count >= 36)
|
||||||
|
{
|
||||||
|
vsync_count = 0;
|
||||||
|
printf("[MAIN] Could not get lepton image\n");
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(185));
|
||||||
|
|
||||||
|
if (sync_fail_count++ == LEP_SYNC_FAIL_FAULT_LIMIT)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *lepton_get_frame()
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t *picture = take_picture();
|
||||||
|
struct timeval tv_now;
|
||||||
|
gettimeofday(&tv_now, NULL);
|
||||||
|
|
||||||
|
PreData pre;
|
||||||
|
pre.isVisible = false;
|
||||||
|
pre.len = LEP_NUM_PIXELS;
|
||||||
|
pre.width = LEP_WIDTH;
|
||||||
|
pre.height = LEP_HEIGHT;
|
||||||
|
pre.format = 0;
|
||||||
|
pre.timestamp = tv_now;
|
||||||
|
size_t totalSize;
|
||||||
|
uint8_t *dataOut = create_frame(picture, &totalSize, pre);
|
||||||
|
send_data_frame(0x10, dataOut, totalSize);
|
||||||
|
return picture;
|
||||||
|
}
|
||||||
|
|
||||||
void app_main(void)
|
void app_main(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// for (size_t i = 0; i < sizeof(hehe); i++)
|
||||||
|
// {
|
||||||
|
// hehe[i] = i & 0xFF;
|
||||||
|
// }
|
||||||
|
|
||||||
const uart_port_t uart_num = UART_NUM_0;
|
const uart_port_t uart_num = UART_NUM_0;
|
||||||
uart_config_t uart_config = {
|
uart_config_t uart_config = {
|
||||||
.baud_rate = 115200,
|
.baud_rate = 115200,
|
||||||
.data_bits = UART_DATA_8_BITS,
|
.data_bits = UART_DATA_8_BITS,
|
||||||
.parity = UART_PARITY_DISABLE,
|
.parity = UART_PARITY_DISABLE,
|
||||||
.stop_bits = UART_STOP_BITS_1,
|
.stop_bits = UART_STOP_BITS_1,
|
||||||
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
|
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE};
|
||||||
};
|
|
||||||
uart_param_config(uart_num, &uart_config);
|
uart_param_config(uart_num, &uart_config);
|
||||||
uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);
|
uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);
|
||||||
|
|
||||||
uint8_t* buf = malloc(BUF_SIZE);
|
uint8_t *buf = malloc(BUF_SIZE);
|
||||||
char* line = malloc(BUF_SIZE);
|
char *line = malloc(BUF_SIZE);
|
||||||
int line_len = 0;
|
int line_len = 0;
|
||||||
|
|
||||||
nvs_flash_init();
|
nvs_flash_init();
|
||||||
@@ -347,7 +445,25 @@ void app_main(void)
|
|||||||
ESP_LOGI(TAG, "ESP32 MAC: %02X:%02X:%02X:%02X:%02X:%02X",
|
ESP_LOGI(TAG, "ESP32 MAC: %02X:%02X:%02X:%02X:%02X:%02X",
|
||||||
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
|
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
|
||||||
|
|
||||||
camera_init();
|
// size_t outLen = 0;
|
||||||
|
|
||||||
|
// PreData pre;
|
||||||
|
|
||||||
|
// struct timeval tv;
|
||||||
|
// gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
|
// pre.format = PIXFORMAT_JPEG;
|
||||||
|
// pre.width = 100;
|
||||||
|
// pre.height = 100;
|
||||||
|
// pre.isVisible = true;
|
||||||
|
// pre.len = sizeof(hehe);
|
||||||
|
// pre.timestamp = tv;
|
||||||
|
|
||||||
|
// uint8_t *imgFrame = create_frame(hehe, &outLen, pre);
|
||||||
|
|
||||||
|
// send_data_frame(0x10, imgFrame, outLen);
|
||||||
|
|
||||||
|
// free(imgFrame);
|
||||||
|
|
||||||
#ifdef LEPTON_ENABLE
|
#ifdef LEPTON_ENABLE
|
||||||
gpio_config_t usb_phy_conf = {
|
gpio_config_t usb_phy_conf = {
|
||||||
@@ -412,6 +528,7 @@ void app_main(void)
|
|||||||
gpio_set_level(LEP_CSN_PIN, 1);
|
gpio_set_level(LEP_CSN_PIN, 1);
|
||||||
|
|
||||||
printf("LEPTON INIT DONE");
|
printf("LEPTON INIT DONE");
|
||||||
|
camera_init();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -421,24 +538,63 @@ void app_main(void)
|
|||||||
int64_t start = esp_timer_get_time();
|
int64_t start = esp_timer_get_time();
|
||||||
camera_capture();
|
camera_capture();
|
||||||
#ifdef LEPTON_ENABLE
|
#ifdef LEPTON_ENABLE
|
||||||
uint8_t *picture = take_picture();
|
uint8_t *picture = lepton_get_frame();
|
||||||
if (picture)
|
if (picture)
|
||||||
{
|
{
|
||||||
|
int maxBrightness = -1;
|
||||||
|
Rectangle brightest = {0, 0, 0, 0};
|
||||||
|
|
||||||
struct timeval tv_now;
|
for (int y = 0; y < LEP_HEIGHT; y++) {
|
||||||
gettimeofday(&tv_now, NULL);
|
for (int x = 0; x < LEP_WIDTH; x++) {
|
||||||
|
int idx = y * LEP_WIDTH + x;
|
||||||
|
int brightness = picture[idx]; // grayscale
|
||||||
|
|
||||||
|
if (brightness > maxBrightness) {
|
||||||
|
maxBrightness = brightness;
|
||||||
|
brightest.x = x;
|
||||||
|
brightest.y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rozšírenie oblasti
|
||||||
|
int padding = 10;
|
||||||
|
brightest.x = (brightest.x - padding < 0) ? 0 : brightest.x - padding;
|
||||||
|
brightest.y = (brightest.y - padding < 0) ? 0 : brightest.y - padding;
|
||||||
|
brightest.width = ((brightest.x + padding * 2) > LEP_WIDTH) ? (LEP_WIDTH - brightest.x) : (padding * 2);
|
||||||
|
brightest.height = ((brightest.y + padding * 2) > LEP_HEIGHT) ? (LEP_HEIGHT - brightest.y) : (padding * 2);
|
||||||
|
|
||||||
|
// Výpočet stredu oblasti
|
||||||
|
double middleX = brightest.x + brightest.width / 2.0;
|
||||||
|
double middleY = brightest.y + brightest.height / 2.0;
|
||||||
|
|
||||||
|
// Výpočet uholných odchýlok
|
||||||
|
double rotationX = 3 * M_PI / 180.0;
|
||||||
|
double rotationY = 0 * M_PI / 180.0;
|
||||||
|
double rotationZ = 45 * M_PI / 180.0;
|
||||||
|
double posX = 100, posY = 100, posZ = 500;
|
||||||
|
|
||||||
|
double plusX = ((middleX - LEP_HEIGHT / 2.0) / LEP_HEIGHT) * 57 * M_PI / 180.0;
|
||||||
|
double plusY = ((middleY - LEP_WIDTH / 2.0) / LEP_WIDTH) * 42.75 * M_PI / 180.0;
|
||||||
|
|
||||||
|
double posGX = posZ * tan(rotationX + plusX) * cos(rotationZ) + posX;
|
||||||
|
double posGY = posZ * tan(rotationY + plusY) * sin(rotationZ) + posY;
|
||||||
|
|
||||||
|
//printf("Stred najjasnejšej oblasti: (%.2f, %.2f)\n", middleX, middleY);
|
||||||
|
//printf("Výpočet pozície: posGX = %.2f, posGY = %.2f\n", posGX, posGY);
|
||||||
|
|
||||||
|
uint8_t messageBuffer[32];
|
||||||
|
|
||||||
|
uint8_t messageBufferEncoded[50];
|
||||||
|
size_t outputLen;
|
||||||
|
mbedtls_base64_encode(messageBufferEncoded, sizeof(messageBufferEncoded), &outputLen, messageBuffer, sizeof(messageBuffer));
|
||||||
|
|
||||||
|
uint8_t messageBufferPrefixed[60] = "NavData:";
|
||||||
|
strcat(messageBufferPrefixed, messageBufferEncoded);
|
||||||
|
strcat(messageBufferPrefixed, "\n");
|
||||||
|
|
||||||
|
uart_write_bytes(uart_num, messageBufferPrefixed, strlen(messageBufferPrefixed));
|
||||||
|
|
||||||
PreData pre;
|
|
||||||
pre.isVisible = false;
|
|
||||||
pre.len = LEP_NUM_PIXELS;
|
|
||||||
pre.width = LEP_WIDTH;
|
|
||||||
pre.height = LEP_HEIGHT;
|
|
||||||
pre.format = 0;
|
|
||||||
pre.timestamp = tv_now;
|
|
||||||
size_t totalSize;
|
|
||||||
uint8_t *dataOut = create_frame(picture, &totalSize, pre);
|
|
||||||
send_data_frame(0x10, dataOut, totalSize);
|
|
||||||
free(picture);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user