From 6dc5b915f4d6cef4d729c8f0c634d9f08117dfad Mon Sep 17 00:00:00 2001 From: WKJay <1931048074@qq.com> Date: Mon, 14 Aug 2023 16:11:49 +0800 Subject: [PATCH] add ci --- .github/workflows/action.yml | 152 ++++++++++++++++++++++++++++++++ SConscript | 2 + docs/_assets/wechat_support.png | Bin 0 -> 56508 bytes readme.md | 90 +++++++++++++------ sample/dlt645_sample.c | 55 ++++++------ 5 files changed, 244 insertions(+), 55 deletions(-) create mode 100644 .github/workflows/action.yml create mode 100644 docs/_assets/wechat_support.png diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml new file mode 100644 index 0000000..9cbec0b --- /dev/null +++ b/.github/workflows/action.yml @@ -0,0 +1,152 @@ +name: dlt645 +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + # Runs at 16:00 UTC (BeiJing 00:00) on the 1st of every month + schedule: + - cron: '0 16 1 * *' + push: + branches: + - master + paths-ignore: + - documentation/** + - '**/README.md' + - '**/README_zh.md' + pull_request: + branches: + - master + paths-ignore: + - documentation/** + - '**/README.md' + - '**/README_zh.md' + +jobs: + build: + runs-on: ubuntu-latest + name: ${{ matrix.legs.RTT_BSP }} + strategy: + fail-fast: false + matrix: + legs: + - RTT_BSP: "gd32" + RTT_TOOL_CHAIN: "sourcery-arm" + SUB_RTT_BSP: + - "gd32/arm/gd32103c-eval" + - "gd32/arm/gd32105c-eval" + - "gd32/arm/gd32105r-start" + - "gd32/arm/gd32107c-eval" + - "gd32/arm/gd32205r-start" + - "gd32/arm/gd32207i-eval" + - "gd32/arm/gd32303e-eval" + - "gd32/arm/gd32305r-start" + - "gd32/arm/gd32307e-start" + - "gd32/arm/gd32407v-start" + - "gd32/arm/gd32450z-eval" + - RTT_BSP: "stm32" + RTT_TOOL_CHAIN: "sourcery-arm" + SUB_RTT_BSP: + - "stm32/stm32f072-st-nucleo" + - "stm32/stm32f091-st-nucleo" + - "stm32/stm32f107-uc-eval" + - "stm32/stm32f207-st-nucleo" + - "stm32/stm32f401-st-nucleo" + - "stm32/stm32f405-smdz-breadfruit" + - "stm32/stm32f407-armfly-v5" + - "stm32/stm32f410-st-nucleo" + - "stm32/stm32f411-atk-nano" + - "stm32/stm32f412-st-nucleo" + - "stm32/stm32f413-st-nucleo" + - "stm32/stm32f427-robomaster-a" + - "stm32/stm32f429-armfly-v6" + - "stm32/stm32f446-st-nucleo" + - "stm32/stm32f469-st-disco" + - "stm32/stm32f746-st-disco" + - "stm32/stm32f767-atk-apollo" + - "stm32/stm32f769-st-disco" + - "stm32/stm32g070-st-nucleo" + - "stm32/stm32g071-st-nucleo" + - "stm32/stm32g431-st-nucleo" + - "stm32/stm32g474-st-nucleo" + - "stm32/stm32h743-armfly-v7" + - "stm32/stm32h747-st-discovery" + - "stm32/stm32h750-artpi" + - "stm32/stm32l4r5-st-nucleo" + - "stm32/stm32l4r9-st-eval" + - "stm32/stm32l010-st-nucleo" + - "stm32/stm32l412-st-nucleo" + - "stm32/stm32l431-BearPi" + - "stm32/stm32l432-st-nucleo" + - "stm32/stm32l433-ali-startkit" + - "stm32/stm32l452-st-nucleo" + - "stm32/stm32l475-atk-pandora" + - "stm32/stm32l476-st-nucleo" + - "stm32/stm32l496-ali-developer" + - "stm32/stm32l552-st-nucleo" + - "stm32/stm32mp157a-st-discovery" + - "stm32/stm32u575-st-nucleo" + - "stm32/stm32wb55-st-nucleo" + steps: + - uses: actions/checkout@v3 + with: + repository: RT-Thread/rt-thread + + - uses: actions/checkout@v3 + with: + path: mypkgs/dlt645 + + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: 3.8 + + - name: Install Tools + shell: bash + run: | + sudo apt-get update + sudo apt-get -qq install gcc-multilib libncurses5-dev scons + sudo python -m pip install --upgrade pip -qq + pip install requests -qq + git config --global http.postBuffer 524288000 + python -c "import tools.menuconfig; tools.menuconfig.touch_env()" + echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV + echo "RTT_CC=gcc" >> $GITHUB_ENV + + - name: Install Arm ToolChains + if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-arm' && success() }} + shell: bash + run: | + wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.3/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 + sudo tar xjf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 -C /opt + /opt/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc --version + echo "RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-10-2020-q4-major/bin" >> $GITHUB_ENV + + - name: Bsp Scons Compile + if: ${{ success() }} + shell: bash + env: + RTT_BSP: ${{ matrix.legs.RTT_BSP }} + RTT_TOOL_CHAIN: ${{ matrix.legs.RTT_TOOL_CHAIN }} + SRTT_BSP: ${{ join(matrix.legs.SUB_RTT_BSP, ',') }} + run: | + source ~/.env/env.sh + failed=0 + count=0 + for bsp in $(echo $SRTT_BSP | tr ',' '\n'); do + count=$((count+1)) + echo "::group::Compiling BSP: ==$count=== $bsp ====" + echo bsp/$bsp + sed -i "s/# CONFIG_PKG_USING_DLT645 is not set/CONFIG_PKG_USING_DLT645=y/g" bsp/$bsp/.config + scons --pyconfig-silent -C bsp/$bsp + sed -i "s/# CONFIG_DLT645_USING_SAMPLE is not set/CONFIG_DLT645_USING_SAMPLE=y/g" bsp/$bsp/.config + scons --pyconfig-silent -C bsp/$bsp + pushd bsp/$bsp && pkgs --update && popd + rm -r bsp/$bsp/packages/dlt645-latest + cp -r mypkgs/dlt645 bsp/$bsp/packages/dlt645 + scons -C bsp/$bsp -j$(nproc) --debug=time | tee output.log || \ + { total_time=$(grep "Total command execution time" output.log | awk '{print $5}'); \ + failed=$((failed+1)) ; echo "::endgroup::" ; echo "::error::build $bsp failed" ; \ + echo "- ❌ build $bsp failed in $total_time seconds " >> $GITHUB_STEP_SUMMARY ; } && \ + { total_time=$(grep "Total command execution time" output.log | awk '{print $5}'); \ + echo "- ✅ build $bsp success in $total_time seconds " >> $GITHUB_STEP_SUMMARY ; echo "::endgroup::" ; } + done + exit $failed \ No newline at end of file diff --git a/SConscript b/SConscript index 2a2ad53..680809d 100644 --- a/SConscript +++ b/SConscript @@ -8,6 +8,8 @@ src = Glob("src/*.c") # add dlt645 sample if GetDepend('DLT645_USING_SAMPLE'): src = src + ['sample/dlt645_sample.c'] +if (GetDepend('DLT645_USING_CUSTOM_PORT') == False): + src = src + ['port/dlt645_port.c'] CPPPATH = [cwd + '/inc'] CPPPATH += [cwd + '/port'] diff --git a/docs/_assets/wechat_support.png b/docs/_assets/wechat_support.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9e23524a0e35e0d00e01c9d4db84a381d46a33 GIT binary patch literal 56508 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 HtMLB=7z78M literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 37cd84f..e8636d8 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ 本软件包用于 DL/T 645 协议的采集与数据处理。在硬件层的移植(主要针对于串口收发数据)完成之后, **用户仅需调用一个API即可完成针对于特定协议(DL/T 1997 或 DL/T 2007)的标识符数据读取、处理与存储。** 使用户无需关注请求数据的封包与接收数据的解包等复杂的协议内部操作,真正做到 **一键采集** 。 -当然,由于本人精力有限,无法第一时间考虑并编写所有可能的情况与功能,所以在软件包的初期其功能只是根据我所用到的功能进行编写,无法涵盖所有的需求。并且可能会有一些小问题。但本文档今后会加入详细的功能开发指南,供开发成员们能够很方便地根据自己的需求进行功能的添加与修改。随着时间的推移,本软件包会逐步趋向于完善,也希望使用本软件包的开发人员们能够加入到软件包的完善中来,为该软件包的成长提供一份宝贵的力量! +当然,由于本人精力有限,无法第一时间考虑并编写所有可能的情况与功能,所以在软件包的初期其功能只是根据个人所用到的功能进行编写,无法涵盖所有的需求。也可能会有一些小问题。不过随着时间的推移,本软件包会逐步趋向于完善,也希望使用本软件包的开发人员们能够加入到软件包的完善中来,为该软件包的成长提供一份宝贵的力量! ### 目前支持的功能: @@ -123,6 +123,8 @@ int (*read) (struct dlt645 *ctx, uint8_t *msg, uint16_t len); //DLT645采集使用的串口名 #define DLT645_SERIAL_NAME "uart4" +//RS485的收发控制引脚,如果驱动层已有485驱动,不使用填-1 +#define DLT645_RS485_DE_PIN -1 //如果用PA15,改为15 //DL/T 645硬件拓展结构体 typedef struct @@ -206,8 +208,19 @@ static int dlt645_hw_read(dlt645_t *ctx, uint8_t *msg ,uint16_t len) */ static int dlt645_hw_write(dlt645_t *ctx, uint8_t *buf, uint16_t len) { + if(DLT645_RS485_DE_PIN != -1) + { + rt_pin_write(DLT645_RS485_DE_PIN, PIN_HIGH); + } + //串口发送数据 - return rt_device_write(dlt645_device,0,buf,len); + int ret = rt_device_write(dlt645_device,0,buf,len); + + if(DLT645_RS485_DE_PIN != -1) + { + rt_pin_write(DLT645_RS485_DE_PIN, PIN_LOW); + } + return ret; } @@ -254,13 +267,17 @@ int dlt645_port_init(void) //设置串口接收回调函数 rt_device_set_rx_indicate(dlt645_device, uart_handler); + //485控制引脚初始化 - rt_pin_mode(GET_PIN(A,15),PIN_MODE_OUTPUT); + if(DLT645_RS485_DE_PIN != -1) + { + rt_pin_mode(DLT645_RS485_DE_PIN, PIN_MODE_OUTPUT); + } return RT_EOK; } //645结构体注册 -static dlt645_t dlt645 = { +dlt645_t dlt645 = { {0}, 0, dlt645_hw_write, @@ -363,18 +380,20 @@ else File name: sample.c Description: DLT645 软件包使用样例 History: - 1. Version: + 1. Version: Date: 2019-09-23 Author: wangjunjie - Modify: + Modify: *************************************************/ #include "dlt645.h" +#include "rtthread.h" +#include "stdio.h" #include "dlt645_port.h" -//dlt645 采集测试标识符 (A相电压) +// dlt645 采集测试标识符 (A相电压) #define DLT645_2007_READ_TEST_CODE 0x02010100 #define DLT645_1997_READ_TEST_CODE 0xB611 -uint8_t test_addr[6] = {0x00,0x00,0x00,0x00,0x00,0x01}; +uint8_t test_addr[6] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}; /** * Name: dlt645_read_test @@ -382,49 +401,62 @@ uint8_t test_addr[6] = {0x00,0x00,0x00,0x00,0x00,0x01}; * Input: None * Output: None */ -static void dlt645_read_test(void) -{ +static void dlt645_read_test(void) { uint8_t read_buf[4]; rt_memset(read_buf, 0, 4); - - //设置从机地址 - dlt645_set_addr(&dlt645,test_addr); - - //if(dlt645_read_data(&dlt645,DLT645_1997_READ_TEST_CODE,read_buf,DLT645_1997) > 0) //1997采集测试 - if(dlt645_read_data(&dlt645,DLT645_2007_READ_TEST_CODE,read_buf,DLT645_2007) > 0) //2007采集测试 - { - printf("读取成功,A相电压值为: %.2f \r\n",*(float *)read_buf); - } - else + + // 设置从机地址 + dlt645_set_addr(&dlt645, test_addr); + + // 设置debug模式 + dlt645_set_debug(&dlt645, 0); + + // if(dlt645_read_data(&dlt645,DLT645_1997_READ_TEST_CODE,read_buf,DLT645_1997) > 0) //1997采集测试 + if (dlt645_read_data(&dlt645, DLT645_2007_READ_TEST_CODE, read_buf, DLT645_2007) > 0) // 2007采集测试 { + printf("读取成功,A相电压值为: %.2f \r\n", *(float *)read_buf); + } else { rt_kprintf("读取失败\r\n"); } } /** - * Name: main - * Brief: 主函数 + * Name: dlt645_entry + * Brief: dlt645协议测试线程 * Input: None * Output: None */ -int main(void) -{ - //dlt645 硬件层初始化 +void dlt645_entry(void *param) { + // dlt645 硬件层初始化 dlt645_port_init(); - while(1) - { - //采集测试 + while (1) { + // 采集测试 dlt645_read_test(); rt_thread_mdelay(1000); } } +int dlt645_test(void) { + rt_thread_t tid; + tid = rt_thread_create("dlt645", dlt645_entry, RT_NULL, 4096, 8, 20); + if (tid != RT_NULL) rt_thread_startup(tid); + return 0; +} +MSH_CMD_EXPORT(dlt645_test, dlt645 test); + + ``` +终端输入 `dlt645_test` 命令打开采集功能. ## 五、注意事项 1. 目前插件不支持自动识别前导码,不会自动拼包或者过滤处理; 2. 如果串口有数据输出和输入但是打印读取失败,考虑是前导码的问题,不同厂商的仪表会有长度不一的前导码。 - 可以用PC工具发送68开头的数据:68 AA AA AA AA AA AA 68 11 04 33 34 34 35 B1 16 - - 返回的报文68开头前的FE个数就是前导码的长度,然后配置DL645_PREMBLE_LEN即刻。 + - 返回的报文68开头前的FE个数就是前导码的长度,然后配置DL645_PREMBLE_LEN即可。 + +## 支持 + +![支持](./docs/_assets/wechat_support.png) +如果这个软件包解决了你的问题,不妨扫描上面二维码请我喝杯咖啡吧 \ No newline at end of file diff --git a/sample/dlt645_sample.c b/sample/dlt645_sample.c index c586f95..283f2a5 100644 --- a/sample/dlt645_sample.c +++ b/sample/dlt645_sample.c @@ -4,20 +4,20 @@ File name: sample.c Description: DLT645 软件包使用样例 History: - 1. Version: + 1. Version: Date: 2019-09-23 Author: wangjunjie - Modify: + Modify: *************************************************/ #include "dlt645.h" #include "rtthread.h" #include "stdio.h" #include "dlt645_port.h" -//dlt645 采集测试标识符 (A相电压) +// dlt645 采集测试标识符 (A相电压) #define DLT645_2007_READ_TEST_CODE 0x02010100 #define DLT645_1997_READ_TEST_CODE 0xB611 -uint8_t test_addr[6] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA}; +uint8_t test_addr[6] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}; /** * Name: dlt645_read_test @@ -25,42 +25,45 @@ uint8_t test_addr[6] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA}; * Input: None * Output: None */ -static void dlt645_read_test(void) -{ +static void dlt645_read_test(void) { uint8_t read_buf[4]; rt_memset(read_buf, 0, 4); - - //设置从机地址 - dlt645_set_addr(&dlt645,test_addr); - - //设置debug模式 + + // 设置从机地址 + dlt645_set_addr(&dlt645, test_addr); + + // 设置debug模式 dlt645_set_debug(&dlt645, 0); - - //if(dlt645_read_data(&dlt645,DLT645_1997_READ_TEST_CODE,read_buf,DLT645_1997) > 0) //1997采集测试 - if(dlt645_read_data(&dlt645,DLT645_2007_READ_TEST_CODE,read_buf,DLT645_2007) > 0) //2007采集测试 - { - printf("读取成功,A相电压值为: %.2f \r\n",*(float *)read_buf); - } - else + + // if(dlt645_read_data(&dlt645,DLT645_1997_READ_TEST_CODE,read_buf,DLT645_1997) > 0) //1997采集测试 + if (dlt645_read_data(&dlt645, DLT645_2007_READ_TEST_CODE, read_buf, DLT645_2007) > 0) // 2007采集测试 { + printf("读取成功,A相电压值为: %.2f \r\n", *(float *)read_buf); + } else { rt_kprintf("读取失败\r\n"); } } /** - * Name: main - * Brief: 主函数 + * Name: dlt645_entry + * Brief: dlt645协议测试线程 * Input: None * Output: None */ -int main(void) -{ - //dlt645 硬件层初始化 +void dlt645_entry(void *param) { + // dlt645 硬件层初始化 dlt645_port_init(); - while(1) - { - //采集测试 + while (1) { + // 采集测试 dlt645_read_test(); rt_thread_mdelay(1000); } } + +int dlt645_test(void) { + rt_thread_t tid; + tid = rt_thread_create("dlt645", dlt645_entry, RT_NULL, 4096, 8, 20); + if (tid != RT_NULL) rt_thread_startup(tid); + return 0; +} +MSH_CMD_EXPORT(dlt645_test, dlt645 test);