• 笔记wife_assistant


    一、wifi_spi_init

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 WiFi 模块初始化
    3. // 参数说明 *wifi_ssid 目标连接的 WiFi 的名称 字符串形式
    4. // 参数说明 *pass_word 目标连接的 WiFi 的密码 字符串形式
    5. // 返回参数 uint8 模块初始化状态 0-成功 1-错误
    6. // 使用示例 wifi_spi_init("SEEKFREE", "SEEKFREE123");
    7. // 备注信息 wifi_spi_init("SEEKFREE", NULL); // 连接没有密码的WIFI热点
    8. //-------------------------------------------------------------------------------------------------------------------
    9. uint8 wifi_spi_init (char *wifi_ssid, char *pass_word)
    10. {
    11. uint8 return_state = 0;
    12. fifo_init(&wifi_spi_fifo, FIFO_DATA_8BIT, wifi_spi_buffer, WIFI_SPI_RECVIVE_FIFO_SIZE);
    13. spi_init(WIFI_SPI_INDEX, SPI_MODE3, WIFI_SPI_SPEED, WIFI_SPI_SCK_PIN, WIFI_SPI_MOSI_PIN, WIFI_SPI_MISO_PIN, SPI_CS_NULL);//硬件SPI初始化
    14. gpio_init(WIFI_SPI_CS_PIN, GPO, 1, GPO_PUSH_PULL);
    15. gpio_init(WIFI_SPI_RST_PIN, GPO, 1, GPO_PUSH_PULL);
    16. gpio_init(WIFI_SPI_INT_PIN, GPI, 0, GPI_PULL_DOWN);
    17. // 复位
    18. gpio_set_level(WIFI_SPI_RST_PIN, 0);
    19. system_delay_ms(10);
    20. gpio_set_level(WIFI_SPI_RST_PIN, 1);
    21. // 等待模块初始化
    22. system_delay_ms(100);
    23. wifi_spi_mutex = WIFI_SPI_IDLE;
    24. do
    25. {
    26. // 固件版本信息以字符串形式保存在wifi_spi_version数组中
    27. return_state = wifi_spi_get_version();
    28. if(return_state)
    29. {
    30. break;
    31. }
    32. // MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中
    33. wifi_spi_get_mac_addr();
    34. return_state = wifi_spi_wifi_connect(wifi_ssid, pass_word);
    35. if(return_state)
    36. {
    37. break;
    38. }
    39. #if(1 == WIFI_SPI_AUTO_CONNECT)
    40. return_state = wifi_spi_socket_connect("TCP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT);
    41. if(return_state)
    42. {
    43. break;
    44. }
    45. #endif
    46. #if(2 == WIFI_SPI_AUTO_CONNECT)
    47. return_state = wifi_spi_socket_connect("UDP", WIFI_SPI_TARGET_IP, WIFI_SPI_TARGET_PORT, WIFI_SPI_LOCAL_PORT);
    48. if(return_state)
    49. {
    50. break;
    51. }
    52. #endif
    53. }while(0);
    54. return return_state;
    55. }

    1、fifo_init

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 FIFO 初始化 挂载对应缓冲区
    3. // 参数说明 *fifo FIFO 对象指针
    4. // 参数说明 type FIFO 数据位数
    5. // 参数说明 *buffer_addr 要挂载的缓冲区
    6. // 参数说明 size 缓冲区大小
    7. // 返回参数 fifo_state_enum 操作状态
    8. // 使用示例 fifo_init(&user_fifo, user_buffer, 64);
    9. // 备注信息
    10. //-------------------------------------------------------------------------------------------------------------------
    11. fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size)
    12. {
    13. zf_assert(NULL != fifo);
    14. fifo_state_enum return_state = FIFO_SUCCESS;
    15. do
    16. {
    17. fifo->buffer = buffer_addr;
    18. fifo->execution = FIFO_IDLE;
    19. fifo->type = type;
    20. fifo->head = 0;
    21. fifo->end = 0;
    22. fifo->size = size;
    23. fifo->max = size;
    24. }while(0);
    25. return return_state;
    26. }

    ①、fifo_state_enum

     C(和许多其他编程语言)中的枚举用于定义一组命名整数常量。枚举中的每个常量都表示一个不同的值。

    1. typedef enum
    2. {
    3. FIFO_SUCCESS, // FIFO 操作成功
    4. FIFO_RESET_UNDO, // FIFO 重置操作未执行
    5. FIFO_CLEAR_UNDO, // FIFO 清空操作未执行
    6. FIFO_BUFFER_NULL, // FIFO 用户缓冲区异常
    7. FIFO_WRITE_UNDO, // FIFO 写入操作未执行
    8. FIFO_SPACE_NO_ENOUGH, // FIFO 写入操作 缓冲区空间不足
    9. FIFO_READ_UNDO, // FIFO 读取操作未执行
    10. FIFO_DATA_NO_ENOUGH, // FIFO 读取操作 数据长度不足
    11. }fifo_state_enum;

    此枚举用于为涉及 FIFO(先进先出)数据结构的操作提供清晰且有意义的状态代码。fifo_state_enum 通过用作fifo_init等函数的返回类型,这些函数的调用者可以根据返回的枚举值轻松了解操作的结果。枚举中的每个常量都对应于与 FIFO 操作相关的特定状态或条件。

    ②、zf_assert(NULL != fifo);

    该行是一个宏,通常用于嵌入式系统或其他资源受限环境中的错误检查和调试目的。

    fifo在继续进行FIFO初始化过程之前,此特定行可确保指针不是NULL(即,fifo它指向有效的内存位置)。如果确实是 NULL,则会触发断言失败,表示编程错误或意外情况。

    断言通常用于开发和调试期间,以在程序执行的早期捕获逻辑错误或无效状态。在生产环境中部署软件后,通常会禁用断言检查以提高性能并减少内存占用。

    ③、do{}while(0)构造

    2、spi_init

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 SPI 接口初始化
    3. // 参数说明 spi_n SPI 模块号 参照 zf_driver_spi.h 内 spi_index_enum 枚举体定义
    4. // 参数说明 mode SPI 模式 参照 zf_driver_spi.h 内 spi_mode_enum 枚举体定义
    5. // 参数说明 baud 设置 SPI 的波特率 不超过系统时钟的一半 部分速率会被适配成相近的速率
    6. // 参数说明 sck_pin 选择 SCK 引脚 参照 zf_driver_spi.h 内 spi_sck_pin_enum 枚举体定义
    7. // 参数说明 mosi_pin 选择 MOSI 引脚 参照 zf_driver_spi.h 内 spi_mosi_pin_enum 枚举体定义
    8. // 参数说明 miso_pin 选择 MISO 引脚 参照 zf_driver_spi.h 内 spi_miso_pin_enum 枚举体定义
    9. // 参数说明 cs_pin 选择 CS 引脚 参照 zf_driver_spi.h 内 spi_cs_pin_enum 枚举体定义
    10. // 返回参数 void
    11. // 使用示例 spi_init(SPI_1, 0, 1*1000*1000, SPI1_SCK_D12, SPI1_MOSI_D14, SPI1_MISO_D15, SPI1_CS0_D13);
    12. // 备注信息
    13. //-------------------------------------------------------------------------------------------------------------------
    14. void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin)
    15. {
    16. zf_assert(spi_n == (sck_pin / 16)); // sck_pin 与 spi_n 匹配
    17. zf_assert(spi_n == (mosi_pin / 16)); // mosi_pin 与 spi_n 匹配
    18. zf_assert(spi_n == (miso_pin / 16) || (miso_pin == SPI_MISO_NULL)); // miso_pin 与 spi_n 匹配
    19. zf_assert(spi_n == (cs_pin / 16) || (cs_pin == SPI_CS_NULL)); // cs_pin 与 spi_n 匹配
    20. if(SPI_CS_NULL == cs_pin)
    21. {
    22. spi_cs_index[spi_n] = 0;
    23. }
    24. else
    25. {
    26. spi_cs_index[spi_n] = cs_pin;
    27. }
    28. lpspi_master_config_t masterConfig;
    29. uint32 src_clock;
    30. spi_iomuxc(spi_n, sck_pin, mosi_pin, miso_pin, cs_pin);
    31. CLOCK_SetMux(kCLOCK_LpspiMux, LPSPI_CLK_SRC); //选择PLL2作为LPSPI时钟源
    32. CLOCK_SetDiv(kCLOCK_LpspiDiv, LPSPI_CLK_DIV);
    33. LPSPI_MasterGetDefaultConfig(&masterConfig);
    34. masterConfig.baudRate = baud;
    35. masterConfig.bitsPerFrame = 8;
    36. masterConfig.whichPcs = (lpspi_which_pcs_t)(cs_pin%14/2-3);
    37. switch(mode)
    38. {
    39. case SPI_MODE0:
    40. {
    41. masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
    42. masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
    43. }break;
    44. case SPI_MODE1:
    45. {
    46. masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
    47. masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge;
    48. }break;
    49. case SPI_MODE2:
    50. {
    51. masterConfig.cpol = kLPSPI_ClockPolarityActiveLow;
    52. masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
    53. }break;
    54. case SPI_MODE3:
    55. {
    56. masterConfig.cpol = kLPSPI_ClockPolarityActiveLow;
    57. masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge;
    58. }break;
    59. }
    60. masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate;
    61. masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate;
    62. masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate;
    63. src_clock = (CLOCK_GetFreq(kCLOCK_SysPllClk) / (LPSPI_CLK_DIV + 1U));
    64. LPSPI_MasterInit(spi_index[spi_n], &masterConfig, src_clock);//第一次初始化便于打开时钟
    65. LPSPI_Reset(spi_index[spi_n]); //复位外设
    66. LPSPI_MasterInit(spi_index[spi_n], &masterConfig, src_clock);//重新初始化设置正确的参数
    67. LPSPI_Enable(spi_index[spi_n], false);
    68. spi_index[spi_n]->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK);
    69. LPSPI_Enable(spi_index[spi_n], true);
    70. LPSPI_FlushFifo(spi_index[spi_n], true, true); //刷新FIFO
    71. LPSPI_ClearStatusFlags(spi_index[spi_n], kLPSPI_AllStatusFlag); //清除状态标志
    72. LPSPI_DisableInterrupts(spi_index[spi_n], kLPSPI_AllInterruptEnable);//关闭中断
    73. }

    3、wifi_spi_get_version

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 WIFI SPI 固件版本获取
    3. // 参数说明 void 端口号
    4. // 返回参数 uint8 状态 0-成功 1-错误
    5. // 使用示例
    6. // 备注信息 调用函数之后,固件版本信息以字符串形式保存在wifi_spi_version数组中
    7. //-------------------------------------------------------------------------------------------------------------------
    8. static uint8 wifi_spi_get_version (void)
    9. {
    10. uint8 return_state;
    11. wifi_spi_packets_struct temp_packets;
    12. return_state = wifi_spi_get_parameter(WIFI_SPI_GET_VERSION, &temp_packets, OTHER_TIME_OUT);
    13. if((0 == return_state) && (WIFI_SPI_REPLY_VERSION == temp_packets.head.command))
    14. {
    15. memcpy(wifi_spi_version, temp_packets.buffer, temp_packets.head.length);
    16. }
    17. return return_state;
    18. }

    4、wifi_spi_get_mac_addr

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 WIFI SPI MAC地址获取
    3. // 参数说明 void 端口号
    4. // 返回参数 uint8 状态 0-成功 1-错误
    5. // 使用示例
    6. // 备注信息 调用函数之后,MAC地址信息以字符串形式保存在wifi_spi_mac_addr数组中
    7. //-------------------------------------------------------------------------------------------------------------------
    8. static uint8 wifi_spi_get_mac_addr (void)
    9. {
    10. uint8 return_state;
    11. wifi_spi_packets_struct temp_packets;
    12. return_state = wifi_spi_get_parameter(WIFI_SPI_GET_MAC_ADDR, &temp_packets, OTHER_TIME_OUT);
    13. if((0 == return_state) && (WIFI_SPI_REPLY_MAC_ADDR == temp_packets.head.command))
    14. {
    15. memcpy(wifi_spi_mac_addr, temp_packets.buffer, temp_packets.head.length);
    16. }
    17. return return_state;
    18. }

    5、wifi_spi_wifi_connect

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 WIFI SPI 设置连接的WiFi信息并尝试连接WiFi
    3. // 参数说明 *wifi_ssid WIFI名称
    4. // 参数说明 *pass_word WIFI密码
    5. // 返回参数 uint8 状态 0-成功 1-错误
    6. // 使用示例 wifi_spi_wifi_connect("SEEKFREE", "SEEKFREE123");
    7. // 备注信息 wifi_spi_wifi_connect("SEEKFREE", NULL); // 连接没有密码的WIFI热点
    8. //-------------------------------------------------------------------------------------------------------------------
    9. uint8 wifi_spi_wifi_connect (char *wifi_ssid, char *pass_word)
    10. {
    11. uint8 return_state;
    12. uint8 temp_buffer[64];
    13. uint16 length;
    14. if(NULL != pass_word)
    15. {
    16. // WIFI热点有密码发送热点名称与密码
    17. length = sprintf((char *)temp_buffer, "%s\r\n%s\r\n", wifi_ssid, pass_word);
    18. }
    19. else
    20. {
    21. // WIFI热点没有密码只需要发送热点名称
    22. length = sprintf((char *)temp_buffer, "%s\r\n", wifi_ssid);
    23. }
    24. return_state = wifi_spi_set_parameter(WIFI_SPI_SET_WIFI_INFORMATION, temp_buffer, length, WIFI_CONNECT_TIME_OUT);
    25. // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中
    26. wifi_spi_get_ip_addr_port();
    27. return return_state;
    28. }

    二、wifi_spi_socket_connect 

    1. // 函数简介 WIFI SPI 设置连接的Socket信息并尝试连接Socket
    2. // 参数说明 *transport_type 传输类型
    3. // 参数说明 *ip_addr IP地址
    4. // 参数说明 *port 目标端口号
    5. // 参数说明 *local_port 本机端口号
    6. // 返回参数 uint8 状态 0-成功 1-错误
    7. // 使用示例 wifi_spi_socket_connect("TCP", "192.168.2.5", "8080", "6060");
    8. // 备注信息
    9. //-------------------------------------------------------------------------------------------------------------------
    10. uint8 wifi_spi_socket_connect (char *transport_type, char *ip_addr, char *port, char *local_port)
    11. {
    12. uint8 return_state;
    13. uint8 temp_buffer[41];
    14. uint16 length;
    15. length = sprintf((char *)temp_buffer, "%s\r\n%s\r\n%s\r\n%s\r\n", transport_type, ip_addr, port, local_port);
    16. return_state = wifi_spi_set_parameter(WIFI_SPI_SET_SOCKET_INFORMATION, temp_buffer, length, SOCKET_CONNECT_TIME_OUT);
    17. // 本机IP地址与端口号信息以字符串形式保存在wifi_spi_ip_addr_port数组中
    18. wifi_spi_get_ip_addr_port();
    19. return return_state;
    20. }

    三、mt9v03x_init()

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 MT9V03X 摄像头初始化
    3. // 参数说明 void
    4. // 返回参数 uint8 1-失败 0-成功
    5. // 使用示例 zf_log(mt9v03x_init(), "mt9v03x init error");
    6. // 备注信息
    7. //-------------------------------------------------------------------------------------------------------------------
    8. uint8 mt9v03x_init (void)
    9. {
    10. uint8 return_state = 0;
    11. soft_iic_info_struct mt9v03x_iic_struct;
    12. do
    13. {
    14. system_delay_ms(200);
    15. set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型
    16. // 首先尝试SCCB通讯
    17. mt9v03x_type = MT9V03X_SCCB;
    18. soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA);
    19. if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer))
    20. {
    21. // SCCB通讯失败,尝试串口通讯
    22. mt9v03x_type = MT9V03X_UART;
    23. camera_fifo_init();
    24. set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, &mt9v03x_uart_callback); // 设置连接摄像头类型
    25. uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头
    26. uart_rx_interrupt(MT9V03X_COF_UART, 1);
    27. fifo_clear(&camera_receiver_fifo);
    28. mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式
    29. if(mt9v03x_set_config(mt9v03x_set_confing_buffer))
    30. {
    31. // 如果程序在输出了断言信息 并且提示出错位置在这里
    32. // 那么就是通信出错并超时退出了
    33. // 检查一下接线有没有问题 如果没问题可能就是坏了
    34. zf_log(0, "MT9V03X set config error.");
    35. set_camera_type(NO_CAMERE, NULL, NULL, NULL);
    36. return_state = 1;
    37. break;
    38. }
    39. // 获取配置便于查看配置是否正确
    40. if(mt9v03x_get_config(mt9v03x_get_confing_buffer))
    41. {
    42. // 如果程序在输出了断言信息 并且提示出错位置在这里
    43. // 那么就是串口通信出错并超时退出了
    44. // 检查一下接线有没有问题 如果没问题可能就是坏了
    45. zf_log(0, "MT9V03X get config error.");
    46. set_camera_type(NO_CAMERE, NULL, NULL, NULL);
    47. return_state = 1;
    48. break;
    49. }
    50. }
    51. csi_init(MT9V03X_W, MT9V03X_H, &csi_handle, mt9v03x_finished_callback, MT9V03X_VSYNC_PIN, MT9V03X_PCLK_PIN, CSI_PIXCLK_RISING);
    52. csi_add_empty_buffer(&csi_handle, mt9v03x_image1[0]);
    53. csi_add_empty_buffer(&csi_handle, mt9v03x_image2[0]);
    54. csi_start(&csi_handle);
    55. mt9v03x_image = mt9v03x_image1;// 设置初值
    56. interrupt_enable(CSI_IRQn);
    57. }while(0);
    58. return return_state;
    59. }

    四、 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI);

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 逐飞助手接口 初始化
    3. // 参数说明
    4. // 返回参数 void
    5. // 使用示例 seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI); 使用高速WIFI SPI模块进行数据收发
    6. // 备注 需要自行调用设备的初始化,例如使用无线转串口进行数据的收发,则需要自行调用无线转串口的初始化,然后再调用seekfree_assistant_interface_init完成逐飞助手的接口初始化
    7. //-------------------------------------------------------------------------------------------------------------------
    8. ZF_WEAK void seekfree_assistant_interface_init (seekfree_assistant_transfer_device_enum transfer_device)
    9. {
    10. switch(transfer_device)
    11. {
    12. case SEEKFREE_ASSISTANT_DEBUG_UART:
    13. {
    14. seekfree_assistant_transfer_callback = debug_send_buffer;
    15. seekfree_assistant_receive_callback = debug_read_ring_buffer;
    16. }break;
    17. case SEEKFREE_ASSISTANT_WIRELESS_UART:
    18. {
    19. seekfree_assistant_transfer_callback = wireless_uart_send_buffer;
    20. seekfree_assistant_receive_callback = wireless_uart_read_buffer;
    21. }break;
    22. case SEEKFREE_ASSISTANT_CH9141:
    23. {
    24. seekfree_assistant_transfer_callback = bluetooth_ch9141_send_buffer;
    25. seekfree_assistant_receive_callback = bluetooth_ch9141_read_buffer;
    26. }break;
    27. case SEEKFREE_ASSISTANT_WIFI_UART:
    28. {
    29. seekfree_assistant_transfer_callback = wifi_uart_send_buffer;
    30. seekfree_assistant_receive_callback = wifi_uart_read_buffer;
    31. }break;
    32. case SEEKFREE_ASSISTANT_WIFI_SPI:
    33. {
    34. seekfree_assistant_transfer_callback = wifi_spi_send_buffer;
    35. seekfree_assistant_receive_callback = wifi_spi_read_buffer;
    36. }break;
    37. case SEEKFREE_ASSISTANT_CUSTOM:
    38. {
    39. // 根据自己的需求 自行实现seekfree_assistant_transfer与seekfree_assistant_receive函数,完成数据的收发
    40. }break;
    41. }
    42. }

    五、seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, image_copy[0], MT9V03X_W, MT9V03X_H);

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 逐飞助手图像信息配置函数
    3. // 参数说明 camera_type 图像类型
    4. // 参数说明 image_addr 图像地址 如果传递NULL参数则表示只发送边线信息到上位机
    5. // 参数说明 width 图像宽度
    6. // 参数说明 height 图像高度
    7. // 返回参数 void
    8. // 使用示例 seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, mt9v03x_image[0], MT9V03X_W, MT9V03X_H);
    9. // 备注信息
    10. //-------------------------------------------------------------------------------------------------------------------
    11. void seekfree_assistant_camera_information_config (seekfree_assistant_image_type_enum camera_type, void *image_addr, uint16 width, uint16 height)
    12. {
    13. seekfree_assistant_camera_dot_data.head = SEEKFREE_ASSISTANT_SEND_HEAD;
    14. seekfree_assistant_camera_dot_data.function = SEEKFREE_ASSISTANT_CAMERA_DOT_FUNCTION;
    15. // 写入包长度信息
    16. seekfree_assistant_camera_dot_data.length = sizeof(seekfree_assistant_camera_dot_struct);
    17. seekfree_assistant_camera_buffer.camera_type = camera_type;
    18. seekfree_assistant_camera_buffer.image_addr = image_addr;
    19. seekfree_assistant_camera_buffer.width = width;
    20. seekfree_assistant_camera_buffer.height = height;
    21. }

    六、seekfree_assistant_camera_send

    1. //-------------------------------------------------------------------------------------------------------------------
    2. // 函数简介 逐飞助手发送摄像头图像
    3. // 参数说明 void
    4. // 返回参数 void
    5. // 使用示例
    6. // 备注信息 在调用图像发送函数之前,请务必调用一次seekfree_assistant_camera_config函数,将对应的参数设置好
    7. //-------------------------------------------------------------------------------------------------------------------
    8. void seekfree_assistant_camera_send (void)
    9. {
    10. // 检查图像发送缓冲区是否准备就绪
    11. zf_assert(0 != seekfree_assistant_camera_buffer.camera_type);
    12. seekfree_assistant_camera_data_send(seekfree_assistant_camera_buffer.camera_type, seekfree_assistant_camera_buffer.image_addr, seekfree_assistant_camera_dot_data.dot_type & 0x0f, seekfree_assistant_camera_buffer.width, seekfree_assistant_camera_buffer.height);
    13. if(seekfree_assistant_camera_dot_data.dot_type & 0x0f)
    14. {
    15. seekfree_assistant_camera_dot_send(&seekfree_assistant_camera_buffer);
    16. }
    17. }

  • 相关阅读:
    乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建
    c# cad二次开发 通过选择txt文件将自动转换成多段线
    行测-图形推理-6-相似图形类
    关于 Appium 各种版本的安装,都在这里
    深入了解iOS内存(WWDC 2018)笔记-内存诊断
    线性代数的学习和整理18:什么是维度,什么是秩?秩的各种定理&&秩的计算 (计算部分未完成)
    0.0C++和C的区别
    STM32G0开发笔记-Platformio+libopencm3-串口中断
    微服务模式:服务发现模式
    记一次IDE硬盘故障的“解决“.2022-11-10
  • 原文地址:https://blog.csdn.net/Ljt030608/article/details/138000836