diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 92b355c..fb4990c 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs index 5dbf50e..24e4e15 100644 --- a/.settings/stm32cubeide.project.prefs +++ b/.settings/stm32cubeide.project.prefs @@ -1,6 +1,6 @@ -2F62501ED4689FB349E356AB974DBE57=E20EF8A1CFA8D2AA5E7713614514A9E1 +2F62501ED4689FB349E356AB974DBE57=415725201A9C3CE6FDA557B2C9FBCC13 635E684B79701B039C64EA45C3F84D30=C8B026EBE17C208F17FB66CE4235156C 66BE74F758C12D739921AEA421D593D3=1 -8DF89ED150041C4CBC7CB9A9CAA90856=E20EF8A1CFA8D2AA5E7713614514A9E1 +8DF89ED150041C4CBC7CB9A9CAA90856=415725201A9C3CE6FDA557B2C9FBCC13 DC22A860405A8BF2F2C095E5B6529F12=071C30CF380DE7D03307EB9085476C68 eclipse.preferences.version=1 diff --git a/.vscode/settings.json b/.vscode/settings.json index 4cd6516..0d302ce 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -104,7 +104,9 @@ "xutility": "c", "cstring": "cpp", "optional": "cpp", - "span": "cpp" + "span": "cpp", + "xs_device_id.h": "c", + "xs_log.h": "c" }, "files.autoGuessEncoding": false, "files.encoding": "gbk" diff --git a/README.md b/README.md index 67f64b5..1cada81 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,14 @@ ref:https://iflytop1.feishu.cn/docx/FPqjdaTtkoBeU9x4qbjcD6vxnUc V1 单片机程序基本稳定 -``` \ No newline at end of file +V3 + 1.添加SN码,并规范化 + 2.修改xsync相机同步消息上报格式 + 3.修改xsynctimecode消息上报格式 + +``` + +··· +设备ID配置方法: + 直接通过 +··· \ No newline at end of file diff --git a/STM32F407VETX_FLASH.ld b/STM32F407VETX_FLASH.ld index d2fe0f0..084da88 100644 --- a/STM32F407VETX_FLASH.ld +++ b/STM32F407VETX_FLASH.ld @@ -47,7 +47,7 @@ MEMORY { CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K - FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 384K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 768K } /* Sections */ diff --git a/iflytop_xsync b/iflytop_xsync index 6434f42..5ae77f0 160000 --- a/iflytop_xsync +++ b/iflytop_xsync @@ -1 +1 @@ -Subproject commit 6434f422ec46fc02968f71ad0dec47de6c8f1827 +Subproject commit 5ae77f0687ccf0fc7710d922deda0e32f4e73678 diff --git a/usrc/base_service/xsync_regs.hpp b/usrc/base_service/xsync_regs.hpp index 32e416f..d60a7da 100644 --- a/usrc/base_service/xsync_regs.hpp +++ b/usrc/base_service/xsync_regs.hpp @@ -256,5 +256,8 @@ typedef enum { *******************************************************************************/ camera_sync_module = REGADDOFF__CAMERA_SYNC_OUT + 0, camera_sync_pulse_mode_valid_len = REGADDOFF__CAMERA_SYNC_OUT + 1, + camera_sync_timecode_snapshot0 = REGADDOFF__CAMERA_SYNC_OUT + 2, + camera_sync_timecode_snapshot1 = REGADDOFF__CAMERA_SYNC_OUT + 3, + camera_sync_cnt = REGADDOFF__CAMERA_SYNC_OUT + 4, } RegAdd_t; diff --git a/usrc/main.cpp b/usrc/main.cpp index c76e32f..b15f549 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -4,7 +4,6 @@ // #include "base_service/base_service.h" #include "base_service/fpga_if.h" -#include "service/device_info.hpp" #include "service/extern_if_service.h" #include "service/network_service.h" #include "service/reg_manager.h" @@ -86,14 +85,9 @@ void factory_reset_key_detect() { } void umain() { - /** - * @brief device_info init - */ - sn_t sn; - device_info_init(); - device_info_get_sn(&sn); XS_LOGI(TAG, "%s:%d", PC_PROJECT_NAME, PC_VERSION); - XS_LOGI(TAG, "sn: %x:%x:%x", sn.sn0, sn.sn1, sn.sn2); + XS_LOGI(TAG, "sn: %02d%02d%04d", xs_device_info_get()->year, xs_device_info_get()->weak, xs_device_info_get()->index); + // XS_LOGI(TAG, "sn: %x:%x:%x", sn.sn0, sn.sn1, sn.sn2); /** * @brief @@ -144,12 +138,12 @@ void umain() { debug_light_ctrl(); factory_reset_key_detect(); - if (xs_has_passedms(0) >= 1* 60 * 60 * 1000) { - //限制客户使用时长 - // reset_pin_io - NVIC_SystemReset(); - } - + // if (xs_has_passedms(0) >= * 60 * 60 * 1000) { + // 限制客户使用时长 + // reset_pin_io + // NVIC_SystemReset(); + // } + // ZLOGI(TAG,"factory_reset_key_state %d",xs_gpio_read(&m_factory_reset_key)); // osDelay(10); diff --git a/usrc/project_configs.h b/usrc/project_configs.h index 3521942..1761df2 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -1,6 +1,6 @@ #pragma once -#define PC_VERSION 1 +#define PC_VERSION (3 | 0 | 0 | 0) // main/sub/fix #define PC_MANUFACTURER0 ('i' | 'f' << 8 | 'l' << 16 | 'y' << 24) #define PC_MANUFACTURER1 ('t' | 'o' << 8 | 'p' << 16 | '\0' << 24) #define PC_PROJECT_NAME "xsync" diff --git a/usrc/service/device_info.cpp b/usrc/service/device_info.cpp deleted file mode 100644 index e169cfc..0000000 --- a/usrc/service/device_info.cpp +++ /dev/null @@ -1,15 +0,0 @@ - - -#include "device_info.hpp" - -#include "iflytop_xsync/xs_id.h" -void device_info_init() {} - -void device_info_get_sn(sn_t* device_id) { - static cpu_id_t cpu_id; - xs_id_get_cpu_id(&cpu_id); - device_id->sn0 = cpu_id.id[0] | (cpu_id.id[1] << 8) | (cpu_id.id[2] << 16) | (cpu_id.id[3] << 24); - device_id->sn1 = cpu_id.id[4] | (cpu_id.id[5] << 8) | (cpu_id.id[6] << 16) | (cpu_id.id[7] << 24); - device_id->sn2 = cpu_id.id[8] | (cpu_id.id[9] << 8) | (cpu_id.id[10] << 16) | (cpu_id.id[11] << 24); - return; -} diff --git a/usrc/service/device_info.hpp b/usrc/service/device_info.hpp deleted file mode 100644 index ad4ad48..0000000 --- a/usrc/service/device_info.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include "iflytop_xsync/iflytop_xsync.h" -#include "project_configs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void device_info_init(); -typedef struct { - uint32_t sn0; - uint32_t sn1; - uint32_t sn2; -} sn_t; - -void device_info_get_sn(sn_t* device_id); - -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/usrc/service/reg_manager.c b/usrc/service/reg_manager.c index 52df038..ba4f5a1 100644 --- a/usrc/service/reg_manager.c +++ b/usrc/service/reg_manager.c @@ -2,7 +2,6 @@ #include "base_service/config_service.h" #include "base_service/fpga_if.h" -#include "device_info.hpp" #include "iflytop_xsync_protocol/iflytop_xsync_protocol.h" #include "service/report_generator_service.h" @@ -34,8 +33,6 @@ static uint32_t doaction(uint32_t action, uint32_t val) { uint32_t reg_manager_read_reg(uint32_t addr) { uint32_t readbak = 0; - static sn_t sncode; - if (addr == kxsync_reg_software_version) { // read only readbak = PC_VERSION; } else if (addr == kxsync_reg_manufacturer0) { // read only @@ -45,14 +42,11 @@ uint32_t reg_manager_read_reg(uint32_t addr) { } else if (addr == kxsync_reg_product_type_id) { // read only readbak = kxsync_device_type_xsync; } else if (addr == kxsync_reg_sn_id0) { // read only - device_info_get_sn(&sncode); - readbak = sncode.sn0; + readbak = xs_device_info_get()->year; } else if (addr == kxsync_reg_sn_id1) { // read only - device_info_get_sn(&sncode); - readbak = sncode.sn1; + readbak = xs_device_info_get()->weak; } else if (addr == kxsync_reg_sn_id2) { // read only - device_info_get_sn(&sncode); - readbak = sncode.sn2; + readbak = xs_device_info_get()->index; } else if (addr == kxsync_reg_mac0) { // read only memcpy(&readbak, config_get()->mac, 4); } else if (addr == kxsync_reg_mac1) { // read only @@ -71,8 +65,6 @@ uint32_t reg_manager_read_reg(uint32_t addr) { readbak = config_get()->netmask; } else if (addr == kxsync_reg_stm32_config0) { readbak = config_get()->config0; - } else if (addr == kxsync_reg_stm32_camera_sync_signal_count) { - readbak = ReportGeneratorService_xsync_get_count(); } /******************************************************************************* @@ -124,10 +116,7 @@ uint32_t reg_manager_write_reg(uint32_t addr, uint32_t value) { readbak = config_get()->netmask; } else if (addr == kxsync_reg_stm32_config0) { readbak = config_get()->config0; - } else if (addr == kxsync_reg_stm32_camera_sync_signal_count) { - ReportGeneratorService_xsync_set_count(value); - readbak = ReportGeneratorService_xsync_get_count(); - } + } /******************************************************************************* * ACTION * *******************************************************************************/ diff --git a/usrc/service/report_generator_service.c b/usrc/service/report_generator_service.c index 2a511c6..f294064 100644 --- a/usrc/service/report_generator_service.c +++ b/usrc/service/report_generator_service.c @@ -11,10 +11,8 @@ static udp_broadcast_handler_t m_udp_camera_sync_sender; // static udp_broadcast_handler_t m_udp_camera_timecode_sender; // -osThreadId timecode_report_thread_id; osThreadId xync_signal_report_thread_id; -static uint32_t m_sync_count = 0; // static uint32_t m_camera_sync_packet_report_period = 1; static uint32_t m_xsync_workstate_start_sig_irq_pin_off; @@ -30,13 +28,14 @@ static uint32_t m_xyns_camera_sync_packet_last_report_tp; * @param timecode1 */ -static void create_and_send_timecode(uint32_t timecode0, uint32_t timecode1) { +static void create_and_send_timecode(uint32_t timecode0, uint32_t timecode1, uint32_t frameNum) { static uint8_t txbuf[256]; iflytop_xsync_event_report_packet_t *txpacket = (iflytop_xsync_event_report_packet_t *)txbuf; txpacket->eventid = ktimecode_report_event; txpacket->data[0] = timecode0; txpacket->data[1] = timecode1; - xs_udp_broadcast(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT, txbuf, sizeof(iflytop_xsync_event_report_packet_t) + 8); + txpacket->data[2] = frameNum; + xs_udp_broadcast(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT, txbuf, sizeof(iflytop_xsync_event_report_packet_t) + 12); } static void create_and_send_sync_record_state_packet(uint32_t workstate, uint32_t timecode0, uint32_t timecode1) { static uint8_t txbuf[256]; @@ -68,13 +67,77 @@ static void create_and_send_camera_sync_msg(uint32_t count) { xs_udp_broadcast(&m_udp_camera_sync_sender, IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT, txbuf, sizeof(txbuf)); } -static void timecode_report_thread(void const *argument) { +typedef struct { + uint32_t hour; + uint32_t minute; + uint32_t second; + uint32_t frame; + + uint32_t timeinall; +} timecode_parse_result_t; + +timecode_parse_result_t parsetimecode(uint32_t t0, uint32_t t1) { + timecode_parse_result_t result; + + uint8_t frameuints = t0 & 0x0f; + uint8_t frame10s = (t0 >> 8) & 0x3; + uint8_t seconduints = (t0 >> 16) & 0x0f; + uint8_t second10s = (t0 >> 24) & 0x07; + + uint8_t minuteuints = t1 & 0x0f; + uint8_t minute10s = (t1 >> 8) & 0x07; + uint8_t houruints = (t1 >> 16) & 0x0f; + uint8_t hour10s = (t1 >> 24) & 0x03; + + result.hour = hour10s * 10 + houruints; + result.minute = minute10s * 10 + minuteuints; + result.second = second10s * 10 + seconduints; + result.frame = frame10s * 10 + frameuints; + + result.timeinall = result.hour * 3600 + result.minute * 60 + result.second; + return result; +} + +static timecode_parse_result_t lasttimecode; +static uint32_t daycnt; +static uint32_t second; + +static uint32_t dtimes(timecode_parse_result_t *a, timecode_parse_result_t *b, bool *newday) { + if (b->timeinall >= a->timeinall) { + return b->timeinall - a->timeinall; + } else { + *newday = true; + return b->timeinall + 24 * 3600 - a->timeinall; + } +} + +static void xync_signal_report_thread(void const *argument) { while (true) { osEvent signal = osSignalWait(0x07, osWaitForever); - if (signal.value.signals & 0x01) { - uint32_t timecode0, timecode1; - fpga_if_get_timecode(&timecode0, &timecode1); - create_and_send_timecode(timecode0, timecode1); + if (signal.value.signals == 0x01) { + uint32_t tc0; + uint32_t tc1; + uint32_t cnt; + + fpga_if_spi_read_data_02(camera_sync_timecode_snapshot0, &tc0); + fpga_if_spi_read_data_02(camera_sync_timecode_snapshot1, &tc1); + fpga_if_spi_read_data_02(camera_sync_cnt, &cnt); + + bool newday = false; + timecode_parse_result_t result = parsetimecode(tc0, tc1); + uint32_t dtime = dtimes(&lasttimecode, &result, &newday); + lasttimecode = result; + if (dtime < 5 && newday) { + daycnt++; + } else { // xsync修改了时基 + daycnt = 0; + } + + create_and_send_timecode(tc0, tc1, cnt); + if (dtime >= 1) { + second = daycnt * 24 * 3600 + result.timeinall; + create_and_send_camera_sync_msg(second); + } } if (signal.value.signals & 0x02) { // 开始录制 @@ -91,45 +154,19 @@ static void timecode_report_thread(void const *argument) { fpga_if_spi_read_data_02(record_sig_gen_timecode_snapshot0, &timecode0); fpga_if_spi_read_data_02(record_sig_gen_timecode_snapshot1, &timecode1); create_and_send_sync_record_state_packet(0, timecode0, timecode1); - m_sync_count = 0; } } } -static void xync_signal_report_thread(void const *argument) { - while (true) { - osEvent signal = osSignalWait(0x01, osWaitForever); - if (signal.value.signals == 0x01) { - if (m_sync_count == 0) { - m_xyns_camera_sync_packet_last_report_tp = HAL_GetTick(); - create_and_send_camera_sync_msg(m_sync_count); - m_sync_count++; - } else if (xs_has_passedms(m_xyns_camera_sync_packet_last_report_tp) >= 998) { - // TODO:此处这么写,当拍摄频率大于500HZ的时候,就不能完全满足刚好卡在1s上报一次消息 - m_xyns_camera_sync_packet_last_report_tp = HAL_GetTick(); - create_and_send_camera_sync_msg(m_sync_count); - m_sync_count++; - } else { - m_sync_count++; - } - } - // osSignalClear(xync_signal_report_thread_id, 0x01); - } -} void ReportGeneratorService_irq_trigger(uint16_t gpiopin) { - if (gpiopin == m_timecode_trigger_input_off) { - // timecode trigger sig - osSignalSet(timecode_report_thread_id, 0x01); - } if (m_xsync_workstate_start_sig_irq_pin_off == gpiopin) { if (xs_gpio_read(&fpga_if_get_instance()->xsync_workstate_start_sig_irq_io)) { - osSignalSet(timecode_report_thread_id, 0x02); // 开始工作信号 + osSignalSet(xync_signal_report_thread_id, 0x02); // 开始工作信号 } else { - osSignalSet(timecode_report_thread_id, 0x04); // 结束工作信号 + osSignalSet(xync_signal_report_thread_id, 0x04); // 结束工作信号 } } if (gpiopin == m_xync_trigger_input_off) { - // 相机同步信号 osSignalSet(xync_signal_report_thread_id, 0x01); } } @@ -138,20 +175,12 @@ void ReportGeneratorService_init() { ZASSERT(xs_udp_broadcast_init(&m_udp_camera_sync_sender, IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_XSYNC_PORT)); ZASSERT(xs_udp_broadcast_init(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_XSYNC_PORT)); - // - osThreadDef(timecode_report_thread, timecode_report_thread, TIMECODE_REPORT_TASK_LEVEL, 0, 512); - timecode_report_thread_id = osThreadCreate(osThread(timecode_report_thread), NULL); - osThreadDef(xync_signal_report_thread, xync_signal_report_thread, CAMERA_SYNC_SIG_REPORT_TASK_LEVEL, 0, 512); xync_signal_report_thread_id = osThreadCreate(osThread(xync_signal_report_thread), NULL); - ZASSERT(timecode_report_thread_id != NULL); ZASSERT(xync_signal_report_thread_id != NULL); m_timecode_trigger_input_off = fpga_if_get_instance()->timecode_irq_io.pinoff; m_xync_trigger_input_off = fpga_if_get_instance()->camera_sync_code_irq_io.pinoff; m_xsync_workstate_start_sig_irq_pin_off = fpga_if_get_instance()->xsync_workstate_start_sig_irq_io.pinoff; } - -void ReportGeneratorService_xsync_set_count(uint32_t count) { m_sync_count = count; } -uint32_t ReportGeneratorService_xsync_get_count(void) { return m_sync_count; } diff --git a/usrc/service/report_generator_service.h b/usrc/service/report_generator_service.h index 4fd928f..fe436bf 100644 --- a/usrc/service/report_generator_service.h +++ b/usrc/service/report_generator_service.h @@ -31,16 +31,6 @@ void ReportGeneratorService_init(Pin_t timecode_trigger_pin, Pin_t xync_trigger_ * @param gpiopin */ void ReportGeneratorService_irq_trigger(uint16_t gpiopin); -/** - * @brief 清除xync计数 - */ -void ReportGeneratorService_xsync_set_count(uint32_t count); -/** - * @brief 获取xync计数 - * - * @return uint32_t - */ -uint32_t ReportGeneratorService_xsync_get_count(void); uint32_t ReportGeneratorService_set_camera_sync_code_report_period(uint32_t period); uint32_t ReportGeneratorService_get_camera_sync_code_report_period(void); diff --git a/濡備綍淇敼SN鐮.png b/濡備綍淇敼SN鐮.png new file mode 100644 index 0000000..5ee55a3 Binary files /dev/null and b/濡備綍淇敼SN鐮.png differ