zhaohe 1 year ago
parent
commit
99d1e2b436
  1. 4
      .settings/language.settings.xml
  2. 4
      .settings/stm32cubeide.project.prefs
  3. 4
      .vscode/settings.json
  4. 12
      README.md
  5. 2
      STM32F407VETX_FLASH.ld
  6. 2
      iflytop_xsync
  7. 3
      usrc/base_service/xsync_regs.hpp
  8. 22
      usrc/main.cpp
  9. 2
      usrc/project_configs.h
  10. 15
      usrc/service/device_info.cpp
  11. 20
      usrc/service/device_info.hpp
  12. 19
      usrc/service/reg_manager.c
  13. 119
      usrc/service/report_generator_service.c
  14. 10
      usrc/service/report_generator_service.h
  15. BIN
      如何修改SN码.png

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1904270345635912855" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="418301202897487251" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1789632813386339464" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="303663670647913860" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

4
.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

4
.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"

12
README.md

@ -6,4 +6,14 @@ ref:https://iflytop1.feishu.cn/docx/FPqjdaTtkoBeU9x4qbjcD6vxnUc
V1
单片机程序基本稳定
```
V3
1.添加SN码,并规范化
2.修改xsync相机同步消息上报格式
3.修改xsynctimecode消息上报格式
```
···
设备ID配置方法:
直接通过
···

2
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 */

2
iflytop_xsync

@ -1 +1 @@
Subproject commit 6434f422ec46fc02968f71ad0dec47de6c8f1827
Subproject commit 5ae77f0687ccf0fc7710d922deda0e32f4e73678

3
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;

22
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);

2
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"

15
usrc/service/device_info.cpp

@ -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;
}

20
usrc/service/device_info.hpp

@ -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

19
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 *
*******************************************************************************/

119
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; }

10
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);

BIN
如何修改SN码.png

After

Width: 1687  |  Height: 517  |  Size: 53 KiB

Loading…
Cancel
Save