From ffe1456b3a6fd6e051d5e0a6841cd70ede00303b Mon Sep 17 00:00:00 2001 From: hwq Date: Thu, 11 Sep 2025 18:38:58 +0800 Subject: [PATCH] view modbus --- apps/chrg/.config | 2975 ++++++++--------- apps/chrg/applications/mb/SConscript | 16 + apps/chrg/applications/mb/mb.c | 264 ++ .../chrg/applications/mb}/mb.h | 250 +- .../rtu => apps/chrg/applications/mb}/mbcrc.c | 50 +- apps/chrg/applications/mb/mbcrc.h | 9 + apps/chrg/applications/mb/mbevent.c | 46 + apps/chrg/applications/mb/mbfunc.h | 41 + .../chrg/applications/mb}/mbfunccoils.c | 112 +- apps/chrg/applications/mb/mbfuncdisc.c | 92 + .../chrg/applications/mb}/mbfuncholding.c | 141 +- apps/chrg/applications/mb/mbfuncinput.c | 83 + apps/chrg/applications/mb/mbfuncother.c | 51 + apps/chrg/applications/mb/mbport.c | 26 + apps/chrg/applications/mb/mbport.h | 84 + .../rtu => apps/chrg/applications/mb}/mbrtu.c | 152 +- apps/chrg/applications/mb/mbrtu.h | 31 + .../chrg/applications/mb/mbserial.c | 54 +- apps/chrg/applications/mb/mbtimer.c | 41 + apps/chrg/applications/mb/mbutils.c | 104 + .../chrg/applications/mb}/mbutils.h | 45 +- apps/chrg/applications/thread/chrg_comm.c | 6 +- .../chrg/applications/utils/chrg_mb.c | 124 +- apps/chrg/applications/utils/chrg_mb.h | 26 + apps/chrg/chrg.uvprojx | 2811 ++++++++++++++++ apps/chrg/rtconfig.h | 928 +++-- libs/freemodbus/SConscript | 69 - libs/freemodbus/modbus/ascii/mbascii.c | 486 --- libs/freemodbus/modbus/ascii/mbascii.h | 58 - .../modbus/functions/mbfunccoils_m.c | 390 --- libs/freemodbus/modbus/functions/mbfuncdiag.c | 29 - libs/freemodbus/modbus/functions/mbfuncdisc.c | 133 - .../modbus/functions/mbfuncdisc_m.c | 162 - .../modbus/functions/mbfuncholding_m.c | 455 --- .../freemodbus/modbus/functions/mbfuncinput.c | 122 - .../modbus/functions/mbfuncinput_m.c | 148 - .../freemodbus/modbus/functions/mbfuncother.c | 88 - libs/freemodbus/modbus/functions/mbutils.c | 141 - libs/freemodbus/modbus/include/mb_m.h | 416 --- libs/freemodbus/modbus/include/mbconfig.h | 145 - libs/freemodbus/modbus/include/mbframe.h | 89 - libs/freemodbus/modbus/include/mbfunc.h | 82 - libs/freemodbus/modbus/include/mbport.h | 207 -- libs/freemodbus/modbus/include/mbproto.h | 85 - libs/freemodbus/modbus/mb.c | 412 --- libs/freemodbus/modbus/mb_m.c | 429 --- libs/freemodbus/modbus/rtu/mbcrc.h | 36 - libs/freemodbus/modbus/rtu/mbrtu.h | 66 - libs/freemodbus/modbus/rtu/mbrtu_m.c | 446 --- libs/freemodbus/modbus/tcp/mbtcp.c | 158 - libs/freemodbus/modbus/tcp/mbtcp.h | 55 - libs/freemodbus/port/port.c | 49 - libs/freemodbus/port/port.h | 61 - libs/freemodbus/port/portevent.c | 68 - libs/freemodbus/port/portevent_m.c | 244 -- libs/freemodbus/port/portserial_m.c | 233 -- libs/freemodbus/port/porttcp.c | 134 - libs/freemodbus/port/porttimer.c | 63 - libs/freemodbus/port/porttimer_m.c | 107 - libs/freemodbus/port/user_mb_app.h | 46 - libs/freemodbus/port/user_mb_app_m.c | 294 -- libs/freemodbus/samples/README.md | 57 - libs/freemodbus/samples/figures/run.png | Bin 12294 -> 0 bytes libs/freemodbus/samples/figures/slave_cfg.png | Bin 78068 -> 0 bytes libs/freemodbus/samples/figures/slave_con.png | Bin 9571 -> 0 bytes libs/freemodbus/samples/figures/slave_run.png | Bin 5461 -> 0 bytes libs/freemodbus/samples/sample_mb_master.c | 117 - libs/freemodbus/samples/sample_mb_slave.c | 139 - 68 files changed, 6002 insertions(+), 9079 deletions(-) create mode 100644 apps/chrg/applications/mb/SConscript create mode 100644 apps/chrg/applications/mb/mb.c rename {libs/freemodbus/modbus/include => apps/chrg/applications/mb}/mb.h (71%) rename {libs/freemodbus/modbus/rtu => apps/chrg/applications/mb}/mbcrc.c (62%) create mode 100644 apps/chrg/applications/mb/mbcrc.h create mode 100644 apps/chrg/applications/mb/mbevent.c create mode 100644 apps/chrg/applications/mb/mbfunc.h rename {libs/freemodbus/modbus/functions => apps/chrg/applications/mb}/mbfunccoils.c (57%) create mode 100644 apps/chrg/applications/mb/mbfuncdisc.c rename {libs/freemodbus/modbus/functions => apps/chrg/applications/mb}/mbfuncholding.c (57%) create mode 100644 apps/chrg/applications/mb/mbfuncinput.c create mode 100644 apps/chrg/applications/mb/mbfuncother.c create mode 100644 apps/chrg/applications/mb/mbport.c create mode 100644 apps/chrg/applications/mb/mbport.h rename {libs/freemodbus/modbus/rtu => apps/chrg/applications/mb}/mbrtu.c (61%) create mode 100644 apps/chrg/applications/mb/mbrtu.h rename libs/freemodbus/port/portserial.c => apps/chrg/applications/mb/mbserial.c (76%) create mode 100644 apps/chrg/applications/mb/mbtimer.c create mode 100644 apps/chrg/applications/mb/mbutils.c rename {libs/freemodbus/modbus/include => apps/chrg/applications/mb}/mbutils.h (51%) rename libs/freemodbus/port/user_mb_app.c => apps/chrg/applications/utils/chrg_mb.c (61%) create mode 100644 apps/chrg/applications/utils/chrg_mb.h create mode 100644 apps/chrg/chrg.uvprojx delete mode 100644 libs/freemodbus/SConscript delete mode 100644 libs/freemodbus/modbus/ascii/mbascii.c delete mode 100644 libs/freemodbus/modbus/ascii/mbascii.h delete mode 100644 libs/freemodbus/modbus/functions/mbfunccoils_m.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncdiag.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncdisc.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncdisc_m.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncholding_m.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncinput.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncinput_m.c delete mode 100644 libs/freemodbus/modbus/functions/mbfuncother.c delete mode 100644 libs/freemodbus/modbus/functions/mbutils.c delete mode 100644 libs/freemodbus/modbus/include/mb_m.h delete mode 100644 libs/freemodbus/modbus/include/mbconfig.h delete mode 100644 libs/freemodbus/modbus/include/mbframe.h delete mode 100644 libs/freemodbus/modbus/include/mbfunc.h delete mode 100644 libs/freemodbus/modbus/include/mbport.h delete mode 100644 libs/freemodbus/modbus/include/mbproto.h delete mode 100644 libs/freemodbus/modbus/mb.c delete mode 100644 libs/freemodbus/modbus/mb_m.c delete mode 100644 libs/freemodbus/modbus/rtu/mbcrc.h delete mode 100644 libs/freemodbus/modbus/rtu/mbrtu.h delete mode 100644 libs/freemodbus/modbus/rtu/mbrtu_m.c delete mode 100644 libs/freemodbus/modbus/tcp/mbtcp.c delete mode 100644 libs/freemodbus/modbus/tcp/mbtcp.h delete mode 100644 libs/freemodbus/port/port.c delete mode 100644 libs/freemodbus/port/port.h delete mode 100644 libs/freemodbus/port/portevent.c delete mode 100644 libs/freemodbus/port/portevent_m.c delete mode 100644 libs/freemodbus/port/portserial_m.c delete mode 100644 libs/freemodbus/port/porttcp.c delete mode 100644 libs/freemodbus/port/porttimer.c delete mode 100644 libs/freemodbus/port/porttimer_m.c delete mode 100644 libs/freemodbus/port/user_mb_app.h delete mode 100644 libs/freemodbus/port/user_mb_app_m.c delete mode 100644 libs/freemodbus/samples/README.md delete mode 100644 libs/freemodbus/samples/figures/run.png delete mode 100644 libs/freemodbus/samples/figures/slave_cfg.png delete mode 100644 libs/freemodbus/samples/figures/slave_con.png delete mode 100644 libs/freemodbus/samples/figures/slave_run.png delete mode 100644 libs/freemodbus/samples/sample_mb_master.c delete mode 100644 libs/freemodbus/samples/sample_mb_slave.c diff --git a/apps/chrg/.config b/apps/chrg/.config index 6afcae4..87de884 100644 --- a/apps/chrg/.config +++ b/apps/chrg/.config @@ -1,1502 +1,1473 @@ -CONFIG_SOC_STM32F405RG=y - -# -# RT-Thread Kernel -# - -# -# klibc options -# - -# -# rt_vsnprintf options -# -# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set -# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set -# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set -# end of rt_vsnprintf options - -# -# rt_vsscanf options -# -# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set -# end of rt_vsscanf options - -# -# rt_memset options -# -# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set -# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set -# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set -# end of rt_memset options - -# -# rt_memcpy options -# -# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set -# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set -# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set -# end of rt_memcpy options - -# -# rt_memmove options -# -# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set -# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set -# end of rt_memmove options - -# -# rt_memcmp options -# -# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set -# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set -# end of rt_memcmp options - -# -# rt_strstr options -# -# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set -# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set -# end of rt_strstr options - -# -# rt_strcasecmp options -# -# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set -# end of rt_strcasecmp options - -# -# rt_strncpy options -# -# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set -# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set -# end of rt_strncpy options - -# -# rt_strcpy options -# -# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set -# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set -# end of rt_strcpy options - -# -# rt_strncmp options -# -# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set -# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set -# end of rt_strncmp options - -# -# rt_strcmp options -# -# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set -# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set -# end of rt_strcmp options - -# -# rt_strlen options -# -# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set -# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set -# end of rt_strlen options - -# -# rt_strnlen options -# -# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set -# end of rt_strnlen options -# end of klibc options - -CONFIG_RT_NAME_MAX=16 -# CONFIG_RT_USING_ARCH_DATA_TYPE is not set -# CONFIG_RT_USING_NANO is not set -# CONFIG_RT_USING_SMART is not set -# CONFIG_RT_USING_AMP is not set -# CONFIG_RT_USING_SMP is not set -CONFIG_RT_CPUS_NR=1 -CONFIG_RT_ALIGN_SIZE=8 -# CONFIG_RT_THREAD_PRIORITY_8 is not set -CONFIG_RT_THREAD_PRIORITY_32=y -# CONFIG_RT_THREAD_PRIORITY_256 is not set -CONFIG_RT_THREAD_PRIORITY_MAX=32 -CONFIG_RT_TICK_PER_SECOND=1000 -CONFIG_RT_USING_OVERFLOW_CHECK=y -CONFIG_RT_USING_HOOK=y -CONFIG_RT_HOOK_USING_FUNC_PTR=y -# CONFIG_RT_USING_HOOKLIST is not set -CONFIG_RT_USING_IDLE_HOOK=y -CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 -CONFIG_IDLE_THREAD_STACK_SIZE=256 -# CONFIG_RT_USING_TIMER_SOFT is not set -CONFIG_RT_USING_CPU_USAGE_TRACER=y - -# -# kservice options -# -# CONFIG_RT_USING_TINY_FFS is not set -# end of kservice options - -CONFIG_RT_USING_DEBUG=y -CONFIG_RT_DEBUGING_ASSERT=y -CONFIG_RT_DEBUGING_COLOR=y -CONFIG_RT_DEBUGING_CONTEXT=y -# CONFIG_RT_DEBUGING_AUTO_INIT is not set -# CONFIG_RT_USING_CI_ACTION is not set - -# -# Inter-Thread communication -# -CONFIG_RT_USING_SEMAPHORE=y -CONFIG_RT_USING_MUTEX=y -CONFIG_RT_USING_EVENT=y -CONFIG_RT_USING_MAILBOX=y -CONFIG_RT_USING_MESSAGEQUEUE=y -# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set -# CONFIG_RT_USING_SIGNALS is not set -# end of Inter-Thread communication - -# -# Memory Management -# -CONFIG_RT_USING_MEMPOOL=y -CONFIG_RT_USING_SMALL_MEM=y -# CONFIG_RT_USING_SLAB is not set -# CONFIG_RT_USING_MEMHEAP is not set -CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y -# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set -# CONFIG_RT_USING_SLAB_AS_HEAP is not set -# CONFIG_RT_USING_USERHEAP is not set -# CONFIG_RT_USING_NOHEAP is not set -# CONFIG_RT_USING_MEMTRACE is not set -# CONFIG_RT_USING_HEAP_ISR is not set -CONFIG_RT_USING_HEAP=y -# end of Memory Management - -CONFIG_RT_USING_DEVICE=y -# CONFIG_RT_USING_DEVICE_OPS is not set -# CONFIG_RT_USING_INTERRUPT_INFO is not set -# CONFIG_RT_USING_THREADSAFE_PRINTF is not set -CONFIG_RT_USING_CONSOLE=y -CONFIG_RT_CONSOLEBUF_SIZE=128 -CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" -CONFIG_RT_VER_NUM=0x50201 -# CONFIG_RT_USING_STDC_ATOMIC is not set -CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 -# end of RT-Thread Kernel - -CONFIG_RT_USING_HW_ATOMIC=y -CONFIG_RT_USING_CPU_FFS=y -CONFIG_ARCH_ARM=y -CONFIG_ARCH_ARM_CORTEX_M=y -CONFIG_ARCH_ARM_CORTEX_M4=y - -# -# RT-Thread Components -# -CONFIG_RT_USING_COMPONENTS_INIT=y -CONFIG_RT_USING_USER_MAIN=y -CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 -CONFIG_RT_MAIN_THREAD_PRIORITY=10 -# CONFIG_RT_USING_LEGACY is not set -CONFIG_RT_USING_MSH=y -CONFIG_RT_USING_FINSH=y -CONFIG_FINSH_USING_MSH=y -CONFIG_FINSH_THREAD_NAME="tshell" -CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=4096 -CONFIG_FINSH_USING_HISTORY=y -CONFIG_FINSH_HISTORY_LINES=5 -# CONFIG_FINSH_USING_WORD_OPERATION is not set -CONFIG_FINSH_USING_SYMTAB=y -CONFIG_FINSH_CMD_SIZE=80 -CONFIG_MSH_USING_BUILT_IN_COMMANDS=y -CONFIG_FINSH_USING_DESCRIPTION=y -# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set -# CONFIG_FINSH_USING_AUTH is not set -CONFIG_FINSH_ARG_MAX=10 -CONFIG_FINSH_USING_OPTION_COMPLETION=y - -# -# DFS: device virtual file system -# -# CONFIG_RT_USING_DFS is not set -# end of DFS: device virtual file system - -CONFIG_RT_USING_FAL=y -# CONFIG_FAL_USING_DEBUG is not set -CONFIG_FAL_PART_HAS_TABLE_CFG=y -# CONFIG_FAL_USING_SFUD_PORT is not set - -# -# Device Drivers -# -# CONFIG_RT_USING_DM is not set -# CONFIG_RT_USING_DEV_BUS is not set -CONFIG_RT_USING_DEVICE_IPC=y -CONFIG_RT_UNAMED_PIPE_NUMBER=64 -CONFIG_RT_USING_SYSTEM_WORKQUEUE=y -CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 -CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 -CONFIG_RT_USING_SERIAL=y -CONFIG_RT_USING_SERIAL_V1=y -# CONFIG_RT_USING_SERIAL_V2 is not set -CONFIG_RT_SERIAL_USING_DMA=y -CONFIG_RT_SERIAL_RB_BUFSZ=64 -# CONFIG_RT_USING_SERIAL_BYPASS is not set -CONFIG_RT_USING_CAN=y -# CONFIG_RT_CAN_USING_HDR is not set -# CONFIG_RT_CAN_USING_CANFD is not set -CONFIG_RT_CANMSG_BOX_SZ=16 -CONFIG_RT_CANSND_BOX_NUM=1 -CONFIG_RT_CANSND_MSG_TIMEOUT=100 -# CONFIG_RT_USING_CPUTIME is not set -CONFIG_RT_USING_I2C=y -# CONFIG_RT_I2C_DEBUG is not set -CONFIG_RT_USING_I2C_BITOPS=y -# CONFIG_RT_I2C_BITOPS_DEBUG is not set -# CONFIG_RT_USING_SOFT_I2C is not set -# CONFIG_RT_USING_PHY is not set -# CONFIG_RT_USING_PHY_V2 is not set -# CONFIG_RT_USING_ADC is not set -# CONFIG_RT_USING_DAC is not set -# CONFIG_RT_USING_NULL is not set -# CONFIG_RT_USING_ZERO is not set -# CONFIG_RT_USING_RANDOM is not set -# CONFIG_RT_USING_PWM is not set -# CONFIG_RT_USING_PULSE_ENCODER is not set -# CONFIG_RT_USING_INPUT_CAPTURE is not set -# CONFIG_RT_USING_MTD_NOR is not set -# CONFIG_RT_USING_MTD_NAND is not set -# CONFIG_RT_USING_PM is not set -# CONFIG_RT_USING_RTC is not set -# CONFIG_RT_USING_SDIO is not set -# CONFIG_RT_USING_SPI is not set -CONFIG_RT_USING_WDT=y -# CONFIG_RT_USING_AUDIO is not set -# CONFIG_RT_USING_SENSOR is not set -# CONFIG_RT_USING_TOUCH is not set -# CONFIG_RT_USING_LCD is not set -# CONFIG_RT_USING_HWCRYPTO is not set -# CONFIG_RT_USING_WIFI is not set -# CONFIG_RT_USING_BLK is not set -# CONFIG_RT_USING_VIRTIO is not set -CONFIG_RT_USING_PIN=y -# CONFIG_RT_USING_KTIME is not set -CONFIG_RT_USING_HWTIMER=y -# CONFIG_RT_USING_CHERRYUSB is not set -# end of Device Drivers - -# -# C/C++ and POSIX layer -# - -# -# ISO-ANSI C layer -# - -# -# Timezone and Daylight Saving Time -# -# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set -CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y -CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 -CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 -CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 -# end of Timezone and Daylight Saving Time -# end of ISO-ANSI C layer - -# -# POSIX (Portable Operating System Interface) layer -# -# CONFIG_RT_USING_POSIX_FS is not set -# CONFIG_RT_USING_POSIX_DELAY is not set -# CONFIG_RT_USING_POSIX_CLOCK is not set -# CONFIG_RT_USING_POSIX_TIMER is not set -# CONFIG_RT_USING_PTHREADS is not set -# CONFIG_RT_USING_MODULE is not set - -# -# Interprocess Communication (IPC) -# -# CONFIG_RT_USING_POSIX_PIPE is not set -# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set -# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set - -# -# Socket is in the 'Network' category -# -# end of Interprocess Communication (IPC) -# end of POSIX (Portable Operating System Interface) layer - -# CONFIG_RT_USING_CPLUSPLUS is not set -# end of C/C++ and POSIX layer - -# -# Network -# -# CONFIG_RT_USING_SAL is not set -# CONFIG_RT_USING_NETDEV is not set -# CONFIG_RT_USING_LWIP is not set -# CONFIG_RT_USING_AT is not set -# end of Network - -# -# Memory protection -# -# CONFIG_RT_USING_MEM_PROTECTION is not set -# CONFIG_RT_USING_HW_STACK_GUARD is not set -# end of Memory protection - -# -# Utilities -# -# CONFIG_RT_USING_RYM is not set -# CONFIG_RT_USING_ULOG is not set -# CONFIG_RT_USING_UTEST is not set -# CONFIG_RT_USING_VAR_EXPORT is not set -# CONFIG_RT_USING_RESOURCE_ID is not set -# CONFIG_RT_USING_ADT is not set -# CONFIG_RT_USING_RT_LINK is not set -# end of Utilities - -# CONFIG_RT_USING_VBUS is not set - -# -# Using USB legacy version -# -# CONFIG_RT_USING_USB_HOST is not set -# CONFIG_RT_USING_USB_DEVICE is not set -# end of Using USB legacy version - -# CONFIG_RT_USING_FDT is not set -# end of RT-Thread Components - -# -# RT-Thread online packages -# - -# -# IoT - internet of things -# -# CONFIG_PKG_USING_LORAWAN_DRIVER is not set -# CONFIG_PKG_USING_PAHOMQTT is not set -# CONFIG_PKG_USING_UMQTT is not set -# CONFIG_PKG_USING_WEBCLIENT is not set -# CONFIG_PKG_USING_WEBNET is not set -# CONFIG_PKG_USING_MONGOOSE is not set -# CONFIG_PKG_USING_MYMQTT is not set -# CONFIG_PKG_USING_KAWAII_MQTT is not set -# CONFIG_PKG_USING_BC28_MQTT is not set -# CONFIG_PKG_USING_WEBTERMINAL is not set -CONFIG_PKG_USING_FREEMODBUS=y -CONFIG_PKG_FREEMODBUS_PATH="/packages/iot/freemodbus" -# CONFIG_PKG_MODBUS_MASTER is not set -CONFIG_PKG_MODBUS_SLAVE=y - -# -# advanced configuration -# -CONFIG_RT_S_DISCRETE_INPUT_START=0 -CONFIG_RT_S_DISCRETE_INPUT_NDISCRETES=16 -CONFIG_RT_S_COIL_START=0 -CONFIG_RT_S_COIL_NCOILS=64 -CONFIG_RT_S_REG_INPUT_START=0 -CONFIG_RT_S_REG_INPUT_NREGS=100 -CONFIG_RT_S_REG_HOLDING_START=0 -CONFIG_RT_S_REG_HOLDING_NREGS=100 -CONFIG_RT_S_HD_RESERVE=0 -CONFIG_RT_S_IN_RESERVE=0 -CONFIG_RT_S_CO_RESERVE=0 -CONFIG_RT_S_DI_RESERVE=0 -# end of advanced configuration - -CONFIG_PKG_MODBUS_SLAVE_RTU=y -# CONFIG_PKG_MODBUS_SLAVE_ASCII is not set -# CONFIG_PKG_MODBUS_SLAVE_TCP is not set -# CONFIG_RT_MODBUS_SLAVE_USE_CONTROL_PIN is not set -# CONFIG_PKG_MODBUS_SLAVE_SAMPLE is not set -# CONFIG_PKG_USING_FREEMODBUS_V160 is not set -CONFIG_PKG_USING_FREEMODBUS_LATEST_VERSION=y -CONFIG_PKG_FREEMODBUS_VER="latest" -# CONFIG_PKG_USING_NANOPB is not set -# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set -# CONFIG_PKG_USING_ESP_HOSTED is not set - -# -# Wi-Fi -# - -# -# Marvell WiFi -# -# CONFIG_PKG_USING_WLANMARVELL is not set -# end of Marvell WiFi - -# -# Wiced WiFi -# -# CONFIG_PKG_USING_WLAN_WICED is not set -# end of Wiced WiFi - -# CONFIG_PKG_USING_RW007 is not set - -# -# CYW43012 WiFi -# -# CONFIG_PKG_USING_WLAN_CYW43012 is not set -# end of CYW43012 WiFi - -# -# BL808 WiFi -# -# CONFIG_PKG_USING_WLAN_BL808 is not set -# end of BL808 WiFi - -# -# CYW43439 WiFi -# -# CONFIG_PKG_USING_WLAN_CYW43439 is not set -# end of CYW43439 WiFi -# end of Wi-Fi - -# CONFIG_PKG_USING_COAP is not set -# CONFIG_PKG_USING_NOPOLL is not set -# CONFIG_PKG_USING_NETUTILS is not set -# CONFIG_PKG_USING_CMUX is not set -# CONFIG_PKG_USING_PPP_DEVICE is not set -# CONFIG_PKG_USING_AT_DEVICE is not set -# CONFIG_PKG_USING_ATSRV_SOCKET is not set -# CONFIG_PKG_USING_WIZNET is not set -# CONFIG_PKG_USING_ZB_COORDINATOR is not set - -# -# IoT Cloud -# -# CONFIG_PKG_USING_ONENET is not set -# CONFIG_PKG_USING_GAGENT_CLOUD is not set -# CONFIG_PKG_USING_ALI_IOTKIT is not set -# CONFIG_PKG_USING_AZURE is not set -# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set -# CONFIG_PKG_USING_JIOT-C-SDK is not set -# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set -# CONFIG_PKG_USING_JOYLINK is not set -# CONFIG_PKG_USING_IOTSHARP_SDK is not set -# end of IoT Cloud - -# CONFIG_PKG_USING_NIMBLE is not set -# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set -# CONFIG_PKG_USING_OTA_DOWNLOADER is not set -# CONFIG_PKG_USING_IPMSG is not set -# CONFIG_PKG_USING_LSSDP is not set -# CONFIG_PKG_USING_AIRKISS_OPEN is not set -# CONFIG_PKG_USING_LIBRWS is not set -# CONFIG_PKG_USING_TCPSERVER is not set -# CONFIG_PKG_USING_PROTOBUF_C is not set -# CONFIG_PKG_USING_DLT645 is not set -# CONFIG_PKG_USING_QXWZ is not set -# CONFIG_PKG_USING_SMTP_CLIENT is not set -# CONFIG_PKG_USING_ABUP_FOTA is not set -# CONFIG_PKG_USING_LIBCURL2RTT is not set -# CONFIG_PKG_USING_CAPNP is not set -# CONFIG_PKG_USING_AGILE_TELNET is not set -# CONFIG_PKG_USING_NMEALIB is not set -# CONFIG_PKG_USING_PDULIB is not set -# CONFIG_PKG_USING_BTSTACK is not set -# CONFIG_PKG_USING_BT_CYW43012 is not set -# CONFIG_PKG_USING_CYW43XX is not set -# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set -# CONFIG_PKG_USING_WAYZ_IOTKIT is not set -# CONFIG_PKG_USING_MAVLINK is not set -# CONFIG_PKG_USING_BSAL is not set -# CONFIG_PKG_USING_AGILE_MODBUS is not set -# CONFIG_PKG_USING_AGILE_FTP is not set -# CONFIG_PKG_USING_EMBEDDEDPROTO is not set -# CONFIG_PKG_USING_RT_LINK_HW is not set -# CONFIG_PKG_USING_RYANMQTT is not set -# CONFIG_PKG_USING_RYANW5500 is not set -# CONFIG_PKG_USING_LORA_PKT_FWD is not set -# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set -# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set -# CONFIG_PKG_USING_HM is not set -# CONFIG_PKG_USING_SMALL_MODBUS is not set -# CONFIG_PKG_USING_NET_SERVER is not set -# CONFIG_PKG_USING_ZFTP is not set -# CONFIG_PKG_USING_WOL is not set -# CONFIG_PKG_USING_ZEPHYR_POLLING is not set -# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set -# CONFIG_PKG_USING_LHC_MODBUS is not set -# CONFIG_PKG_USING_QMODBUS is not set -# CONFIG_PKG_USING_PNET is not set -# CONFIG_PKG_USING_OPENER is not set -# CONFIG_PKG_USING_FREEMQTT is not set -# end of IoT - internet of things - -# -# security packages -# -# CONFIG_PKG_USING_MBEDTLS is not set -# CONFIG_PKG_USING_LIBSODIUM is not set -# CONFIG_PKG_USING_LIBHYDROGEN is not set -# CONFIG_PKG_USING_TINYCRYPT is not set -# CONFIG_PKG_USING_TFM is not set -# CONFIG_PKG_USING_YD_CRYPTO is not set -# end of security packages - -# -# language packages -# - -# -# JSON: JavaScript Object Notation, a lightweight data-interchange format -# -# CONFIG_PKG_USING_CJSON is not set -# CONFIG_PKG_USING_LJSON is not set -# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set -# CONFIG_PKG_USING_RAPIDJSON is not set -# CONFIG_PKG_USING_JSMN is not set -# CONFIG_PKG_USING_AGILE_JSMN is not set -# CONFIG_PKG_USING_PARSON is not set -# CONFIG_PKG_USING_RYAN_JSON is not set -# end of JSON: JavaScript Object Notation, a lightweight data-interchange format - -# -# XML: Extensible Markup Language -# -# CONFIG_PKG_USING_SIMPLE_XML is not set -# CONFIG_PKG_USING_EZXML is not set -# end of XML: Extensible Markup Language - -# CONFIG_PKG_USING_LUATOS_SOC is not set -# CONFIG_PKG_USING_LUA is not set -# CONFIG_PKG_USING_JERRYSCRIPT is not set -# CONFIG_PKG_USING_MICROPYTHON is not set -# CONFIG_PKG_USING_PIKASCRIPT is not set -# CONFIG_PKG_USING_RTT_RUST is not set -# end of language packages - -# -# multimedia packages -# - -# -# LVGL: powerful and easy-to-use embedded GUI library -# -# CONFIG_PKG_USING_LVGL is not set -# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set -# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set -# end of LVGL: powerful and easy-to-use embedded GUI library - -# -# u8g2: a monochrome graphic library -# -# CONFIG_PKG_USING_U8G2_OFFICIAL is not set -# CONFIG_PKG_USING_U8G2 is not set -# end of u8g2: a monochrome graphic library - -# CONFIG_PKG_USING_OPENMV is not set -# CONFIG_PKG_USING_MUPDF is not set -# CONFIG_PKG_USING_STEMWIN is not set -# CONFIG_PKG_USING_WAVPLAYER is not set -# CONFIG_PKG_USING_TJPGD is not set -# CONFIG_PKG_USING_PDFGEN is not set -# CONFIG_PKG_USING_HELIX is not set -# CONFIG_PKG_USING_AZUREGUIX is not set -# CONFIG_PKG_USING_TOUCHGFX2RTT is not set -# CONFIG_PKG_USING_NUEMWIN is not set -# CONFIG_PKG_USING_MP3PLAYER is not set -# CONFIG_PKG_USING_TINYJPEG is not set -# CONFIG_PKG_USING_UGUI is not set -# CONFIG_PKG_USING_MCURSES is not set -# CONFIG_PKG_USING_TERMBOX is not set -# CONFIG_PKG_USING_VT100 is not set -# CONFIG_PKG_USING_QRCODE is not set -# CONFIG_PKG_USING_GUIENGINE is not set -# CONFIG_PKG_USING_PERSIMMON is not set -# CONFIG_PKG_USING_3GPP_AMRNB is not set -# end of multimedia packages - -# -# tools packages -# -# CONFIG_PKG_USING_CMBACKTRACE is not set -# CONFIG_PKG_USING_EASYFLASH is not set -# CONFIG_PKG_USING_EASYLOGGER is not set -# CONFIG_PKG_USING_SYSTEMVIEW is not set -# CONFIG_PKG_USING_SEGGER_RTT is not set -# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set -# CONFIG_PKG_USING_RDB is not set -# CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_LOGMGR is not set -# CONFIG_PKG_USING_ADBD is not set -# CONFIG_PKG_USING_COREMARK is not set -# CONFIG_PKG_USING_DHRYSTONE is not set -# CONFIG_PKG_USING_MEMORYPERF is not set -# CONFIG_PKG_USING_NR_MICRO_SHELL is not set -# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set -# CONFIG_PKG_USING_LUNAR_CALENDAR is not set -# CONFIG_PKG_USING_BS8116A is not set -# CONFIG_PKG_USING_GPS_RMC is not set -# CONFIG_PKG_USING_URLENCODE is not set -# CONFIG_PKG_USING_UMCN is not set -# CONFIG_PKG_USING_LWRB2RTT is not set -# CONFIG_PKG_USING_CPU_USAGE is not set -# CONFIG_PKG_USING_GBK2UTF8 is not set -# CONFIG_PKG_USING_VCONSOLE is not set -# CONFIG_PKG_USING_KDB is not set -# CONFIG_PKG_USING_WAMR is not set -# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set -# CONFIG_PKG_USING_LWLOG is not set -# CONFIG_PKG_USING_ANV_TRACE is not set -# CONFIG_PKG_USING_ANV_MEMLEAK is not set -# CONFIG_PKG_USING_ANV_TESTSUIT is not set -# CONFIG_PKG_USING_ANV_BENCH is not set -# CONFIG_PKG_USING_DEVMEM is not set -# CONFIG_PKG_USING_REGEX is not set -# CONFIG_PKG_USING_MEM_SANDBOX is not set -# CONFIG_PKG_USING_SOLAR_TERMS is not set -# CONFIG_PKG_USING_GAN_ZHI is not set -# CONFIG_PKG_USING_FDT is not set -# CONFIG_PKG_USING_CBOX is not set -# CONFIG_PKG_USING_SNOWFLAKE is not set -# CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set -# CONFIG_PKG_USING_VOFA_PLUS is not set -# CONFIG_PKG_USING_RT_TRACE is not set -# CONFIG_PKG_USING_ZDEBUG is not set -# CONFIG_PKG_USING_RVBACKTRACE is not set -# CONFIG_PKG_USING_HPATCHLITE is not set -# CONFIG_PKG_USING_THREAD_METRIC is not set -# end of tools packages - -# -# system packages -# - -# -# enhanced kernel services -# -# CONFIG_PKG_USING_RT_MEMCPY_CM is not set -# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set -# end of enhanced kernel services - -# CONFIG_PKG_USING_AUNITY is not set - -# -# acceleration: Assembly language or algorithmic acceleration packages -# -# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set -# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set -# CONFIG_PKG_USING_QFPLIB_M3 is not set -# end of acceleration: Assembly language or algorithmic acceleration packages - -# -# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard -# -# CONFIG_PKG_USING_CMSIS_5 is not set -CONFIG_PKG_USING_CMSIS_CORE=y -CONFIG_PKG_CMSIS_CORE_PATH="/packages/system/CMSIS/CMSIS-Core" -CONFIG_PKG_USING_CMSIS_CORE_LATEST_VERSION=y -CONFIG_PKG_CMSIS_CORE_VER="latest" -# CONFIG_PKG_USING_CMSIS_NN is not set -# CONFIG_PKG_USING_CMSIS_RTOS1 is not set -# CONFIG_PKG_USING_CMSIS_RTOS2 is not set -# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard - -# -# Micrium: Micrium software products porting for RT-Thread -# -# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set -# CONFIG_PKG_USING_UCOSII_WRAPPER is not set -# CONFIG_PKG_USING_UC_CRC is not set -# CONFIG_PKG_USING_UC_CLK is not set -# CONFIG_PKG_USING_UC_COMMON is not set -# CONFIG_PKG_USING_UC_MODBUS is not set -# end of Micrium: Micrium software products porting for RT-Thread - -# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set -# CONFIG_PKG_USING_LITEOS_SDK is not set -# CONFIG_PKG_USING_TZ_DATABASE is not set -# CONFIG_PKG_USING_CAIRO is not set -# CONFIG_PKG_USING_PIXMAN is not set -# CONFIG_PKG_USING_PARTITION is not set -# CONFIG_PKG_USING_PERF_COUNTER is not set -# CONFIG_PKG_USING_FILEX is not set -# CONFIG_PKG_USING_LEVELX is not set -# CONFIG_PKG_USING_FLASHDB is not set -# CONFIG_PKG_USING_SQLITE is not set -# CONFIG_PKG_USING_RTI is not set -# CONFIG_PKG_USING_DFS_YAFFS is not set -# CONFIG_PKG_USING_LITTLEFS is not set -# CONFIG_PKG_USING_DFS_JFFS2 is not set -# CONFIG_PKG_USING_DFS_UFFS is not set -# CONFIG_PKG_USING_LWEXT4 is not set -# CONFIG_PKG_USING_THREAD_POOL is not set -# CONFIG_PKG_USING_ROBOTS is not set -# CONFIG_PKG_USING_EV is not set -# CONFIG_PKG_USING_SYSWATCH is not set -# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set -# CONFIG_PKG_USING_PLCCORE is not set -# CONFIG_PKG_USING_RAMDISK is not set -# CONFIG_PKG_USING_MININI is not set -# CONFIG_PKG_USING_QBOOT is not set -# CONFIG_PKG_USING_PPOOL is not set -# CONFIG_PKG_USING_OPENAMP is not set -# CONFIG_PKG_USING_RPMSG_LITE is not set -# CONFIG_PKG_USING_LPM is not set -# CONFIG_PKG_USING_TLSF is not set -# CONFIG_PKG_USING_EVENT_RECORDER is not set -# CONFIG_PKG_USING_ARM_2D is not set -# CONFIG_PKG_USING_MCUBOOT is not set -# CONFIG_PKG_USING_TINYUSB is not set -# CONFIG_PKG_USING_KMULTI_RTIMER is not set -# CONFIG_PKG_USING_TFDB is not set -# CONFIG_PKG_USING_QPC is not set -# CONFIG_PKG_USING_AGILE_UPGRADE is not set -# CONFIG_PKG_USING_FLASH_BLOB is not set -# CONFIG_PKG_USING_MLIBC is not set -# CONFIG_PKG_USING_TASK_MSG_BUS is not set -# CONFIG_PKG_USING_UART_FRAMEWORK is not set -# CONFIG_PKG_USING_SFDB is not set -# CONFIG_PKG_USING_RTP is not set -# CONFIG_PKG_USING_REB is not set -# CONFIG_PKG_USING_RMP is not set -# CONFIG_PKG_USING_R_RHEALSTONE is not set -# CONFIG_PKG_USING_HEARTBEAT is not set -# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -# end of system packages - -# -# peripheral libraries and drivers -# - -# -# HAL & SDK Drivers -# - -# -# STM32 HAL & SDK Drivers -# -# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set -CONFIG_PKG_USING_STM32F4_HAL_DRIVER=y -CONFIG_PKG_STM32F4_HAL_DRIVER_PATH="/packages/peripherals/hal-sdk/stm32/stm32f4_hal_driver" -CONFIG_PKG_USING_STM32F4_HAL_DRIVER_LATEST_VERSION=y -CONFIG_PKG_STM32F4_HAL_DRIVER_VER="latest" -CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER=y -CONFIG_PKG_STM32F4_CMSIS_DRIVER_PATH="/packages/peripherals/hal-sdk/stm32/stm32f4_cmsis_driver" -CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER_LATEST_VERSION=y -CONFIG_PKG_STM32F4_CMSIS_DRIVER_VER="latest" -# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32WB55_SDK is not set -# CONFIG_PKG_USING_STM32_SDIO is not set -# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set -# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set -# end of STM32 HAL & SDK Drivers - -# -# Infineon HAL Packages -# -# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set -# CONFIG_PKG_USING_INFINEON_CMSIS is not set -# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set -# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set -# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set -# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set -# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set -# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set -# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set -# CONFIG_PKG_USING_INFINEON_USBDEV is not set -# end of Infineon HAL Packages - -# CONFIG_PKG_USING_BLUETRUM_SDK is not set -# CONFIG_PKG_USING_EMBARC_BSP is not set -# CONFIG_PKG_USING_ESP_IDF is not set - -# -# Kendryte SDK -# -# CONFIG_PKG_USING_K210_SDK is not set -# CONFIG_PKG_USING_KENDRYTE_SDK is not set -# end of Kendryte SDK - -# CONFIG_PKG_USING_NRF5X_SDK is not set -# CONFIG_PKG_USING_NRFX is not set -# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set -# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set -# CONFIG_PKG_USING_MM32 is not set - -# -# WCH HAL & SDK Drivers -# -# CONFIG_PKG_USING_CH32V20x_SDK is not set -# CONFIG_PKG_USING_CH32V307_SDK is not set -# end of WCH HAL & SDK Drivers - -# -# AT32 HAL & SDK Drivers -# -# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set -# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set -# end of AT32 HAL & SDK Drivers - -# -# HC32 DDL Drivers -# -# CONFIG_PKG_USING_HC32F3_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_HC32F3_SERIES_DRIVER is not set -# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set -# end of HC32 DDL Drivers - -# -# NXP HAL & SDK Drivers -# -# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set -# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set -# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set -# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set -# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set -# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set -# end of NXP HAL & SDK Drivers - -# -# NUVOTON Drivers -# -# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set -# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set -# end of NUVOTON Drivers - -# -# GD32 Drivers -# -# CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set -# CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set -# end of GD32 Drivers -# end of HAL & SDK Drivers - -# -# sensors drivers -# -# CONFIG_PKG_USING_LSM6DSM is not set -# CONFIG_PKG_USING_LSM6DSL is not set -# CONFIG_PKG_USING_LPS22HB is not set -# CONFIG_PKG_USING_HTS221 is not set -# CONFIG_PKG_USING_LSM303AGR is not set -# CONFIG_PKG_USING_BME280 is not set -# CONFIG_PKG_USING_BME680 is not set -# CONFIG_PKG_USING_BMA400 is not set -# CONFIG_PKG_USING_BMI160_BMX160 is not set -# CONFIG_PKG_USING_SPL0601 is not set -# CONFIG_PKG_USING_MS5805 is not set -# CONFIG_PKG_USING_DA270 is not set -# CONFIG_PKG_USING_DF220 is not set -# CONFIG_PKG_USING_HSHCAL001 is not set -# CONFIG_PKG_USING_BH1750 is not set -# CONFIG_PKG_USING_MPU6XXX is not set -# CONFIG_PKG_USING_AHT10 is not set -# CONFIG_PKG_USING_AP3216C is not set -# CONFIG_PKG_USING_TSL4531 is not set -# CONFIG_PKG_USING_DS18B20 is not set -# CONFIG_PKG_USING_DHT11 is not set -# CONFIG_PKG_USING_DHTXX is not set -# CONFIG_PKG_USING_GY271 is not set -# CONFIG_PKG_USING_GP2Y10 is not set -# CONFIG_PKG_USING_SGP30 is not set -# CONFIG_PKG_USING_HDC1000 is not set -# CONFIG_PKG_USING_BMP180 is not set -# CONFIG_PKG_USING_BMP280 is not set -# CONFIG_PKG_USING_SHTC1 is not set -# CONFIG_PKG_USING_BMI088 is not set -# CONFIG_PKG_USING_HMC5883 is not set -# CONFIG_PKG_USING_MAX6675 is not set -# CONFIG_PKG_USING_MAX31855 is not set -# CONFIG_PKG_USING_TMP1075 is not set -# CONFIG_PKG_USING_SR04 is not set -# CONFIG_PKG_USING_CCS811 is not set -# CONFIG_PKG_USING_PMSXX is not set -# CONFIG_PKG_USING_RT3020 is not set -# CONFIG_PKG_USING_MLX90632 is not set -# CONFIG_PKG_USING_MLX90382 is not set -# CONFIG_PKG_USING_MLX90393 is not set -# CONFIG_PKG_USING_MLX90392 is not set -# CONFIG_PKG_USING_MLX90394 is not set -# CONFIG_PKG_USING_MLX90397 is not set -# CONFIG_PKG_USING_MS5611 is not set -# CONFIG_PKG_USING_MAX31865 is not set -# CONFIG_PKG_USING_VL53L0X is not set -# CONFIG_PKG_USING_INA260 is not set -# CONFIG_PKG_USING_MAX30102 is not set -# CONFIG_PKG_USING_INA226 is not set -# CONFIG_PKG_USING_LIS2DH12 is not set -# CONFIG_PKG_USING_HS300X is not set -# CONFIG_PKG_USING_ZMOD4410 is not set -# CONFIG_PKG_USING_ISL29035 is not set -# CONFIG_PKG_USING_MMC3680KJ is not set -# CONFIG_PKG_USING_QMP6989 is not set -# CONFIG_PKG_USING_BALANCE is not set -# CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_SHT3X is not set -# CONFIG_PKG_USING_SHT4X is not set -# CONFIG_PKG_USING_AD7746 is not set -# CONFIG_PKG_USING_ADT74XX is not set -# CONFIG_PKG_USING_MAX17048 is not set -# CONFIG_PKG_USING_AS7341 is not set -# CONFIG_PKG_USING_CW2015 is not set -# CONFIG_PKG_USING_ICM20608 is not set -# CONFIG_PKG_USING_PAJ7620 is not set -# CONFIG_PKG_USING_STHS34PF80 is not set -# CONFIG_PKG_USING_P3T1755 is not set -# CONFIG_PKG_USING_QMI8658 is not set -# CONFIG_PKG_USING_ICM20948 is not set -# end of sensors drivers - -# -# touch drivers -# -# CONFIG_PKG_USING_GT9147 is not set -# CONFIG_PKG_USING_GT1151 is not set -# CONFIG_PKG_USING_GT917S is not set -# CONFIG_PKG_USING_GT911 is not set -# CONFIG_PKG_USING_FT6206 is not set -# CONFIG_PKG_USING_FT5426 is not set -# CONFIG_PKG_USING_FT6236 is not set -# CONFIG_PKG_USING_XPT2046_TOUCH is not set -# CONFIG_PKG_USING_CST816X is not set -# CONFIG_PKG_USING_CST812T is not set -# end of touch drivers - -# CONFIG_PKG_USING_REALTEK_AMEBA is not set -# CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_PCF8574 is not set -# CONFIG_PKG_USING_SX12XX is not set -# CONFIG_PKG_USING_SIGNAL_LED is not set -# CONFIG_PKG_USING_LEDBLINK is not set -# CONFIG_PKG_USING_LITTLED is not set -# CONFIG_PKG_USING_LKDGUI is not set -# CONFIG_PKG_USING_INFRARED is not set -# CONFIG_PKG_USING_MULTI_INFRARED is not set -# CONFIG_PKG_USING_AGILE_BUTTON is not set -# CONFIG_PKG_USING_AGILE_LED is not set -# CONFIG_PKG_USING_AT24CXX is not set -# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_PCA9685 is not set -# CONFIG_PKG_USING_ILI9341 is not set -# CONFIG_PKG_USING_I2C_TOOLS is not set -# CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_RPLIDAR is not set -# CONFIG_PKG_USING_AS608 is not set -# CONFIG_PKG_USING_RC522 is not set -# CONFIG_PKG_USING_WS2812B is not set -# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set -# CONFIG_PKG_USING_MULTI_RTIMER is not set -# CONFIG_PKG_USING_MAX7219 is not set -# CONFIG_PKG_USING_BEEP is not set -# CONFIG_PKG_USING_EASYBLINK is not set -# CONFIG_PKG_USING_PMS_SERIES is not set -# CONFIG_PKG_USING_CAN_YMODEM is not set -# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set -# CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_AGILE_CONSOLE is not set -# CONFIG_PKG_USING_LD3320 is not set -# CONFIG_PKG_USING_WK2124 is not set -# CONFIG_PKG_USING_LY68L6400 is not set -# CONFIG_PKG_USING_DM9051 is not set -# CONFIG_PKG_USING_SSD1306 is not set -# CONFIG_PKG_USING_QKEY is not set -# CONFIG_PKG_USING_RS485 is not set -# CONFIG_PKG_USING_RS232 is not set -# CONFIG_PKG_USING_NES is not set -# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set -# CONFIG_PKG_USING_VDEVICE is not set -# CONFIG_PKG_USING_SGM706 is not set -# CONFIG_PKG_USING_RDA58XX is not set -# CONFIG_PKG_USING_LIBNFC is not set -# CONFIG_PKG_USING_MFOC is not set -# CONFIG_PKG_USING_TMC51XX is not set -# CONFIG_PKG_USING_TCA9534 is not set -# CONFIG_PKG_USING_KOBUKI is not set -# CONFIG_PKG_USING_ROSSERIAL is not set -# CONFIG_PKG_USING_MICRO_ROS is not set -# CONFIG_PKG_USING_MCP23008 is not set -# CONFIG_PKG_USING_MISAKA_AT24CXX is not set -# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set -# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set -# CONFIG_PKG_USING_SOFT_SERIAL is not set -# CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_RFM300 is not set -# CONFIG_PKG_USING_IO_INPUT_FILTER is not set -# CONFIG_PKG_USING_LRF_NV7LIDAR is not set -# CONFIG_PKG_USING_AIP650 is not set -# CONFIG_PKG_USING_FINGERPRINT is not set -# CONFIG_PKG_USING_BT_ECB02C is not set -# CONFIG_PKG_USING_UAT is not set -# CONFIG_PKG_USING_ST7789 is not set -# CONFIG_PKG_USING_VS1003 is not set -# CONFIG_PKG_USING_X9555 is not set -# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set -# CONFIG_PKG_USING_BT_MX01 is not set -# CONFIG_PKG_USING_RGPOWER is not set -# CONFIG_PKG_USING_BT_MX02 is not set -# CONFIG_PKG_USING_GC9A01 is not set -# CONFIG_PKG_USING_IK485 is not set -# CONFIG_PKG_USING_SERVO is not set -# CONFIG_PKG_USING_SEAN_WS2812B is not set -# CONFIG_PKG_USING_IC74HC165 is not set -# CONFIG_PKG_USING_IST8310 is not set -# CONFIG_PKG_USING_ST7789_SPI is not set -# CONFIG_PKG_USING_SPI_TOOLS is not set -# end of peripheral libraries and drivers - -# -# AI packages -# -# CONFIG_PKG_USING_LIBANN is not set -# CONFIG_PKG_USING_NNOM is not set -# CONFIG_PKG_USING_ONNX_BACKEND is not set -# CONFIG_PKG_USING_ONNX_PARSER is not set -# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set -# CONFIG_PKG_USING_ELAPACK is not set -# CONFIG_PKG_USING_ULAPACK is not set -# CONFIG_PKG_USING_QUEST is not set -# CONFIG_PKG_USING_NAXOS is not set -# CONFIG_PKG_USING_R_TINYMAIX is not set -# CONFIG_PKG_USING_LLMCHAT is not set -# end of AI packages - -# -# Signal Processing and Control Algorithm Packages -# -# CONFIG_PKG_USING_APID is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set -# CONFIG_PKG_USING_QPID is not set -# CONFIG_PKG_USING_UKAL is not set -# CONFIG_PKG_USING_DIGITALCTRL is not set -# CONFIG_PKG_USING_KISSFFT is not set -# CONFIG_PKG_USING_CMSIS_DSP is not set -# end of Signal Processing and Control Algorithm Packages - -# -# miscellaneous packages -# - -# -# project laboratory -# -# end of project laboratory - -# -# samples: kernel and components samples -# -# CONFIG_PKG_USING_KERNEL_SAMPLES is not set -# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set -# CONFIG_PKG_USING_NETWORK_SAMPLES is not set -# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set -# end of samples: kernel and components samples - -# -# entertainment: terminal games and other interesting software packages -# -# CONFIG_PKG_USING_CMATRIX is not set -# CONFIG_PKG_USING_SL is not set -# CONFIG_PKG_USING_CAL is not set -# CONFIG_PKG_USING_ACLOCK is not set -# CONFIG_PKG_USING_THREES is not set -# CONFIG_PKG_USING_2048 is not set -# CONFIG_PKG_USING_SNAKE is not set -# CONFIG_PKG_USING_TETRIS is not set -# CONFIG_PKG_USING_DONUT is not set -# CONFIG_PKG_USING_COWSAY is not set -# CONFIG_PKG_USING_MORSE is not set -# CONFIG_PKG_USING_TINYSQUARE is not set -# end of entertainment: terminal games and other interesting software packages - -# CONFIG_PKG_USING_LIBCSV is not set -# CONFIG_PKG_USING_OPTPARSE is not set -# CONFIG_PKG_USING_FASTLZ is not set -# CONFIG_PKG_USING_MINILZO is not set -# CONFIG_PKG_USING_QUICKLZ is not set -# CONFIG_PKG_USING_LZMA is not set -# CONFIG_PKG_USING_RALARAM is not set -# CONFIG_PKG_USING_MULTIBUTTON is not set -# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set -# CONFIG_PKG_USING_CANFESTIVAL is not set -# CONFIG_PKG_USING_ZLIB is not set -# CONFIG_PKG_USING_MINIZIP is not set -# CONFIG_PKG_USING_HEATSHRINK is not set -# CONFIG_PKG_USING_DSTR is not set -# CONFIG_PKG_USING_TINYFRAME is not set -# CONFIG_PKG_USING_KENDRYTE_DEMO is not set -# CONFIG_PKG_USING_UPACKER is not set -# CONFIG_PKG_USING_UPARAM is not set -# CONFIG_PKG_USING_HELLO is not set -# CONFIG_PKG_USING_VI is not set -# CONFIG_PKG_USING_KI is not set -# CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_CRCLIB is not set -# CONFIG_PKG_USING_LIBCRC is not set -# CONFIG_PKG_USING_LWGPS is not set -# CONFIG_PKG_USING_STATE_MACHINE is not set -# CONFIG_PKG_USING_DESIGN_PATTERN is not set -# CONFIG_PKG_USING_CONTROLLER is not set -# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set -# CONFIG_PKG_USING_MFBD is not set -# CONFIG_PKG_USING_SLCAN2RTT is not set -# CONFIG_PKG_USING_SOEM is not set -# CONFIG_PKG_USING_QPARAM is not set -# CONFIG_PKG_USING_CorevMCU_CLI is not set -# CONFIG_PKG_USING_GET_IRQ_PRIORITY is not set -# CONFIG_PKG_USING_DRMP is not set -# end of miscellaneous packages - -# -# Arduino libraries -# -# CONFIG_PKG_USING_RTDUINO is not set - -# -# Projects and Demos -# -# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set -# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set -# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set -# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set -# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set -# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set -# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set -# end of Projects and Demos - -# -# Sensors -# -# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set -# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set -# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set -# end of Sensors - -# -# Display -# -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set -# CONFIG_PKG_USING_ARDUINO_U8G2 is not set -# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set -# CONFIG_PKG_USING_SEEED_TM1637 is not set -# end of Display - -# -# Timing -# -# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set -# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set -# CONFIG_PKG_USING_ARDUINO_TICKER is not set -# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set -# end of Timing - -# -# Data Processing -# -# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set -# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set -# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set -# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set -# end of Data Processing - -# -# Data Storage -# - -# -# Communication -# -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set -# end of Communication - -# -# Device Control -# -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set -# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set -# end of Device Control - -# -# Other -# -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set -# end of Other - -# -# Signal IO -# -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set -# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set -# end of Signal IO - -# -# Uncategorized -# -# end of Arduino libraries -# end of RT-Thread online packages - -CONFIG_SOC_FAMILY_STM32=y -CONFIG_SOC_SERIES_STM32F4=y - -# -# Hardware Drivers Config -# - -# -# Onboard Peripheral Drivers -# - -# -# On-chip Peripheral Drivers -# -CONFIG_BSP_USING_GPIO=y -CONFIG_BSP_USING_UART=y -CONFIG_BSP_STM32_UART_V1_TX_TIMEOUT=2000 -CONFIG_BSP_USING_UART1=y -CONFIG_BSP_UART1_RX_USING_DMA=y -CONFIG_BSP_UART1_TX_USING_DMA=y -CONFIG_BSP_USING_UART2=y -# CONFIG_BSP_UART2_RX_USING_DMA is not set -# CONFIG_BSP_UART2_TX_USING_DMA is not set -CONFIG_BSP_USING_UART3=y -CONFIG_BSP_UART3_RX_USING_DMA=y -CONFIG_BSP_UART3_TX_USING_DMA=y -# CONFIG_BSP_USING_UART4 is not set -CONFIG_BSP_USING_UART5=y -# CONFIG_BSP_UART5_RX_USING_DMA is not set -# CONFIG_BSP_UART5_TX_USING_DMA is not set -CONFIG_BSP_USING_UART6=y -CONFIG_BSP_UART6_RX_USING_DMA=y -CONFIG_BSP_UART6_TX_USING_DMA=y -CONFIG_BSP_USING_I2C=y -CONFIG_BSP_USING_I2C1=y -CONFIG_BSP_USING_I2C2=y -CONFIG_BSP_USING_I2C3=y -CONFIG_BSP_USING_I2C4=y -CONFIG_BSP_USING_CAN=y -CONFIG_BSP_USING_CAN1=y -# CONFIG_BSP_USING_ADC is not set -# CONFIG_BSP_USING_ONCHIP_RTC is not set -CONFIG_BSP_USING_WDT=y -# CONFIG_BSP_USING_USBD is not set -# CONFIG_BSP_USING_USBH is not set -CONFIG_BSP_USING_ON_CHIP_FLASH=y -CONFIG_BSP_USING_TIM=y -# CONFIG_BSP_USING_TIM1 is not set -CONFIG_BSP_USING_TIM2=y -# CONFIG_BSP_USING_TIM3 is not set -# CONFIG_BSP_USING_TIM4 is not set -# CONFIG_BSP_USING_TIM5 is not set -# CONFIG_BSP_USING_TIM6 is not set -# CONFIG_BSP_USING_TIM7 is not set -# CONFIG_BSP_USING_RNG is not set -# CONFIG_BSP_USING_UDID is not set -# end of On-chip Peripheral Drivers - -# -# Board extended module Drivers -# -# end of Hardware Drivers Config +CONFIG_SOC_STM32F405RG=y + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options +# end of klibc options + +CONFIG_RT_NAME_MAX=16 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_USING_CPU_USAGE_TRACER=y + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x50201 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +# CONFIG_FINSH_USING_WORD_OPERATION is not set +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +CONFIG_RT_USING_FAL=y +# CONFIG_FAL_USING_DEBUG is not set +CONFIG_FAL_PART_HAS_TABLE_CFG=y +# CONFIG_FAL_USING_SFUD_PORT is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +CONFIG_RT_USING_SYSTEM_WORKQUEUE=y +CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 +CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +CONFIG_RT_USING_CAN=y +# CONFIG_RT_CAN_USING_HDR is not set +# CONFIG_RT_CAN_USING_CANFD is not set +CONFIG_RT_CANMSG_BOX_SZ=16 +CONFIG_RT_CANSND_BOX_NUM=1 +CONFIG_RT_CANSND_MSG_TIMEOUT=100 +# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_I2C=y +# CONFIG_RT_I2C_DEBUG is not set +CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_I2C_BITOPS_DEBUG is not set +# CONFIG_RT_USING_SOFT_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +CONFIG_RT_USING_WDT=y +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +CONFIG_RT_USING_HWTIMER=y +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set +# CONFIG_PKG_USING_ESP_HOSTED is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# CONFIG_PKG_USING_PNET is not set +# CONFIG_PKG_USING_OPENER is not set +# CONFIG_PKG_USING_FREEMQTT is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_RT_TRACE is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# CONFIG_PKG_USING_HPATCHLITE is not set +# CONFIG_PKG_USING_THREAD_METRIC is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +CONFIG_PKG_USING_CMSIS_CORE=y +CONFIG_PKG_CMSIS_CORE_PATH="/packages/system/CMSIS/CMSIS-Core" +CONFIG_PKG_USING_CMSIS_CORE_LATEST_VERSION=y +CONFIG_PKG_CMSIS_CORE_VER="latest" +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_RMP is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# CONFIG_PKG_USING_HEARTBEAT is not set +# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set +CONFIG_PKG_USING_STM32F4_HAL_DRIVER=y +CONFIG_PKG_STM32F4_HAL_DRIVER_PATH="/packages/peripherals/hal-sdk/stm32/stm32f4_hal_driver" +CONFIG_PKG_USING_STM32F4_HAL_DRIVER_LATEST_VERSION=y +CONFIG_PKG_STM32F4_HAL_DRIVER_VER="latest" +CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER=y +CONFIG_PKG_STM32F4_CMSIS_DRIVER_PATH="/packages/peripherals/hal-sdk/stm32/stm32f4_cmsis_driver" +CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER_LATEST_VERSION=y +CONFIG_PKG_STM32F4_CMSIS_DRIVER_VER="latest" +# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_MM32 is not set + +# +# WCH HAL & SDK Drivers +# +# CONFIG_PKG_USING_CH32V20x_SDK is not set +# CONFIG_PKG_USING_CH32V307_SDK is not set +# end of WCH HAL & SDK Drivers + +# +# AT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set +# end of AT32 HAL & SDK Drivers + +# +# HC32 DDL Drivers +# +# CONFIG_PKG_USING_HC32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F3_SERIES_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set +# end of HC32 DDL Drivers + +# +# NXP HAL & SDK Drivers +# +# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set +# end of NXP HAL & SDK Drivers + +# +# NUVOTON Drivers +# +# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set +# end of NUVOTON Drivers + +# +# GD32 Drivers +# +# CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# end of GD32 Drivers +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_MAX31855 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# CONFIG_PKG_USING_P3T1755 is not set +# CONFIG_PKG_USING_QMI8658 is not set +# CONFIG_PKG_USING_ICM20948 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +# CONFIG_PKG_USING_GC9A01 is not set +# CONFIG_PKG_USING_IK485 is not set +# CONFIG_PKG_USING_SERVO is not set +# CONFIG_PKG_USING_SEAN_WS2812B is not set +# CONFIG_PKG_USING_IC74HC165 is not set +# CONFIG_PKG_USING_IST8310 is not set +# CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# CONFIG_PKG_USING_LLMCHAT is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LIBCRC is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# CONFIG_PKG_USING_GET_IRQ_PRIORITY is not set +# CONFIG_PKG_USING_DRMP is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F4=y + +# +# Hardware Drivers Config +# + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_STM32_UART_V1_TX_TIMEOUT=2000 +CONFIG_BSP_USING_UART1=y +CONFIG_BSP_UART1_RX_USING_DMA=y +CONFIG_BSP_UART1_TX_USING_DMA=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set +# CONFIG_BSP_UART2_TX_USING_DMA is not set +CONFIG_BSP_USING_UART3=y +CONFIG_BSP_UART3_RX_USING_DMA=y +CONFIG_BSP_UART3_TX_USING_DMA=y +# CONFIG_BSP_USING_UART4 is not set +CONFIG_BSP_USING_UART5=y +# CONFIG_BSP_UART5_RX_USING_DMA is not set +# CONFIG_BSP_UART5_TX_USING_DMA is not set +CONFIG_BSP_USING_UART6=y +CONFIG_BSP_UART6_RX_USING_DMA=y +CONFIG_BSP_UART6_TX_USING_DMA=y +CONFIG_BSP_USING_I2C=y +CONFIG_BSP_USING_I2C1=y +CONFIG_BSP_USING_I2C2=y +CONFIG_BSP_USING_I2C3=y +CONFIG_BSP_USING_I2C4=y +CONFIG_BSP_USING_CAN=y +CONFIG_BSP_USING_CAN1=y +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +CONFIG_BSP_USING_WDT=y +# CONFIG_BSP_USING_USBD is not set +# CONFIG_BSP_USING_USBH is not set +CONFIG_BSP_USING_ON_CHIP_FLASH=y +CONFIG_BSP_USING_TIM=y +# CONFIG_BSP_USING_TIM1 is not set +CONFIG_BSP_USING_TIM2=y +# CONFIG_BSP_USING_TIM3 is not set +# CONFIG_BSP_USING_TIM4 is not set +# CONFIG_BSP_USING_TIM5 is not set +# CONFIG_BSP_USING_TIM6 is not set +# CONFIG_BSP_USING_TIM7 is not set +# CONFIG_BSP_USING_RNG is not set +# CONFIG_BSP_USING_UDID is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/apps/chrg/applications/mb/SConscript b/apps/chrg/applications/mb/SConscript new file mode 100644 index 0000000..898a7bb --- /dev/null +++ b/apps/chrg/applications/mb/SConscript @@ -0,0 +1,16 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') + +path = [cwd] + +group = DefineGroup('Applications/mb', src, depend = [''], CPPPATH = path) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/apps/chrg/applications/mb/mb.c b/apps/chrg/applications/mb/mb.c new file mode 100644 index 0000000..48e4f40 --- /dev/null +++ b/apps/chrg/applications/mb/mb.c @@ -0,0 +1,264 @@ + +#include +#include + +#include + + +#include "mb.h" +#include "mbfunc.h" +#include "mbport.h" +#include "mbrtu.h" + + +static rt_uint8_t ucMBAddress; + +static enum { + STATE_ENABLED, + STATE_DISABLED, + STATE_NOT_INITIALIZED +} eMBState = STATE_NOT_INITIALIZED; + + +static peMBFrameSend peMBFrameSendCur; +static pvMBFrameStart pvMBFrameStartCur; +static pvMBFrameStop pvMBFrameStopCur; +static peMBFrameReceive peMBFrameReceiveCur; +static pvMBFrameClose pvMBFrameCloseCur; + +rt_uint8_t( *pxMBFrameCBByteReceived ) ( void ); +rt_uint8_t( *pxMBFrameCBTransmitterEmpty ) ( void ); +rt_uint8_t( *pxMBPortCBTimerExpired ) ( void ); + +rt_uint8_t( *pxMBFrameCBReceiveFSMCur ) ( void ); +rt_uint8_t( *pxMBFrameCBTransmitFSMCur ) ( void ); + +#define MB_FUNC_HANDLERS_MAX (16) + +static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = { + {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, + {MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister}, + {MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister}, + {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister}, + {MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister}, + {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister}, + {MB_FUNC_READ_COILS, eMBFuncReadCoils}, + {MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil}, + {MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils}, + {MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs}, +}; + +eMBErrorCode eMBInit(rt_uint8_t ucSlaveAddress, rt_uint8_t ucPort, rt_uint32_t ulBaudRate, eMBParity eParity ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if((ucSlaveAddress == MB_ADDRESS_BROADCAST) || + (ucSlaveAddress < MB_ADDRESS_MIN)||( ucSlaveAddress > MB_ADDRESS_MAX)) { + eStatus = MB_EINVAL; + } else { + ucMBAddress = ucSlaveAddress; + + pvMBFrameStartCur = eMBRTUStart; + pvMBFrameStopCur = eMBRTUStop; + peMBFrameSendCur = eMBRTUSend; + peMBFrameReceiveCur = eMBRTUReceive; + pvMBFrameCloseCur = NULL; + pxMBFrameCBByteReceived = xMBRTUReceiveFSM; + pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; + pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; + + eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); + if( eStatus == MB_ENOERR ) { + if(!xMBPortEventInit()) { + /* port dependent event module initalization failed. */ + eStatus = MB_EPORTERR; + } else { + eMBState = STATE_DISABLED; + } + } + } + + return eStatus; +} + +eMBErrorCode eMBRegisterCB( rt_uint8_t ucFunctionCode, pxMBFunctionHandler pxHandler ) +{ + int i; + eMBErrorCode eStatus; + + if( ( 0 < ucFunctionCode ) && ( ucFunctionCode <= 127 ) ) { + EnterCriticalSection(); + if( pxHandler != NULL ) + { + for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) + { + if( ( xFuncHandlers[i].pxHandler == NULL ) || + ( xFuncHandlers[i].pxHandler == pxHandler ) ) + { + xFuncHandlers[i].ucFunctionCode = ucFunctionCode; + xFuncHandlers[i].pxHandler = pxHandler; + break; + } + } + eStatus = ( i != MB_FUNC_HANDLERS_MAX ) ? MB_ENOERR : MB_ENORES; + } + else + { + for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) + { + if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) + { + xFuncHandlers[i].ucFunctionCode = 0; + xFuncHandlers[i].pxHandler = NULL; + break; + } + } + /* Remove can't fail. */ + eStatus = MB_ENOERR; + } + ExitCriticalSection(); + } + else + { + eStatus = MB_EINVAL; + } + return eStatus; +} + + +eMBErrorCode eMBClose( void ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if( eMBState == STATE_DISABLED ) + { + if( pvMBFrameCloseCur != NULL ) + { + pvMBFrameCloseCur( ); + } + } + else + { + eStatus = MB_EILLSTATE; + } + return eStatus; +} + + +eMBErrorCode eMBEnable( void ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + if( eMBState == STATE_DISABLED ) + { + /* Activate the protocol stack. */ + pvMBFrameStartCur( ); + eMBState = STATE_ENABLED; + } + else + { + eStatus = MB_EILLSTATE; + } + return eStatus; +} + +eMBErrorCode eMBDisable( void ) +{ + eMBErrorCode eStatus; + + if( eMBState == STATE_ENABLED ) + { + pvMBFrameStopCur( ); + eMBState = STATE_DISABLED; + eStatus = MB_ENOERR; + } + else if( eMBState == STATE_DISABLED ) + { + eStatus = MB_ENOERR; + } + else + { + eStatus = MB_EILLSTATE; + } + return eStatus; +} + +eMBErrorCode eMBPoll( void ) +{ + static rt_uint8_t *ucMBFrame; + static rt_uint8_t ucRcvAddress; + static rt_uint8_t ucFunctionCode; + static rt_uint16_t usLength; + static eMBException eException; + + int i; + eMBErrorCode eStatus = MB_ENOERR; + eMBEventType eEvent; + + /* Check if the protocol stack is ready. */ + if( eMBState != STATE_ENABLED ) + { + return MB_EILLSTATE; + } + + /* Check if there is a event available. If not return control to caller. + * Otherwise we will handle the event. */ + if( xMBPortEventGet( &eEvent ) == TRUE ) + { + switch ( eEvent ) + { + case EV_READY: + break; + + case EV_FRAME_RECEIVED: + eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength ); + if( eStatus == MB_ENOERR ) + { + /* Check if the frame is for us. If not ignore the frame. */ + if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) + { + ( void )xMBPortEventPost( EV_EXECUTE ); + } + } + break; + + case EV_EXECUTE: + ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; + eException = MB_EX_ILLEGAL_FUNCTION; + for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) + { + /* No more function handlers registered. Abort. */ + if( xFuncHandlers[i].ucFunctionCode == 0 ) + { + break; + } + else if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) + { + eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength ); + break; + } + } + + /* If the request was not sent to the broadcast address we + * return a reply. */ + if( ucRcvAddress != MB_ADDRESS_BROADCAST ) + { + if( eException != MB_EX_NONE ) + { + /* An exception occured. Build an error frame. */ + usLength = 0; + ucMBFrame[usLength++] = ( rt_uint8_t )( ucFunctionCode | MB_FUNC_ERROR ); + ucMBFrame[usLength++] = eException; + } + eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength ); + } + break; + + case EV_FRAME_SENT: + break; + } + } + return MB_ENOERR; +} + + diff --git a/libs/freemodbus/modbus/include/mb.h b/apps/chrg/applications/mb/mb.h similarity index 71% rename from libs/freemodbus/modbus/include/mb.h rename to apps/chrg/applications/mb/mb.h index bf4c0eb..aa58809 100644 --- a/libs/freemodbus/modbus/include/mb.h +++ b/apps/chrg/applications/mb/mb.h @@ -1,93 +1,16 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb.h,v 1.17 2006/12/07 22:10:34 wolti Exp $ - */ +#ifndef __MB_H__ +#define __MB_H__ -#ifndef _MB_H -#define _MB_H -#include "port.h" +#include +#include +//#include + #ifdef __cplusplus extern "C" { #endif -#include "mbport.h" -#include "mbproto.h" - -/*! \defgroup modbus Modbus - * \code #include "mb.h" \endcode - * - * This module defines the interface for the application. It contains - * the basic functions and types required to use the Modbus protocol stack. - * A typical application will want to call eMBInit() first. If the device - * is ready to answer network requests it must then call eMBEnable() to activate - * the protocol stack. In the main loop the function eMBPoll() must be called - * periodically. The time interval between pooling depends on the configured - * Modbus timeout. If an RTOS is available a separate task should be created - * and the task should always call the function eMBPoll(). - * - * \code - * // Initialize protocol stack in RTU mode for a slave with address 10 = 0x0A - * eMBInit( MB_RTU, 0x0A, 38400, MB_PAR_EVEN ); - * // Enable the Modbus Protocol Stack. - * eMBEnable( ); - * for( ;; ) - * { - * // Call the main polling loop of the Modbus protocol stack. - * eMBPoll( ); - * ... - * } - * \endcode - */ - -/* ----------------------- Defines ------------------------------------------*/ - -/*! \ingroup modbus - * \brief Use the default Modbus TCP port (502) - */ -#define MB_TCP_PORT_USE_DEFAULT 0 - -/* ----------------------- Type definitions ---------------------------------*/ - -/*! \ingroup modbus - * \brief Modbus serial transmission modes (RTU/ASCII). - * - * Modbus serial supports two transmission modes. Either ASCII or RTU. RTU - * is faster but has more hardware requirements and requires a network with - * a low jitter. ASCII is slower and more reliable on slower links (E.g. modems) - */ - typedef enum -{ - MB_RTU, /*!< RTU transmission mode. */ - MB_ASCII, /*!< ASCII transmission mode. */ - MB_TCP /*!< TCP mode. */ -} eMBMode; /*! \ingroup modbus * \brief If register should be written or read. @@ -100,8 +23,7 @@ extern "C" { * \see eMBRegHoldingCB( ), eMBRegCoilsCB( ), eMBRegDiscreteCB( ) and * eMBRegInputCB( ). */ -typedef enum -{ +typedef enum { MB_REG_READ, /*!< Read register values and pass to protocol stack. */ MB_REG_WRITE /*!< Update register values. */ } eMBRegisterMode; @@ -109,8 +31,7 @@ typedef enum /*! \ingroup modbus * \brief Errorcodes used by all function in the protocol stack. */ -typedef enum -{ +typedef enum { MB_ENOERR, /*!< no error. */ MB_ENOREG, /*!< illegal register address. */ MB_EINVAL, /*!< illegal argument. */ @@ -121,8 +42,67 @@ typedef enum MB_ETIMEDOUT /*!< timeout error occurred. */ } eMBErrorCode; +typedef enum { + EV_READY = 1<<0, /*!< Startup finished. */ + EV_FRAME_RECEIVED = 1<<1, /*!< Frame received. */ + EV_EXECUTE = 1<<2, /*!< Execute function. */ + EV_FRAME_SENT = 1<<3 /*!< Frame sent. */ +} eMBEventType; + +/*! \ingroup modbus + * \brief Parity used for characters in serial mode. + * + * The parity which should be applied to the characters sent over the serial + * link. Please note that this values are actually passed to the porting + * layer and therefore not all parity modes might be available. + */ +typedef enum { + MB_PAR_NONE, /*!< No parity. */ + MB_PAR_ODD, /*!< Odd parity. */ + MB_PAR_EVEN /*!< Even parity. */ +} eMBParity; + +#define MB_ADDRESS_BROADCAST ( 0 ) /*! Modbus broadcast address. */ +#define MB_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ +#define MB_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ +#define MB_FUNC_NONE ( 0 ) +#define MB_FUNC_READ_COILS ( 1 ) +#define MB_FUNC_READ_DISCRETE_INPUTS ( 2 ) +#define MB_FUNC_WRITE_SINGLE_COIL ( 5 ) +#define MB_FUNC_WRITE_MULTIPLE_COILS ( 15 ) +#define MB_FUNC_READ_HOLDING_REGISTER ( 3 ) +#define MB_FUNC_READ_INPUT_REGISTER ( 4 ) +#define MB_FUNC_WRITE_REGISTER ( 6 ) +#define MB_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) +#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) +#define MB_FUNC_DIAG_READ_EXCEPTION ( 7 ) +#define MB_FUNC_DIAG_DIAGNOSTIC ( 8 ) +#define MB_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) +#define MB_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) +#define MB_FUNC_OTHER_REPORT_SLAVEID ( 17 ) +#define MB_FUNC_ERROR ( 128 ) + +typedef enum { + MB_EX_NONE = 0x00, + MB_EX_ILLEGAL_FUNCTION = 0x01, + MB_EX_ILLEGAL_DATA_ADDRESS = 0x02, + MB_EX_ILLEGAL_DATA_VALUE = 0x03, + MB_EX_SLAVE_DEVICE_FAILURE = 0x04, + MB_EX_ACKNOWLEDGE = 0x05, + MB_EX_SLAVE_BUSY = 0x06, + MB_EX_MEMORY_PARITY_ERROR = 0x08, + MB_EX_GATEWAY_PATH_FAILED = 0x0A, + MB_EX_GATEWAY_TGT_FAILED = 0x0B +} eMBException; + +typedef eMBException( *pxMBFunctionHandler ) ( rt_uint8_t * pucFrame, rt_uint16_t * pusLength ); + +typedef struct { + rt_uint8_t ucFunctionCode; + pxMBFunctionHandler pxHandler; +} xMBFunctionHandler; + -/* ----------------------- Function prototypes ------------------------------*/ /*! \ingroup modbus * \brief Initialize the Modbus protocol stack. * @@ -148,24 +128,8 @@ typedef enum * slave addresses are in the range 1 - 247. * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. */ -eMBErrorCode eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, - UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ); - -/*! \ingroup modbus - * \brief Initialize the Modbus protocol stack for Modbus TCP. - * - * This function initializes the Modbus TCP Module. Please note that - * frame processing is still disabled until eMBEnable( ) is called. - * - * \param usTCPPort The TCP port to listen on. - * \return If the protocol stack has been initialized correctly the function - * returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error - * codes is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBTCPInit( USHORT usTCPPort ); +eMBErrorCode eMBInit(rt_uint8_t ucSlaveAddress, rt_uint8_t ucPort, + rt_uint32_t ulBaudRate, eMBParity eParity ); /*! \ingroup modbus * \brief Release resources used by the protocol stack. @@ -181,7 +145,7 @@ eMBErrorCode eMBTCPInit( USHORT usTCPPort ); * If the protocol stack is not in the disabled state it returns * eMBErrorCode::MB_EILLSTATE. */ -eMBErrorCode eMBClose( void ); +eMBErrorCode eMBClose( void ); /*! \ingroup modbus * \brief Enable the Modbus protocol stack. @@ -193,7 +157,7 @@ eMBErrorCode eMBClose( void ); * eMBErrorCode::MB_ENOERR. If it was not in the disabled state it * return eMBErrorCode::MB_EILLSTATE. */ -eMBErrorCode eMBEnable( void ); +eMBErrorCode eMBEnable( void ); /*! \ingroup modbus * \brief Disable the Modbus protocol stack. @@ -204,7 +168,7 @@ eMBErrorCode eMBEnable( void ); * eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns * eMBErrorCode::MB_EILLSTATE. */ -eMBErrorCode eMBDisable( void ); +eMBErrorCode eMBDisable( void ); /*! \ingroup modbus * \brief The main pooling loop of the Modbus protocol stack. @@ -218,7 +182,7 @@ eMBErrorCode eMBDisable( void ); * returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns * eMBErrorCode::MB_ENOERR. */ -eMBErrorCode eMBPoll( void ); +eMBErrorCode eMBPoll( void ); /*! \ingroup modbus * \brief Configure the slave id of the device. @@ -238,9 +202,8 @@ eMBErrorCode eMBPoll( void ); * mbconfig.h is to small it returns eMBErrorCode::MB_ENORES. Otherwise * it returns eMBErrorCode::MB_ENOERR. */ -eMBErrorCode eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, - UCHAR const *pucAdditional, - USHORT usAdditionalLen ); +eMBErrorCode eMBSetSlaveID( rt_uint8_t ucSlaveID, rt_uint8_t xIsRunning, + rt_uint8_t const *pucAdditional, rt_uint16_t usAdditionalLen ); /*! \ingroup modbus * \brief Registers a callback handler for a given function code. @@ -262,8 +225,7 @@ eMBErrorCode eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, * case the values in mbconfig.h should be adjusted. If the argument was not * valid it returns eMBErrorCode::MB_EINVAL. */ -eMBErrorCode eMBRegisterCB( UCHAR ucFunctionCode, - pxMBFunctionHandler pxHandler ); +eMBErrorCode eMBRegisterCB( rt_uint8_t ucFunctionCode, pxMBFunctionHandler pxHandler ); /* ----------------------- Callback -----------------------------------------*/ @@ -309,8 +271,8 @@ eMBErrorCode eMBRegisterCB( UCHAR ucFunctionCode, * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case * a SLAVE DEVICE FAILURE exception is sent as a response. */ -eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs ); +eMBErrorCode eMBRegInputCB( rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, + rt_uint16_t usNRegs ); /*! \ingroup modbus_registers * \brief Callback function used if a Holding Register value is @@ -344,8 +306,8 @@ eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case * a SLAVE DEVICE FAILURE exception is sent as a response. */ -eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode ); +eMBErrorCode eMBRegHoldingCB( rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, + rt_uint16_t usNRegs, eMBRegisterMode eMode ); /*! \ingroup modbus_registers * \brief Callback function used if a Coil Register value is @@ -379,8 +341,8 @@ eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case * a SLAVE DEVICE FAILURE exception is sent as a response. */ -eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode ); +eMBErrorCode eMBRegCoilsCB( rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, + rt_uint16_t usNCoils, eMBRegisterMode eMode ); /*! \ingroup modbus_registers * \brief Callback function used if a Input Discrete Register value is @@ -408,8 +370,50 @@ eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, * - eMBErrorCode::MB_EIO If an unrecoverable error occurred. In this case * a SLAVE DEVICE FAILURE exception is sent as a response. */ -eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete ); +eMBErrorCode eMBRegDiscreteCB( rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, + rt_uint16_t usNDiscrete ); + +/*! + * Constants which defines the format of a modbus frame. The example is + * shown for a Modbus RTU/ASCII frame. Note that the Modbus PDU is not + * dependent on the underlying transport. + * + * + * <------------------------ MODBUS SERIAL LINE PDU (1) -------------------> + * <----------- MODBUS PDU (1') ----------------> + * +-----------+---------------+----------------------------+-------------+ + * | Address | Function Code | Data | CRC/LRC | + * +-----------+---------------+----------------------------+-------------+ + * | | | | + * (2) (3/2') (3') (4) + * + * (1) ... MB_SER_PDU_SIZE_MAX = 256 + * (2) ... MB_SER_PDU_ADDR_OFF = 0 + * (3) ... MB_SER_PDU_PDU_OFF = 1 + * (4) ... MB_SER_PDU_SIZE_CRC = 2 + * + * (1') ... MB_PDU_SIZE_MAX = 253 + * (2') ... MB_PDU_FUNC_OFF = 0 + * (3') ... MB_PDU_DATA_OFF = 1 + * + */ + +#define MB_PDU_SIZE_MAX 253 /*!< Maximum size of a PDU. */ +#define MB_PDU_SIZE_MIN 1 /*!< Function Code */ +#define MB_PDU_FUNC_OFF 0 /*!< Offset of function code in PDU. */ +#define MB_PDU_DATA_OFF 1 /*!< Offset for response data in PDU. */ + +typedef void ( *pvMBFrameStart ) ( void ); + +typedef void ( *pvMBFrameStop ) ( void ); + +typedef eMBErrorCode( *peMBFrameReceive ) ( rt_uint8_t * pucRcvAddress, + rt_uint8_t ** pucFrame, rt_uint16_t * pusLength ); + +typedef eMBErrorCode( *peMBFrameSend ) ( rt_uint8_t slaveAddress, + const rt_uint8_t * pucFrame, rt_uint16_t usLength ); + +typedef void( *pvMBFrameClose ) ( void ); #ifdef __cplusplus } diff --git a/libs/freemodbus/modbus/rtu/mbcrc.c b/apps/chrg/applications/mb/mbcrc.c similarity index 62% rename from libs/freemodbus/modbus/rtu/mbcrc.c rename to apps/chrg/applications/mb/mbcrc.c index 5ed2a80..3365826 100644 --- a/libs/freemodbus/modbus/rtu/mbcrc.c +++ b/apps/chrg/applications/mb/mbcrc.c @@ -1,37 +1,7 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbcrc.c,v 1.7 2007/02/18 23:50:27 wolti Exp $ - */ -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" +#include -static const UCHAR aucCRCHi[] = { +static const rt_uint8_t aucCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, @@ -56,7 +26,7 @@ static const UCHAR aucCRCHi[] = { 0x00, 0xC1, 0x81, 0x40 }; -static const UCHAR aucCRCLo[] = { +static const rt_uint8_t aucCRCLo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, @@ -81,18 +51,20 @@ static const UCHAR aucCRCLo[] = { 0x41, 0x81, 0x80, 0x40 }; -USHORT -usMBCRC16( UCHAR * pucFrame, USHORT usLen ) +rt_uint16_t usMBCRC16( rt_uint8_t * pucFrame, rt_uint16_t usLen ) { - UCHAR ucCRCHi = 0xFF; - UCHAR ucCRCLo = 0xFF; + rt_uint8_t ucCRCHi = 0xFF; + rt_uint8_t ucCRCLo = 0xFF; int iIndex; while( usLen-- ) { iIndex = ucCRCLo ^ *( pucFrame++ ); - ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] ); + ucCRCLo = ( rt_uint8_t )( ucCRCHi ^ aucCRCHi[iIndex] ); ucCRCHi = aucCRCLo[iIndex]; } - return ( USHORT )( ucCRCHi << 8 | ucCRCLo ); + return ( rt_uint16_t )( ucCRCHi << 8 | ucCRCLo ); } + + + diff --git a/apps/chrg/applications/mb/mbcrc.h b/apps/chrg/applications/mb/mbcrc.h new file mode 100644 index 0000000..b8bfbba --- /dev/null +++ b/apps/chrg/applications/mb/mbcrc.h @@ -0,0 +1,9 @@ + +#ifndef __MB_CRC_H__ +#define __MB_CRC_H__ + +rt_uint16_t usMBCRC16( rt_uint8_t * pucFrame, rt_uint16_t usLen ); + +#endif + + diff --git a/apps/chrg/applications/mb/mbevent.c b/apps/chrg/applications/mb/mbevent.c new file mode 100644 index 0000000..04e36d1 --- /dev/null +++ b/apps/chrg/applications/mb/mbevent.c @@ -0,0 +1,46 @@ + +#include "mb.h" +#include "mbport.h" + +static struct rt_event xSlaveOsEvent; + +rt_uint8_t xMBPortEventInit( void ) +{ + rt_event_init(&xSlaveOsEvent,"slave event",RT_IPC_FLAG_PRIO); + return TRUE; +} + +rt_uint8_t xMBPortEventPost( eMBEventType eEvent ) +{ + rt_event_send(&xSlaveOsEvent, eEvent); + return TRUE; +} + +rt_uint8_t xMBPortEventGet( eMBEventType * eEvent ) +{ + rt_uint32_t recvedEvent; + /* waiting forever OS event */ + rt_event_recv(&xSlaveOsEvent, + EV_READY | EV_FRAME_RECEIVED | EV_EXECUTE | EV_FRAME_SENT, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, + &recvedEvent); + switch (recvedEvent) + { + case EV_READY: + *eEvent = EV_READY; + break; + case EV_FRAME_RECEIVED: + *eEvent = EV_FRAME_RECEIVED; + break; + case EV_EXECUTE: + *eEvent = EV_EXECUTE; + break; + case EV_FRAME_SENT: + *eEvent = EV_FRAME_SENT; + break; + } + return TRUE; +} + + + diff --git a/apps/chrg/applications/mb/mbfunc.h b/apps/chrg/applications/mb/mbfunc.h new file mode 100644 index 0000000..36ae023 --- /dev/null +++ b/apps/chrg/applications/mb/mbfunc.h @@ -0,0 +1,41 @@ + +#ifndef __MB_FUNC_H__ +#define __MB_FUNC_H__ + +#include + +#include "mb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +eMBException eMBFuncReportSlaveID( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncReadInputRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncReadHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncWriteHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncWriteMultipleHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncReadCoils( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncWriteCoil( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncWriteMultipleCoils( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncReadDiscreteInputs( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + +eMBException eMBFuncReadWriteMultipleHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ); + + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/libs/freemodbus/modbus/functions/mbfunccoils.c b/apps/chrg/applications/mb/mbfunccoils.c similarity index 57% rename from libs/freemodbus/modbus/functions/mbfunccoils.c rename to apps/chrg/applications/mb/mbfunccoils.c index 6aac666..f25688f 100644 --- a/libs/freemodbus/modbus/functions/mbfunccoils.c +++ b/apps/chrg/applications/mb/mbfunccoils.c @@ -1,47 +1,11 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunccoils.c,v 1.8 2007/02/18 23:47:16 wolti Exp $ - */ -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" +#include +#include -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" +#include -/* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" -/* ----------------------- Defines ------------------------------------------*/ #define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) #define MB_PDU_FUNC_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) #define MB_PDU_FUNC_READ_SIZE ( 4 ) @@ -58,32 +22,26 @@ #define MB_PDU_FUNC_WRITE_MUL_SIZE_MIN ( 5 ) #define MB_PDU_FUNC_WRITE_MUL_COILCNT_MAX ( 0x07B0 ) -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); -/* ----------------------- Start implementation -----------------------------*/ - -#if MB_FUNC_READ_COILS_ENABLED > 0 - -eMBException -eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncReadCoils( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegAddress; - USHORT usCoilCount; - UCHAR ucNBytes; - UCHAR *pucFrameCur; + rt_uint16_t usRegAddress; + rt_uint16_t usCoilCount; + rt_uint8_t ucNBytes; + rt_uint8_t *pucFrameCur; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); usRegAddress++; - usCoilCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] << 8 ); - usCoilCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF + 1] ); + usCoilCount = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] << 8 ); + usCoilCount |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF + 1] ); /* Check if the number of registers to read is valid. If not * return Modbus illegal data value exception. @@ -103,11 +61,11 @@ eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) * byte is only partially field with unused coils set to zero. */ if( ( usCoilCount & 0x0007 ) != 0 ) { - ucNBytes = ( UCHAR )( usCoilCount / 8 + 1 ); + ucNBytes = ( rt_uint8_t )( usCoilCount / 8 + 1 ); } else { - ucNBytes = ( UCHAR )( usCoilCount / 8 ); + ucNBytes = ( rt_uint8_t )( usCoilCount / 8 ); } *pucFrameCur++ = ucNBytes; *usLen += 1; @@ -142,22 +100,19 @@ eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) } return eStatus; } -#endif -#if MB_FUNC_WRITE_COIL_ENABLED > 0 -eMBException -eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncWriteCoil( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegAddress; - UCHAR ucBuf[2]; + rt_uint16_t usRegAddress; + rt_uint8_t ucBuf[2]; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); usRegAddress++; if( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF + 1] == 0x00 ) && @@ -196,39 +151,36 @@ eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) return eStatus; } -#endif -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -eMBException -eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncWriteMultipleCoils( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegAddress; - USHORT usCoilCnt; - UCHAR ucByteCount; - UCHAR ucByteCountVerify; + rt_uint16_t usRegAddress; + rt_uint16_t usCoilCnt; + rt_uint8_t ucByteCount; + rt_uint8_t ucByteCountVerify; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen > ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); usRegAddress++; - usCoilCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); - usCoilCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); + usCoilCnt = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); + usCoilCnt |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); ucByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; /* Compute the number of expected bytes in the request. */ if( ( usCoilCnt & 0x0007 ) != 0 ) { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 + 1 ); + ucByteCountVerify = ( rt_uint8_t )( usCoilCnt / 8 + 1 ); } else { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 ); + ucByteCountVerify = ( rt_uint8_t )( usCoilCnt / 8 ); } if( ( usCoilCnt >= 1 ) && @@ -266,4 +218,4 @@ eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) return eStatus; } -#endif + diff --git a/apps/chrg/applications/mb/mbfuncdisc.c b/apps/chrg/applications/mb/mbfuncdisc.c new file mode 100644 index 0000000..9e321c3 --- /dev/null +++ b/apps/chrg/applications/mb/mbfuncdisc.c @@ -0,0 +1,92 @@ + +#include +#include + +#include + +#include "mb.h" + +#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READ_SIZE ( 4 ) +#define MB_PDU_FUNC_READ_DISCCNT_MAX ( 0x07D0 ) + +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); + +eMBException eMBFuncReadDiscreteInputs( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) +{ + rt_uint16_t usRegAddress; + rt_uint16_t usDiscreteCnt; + rt_uint8_t ucNBytes; + rt_uint8_t *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress++; + + usDiscreteCnt = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF] << 8 ); + usDiscreteCnt |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF + 1] ); + + /* Check if the number of registers to read is valid. If not + * return Modbus illegal data value exception. + */ + if( ( usDiscreteCnt >= 1 ) && + ( usDiscreteCnt < MB_PDU_FUNC_READ_DISCCNT_MAX ) ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READ_DISCRETE_INPUTS; + *usLen += 1; + + /* Test if the quantity of coils is a multiple of 8. If not last + * byte is only partially field with unused coils set to zero. */ + if( ( usDiscreteCnt & 0x0007 ) != 0 ) + { + ucNBytes = ( rt_uint8_t ) ( usDiscreteCnt / 8 + 1 ); + } + else + { + ucNBytes = ( rt_uint8_t ) ( usDiscreteCnt / 8 ); + } + *pucFrameCur++ = ucNBytes; + *usLen += 1; + + eRegStatus = + eMBRegDiscreteCB( pucFrameCur, usRegAddress, usDiscreteCnt ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + /* The response contains the function code, the starting address + * and the quantity of registers. We reuse the old values in the + * buffer because they are still valid. */ + *usLen += ucNBytes;; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid read coil register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + + diff --git a/libs/freemodbus/modbus/functions/mbfuncholding.c b/apps/chrg/applications/mb/mbfuncholding.c similarity index 57% rename from libs/freemodbus/modbus/functions/mbfuncholding.c rename to apps/chrg/applications/mb/mbfuncholding.c index 717a914..aad1dca 100644 --- a/libs/freemodbus/modbus/functions/mbfuncholding.c +++ b/apps/chrg/applications/mb/mbfuncholding.c @@ -1,47 +1,12 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncholding.c,v 1.12 2007/02/18 23:48:22 wolti Exp $ - */ -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" +#include +#include -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" +#include -/* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" -/* ----------------------- Defines ------------------------------------------*/ + #define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0) #define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) #define MB_PDU_FUNC_READ_SIZE ( 4 ) @@ -66,24 +31,18 @@ #define MB_PDU_FUNC_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 ) #define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 9 ) -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); -/* ----------------------- Start implementation -----------------------------*/ - -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - -eMBException -eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncWriteHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegAddress; + rt_uint16_t usRegAddress; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); usRegAddress++; /* Make callback to update the value. */ @@ -103,33 +62,30 @@ eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) } return eStatus; } -#endif -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 -eMBException -eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncWriteMultipleHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegAddress; - USHORT usRegCount; - UCHAR ucRegByteCount; + rt_uint16_t usRegAddress; + rt_uint16_t usRegCount; + rt_uint8_t ucRegByteCount; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen >= ( MB_PDU_FUNC_WRITE_MUL_SIZE_MIN + MB_PDU_SIZE_MIN ) ) { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); usRegAddress++; - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF + 1] ); + usRegCount = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF] << 8 ); + usRegCount |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF + 1] ); ucRegByteCount = pucFrame[MB_PDU_FUNC_WRITE_MUL_BYTECNT_OFF]; if( ( usRegCount >= 1 ) && ( usRegCount <= MB_PDU_FUNC_WRITE_MUL_REGCNT_MAX ) && - ( ucRegByteCount == ( UCHAR ) ( 2 * usRegCount ) ) ) + ( ucRegByteCount == ( rt_uint8_t ) ( 2 * usRegCount ) ) ) { /* Make callback to update the register values. */ eRegStatus = @@ -162,28 +118,24 @@ eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) } return eStatus; } -#endif -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - -eMBException -eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncReadHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegAddress; - USHORT usRegCount; - UCHAR *pucFrameCur; + rt_uint16_t usRegAddress; + rt_uint16_t usRegCount; + rt_uint8_t *pucFrameCur; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); usRegAddress++; - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); + usRegCount = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); + usRegCount |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); /* Check if the number of registers to read is valid. If not * return Modbus illegal data value exception. @@ -199,7 +151,7 @@ eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) *usLen += 1; /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR ) ( usRegCount * 2 ); + *pucFrameCur++ = ( rt_uint8_t ) ( usRegCount * 2 ); *usLen += 1; /* Make callback to fill the buffer. */ @@ -227,38 +179,34 @@ eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) return eStatus; } -#endif -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - -eMBException -eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) +eMBException eMBFuncReadWriteMultipleHoldingRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) { - USHORT usRegReadAddress; - USHORT usRegReadCount; - USHORT usRegWriteAddress; - USHORT usRegWriteCount; - UCHAR ucRegWriteByteCount; - UCHAR *pucFrameCur; + rt_uint16_t usRegReadAddress; + rt_uint16_t usRegReadCount; + rt_uint16_t usRegWriteAddress; + rt_uint16_t usRegWriteCount; + rt_uint8_t ucRegWriteByteCount; + rt_uint8_t *pucFrameCur; eMBException eStatus = MB_EX_NONE; eMBErrorCode eRegStatus; if( *usLen >= ( MB_PDU_FUNC_READWRITE_SIZE_MIN + MB_PDU_SIZE_MIN ) ) { - usRegReadAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF] << 8U ); - usRegReadAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF + 1] ); + usRegReadAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF] << 8U ); + usRegReadAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_READ_ADDR_OFF + 1] ); usRegReadAddress++; - usRegReadCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF] << 8U ); - usRegReadCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF + 1] ); + usRegReadCount = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF] << 8U ); + usRegReadCount |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_READ_REGCNT_OFF + 1] ); - usRegWriteAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF] << 8U ); - usRegWriteAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF + 1] ); + usRegWriteAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF] << 8U ); + usRegWriteAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_ADDR_OFF + 1] ); usRegWriteAddress++; - usRegWriteCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF] << 8U ); - usRegWriteCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF + 1] ); + usRegWriteCount = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF] << 8U ); + usRegWriteCount |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READWRITE_WRITE_REGCNT_OFF + 1] ); ucRegWriteByteCount = pucFrame[MB_PDU_FUNC_READWRITE_BYTECNT_OFF]; @@ -281,7 +229,7 @@ eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) *usLen += 1; /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR ) ( usRegReadCount * 2 ); + *pucFrameCur++ = ( rt_uint8_t ) ( usRegReadCount * 2 ); *usLen += 1; /* Make the read callback. */ @@ -305,4 +253,5 @@ eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) return eStatus; } -#endif + + diff --git a/apps/chrg/applications/mb/mbfuncinput.c b/apps/chrg/applications/mb/mbfuncinput.c new file mode 100644 index 0000000..4e50cdf --- /dev/null +++ b/apps/chrg/applications/mb/mbfuncinput.c @@ -0,0 +1,83 @@ + +#include +#include + +#include + +#include "mb.h" + + +#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) +#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) +#define MB_PDU_FUNC_READ_SIZE ( 4 ) +#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) + +#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) + +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); + + +eMBException eMBFuncReadInputRegister( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) +{ + rt_uint16_t usRegAddress; + rt_uint16_t usRegCount; + rt_uint8_t *pucFrameCur; + + eMBException eStatus = MB_EX_NONE; + eMBErrorCode eRegStatus; + + if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) + { + usRegAddress = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); + usRegAddress |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); + usRegAddress++; + + usRegCount = ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); + usRegCount |= ( rt_uint16_t )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); + + /* Check if the number of registers to read is valid. If not + * return Modbus illegal data value exception. + */ + if( ( usRegCount >= 1 ) + && ( usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX ) ) + { + /* Set the current PDU data pointer to the beginning. */ + pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; + *usLen = MB_PDU_FUNC_OFF; + + /* First byte contains the function code. */ + *pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER; + *usLen += 1; + + /* Second byte in the response contain the number of bytes. */ + *pucFrameCur++ = ( rt_uint8_t )( usRegCount * 2 ); + *usLen += 1; + + eRegStatus = + eMBRegInputCB( pucFrameCur, usRegAddress, usRegCount ); + + /* If an error occured convert it into a Modbus exception. */ + if( eRegStatus != MB_ENOERR ) + { + eStatus = prveMBError2Exception( eRegStatus ); + } + else + { + *usLen += usRegCount * 2; + } + } + else + { + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + } + else + { + /* Can't be a valid read input register request because the length + * is incorrect. */ + eStatus = MB_EX_ILLEGAL_DATA_VALUE; + } + return eStatus; +} + + diff --git a/apps/chrg/applications/mb/mbfuncother.c b/apps/chrg/applications/mb/mbfuncother.c new file mode 100644 index 0000000..f7129e5 --- /dev/null +++ b/apps/chrg/applications/mb/mbfuncother.c @@ -0,0 +1,51 @@ + +#include +#include + +#include + +#include "mb.h" + + +#define MB_FUNC_OTHER_REP_SLAVEID_BUF (32) + +static rt_uint8_t ucMBSlaveID[MB_FUNC_OTHER_REP_SLAVEID_BUF]; +static rt_uint16_t usMBSlaveIDLen; + + +eMBErrorCode eMBSetSlaveID( rt_uint8_t ucSlaveID, rt_uint8_t xIsRunning, + rt_uint8_t const *pucAdditional, rt_uint16_t usAdditionalLen ) +{ + eMBErrorCode eStatus = MB_ENOERR; + + /* the first byte and second byte in the buffer is reserved for + * the parameter ucSlaveID and the running flag. The rest of + * the buffer is available for additional data. */ + if( usAdditionalLen + 2 < MB_FUNC_OTHER_REP_SLAVEID_BUF ) + { + usMBSlaveIDLen = 0; + ucMBSlaveID[usMBSlaveIDLen++] = ucSlaveID; + ucMBSlaveID[usMBSlaveIDLen++] = ( rt_uint8_t )( xIsRunning ? 0xFF : 0x00 ); + if( usAdditionalLen > 0 ) + { + memcpy( &ucMBSlaveID[usMBSlaveIDLen], pucAdditional, + ( size_t )usAdditionalLen ); + usMBSlaveIDLen += usAdditionalLen; + } + } + else + { + eStatus = MB_ENORES; + } + return eStatus; +} + +eMBException eMBFuncReportSlaveID( rt_uint8_t * pucFrame, rt_uint16_t * usLen ) +{ + memcpy( &pucFrame[MB_PDU_DATA_OFF], &ucMBSlaveID[0], ( size_t )usMBSlaveIDLen ); + *usLen = ( rt_uint16_t )( MB_PDU_DATA_OFF + usMBSlaveIDLen ); + return MB_EX_NONE; +} + + + diff --git a/apps/chrg/applications/mb/mbport.c b/apps/chrg/applications/mb/mbport.c new file mode 100644 index 0000000..76e910e --- /dev/null +++ b/apps/chrg/applications/mb/mbport.c @@ -0,0 +1,26 @@ + +#include "mbport.h" + +static struct rt_semaphore lock; +static int is_inited = 0; + +void EnterCriticalSection(void) +{ + rt_err_t err; + if (!is_inited) { + err = rt_sem_init(&lock, "mb.lock", 1, RT_IPC_FLAG_PRIO); + if(err != RT_EOK) { + rt_kprintf("modbus critical init failed!\r\n"); + } + is_inited = 1; + } + rt_sem_take(&lock, RT_WAITING_FOREVER); +} + +void ExitCriticalSection(void) +{ + rt_sem_release(&lock); +} + + + diff --git a/apps/chrg/applications/mb/mbport.h b/apps/chrg/applications/mb/mbport.h new file mode 100644 index 0000000..63645eb --- /dev/null +++ b/apps/chrg/applications/mb/mbport.h @@ -0,0 +1,84 @@ +#ifndef __MB_PORT_H__ +#define __MB_PORT_H__ + + +#include +#include + +#include +#include + +#include "mb.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + + +rt_uint8_t xMBPortEventInit( void ); + +rt_uint8_t xMBPortEventPost( eMBEventType eEvent ); + +rt_uint8_t xMBPortEventGet( /*@out@ */ eMBEventType * eEvent ); + +rt_uint8_t xMBPortSerialInit( rt_uint8_t ucPort, rt_uint32_t ulBaudRate, + rt_uint8_t ucDataBits, eMBParity eParity ); + +void vMBPortClose( void ); + +void xMBPortSerialClose( void ); + +void vMBPortSerialEnable( rt_uint8_t xRxEnable, rt_uint8_t xTxEnable ); + +rt_uint8_t xMBPortSerialGetByte(char * pucByte ); + +rt_uint8_t xMBPortSerialPutByte(char ucByte ); + +rt_uint8_t xMBPortTimersInit( rt_uint16_t usTimeOut50us ); + +void xMBPortTimersClose( void ); + +void vMBPortTimersEnable( void ); + +void vMBPortTimersDisable( void ); + + +/*! + * \brief Callback function for the porting layer when a new byte is + * available. + * + * Depending upon the mode this callback function is used by the RTU or + * ASCII transmission layers. In any case a call to xMBPortSerialGetByte() + * must immediately return a new character. + * + * \return TRUE if a event was posted to the queue because + * a new byte was received. The port implementation should wake up the + * tasks which are currently blocked on the eventqueue. + */ +extern rt_uint8_t( *pxMBFrameCBByteReceived ) ( void ); + +extern rt_uint8_t( *pxMBFrameCBTransmitterEmpty ) ( void ); + +extern rt_uint8_t( *pxMBPortCBTimerExpired ) ( void ); + +void EnterCriticalSection(void); +void ExitCriticalSection(void); + + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/libs/freemodbus/modbus/rtu/mbrtu.c b/apps/chrg/applications/mb/mbrtu.c similarity index 61% rename from libs/freemodbus/modbus/rtu/mbrtu.c rename to apps/chrg/applications/mb/mbrtu.c index 709214c..c00c8bc 100644 --- a/libs/freemodbus/modbus/rtu/mbrtu.c +++ b/apps/chrg/applications/mb/mbrtu.c @@ -1,90 +1,49 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu.c,v 1.18 2007/09/12 10:15:56 wolti Exp $ - */ -/* ----------------------- System includes ----------------------------------*/ #include "stdlib.h" #include "string.h" -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" #include "mbrtu.h" -#include "mbframe.h" #include "mbcrc.h" #include "mbport.h" -/* ----------------------- Defines ------------------------------------------*/ #define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */ #define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus RTU frame. */ #define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */ #define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ #define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ +typedef enum { STATE_RX_INIT, /*!< Receiver is in initial state. */ STATE_RX_IDLE, /*!< Receiver is in idle state. */ STATE_RX_RCV, /*!< Frame is beeing received. */ STATE_RX_ERROR /*!< If the frame is invalid. */ } eMBRcvState; -typedef enum -{ +typedef enum { STATE_TX_IDLE, /*!< Transmitter is in idle state. */ STATE_TX_XMIT /*!< Transmitter is in transfer state. */ } eMBSndState; -/* ----------------------- Static variables ---------------------------------*/ static volatile eMBSndState eSndState; static volatile eMBRcvState eRcvState; -volatile UCHAR ucRTUBuf[MB_SER_PDU_SIZE_MAX]; +volatile rt_uint8_t ucRTUBuf[MB_SER_PDU_SIZE_MAX]; -static volatile UCHAR *pucSndBufferCur; -static volatile USHORT usSndBufferCount; +static volatile rt_uint8_t *pucSndBufferCur; +static volatile rt_uint16_t usSndBufferCount; -static volatile USHORT usRcvBufferPos; +static volatile rt_uint16_t usRcvBufferPos; -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) +eMBErrorCode eMBRTUInit( rt_uint8_t ucSlaveAddress, rt_uint8_t ucPort, + rt_uint32_t ulBaudRate, eMBParity eParity ) { - eMBErrorCode eStatus = MB_ENOERR; - ULONG usTimerT35_50us; + eMBErrorCode eStatus = MB_ENOERR; + rt_uint32_t usTimerT35_50us; ( void )ucSlaveAddress; - ENTER_CRITICAL_SECTION( ); + EnterCriticalSection(); /* Modbus RTU uses 8 Databits. */ /* If baudrate > 19200 then we should use the fixed timer values @@ -107,7 +66,7 @@ eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity ePar usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); } - if( xMBPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE ) + if( xMBPortTimersInit( ( rt_uint16_t ) usTimerT35_50us ) != TRUE ) { eStatus = MB_EPORTERR; } @@ -115,15 +74,14 @@ eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity ePar { eStatus = MB_EPORTERR; } - EXIT_CRITICAL_SECTION( ); + ExitCriticalSection(); return eStatus; } -void -eMBRTUStart( void ) +void eMBRTUStart( void ) { - ENTER_CRITICAL_SECTION( ); + EnterCriticalSection(); /* Initially the receiver is in the state STATE_RX_INIT. we start * the timer and if no character is received within t3.5 we change * to STATE_RX_IDLE. This makes sure that we delay startup of the @@ -131,31 +89,29 @@ eMBRTUStart( void ) */ eRcvState = STATE_RX_INIT; vMBPortSerialEnable( TRUE, FALSE ); - vMBPortTimersEnable( ); + vMBPortTimersEnable(); - EXIT_CRITICAL_SECTION( ); + ExitCriticalSection(); } -void -eMBRTUStop( void ) +void eMBRTUStop( void ) { - ENTER_CRITICAL_SECTION( ); + EnterCriticalSection(); vMBPortSerialEnable( FALSE, FALSE ); - vMBPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); + vMBPortTimersDisable(); + ExitCriticalSection(); } -eMBErrorCode -eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) +eMBErrorCode eMBRTUReceive( rt_uint8_t * pucRcvAddress, rt_uint8_t ** pucFrame, rt_uint16_t * pusLength ) { - eMBErrorCode eStatus = MB_ENOERR; + eMBErrorCode eStatus = MB_ENOERR; - ENTER_CRITICAL_SECTION( ); + EnterCriticalSection(); RT_ASSERT( usRcvBufferPos <= MB_SER_PDU_SIZE_MAX ); /* Length and CRC check */ if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) - && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) ) + && ( usMBCRC16( ( rt_uint8_t * ) ucRTUBuf, usRcvBufferPos ) == 0 ) ) { /* Save the address field. All frames are passed to the upper layed * and the decision if a frame is used is done there. @@ -165,27 +121,27 @@ eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus * size of address field and CRC checksum. */ - *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); + *pusLength = ( rt_uint16_t )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & ucRTUBuf[MB_SER_PDU_PDU_OFF]; + *pucFrame = ( rt_uint8_t * ) & ucRTUBuf[MB_SER_PDU_PDU_OFF]; } else { eStatus = MB_EIO; } - EXIT_CRITICAL_SECTION( ); + ExitCriticalSection(); + return eStatus; } -eMBErrorCode -eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) +eMBErrorCode eMBRTUSend( rt_uint8_t ucSlaveAddress, const rt_uint8_t * pucFrame, rt_uint16_t usLength ) { eMBErrorCode eStatus = MB_ENOERR; - USHORT usCRC16; + rt_uint16_t usCRC16; - ENTER_CRITICAL_SECTION( ); + EnterCriticalSection(); /* Check if the receiver is still in idle state. If not we where to * slow with processing the received frame and the master sent another @@ -194,7 +150,7 @@ eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) if( eRcvState == STATE_RX_IDLE ) { /* First byte before the Modbus-PDU is the slave address. */ - pucSndBufferCur = ( UCHAR * ) pucFrame - 1; + pucSndBufferCur = ( rt_uint8_t * ) pucFrame - 1; usSndBufferCount = 1; /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ @@ -202,9 +158,9 @@ eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) usSndBufferCount += usLength; /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ - usCRC16 = usMBCRC16( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); - ucRTUBuf[usSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); + usCRC16 = usMBCRC16( ( rt_uint8_t * ) pucSndBufferCur, usSndBufferCount ); + ucRTUBuf[usSndBufferCount++] = ( rt_uint8_t )( usCRC16 & 0xFF ); + ucRTUBuf[usSndBufferCount++] = ( rt_uint8_t )( usCRC16 >> 8 ); /* Activate the transmitter. */ eSndState = STATE_TX_XMIT; @@ -214,20 +170,21 @@ eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) { eStatus = MB_EIO; } - EXIT_CRITICAL_SECTION( ); + + ExitCriticalSection(); + return eStatus; } -BOOL -xMBRTUReceiveFSM( void ) +rt_uint8_t xMBRTUReceiveFSM( void ) { - BOOL xTaskNeedSwitch = FALSE; - UCHAR ucByte; + rt_uint8_t xTaskNeedSwitch = FALSE; + rt_uint8_t ucByte; RT_ASSERT( eSndState == STATE_TX_IDLE ); /* Always read the character. */ - ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte ); + ( void )xMBPortSerialGetByte((char *) &ucByte); switch ( eRcvState ) { @@ -235,14 +192,14 @@ xMBRTUReceiveFSM( void ) * wait until the frame is finished. */ case STATE_RX_INIT: - vMBPortTimersEnable( ); + vMBPortTimersEnable(); break; /* In the error state we wait until all characters in the * damaged frame are transmitted. */ case STATE_RX_ERROR: - vMBPortTimersEnable( ); + vMBPortTimersEnable(); break; /* In the idle state we wait for a new character. If a character @@ -255,7 +212,7 @@ xMBRTUReceiveFSM( void ) eRcvState = STATE_RX_RCV; /* Enable t3.5 timers. */ - vMBPortTimersEnable( ); + vMBPortTimersEnable(); break; /* We are currently receiving a frame. Reset the timer after @@ -278,10 +235,9 @@ xMBRTUReceiveFSM( void ) return xTaskNeedSwitch; } -BOOL -xMBRTUTransmitFSM( void ) +rt_uint8_t xMBRTUTransmitFSM( void ) { - BOOL xNeedPoll = FALSE; + rt_uint8_t xNeedPoll = FALSE; RT_ASSERT( eRcvState == STATE_RX_IDLE ); @@ -298,7 +254,7 @@ xMBRTUTransmitFSM( void ) /* check if we are finished. */ if( usSndBufferCount != 0 ) { - xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); + xMBPortSerialPutByte((char)*pucSndBufferCur ); pucSndBufferCur++; /* next byte in sendbuffer. */ usSndBufferCount--; } @@ -316,10 +272,9 @@ xMBRTUTransmitFSM( void ) return xNeedPoll; } -BOOL -xMBRTUTimerT35Expired( void ) +rt_uint8_t xMBRTUTimerT35Expired( void ) { - BOOL xNeedPoll = FALSE; + rt_uint8_t xNeedPoll = FALSE; switch ( eRcvState ) { @@ -345,8 +300,11 @@ xMBRTUTimerT35Expired( void ) break; } - vMBPortTimersDisable( ); + vMBPortTimersDisable(); eRcvState = STATE_RX_IDLE; return xNeedPoll; } + + + diff --git a/apps/chrg/applications/mb/mbrtu.h b/apps/chrg/applications/mb/mbrtu.h new file mode 100644 index 0000000..1b3fe90 --- /dev/null +++ b/apps/chrg/applications/mb/mbrtu.h @@ -0,0 +1,31 @@ +#ifndef __MB_RTU_H__ +#define __MB_RTU_H__ + +#include +#include + +#include + +#include "mb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +eMBErrorCode eMBRTUInit( rt_uint8_t slaveAddress, rt_uint8_t ucPort, + rt_uint32_t ulBaudRate, eMBParity eParity ); +void eMBRTUStart( void ); +void eMBRTUStop( void ); +eMBErrorCode eMBRTUReceive( rt_uint8_t * pucRcvAddress, rt_uint8_t ** pucFrame, rt_uint16_t * pusLength ); +eMBErrorCode eMBRTUSend( rt_uint8_t slaveAddress, const rt_uint8_t * pucFrame, rt_uint16_t usLength ); +rt_uint8_t xMBRTUReceiveFSM( void ); +rt_uint8_t xMBRTUTransmitFSM( void ); +rt_uint8_t xMBRTUTimerT15Expired( void ); +rt_uint8_t xMBRTUTimerT35Expired( void ); + +#ifdef __cplusplus +} +#endif +#endif + + diff --git a/libs/freemodbus/port/portserial.c b/apps/chrg/applications/mb/mbserial.c similarity index 76% rename from libs/freemodbus/port/portserial.c rename to apps/chrg/applications/mb/mbserial.c index 4093120..75b543f 100644 --- a/libs/freemodbus/port/portserial.c +++ b/apps/chrg/applications/mb/mbserial.c @@ -1,60 +1,35 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portserial.c,v 1.60 2013/08/13 15:07:05 Armink $ - */ -#include "port.h" +#include +#include -/* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" #include "mbport.h" -#include "rtdevice.h" -#include "board.h" -/* ----------------------- Static variables ---------------------------------*/ + /* software simulation serial transmit IRQ handler thread stack */ -#ifdef rt_align -rt_align(RT_ALIGN_SIZE) -#else -ALIGN(RT_ALIGN_SIZE) -#endif +//rt_align(RT_ALIGN_SIZE) + static rt_uint8_t serial_soft_trans_irq_stack[512]; + /* software simulation serial transmit IRQ handler thread */ static struct rt_thread thread_serial_soft_trans_irq; + /* serial event */ static struct rt_event event_serial; + /* modbus slave serial device */ static struct rt_serial_device *serial; -/* ----------------------- Defines ------------------------------------------*/ /* serial transmit event */ #define EVENT_SERIAL_TRANS_START (1<<0) -/* ----------------------- static functions ---------------------------------*/ static void prvvUARTTxReadyISR(void); static void prvvUARTRxISR(void); static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size); static void serial_soft_trans_irq(void* parameter); -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, - eMBParity eParity) +rt_uint8_t xMBPortSerialInit(rt_uint8_t ucPORT, rt_uint32_t ulBaudRate, + rt_uint8_t ucDataBits, eMBParity eParity) { rt_device_t dev = RT_NULL; char uart_name[20]; @@ -123,7 +98,7 @@ BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, return TRUE; } -void vMBPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) +void vMBPortSerialEnable(rt_uint8_t xRxEnable, rt_uint8_t xTxEnable) { rt_uint32_t recved_event; if (xRxEnable) @@ -163,13 +138,13 @@ void vMBPortClose(void) serial->parent.close(&(serial->parent)); } -BOOL xMBPortSerialPutByte(CHAR ucByte) +rt_uint8_t xMBPortSerialPutByte(char ucByte) { serial->parent.write(&(serial->parent), 0, &ucByte, 1); return TRUE; } -BOOL xMBPortSerialGetByte(CHAR * pucByte) +rt_uint8_t xMBPortSerialGetByte(char * pucByte) { serial->parent.read(&(serial->parent), 0, pucByte, 1); return TRUE; @@ -228,3 +203,6 @@ static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size) { prvvUARTRxISR(); return RT_EOK; } + + + diff --git a/apps/chrg/applications/mb/mbtimer.c b/apps/chrg/applications/mb/mbtimer.c new file mode 100644 index 0000000..a71832b --- /dev/null +++ b/apps/chrg/applications/mb/mbtimer.c @@ -0,0 +1,41 @@ + +#include + +#include "mb.h" +#include "mbport.h" + +static struct rt_timer timer; + +void vMBPortTimersEnable() +{ + rt_timer_start(&timer); +} + +void vMBPortTimersDisable() +{ + rt_timer_stop(&timer); +} + +static void prvvTIMERExpiredISR(void) +{ + (void)pxMBPortCBTimerExpired(); +} + +static void timer_timeout_ind(void* parameter) +{ + prvvTIMERExpiredISR(); +} + +rt_uint8_t xMBPortTimersInit(rt_uint16_t usTim1Timerout50us) +{ + rt_timer_init(&timer, "tmr.mb", + timer_timeout_ind, /* bind timeout callback function */ + RT_NULL, + (50 * usTim1Timerout50us) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1, + RT_TIMER_FLAG_ONE_SHOT); /* one shot */ + + return TRUE; +} + + + diff --git a/apps/chrg/applications/mb/mbutils.c b/apps/chrg/applications/mb/mbutils.c new file mode 100644 index 0000000..dbdac5f --- /dev/null +++ b/apps/chrg/applications/mb/mbutils.c @@ -0,0 +1,104 @@ + +#include +#include + +#include "mbport.h" + +#include "mb.h" + +#define BITS_UCHAR 8U + +void xMBUtilSetBits( rt_uint8_t * ucByteBuf, rt_uint16_t usBitOffset, + rt_uint8_t ucNBits, rt_uint8_t ucValue ) +{ + rt_uint16_t usWordBuf; + rt_uint16_t usMask; + rt_uint16_t usByteOffset; + rt_uint16_t usNPreBits; + rt_uint16_t usValue = ucValue; + + RT_ASSERT( ucNBits <= 8 ); + RT_ASSERT( ( size_t )BITS_UCHAR == sizeof( rt_uint8_t ) * 8 ); + + /* Calculate byte offset for first byte containing the bit values starting + * at usBitOffset. */ + usByteOffset = ( rt_uint16_t )( ( usBitOffset ) / BITS_UCHAR ); + + /* How many bits precede our bits to set. */ + usNPreBits = ( rt_uint16_t )( usBitOffset - usByteOffset * BITS_UCHAR ); + + /* Move bit field into position over bits to set */ + usValue <<= usNPreBits; + + /* Prepare a mask for setting the new bits. */ + usMask = ( rt_uint16_t )( ( 1 << ( rt_uint16_t ) ucNBits ) - 1 ); + usMask <<= usBitOffset - usByteOffset * BITS_UCHAR; + + /* copy bits into temporary storage. */ + usWordBuf = ucByteBuf[usByteOffset]; + usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; + + /* Zero out bit field bits and then or value bits into them. */ + usWordBuf = ( rt_uint16_t )( ( usWordBuf & ( ~usMask ) ) | usValue ); + + /* move bits back into storage */ + ucByteBuf[usByteOffset] = ( rt_uint8_t )( usWordBuf & 0xFF ); + ucByteBuf[usByteOffset + 1] = ( rt_uint8_t )( usWordBuf >> BITS_UCHAR ); +} + +rt_uint8_t xMBUtilGetBits( rt_uint8_t * ucByteBuf, rt_uint16_t usBitOffset, rt_uint8_t ucNBits ) +{ + rt_uint16_t usWordBuf; + rt_uint16_t usMask; + rt_uint16_t usByteOffset; + rt_uint16_t usNPreBits; + + /* Calculate byte offset for first byte containing the bit values starting + * at usBitOffset. */ + usByteOffset = ( rt_uint16_t )( ( usBitOffset ) / BITS_UCHAR ); + + /* How many bits precede our bits to set. */ + usNPreBits = ( rt_uint16_t )( usBitOffset - usByteOffset * BITS_UCHAR ); + + /* Prepare a mask for setting the new bits. */ + usMask = ( rt_uint16_t )( ( 1 << ( rt_uint16_t ) ucNBits ) - 1 ); + + /* copy bits into temporary storage. */ + usWordBuf = ucByteBuf[usByteOffset]; + usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; + + /* throw away unneeded bits. */ + usWordBuf >>= usNPreBits; + + /* mask away bits above the requested bitfield. */ + usWordBuf &= usMask; + + return ( rt_uint8_t ) usWordBuf; +} + +eMBException prveMBError2Exception( eMBErrorCode eErrorCode ) +{ + eMBException eStatus; + + switch ( eErrorCode ) { + case MB_ENOERR: + eStatus = MB_EX_NONE; + break; + + case MB_ENOREG: + eStatus = MB_EX_ILLEGAL_DATA_ADDRESS; + break; + + case MB_ETIMEDOUT: + eStatus = MB_EX_SLAVE_BUSY; + break; + + default: + eStatus = MB_EX_SLAVE_DEVICE_FAILURE; + break; + } + + return eStatus; +} + + diff --git a/libs/freemodbus/modbus/include/mbutils.h b/apps/chrg/applications/mb/mbutils.h similarity index 51% rename from libs/freemodbus/modbus/include/mbutils.h rename to apps/chrg/applications/mb/mbutils.h index d3179b2..6137442 100644 --- a/libs/freemodbus/modbus/include/mbutils.h +++ b/apps/chrg/applications/mb/mbutils.h @@ -1,35 +1,6 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbutils.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ - */ -#ifndef _MB_UTILS_H -#define _MB_UTILS_H +#ifndef __MB_UTILS_H__ +#define __MB_UTILS_H__ #ifdef __cplusplus extern "C" { @@ -75,8 +46,8 @@ extern "C" { * xMBUtilSetBits( ucBits, 8, 8, 0x5A); * \endcode */ -void xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, - UCHAR ucNBits, UCHAR ucValues ); +void xMBUtilSetBits( rt_uint8_t * ucByteBuf, rt_uint16_t usBitOffset, + rt_uint8_t ucNBits, rt_uint8_t ucValues ); /*! \brief Function to read bits in a byte buffer. * @@ -90,21 +61,21 @@ void xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, * than 8. * * \code - * UCHAR ucBits[2] = {0, 0}; - * UCHAR ucResult; + * rt_uint8_t ucBits[2] = {0, 0}; + * rt_uint8_t ucResult; * * // Extract the bits 3 - 10. * ucResult = xMBUtilGetBits( ucBits, 3, 8 ); * \endcode */ -UCHAR xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, - UCHAR ucNBits ); +rt_uint8_t xMBUtilGetBits( rt_uint8_t * ucByteBuf, rt_uint16_t usBitOffset, rt_uint8_t ucNBits ); /*! @} */ #ifdef __cplusplus } #endif + #endif diff --git a/apps/chrg/applications/thread/chrg_comm.c b/apps/chrg/applications/thread/chrg_comm.c index 7ff1f1b..0d94d74 100644 --- a/apps/chrg/applications/thread/chrg_comm.c +++ b/apps/chrg/applications/thread/chrg_comm.c @@ -2,13 +2,15 @@ #include #include "mb.h" +#include "chrg_mb.h" #include "chrg_comm.h" + #define LOG_TAG "chrg.comm" #define DBG_LEVEL DBG_LOG #include -extern rt_uint16_t usSRegHoldBuf[RT_S_REG_HOLDING_NREGS]; +extern rt_uint16_t usSRegHoldBuf[S_REG_HOLDING_NREGS]; struct chrg_comm_t chrgcomm = { .tid_poll = RT_NULL, @@ -49,7 +51,7 @@ static void chrg_comm_poll (void *pdata) return ; } - eMBInit(MB_RTU, pCOMM->addr, 1, 115200, MB_PAR_EVEN); + eMBInit(pCOMM->addr, 1, 115200, MB_PAR_EVEN); eMBEnable(); diff --git a/libs/freemodbus/port/user_mb_app.c b/apps/chrg/applications/utils/chrg_mb.c similarity index 61% rename from libs/freemodbus/port/user_mb_app.c rename to apps/chrg/applications/utils/chrg_mb.c index 8da7376..a7261fd 100644 --- a/libs/freemodbus/port/user_mb_app.c +++ b/apps/chrg/applications/utils/chrg_mb.c @@ -1,46 +1,26 @@ -/* - * FreeModbus Libary: user callback functions and buffer define in slave mode - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: user_mb_app.c,v 1.60 2013/11/23 11:49:05 Armink $ - */ -#include "user_mb_app.h" -/*------------------------Slave mode use these variables----------------------*/ +#include + +#include "mb.h" +#include "mbutils.h" + +#include "chrg_mb.h" + //Slave mode:DiscreteInputs variables -USHORT usSDiscInStart = S_DISCRETE_INPUT_START; -#if S_DISCRETE_INPUT_NDISCRETES%8 -UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1]; -#else -UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ; -#endif +rt_uint16_t usSDiscInStart = S_DISCRETE_INPUT_START; +rt_uint8_t ucSDiscInBuf[(S_DISCRETE_INPUT_NDISCRETES+7)/8]; + //Slave mode:Coils variables -USHORT usSCoilStart = S_COIL_START; -#if S_COIL_NCOILS%8 -UCHAR ucSCoilBuf[S_COIL_NCOILS/8+1] ; -#else -UCHAR ucSCoilBuf[S_COIL_NCOILS/8] ; -#endif +rt_uint16_t usSCoilStart = S_COIL_START; +rt_uint8_t ucSCoilBuf[(S_COIL_NCOILS+7)/8]; + //Slave mode:InputRegister variables -USHORT usSRegInStart = S_REG_INPUT_START; -USHORT usSRegInBuf[S_REG_INPUT_NREGS] ; +rt_uint16_t usSRegInStart = S_REG_INPUT_START; +rt_uint16_t usSRegInBuf[S_REG_INPUT_NREGS]; + //Slave mode:HoldingRegister variables -USHORT usSRegHoldStart = S_REG_HOLDING_START; -USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ; +rt_uint16_t usSRegHoldStart = S_REG_HOLDING_START; +rt_uint16_t usSRegHoldBuf[S_REG_HOLDING_NREGS]; /** * Modbus slave input register callback function. @@ -51,14 +31,14 @@ USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ; * * @return result */ -eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) +eMBErrorCode eMBRegInputCB(rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, rt_uint16_t usNRegs ) { eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex; - USHORT * pusRegInputBuf; - USHORT REG_INPUT_START; - USHORT REG_INPUT_NREGS; - USHORT usRegInStart; + rt_uint16_t iRegIndex; + rt_uint16_t * pusRegInputBuf; + rt_uint16_t REG_INPUT_START; + rt_uint16_t REG_INPUT_NREGS; + rt_uint16_t usRegInStart; pusRegInputBuf = usSRegInBuf; REG_INPUT_START = S_REG_INPUT_START; @@ -74,8 +54,8 @@ eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNReg iRegIndex = usAddress - usRegInStart; while (usNRegs > 0) { - *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8); - *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF); + *pucRegBuffer++ = (rt_uint8_t) (pusRegInputBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (rt_uint8_t) (pusRegInputBuf[iRegIndex] & 0xFF); iRegIndex++; usNRegs--; } @@ -98,15 +78,15 @@ eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNReg * * @return result */ -eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode) +eMBErrorCode eMBRegHoldingCB(rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, + rt_uint16_t usNRegs, eMBRegisterMode eMode) { eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex; - USHORT * pusRegHoldingBuf; - USHORT REG_HOLDING_START; - USHORT REG_HOLDING_NREGS; - USHORT usRegHoldStart; + rt_uint16_t iRegIndex; + rt_uint16_t * pusRegHoldingBuf; + rt_uint16_t REG_HOLDING_START; + rt_uint16_t REG_HOLDING_NREGS; + rt_uint16_t usRegHoldStart; pusRegHoldingBuf = usSRegHoldBuf; REG_HOLDING_START = S_REG_HOLDING_START; @@ -126,8 +106,8 @@ eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, case MB_REG_READ: while (usNRegs > 0) { - *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8); - *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF); + *pucRegBuffer++ = (rt_uint8_t) (pusRegHoldingBuf[iRegIndex] >> 8); + *pucRegBuffer++ = (rt_uint8_t) (pusRegHoldingBuf[iRegIndex] & 0xFF); iRegIndex++; usNRegs--; } @@ -162,15 +142,15 @@ eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, * * @return result */ -eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode) +eMBErrorCode eMBRegCoilsCB(rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, + rt_uint16_t usNCoils, eMBRegisterMode eMode) { eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucCoilBuf; - USHORT COIL_START; - USHORT COIL_NCOILS; - USHORT usCoilStart; + rt_uint16_t iRegIndex , iRegBitIndex , iNReg; + rt_uint8_t * pucCoilBuf; + rt_uint16_t COIL_START; + rt_uint16_t COIL_NCOILS; + rt_uint16_t usCoilStart; iNReg = usNCoils / 8 + 1; pucCoilBuf = ucSCoilBuf; @@ -184,8 +164,8 @@ eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, if( ( usAddress >= COIL_START ) && ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ) { - iRegIndex = (USHORT) (usAddress - usCoilStart) / 8; - iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8; + iRegIndex = (rt_uint16_t) (usAddress - usCoilStart) / 8; + iRegBitIndex = (rt_uint16_t) (usAddress - usCoilStart) % 8; switch ( eMode ) { /* read current coil values from the protocol stack. */ @@ -239,14 +219,14 @@ eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, * * @return result */ -eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) +eMBErrorCode eMBRegDiscreteCB( rt_uint8_t * pucRegBuffer, rt_uint16_t usAddress, rt_uint16_t usNDiscrete ) { eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucDiscreteInputBuf; - USHORT DISCRETE_INPUT_START; - USHORT DISCRETE_INPUT_NDISCRETES; - USHORT usDiscreteInputStart; + rt_uint16_t iRegIndex , iRegBitIndex , iNReg; + rt_uint8_t * pucDiscreteInputBuf; + rt_uint16_t DISCRETE_INPUT_START; + rt_uint16_t DISCRETE_INPUT_NDISCRETES; + rt_uint16_t usDiscreteInputStart; iNReg = usNDiscrete / 8 + 1; pucDiscreteInputBuf = ucSDiscInBuf; @@ -260,8 +240,8 @@ eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT us if ((usAddress >= DISCRETE_INPUT_START) && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)) { - iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8; - iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8; + iRegIndex = (rt_uint16_t) (usAddress - usDiscreteInputStart) / 8; + iRegBitIndex = (rt_uint16_t) (usAddress - usDiscreteInputStart) % 8; while (iNReg > 0) { diff --git a/apps/chrg/applications/utils/chrg_mb.h b/apps/chrg/applications/utils/chrg_mb.h new file mode 100644 index 0000000..b7252d3 --- /dev/null +++ b/apps/chrg/applications/utils/chrg_mb.h @@ -0,0 +1,26 @@ +#ifndef __CHRG_MB_H__ +#define __CHRG_MB_H__ + + +#define S_DISCRETE_INPUT_START 0 +#define S_DISCRETE_INPUT_NDISCRETES 16 +#define S_COIL_START 0 +#define S_COIL_NCOILS 64 +#define S_REG_INPUT_START 0 +#define S_REG_INPUT_NREGS 100 +#define S_REG_HOLDING_START 0 +#define S_REG_HOLDING_NREGS 100 + +/* salve mode: holding register's all address */ +#define S_HD_RESERVE 0 +/* salve mode: input register's all address */ +#define S_IN_RESERVE 0 +/* salve mode: coil's all address */ +#define S_CO_RESERVE 0 +/* salve mode: discrete's all address */ +#define S_DI_RESERVE 0 + + +#endif + + diff --git a/apps/chrg/chrg.uvprojx b/apps/chrg/chrg.uvprojx new file mode 100644 index 0000000..c7bbe4e --- /dev/null +++ b/apps/chrg/chrg.uvprojx @@ -0,0 +1,2811 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + chrg + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F405RG + STMicroelectronics + Keil.STM32F4xx_DFP.2.17.1 + https://www.keil.com/pack/ + IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "Startup\ST\STM32F4xx\startup_stm32f40_41xxx.s" ("STM32F40/41xxx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + 6100 + stm32f4xx.h + + + + + + + -DSTM32F40_41xxx + + + SFD\ST\STM32F4xx\STM32F40x.sfr + 0 + 0 + + + + ST\STM32F4xx\ + ST\STM32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + chrg + 1 + 0 + 1 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L -o @L.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU -REMAP + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8040000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, __RTTHREAD__, STM32F405xx, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_LIBC, RT_USING_ARMLIBC, USE_HAL_DRIVER + + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\config;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\drivers\include;..\..\rt-thread\libcpu\arm\common;..\..\rt-thread\components\libc\compilers\common\extension;board\ports;..\..\rt-thread\components\libc\posix\io\epoll;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\libc\posix\io\eventfd;applications\mb;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\libc\compilers\common\include;..\..\rt-thread\components\finsh;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers;..\..\libs\cmsis-core\Include;..\..\rt-thread\components\libc\compilers\common\extension\fcntl\octal;..\..\rt-thread\components\drivers\phy;..\..\rt-thread\components\libc\posix\io\poll;applications\bsp;..\..\rt-thread\components\drivers\include;board\CubeMX_Config\Inc;..\..\libs\stm32f4\STM32F4_CMSIS\Include;..\..\rt-thread\components\drivers\include;..\..\rt-thread\libcpu\arm\cortex-m4;..\..\rt-thread\include;applications\utils;.;..\..\rt-thread\components\drivers\smp_call;applications\thread;..\..\rt-thread\components\drivers\include;..\..\rt-thread\components\drivers\include;applications;board;..\..\libs\stm32f4\STM32F4_HAL\Inc;..\..\rt-thread\components\fal\inc;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_flash;..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers;..\..\libs\stm32f4\STM32F4_HAL\Inc\Legacy;..\..\rt-thread\components\libc\posix\ipc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Applications/bsp + + + chrg_i2c.c + 1 + applications\bsp\chrg_i2c.c + + + chrg_tmr.c + 1 + applications\bsp\chrg_tmr.c + + + chrg_pin.c + 1 + applications\bsp\chrg_pin.c + + + chrg_clk.c + 1 + applications\bsp\chrg_clk.c + + + chrg_fal.c + 1 + applications\bsp\chrg_fal.c + + + chrg_switch.c + 1 + applications\bsp\chrg_switch.c + + + chrg_intr.c + 1 + applications\bsp\chrg_intr.c + + + chrg_can.c + 1 + applications\bsp\chrg_can.c + + + chrg_wdt.c + 1 + applications\bsp\chrg_wdt.c + + + chrg_tty.c + 1 + applications\bsp\chrg_tty.c + + + + + Applications/mb + + + mbfunccoils.c + 1 + applications\mb\mbfunccoils.c + + + mbrtu.c + 1 + applications\mb\mbrtu.c + + + mbfuncholding.c + 1 + applications\mb\mbfuncholding.c + + + mb.c + 1 + applications\mb\mb.c + + + mbfuncother.c + 1 + applications\mb\mbfuncother.c + + + mbutils.c + 1 + applications\mb\mbutils.c + + + mbserial.c + 1 + applications\mb\mbserial.c + + + mbcrc.c + 1 + applications\mb\mbcrc.c + + + mbfuncinput.c + 1 + applications\mb\mbfuncinput.c + + + mbfuncdisc.c + 1 + applications\mb\mbfuncdisc.c + + + mbport.c + 1 + applications\mb\mbport.c + + + mbtimer.c + 1 + applications\mb\mbtimer.c + + + mbevent.c + 1 + applications\mb\mbevent.c + + + + + Applications/thread + + + chrg_south.c + 1 + applications\thread\chrg_south.c + + + chrg_lcd.c + 1 + applications\thread\chrg_lcd.c + + + chrg_north.c + 1 + applications\thread\chrg_north.c + + + chrg_comm.c + 1 + applications\thread\chrg_comm.c + + + + + Applications/utils + + + chrg_source.c + 1 + applications\utils\chrg_source.c + + + chrg_sink.c + 1 + applications\utils\chrg_sink.c + + + chrg_mb.c + 1 + applications\utils\chrg_mb.c + + + chrg_pkg.c + 1 + applications\utils\chrg_pkg.c + + + chrg_pcf8574.c + 1 + applications\utils\chrg_pcf8574.c + + + chrg_utils.c + 1 + applications\utils\chrg_utils.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\rt-thread\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\rt-thread\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\rt-thread\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\rt-thread\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\rt-thread\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\rt-thread\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\rt-thread\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\rt-thread\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + dev_can.c + 1 + ..\..\rt-thread\components\drivers\can\dev_can.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + device.c + 1 + ..\..\rt-thread\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + hwtimer.c + 1 + ..\..\rt-thread\components\drivers\hwtimer\hwtimer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_bit_ops.c + 1 + ..\..\rt-thread\components\drivers\i2c\dev_i2c_bit_ops.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_core.c + 1 + ..\..\rt-thread\components\drivers\i2c\dev_i2c_core.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_dev.c + 1 + ..\..\rt-thread\components\drivers\i2c\dev_i2c_dev.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\rt-thread\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\rt-thread\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\rt-thread\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\rt-thread\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\rt-thread\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\rt-thread\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\rt-thread\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\rt-thread\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\rt-thread\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\rt-thread\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\rt-thread\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_watchdog.c + 1 + ..\..\rt-thread\components\drivers\watchdog\dev_watchdog.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + stm32f4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + board.c + 1 + board\board.c + + + drv_can.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_can.c + + + drv_flash_f4.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_flash\drv_flash_f4.c + + + drv_gpio.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_gpio.c + + + drv_soft_i2c.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_soft_i2c.c + + + drv_tim.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_tim.c + + + drv_usart.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_usart.c + + + drv_wdt.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drivers\drv_wdt.c + + + drv_common.c + 1 + ..\..\rt-thread\bsp\stm32\libraries\HAL_Drivers\drv_common.c + + + + + Fal + + + fal_rtt.c + 1 + ..\..\rt-thread\components\fal\src\fal_rtt.c + + + fal_partition.c + 1 + ..\..\rt-thread\components\fal\src\fal_partition.c + + + fal_flash.c + 1 + ..\..\rt-thread\components\fal\src\fal_flash.c + + + fal.c + 1 + ..\..\rt-thread\components\fal\src\fal.c + + + + + Finsh + + + msh_parse.c + 1 + ..\..\rt-thread\components\finsh\msh_parse.c + + + cmd.c + 1 + ..\..\rt-thread\components\finsh\cmd.c + + + shell.c + 1 + ..\..\rt-thread\components\finsh\shell.c + + + msh.c + 1 + ..\..\rt-thread\components\finsh\msh.c + + + + + Kernel + + + clock.c + 1 + ..\..\rt-thread\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\rt-thread\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\rt-thread\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\rt-thread\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\rt-thread\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\rt-thread\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\rt-thread\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\rt-thread\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\rt-thread\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\rt-thread\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\rt-thread\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\rt-thread\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\rt-thread\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\rt-thread\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\rt-thread\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstring.c + 1 + ..\..\rt-thread\src\klibc\kstring.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\rt-thread\src\klibc\rt_vsnprintf_tiny.c + + + rt_vsscanf.c + 1 + ..\..\rt-thread\src\klibc\rt_vsscanf.c + + + kerrno.c + 1 + ..\..\rt-thread\src\klibc\kerrno.c + + + kstdio.c + 1 + ..\..\rt-thread\src\klibc\kstdio.c + + + + + libcpu + + + atomic_arm.c + 1 + ..\..\rt-thread\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\rt-thread\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\rt-thread\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\rt-thread\libcpu\arm\cortex-m4\context_rvds.S + + + cpuport.c + 1 + ..\..\rt-thread\libcpu\arm\cortex-m4\cpuport.c + + + + + STM32F4-CMSIS + + + system_stm32f4xx.c + 1 + ..\..\libs\stm32f4\STM32F4_CMSIS\Source\Templates\system_stm32f4xx.c + + + startup_stm32f405xx.s + 2 + ..\..\libs\stm32f4\STM32F4_CMSIS\Source\Templates\arm\startup_stm32f405xx.s + + + + + STM32F4-HAL + + + stm32f4xx_hal_flash_ramfunc.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_flash_ramfunc.c + + + stm32f4xx_hal_can.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_can.c + + + stm32f4xx_hal_cortex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cortex.c + + + stm32f4xx_hal_wwdg.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_wwdg.c + + + stm32f4xx_hal_uart.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_uart.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal_lptim.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_lptim.c + + + stm32f4xx_hal_crc.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_crc.c + + + stm32f4xx_hal_cryp.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cryp.c + + + stm32f4xx_hal_gpio.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_dma.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_dma.c + + + stm32f4xx_hal_cec.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cec.c + + + stm32f4xx_hal_dma_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_dma_ex.c + + + stm32f4xx_hal_rng.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rng.c + + + stm32f4xx_hal_i2c_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_i2c_ex.c + + + stm32f4xx_hal_rcc_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rcc_ex.c + + + stm32f4xx_hal_tim_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_tim_ex.c + + + stm32f4xx_hal_flash_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_flash_ex.c + + + stm32f4xx_hal_usart.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_usart.c + + + stm32f4xx_hal_rcc.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_i2c.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_i2c.c + + + stm32f4xx_hal.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal.c + + + stm32f4xx_hal_cryp_ex.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_cryp_ex.c + + + stm32f4xx_hal_tim.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_tim.c + + + stm32f4xx_hal_iwdg.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_iwdg.c + + + stm32f4xx_hal_pwr.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_pwr.c + + + stm32f4xx_hal_flash.c + 1 + ..\..\libs\stm32f4\STM32F4_HAL\Src\stm32f4xx_hal_flash.c + + + + + + + + + + + + + +
diff --git a/apps/chrg/rtconfig.h b/apps/chrg/rtconfig.h index 7493d94..fe39d0c 100644 --- a/apps/chrg/rtconfig.h +++ b/apps/chrg/rtconfig.h @@ -1,474 +1,454 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -#define SOC_STM32F405RG - -/* RT-Thread Kernel */ - -/* klibc options */ - -/* rt_vsnprintf options */ - -/* end of rt_vsnprintf options */ - -/* rt_vsscanf options */ - -/* end of rt_vsscanf options */ - -/* rt_memset options */ - -/* end of rt_memset options */ - -/* rt_memcpy options */ - -/* end of rt_memcpy options */ - -/* rt_memmove options */ - -/* end of rt_memmove options */ - -/* rt_memcmp options */ - -/* end of rt_memcmp options */ - -/* rt_strstr options */ - -/* end of rt_strstr options */ - -/* rt_strcasecmp options */ - -/* end of rt_strcasecmp options */ - -/* rt_strncpy options */ - -/* end of rt_strncpy options */ - -/* rt_strcpy options */ - -/* end of rt_strcpy options */ - -/* rt_strncmp options */ - -/* end of rt_strncmp options */ - -/* rt_strcmp options */ - -/* end of rt_strcmp options */ - -/* rt_strlen options */ - -/* end of rt_strlen options */ - -/* rt_strnlen options */ - -/* end of rt_strnlen options */ -/* end of klibc options */ -#define RT_NAME_MAX 16 -#define RT_CPUS_NR 1 -#define RT_ALIGN_SIZE 8 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 256 -#define RT_USING_CPU_USAGE_TRACER - -/* kservice options */ - -/* end of kservice options */ -#define RT_USING_DEBUG -#define RT_DEBUGING_ASSERT -#define RT_DEBUGING_COLOR -#define RT_DEBUGING_CONTEXT - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -/* end of Inter-Thread communication */ - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_HEAP -/* end of Memory Management */ -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 128 -#define RT_CONSOLE_DEVICE_NAME "uart2" -#define RT_VER_NUM 0x50201 -#define RT_BACKTRACE_LEVEL_MAX_NR 32 -/* end of RT-Thread Kernel */ -#define RT_USING_HW_ATOMIC -#define RT_USING_CPU_FFS -#define ARCH_ARM -#define ARCH_ARM_CORTEX_M -#define ARCH_ARM_CORTEX_M4 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 4096 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define FINSH_USING_OPTION_COMPLETION - -/* DFS: device virtual file system */ - -/* end of DFS: device virtual file system */ -#define RT_USING_FAL -#define FAL_PART_HAS_TABLE_CFG - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_UNAMED_PIPE_NUMBER 64 -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_CAN -#define RT_CANMSG_BOX_SZ 16 -#define RT_CANSND_BOX_NUM 1 -#define RT_CANSND_MSG_TIMEOUT 100 -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_WDT -#define RT_USING_PIN -#define RT_USING_HWTIMER -/* end of Device Drivers */ - -/* C/C++ and POSIX layer */ - -/* ISO-ANSI C layer */ - -/* Timezone and Daylight Saving Time */ - -#define RT_LIBC_USING_LIGHT_TZ_DST -#define RT_LIBC_TZ_DEFAULT_HOUR 8 -#define RT_LIBC_TZ_DEFAULT_MIN 0 -#define RT_LIBC_TZ_DEFAULT_SEC 0 -/* end of Timezone and Daylight Saving Time */ -/* end of ISO-ANSI C layer */ - -/* POSIX (Portable Operating System Interface) layer */ - - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - -/* end of Interprocess Communication (IPC) */ -/* end of POSIX (Portable Operating System Interface) layer */ -/* end of C/C++ and POSIX layer */ - -/* Network */ - -/* end of Network */ - -/* Memory protection */ - -/* end of Memory protection */ - -/* Utilities */ - -/* end of Utilities */ - -/* Using USB legacy version */ - -/* end of Using USB legacy version */ -/* end of RT-Thread Components */ - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - -#define PKG_USING_FREEMODBUS -#define PKG_MODBUS_SLAVE - -/* advanced configuration */ - -#define RT_S_DISCRETE_INPUT_START 0 -#define RT_S_DISCRETE_INPUT_NDISCRETES 16 -#define RT_S_COIL_START 0 -#define RT_S_COIL_NCOILS 64 -#define RT_S_REG_INPUT_START 0 -#define RT_S_REG_INPUT_NREGS 100 -#define RT_S_REG_HOLDING_START 0 -#define RT_S_REG_HOLDING_NREGS 100 -#define RT_S_HD_RESERVE 0 -#define RT_S_IN_RESERVE 0 -#define RT_S_CO_RESERVE 0 -#define RT_S_DI_RESERVE 0 -/* end of advanced configuration */ -#define PKG_MODBUS_SLAVE_RTU -#define PKG_USING_FREEMODBUS_LATEST_VERSION - -/* Wi-Fi */ - -/* Marvell WiFi */ - -/* end of Marvell WiFi */ - -/* Wiced WiFi */ - -/* end of Wiced WiFi */ - -/* CYW43012 WiFi */ - -/* end of CYW43012 WiFi */ - -/* BL808 WiFi */ - -/* end of BL808 WiFi */ - -/* CYW43439 WiFi */ - -/* end of CYW43439 WiFi */ -/* end of Wi-Fi */ - -/* IoT Cloud */ - -/* end of IoT Cloud */ -/* end of IoT - internet of things */ - -/* security packages */ - -/* end of security packages */ - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - -/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ - -/* XML: Extensible Markup Language */ - -/* end of XML: Extensible Markup Language */ -/* end of language packages */ - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - -/* end of LVGL: powerful and easy-to-use embedded GUI library */ - -/* u8g2: a monochrome graphic library */ - -/* end of u8g2: a monochrome graphic library */ -/* end of multimedia packages */ - -/* tools packages */ - -/* end of tools packages */ - -/* system packages */ - -/* enhanced kernel services */ - -/* end of enhanced kernel services */ - -/* acceleration: Assembly language or algorithmic acceleration packages */ - -/* end of acceleration: Assembly language or algorithmic acceleration packages */ - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - -#define PKG_USING_CMSIS_CORE -#define PKG_USING_CMSIS_CORE_LATEST_VERSION -/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - -/* Micrium: Micrium software products porting for RT-Thread */ - -/* end of Micrium: Micrium software products porting for RT-Thread */ -/* end of system packages */ - -/* peripheral libraries and drivers */ - -/* HAL & SDK Drivers */ - -/* STM32 HAL & SDK Drivers */ - -#define PKG_USING_STM32F4_HAL_DRIVER -#define PKG_USING_STM32F4_HAL_DRIVER_LATEST_VERSION -#define PKG_USING_STM32F4_CMSIS_DRIVER -#define PKG_USING_STM32F4_CMSIS_DRIVER_LATEST_VERSION -/* end of STM32 HAL & SDK Drivers */ - -/* Infineon HAL Packages */ - -/* end of Infineon HAL Packages */ - -/* Kendryte SDK */ - -/* end of Kendryte SDK */ - -/* WCH HAL & SDK Drivers */ - -/* end of WCH HAL & SDK Drivers */ - -/* AT32 HAL & SDK Drivers */ - -/* end of AT32 HAL & SDK Drivers */ - -/* HC32 DDL Drivers */ - -/* end of HC32 DDL Drivers */ - -/* NXP HAL & SDK Drivers */ - -/* end of NXP HAL & SDK Drivers */ - -/* NUVOTON Drivers */ - -/* end of NUVOTON Drivers */ - -/* GD32 Drivers */ - -/* end of GD32 Drivers */ -/* end of HAL & SDK Drivers */ - -/* sensors drivers */ - -/* end of sensors drivers */ - -/* touch drivers */ - -/* end of touch drivers */ -/* end of peripheral libraries and drivers */ - -/* AI packages */ - -/* end of AI packages */ - -/* Signal Processing and Control Algorithm Packages */ - -/* end of Signal Processing and Control Algorithm Packages */ - -/* miscellaneous packages */ - -/* project laboratory */ - -/* end of project laboratory */ - -/* samples: kernel and components samples */ - -/* end of samples: kernel and components samples */ - -/* entertainment: terminal games and other interesting software packages */ - -/* end of entertainment: terminal games and other interesting software packages */ -/* end of miscellaneous packages */ - -/* Arduino libraries */ - - -/* Projects and Demos */ - -/* end of Projects and Demos */ - -/* Sensors */ - -/* end of Sensors */ - -/* Display */ - -/* end of Display */ - -/* Timing */ - -/* end of Timing */ - -/* Data Processing */ - -/* end of Data Processing */ - -/* Data Storage */ - -/* Communication */ - -/* end of Communication */ - -/* Device Control */ - -/* end of Device Control */ - -/* Other */ - -/* end of Other */ - -/* Signal IO */ - -/* end of Signal IO */ - -/* Uncategorized */ - -/* end of Arduino libraries */ -/* end of RT-Thread online packages */ -#define SOC_FAMILY_STM32 -#define SOC_SERIES_STM32F4 - -/* Hardware Drivers Config */ - -/* Onboard Peripheral Drivers */ - -/* On-chip Peripheral Drivers */ - -#define BSP_USING_GPIO -#define BSP_USING_UART -#define BSP_STM32_UART_V1_TX_TIMEOUT 2000 -#define BSP_USING_UART1 -#define BSP_UART1_RX_USING_DMA -#define BSP_UART1_TX_USING_DMA -#define BSP_USING_UART2 -#define BSP_USING_UART3 -#define BSP_UART3_RX_USING_DMA -#define BSP_UART3_TX_USING_DMA -#define BSP_USING_UART5 -#define BSP_USING_UART6 -#define BSP_UART6_RX_USING_DMA -#define BSP_UART6_TX_USING_DMA -#define BSP_USING_I2C -#define BSP_USING_I2C1 -#define BSP_USING_I2C2 -#define BSP_USING_I2C3 -#define BSP_USING_I2C4 -#define BSP_USING_CAN -#define BSP_USING_CAN1 -#define BSP_USING_WDT -#define BSP_USING_ON_CHIP_FLASH -#define BSP_USING_TIM -#define BSP_USING_TIM2 -/* end of On-chip Peripheral Drivers */ - -/* Board extended module Drivers */ - -/* end of Hardware Drivers Config */ - -#endif +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +#define SOC_STM32F405RG + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 16 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_USING_CPU_USAGE_TRACER + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x50201 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ +#define RT_USING_FAL +#define FAL_PART_HAS_TABLE_CFG + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SYSTEM_WORKQUEUE +#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 +#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_CAN +#define RT_CANMSG_BOX_SZ 16 +#define RT_CANSND_BOX_NUM 1 +#define RT_CANSND_MSG_TIMEOUT 100 +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_WDT +#define RT_USING_PIN +#define RT_USING_HWTIMER +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +#define PKG_USING_CMSIS_CORE +#define PKG_USING_CMSIS_CORE_LATEST_VERSION +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +#define PKG_USING_STM32F4_HAL_DRIVER +#define PKG_USING_STM32F4_HAL_DRIVER_LATEST_VERSION +#define PKG_USING_STM32F4_CMSIS_DRIVER +#define PKG_USING_STM32F4_CMSIS_DRIVER_LATEST_VERSION +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ + +/* WCH HAL & SDK Drivers */ + +/* end of WCH HAL & SDK Drivers */ + +/* AT32 HAL & SDK Drivers */ + +/* end of AT32 HAL & SDK Drivers */ + +/* HC32 DDL Drivers */ + +/* end of HC32 DDL Drivers */ + +/* NXP HAL & SDK Drivers */ + +/* end of NXP HAL & SDK Drivers */ + +/* NUVOTON Drivers */ + +/* end of NUVOTON Drivers */ + +/* GD32 Drivers */ + +/* end of GD32 Drivers */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F4 + +/* Hardware Drivers Config */ + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_STM32_UART_V1_TX_TIMEOUT 2000 +#define BSP_USING_UART1 +#define BSP_UART1_RX_USING_DMA +#define BSP_UART1_TX_USING_DMA +#define BSP_USING_UART2 +#define BSP_USING_UART3 +#define BSP_UART3_RX_USING_DMA +#define BSP_UART3_TX_USING_DMA +#define BSP_USING_UART5 +#define BSP_USING_UART6 +#define BSP_UART6_RX_USING_DMA +#define BSP_UART6_TX_USING_DMA +#define BSP_USING_I2C +#define BSP_USING_I2C1 +#define BSP_USING_I2C2 +#define BSP_USING_I2C3 +#define BSP_USING_I2C4 +#define BSP_USING_CAN +#define BSP_USING_CAN1 +#define BSP_USING_WDT +#define BSP_USING_ON_CHIP_FLASH +#define BSP_USING_TIM +#define BSP_USING_TIM2 +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/libs/freemodbus/SConscript b/libs/freemodbus/SConscript deleted file mode 100644 index 6514cf2..0000000 --- a/libs/freemodbus/SConscript +++ /dev/null @@ -1,69 +0,0 @@ -Import('RTT_ROOT') -from building import * - -src = Split(""" -modbus/functions/mbfuncdiag.c -modbus/functions/mbutils.c -modbus/functions/mbfuncother.c -modbus/rtu/mbcrc.c -port/port.c -""") - -master_rtu_src = Split(""" -modbus/functions/mbfunccoils_m.c -modbus/functions/mbfuncdisc_m.c -modbus/functions/mbfuncholding_m.c -modbus/functions/mbfuncinput_m.c -modbus/rtu/mbrtu_m.c -modbus/mb_m.c -port/portevent_m.c -port/portserial_m.c -port/porttimer_m.c -port/user_mb_app_m.c -""") - -slave_src = Split(""" -modbus/functions/mbfunccoils.c -modbus/functions/mbfuncdisc.c -modbus/functions/mbfuncholding.c -modbus/functions/mbfuncinput.c -modbus/mb.c -port/portevent.c -port/portserial.c -port/porttcp.c -port/porttimer.c -port/user_mb_app.c -""") - -# The set of source files associated with this SConscript file. -path = [GetCurrentDir() + '/modbus/include', - GetCurrentDir() + '/modbus/rtu', - GetCurrentDir() + '/modbus/ascii', - GetCurrentDir() + '/modbus/tcp', - GetCurrentDir() + '/port'] - -if GetDepend(['PKG_MODBUS_MASTER_RTU']): - src += master_rtu_src - -if GetDepend(['PKG_MODBUS_SLAVE']): - src += slave_src - -if GetDepend(['PKG_MODBUS_SLAVE_RTU']): - src += ['modbus/rtu/mbrtu.c'] - -if GetDepend(['PKG_MODBUS_SLAVE_ASCII']): - src += ['modbus/ascii/mbascii.c'] - src += ['modbus/rtu/mbrtu.c'] - -if GetDepend(['PKG_MODBUS_SLAVE_TCP']): - src += ['modbus/tcp/mbtcp.c'] - -if GetDepend(['PKG_MODBUS_MASTER_SAMPLE']): - src += ['samples/sample_mb_master.c'] - -if GetDepend(['PKG_MODBUS_SLAVE_SAMPLE']): - src += ['samples/sample_mb_slave.c'] - -group = DefineGroup('FreeModbus', src, depend = ['PKG_USING_FREEMODBUS'], CPPPATH = path) - -Return('group') diff --git a/libs/freemodbus/modbus/ascii/mbascii.c b/libs/freemodbus/modbus/ascii/mbascii.c deleted file mode 100644 index 5ed4a26..0000000 --- a/libs/freemodbus/modbus/ascii/mbascii.c +++ /dev/null @@ -1,486 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.c,v 1.15 2007/02/18 23:46:48 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbascii.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -#if MB_SLAVE_ASCII_ENABLED > 0 - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_ASCII_DEFAULT_CR '\r' /*!< Default CR character for Modbus ASCII. */ -#define MB_ASCII_DEFAULT_LF '\n' /*!< Default LF character for Modbus ASCII. */ -#define MB_SER_PDU_SIZE_MIN 3 /*!< Minimum size of a Modbus ASCII frame. */ -#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus ASCII frame. */ -#define MB_SER_PDU_SIZE_LRC 1 /*!< Size of LRC field in PDU. */ -#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ -#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_RX_RCV, /*!< Frame is beeing received. */ - STATE_RX_WAIT_EOF /*!< Wait for End of Frame. */ -} eMBRcvState; - -typedef enum -{ - STATE_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_TX_START, /*!< Starting transmission (':' sent). */ - STATE_TX_DATA, /*!< Sending of data (Address, Data, LRC). */ - STATE_TX_END, /*!< End of transmission. */ - STATE_TX_NOTIFY /*!< Notify sender that the frame has been sent. */ -} eMBSndState; - -typedef enum -{ - BYTE_HIGH_NIBBLE, /*!< Character for high nibble of byte. */ - BYTE_LOW_NIBBLE /*!< Character for low nibble of byte. */ -} eMBBytePos; - -/* ----------------------- Static functions ---------------------------------*/ -static UCHAR prvucMBCHAR2BIN( UCHAR ucCharacter ); - -static UCHAR prvucMBBIN2CHAR( UCHAR ucByte ); - -static UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen ); - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBSndState eSndState; -static volatile eMBRcvState eRcvState; - -/* We reuse the Modbus RTU buffer because only one buffer is needed and the - * RTU buffer is bigger. */ -extern volatile UCHAR ucRTUBuf[]; -static volatile UCHAR *ucASCIIBuf = ucRTUBuf; - -static volatile USHORT usRcvBufferPos; -static volatile eMBBytePos eBytePos; - -static volatile UCHAR *pucSndBufferCur; -static volatile USHORT usSndBufferCount; - -static volatile UCHAR ucLRC; -static volatile UCHAR ucMBLFCharacter; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ( void )ucSlaveAddress; - - ENTER_CRITICAL_SECTION( ); - ucMBLFCharacter = MB_ASCII_DEFAULT_LF; - - if( xMBPortSerialInit( ucPort, ulBaudRate, 7, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else if( xMBPortTimersInit( MB_ASCII_TIMEOUT_SEC * 20000UL ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBASCIIStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( TRUE, FALSE ); - eRcvState = STATE_RX_IDLE; - EXIT_CRITICAL_SECTION( ); - - /* No special startup required for ASCII. */ - ( void )xMBPortEventPost( EV_READY ); -} - -void -eMBASCIIStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBPortSerialEnable( FALSE, FALSE ); - vMBPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - ENTER_CRITICAL_SECTION( ); - assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ); - - /* Length and CRC check */ - if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) - && ( prvucMBLRC( ( UCHAR * ) ucASCIIBuf, usRcvBufferPos ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = ucASCIIBuf[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF]; - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBASCIISend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR usLRC; - - ENTER_CRITICAL_SECTION( ); - /* Check if the receiver is still in idle state. If not we where too - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_RX_IDLE ) - { - /* First byte before the Modbus-PDU is the slave address. */ - pucSndBufferCur = ( UCHAR * ) pucFrame - 1; - usSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usSndBufferCount += usLength; - - /* Calculate LRC checksum for Modbus-Serial-Line-PDU. */ - usLRC = prvucMBLRC( ( UCHAR * ) pucSndBufferCur, usSndBufferCount ); - ucASCIIBuf[usSndBufferCount++] = usLRC; - - /* Activate the transmitter. */ - eSndState = STATE_TX_START; - vMBPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -BOOL -xMBASCIIReceiveFSM( void ) -{ - BOOL xNeedPoll = FALSE; - UCHAR ucByte; - UCHAR ucResult; - - assert( eSndState == STATE_TX_IDLE ); - - ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte ); - switch ( eRcvState ) - { - /* A new character is received. If the character is a ':' the input - * buffer is cleared. A CR-character signals the end of the data - * block. Other characters are part of the data block and their - * ASCII value is converted back to a binary representation. - */ - case STATE_RX_RCV: - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - if( ucByte == ':' ) - { - /* Empty receive buffer. */ - eBytePos = BYTE_HIGH_NIBBLE; - usRcvBufferPos = 0; - } - else if( ucByte == MB_ASCII_DEFAULT_CR ) - { - eRcvState = STATE_RX_WAIT_EOF; - } - else - { - ucResult = prvucMBCHAR2BIN( ucByte ); - switch ( eBytePos ) - { - /* High nibble of the byte comes first. We check for - * a buffer overflow here. */ - case BYTE_HIGH_NIBBLE: - if( usRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - ucASCIIBuf[usRcvBufferPos] = ( UCHAR )( ucResult << 4 ); - eBytePos = BYTE_LOW_NIBBLE; - break; - } - else - { - /* not handled in Modbus specification but seems - * a resonable implementation. */ - eRcvState = STATE_RX_IDLE; - /* Disable previously activated timer because of error state. */ - vMBPortTimersDisable( ); - } - break; - - case BYTE_LOW_NIBBLE: - ucASCIIBuf[usRcvBufferPos] |= ucResult; - usRcvBufferPos++; - eBytePos = BYTE_HIGH_NIBBLE; - break; - } - } - break; - - case STATE_RX_WAIT_EOF: - if( ucByte == ucMBLFCharacter ) - { - /* Disable character timeout timer because all characters are - * received. */ - vMBPortTimersDisable( ); - /* Receiver is again in idle state. */ - eRcvState = STATE_RX_IDLE; - - /* Notify the caller of eMBASCIIReceive that a new frame - * was received. */ - xNeedPoll = xMBPortEventPost( EV_FRAME_RECEIVED ); - } - else if( ucByte == ':' ) - { - /* Empty receive buffer and back to receive state. */ - eBytePos = BYTE_HIGH_NIBBLE; - usRcvBufferPos = 0; - eRcvState = STATE_RX_RCV; - - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - } - else - { - /* Frame is not okay. Delete entire frame. */ - eRcvState = STATE_RX_IDLE; - } - break; - - case STATE_RX_IDLE: - if( ucByte == ':' ) - { - /* Enable timer for character timeout. */ - vMBPortTimersEnable( ); - /* Reset the input buffers to store the frame. */ - usRcvBufferPos = 0;; - eBytePos = BYTE_HIGH_NIBBLE; - eRcvState = STATE_RX_RCV; - } - break; - } - - return xNeedPoll; -} - -BOOL -xMBASCIITransmitFSM( void ) -{ - BOOL xNeedPoll = FALSE; - UCHAR ucByte; - - assert( eRcvState == STATE_RX_IDLE ); - switch ( eSndState ) - { - /* Start of transmission. The start of a frame is defined by sending - * the character ':'. */ - case STATE_TX_START: - ucByte = ':'; - xMBPortSerialPutByte( ( CHAR )ucByte ); - eSndState = STATE_TX_DATA; - eBytePos = BYTE_HIGH_NIBBLE; - break; - - /* Send the data block. Each data byte is encoded as a character hex - * stream with the high nibble sent first and the low nibble sent - * last. If all data bytes are exhausted we send a '\r' character - * to end the transmission. */ - case STATE_TX_DATA: - if( usSndBufferCount > 0 ) - { - switch ( eBytePos ) - { - case BYTE_HIGH_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur >> 4 ) ); - xMBPortSerialPutByte( ( CHAR ) ucByte ); - eBytePos = BYTE_LOW_NIBBLE; - break; - - case BYTE_LOW_NIBBLE: - ucByte = prvucMBBIN2CHAR( ( UCHAR )( *pucSndBufferCur & 0x0F ) ); - xMBPortSerialPutByte( ( CHAR )ucByte ); - pucSndBufferCur++; - eBytePos = BYTE_HIGH_NIBBLE; - usSndBufferCount--; - break; - } - } - else - { - xMBPortSerialPutByte( MB_ASCII_DEFAULT_CR ); - eSndState = STATE_TX_END; - } - break; - - /* Finish the frame by sending a LF character. */ - case STATE_TX_END: - xMBPortSerialPutByte( ( CHAR )ucMBLFCharacter ); - /* We need another state to make sure that the CR character has - * been sent. */ - eSndState = STATE_TX_NOTIFY; - break; - - /* Notify the task which called eMBASCIISend that the frame has - * been sent. */ - case STATE_TX_NOTIFY: - eSndState = STATE_TX_IDLE; - xNeedPoll = xMBPortEventPost( EV_FRAME_SENT ); - - /* Disable transmitter. This prevents another transmit buffer - * empty interrupt. */ - vMBPortSerialEnable( TRUE, FALSE ); - eSndState = STATE_TX_IDLE; - break; - - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_TX_IDLE: - /* enable receiver/disable transmitter. */ - vMBPortSerialEnable( TRUE, FALSE ); - break; - } - - return xNeedPoll; -} - -BOOL -xMBASCIITimerT1SExpired( void ) -{ - switch ( eRcvState ) - { - /* If we have a timeout we go back to the idle state and wait for - * the next frame. - */ - case STATE_RX_RCV: - case STATE_RX_WAIT_EOF: - eRcvState = STATE_RX_IDLE; - break; - - default: - assert( ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_WAIT_EOF ) ); - break; - } - vMBPortTimersDisable( ); - - /* no context switch required. */ - return FALSE; -} - - -static UCHAR -prvucMBCHAR2BIN( UCHAR ucCharacter ) -{ - if( ( ucCharacter >= '0' ) && ( ucCharacter <= '9' ) ) - { - return ( UCHAR )( ucCharacter - '0' ); - } - else if( ( ucCharacter >= 'A' ) && ( ucCharacter <= 'F' ) ) - { - return ( UCHAR )( ucCharacter - 'A' + 0x0A ); - } - else - { - return 0xFF; - } -} - -static UCHAR -prvucMBBIN2CHAR( UCHAR ucByte ) -{ - if( ucByte <= 0x09 ) - { - return ( UCHAR )( '0' + ucByte ); - } - else if( ( ucByte >= 0x0A ) && ( ucByte <= 0x0F ) ) - { - return ( UCHAR )( ucByte - 0x0A + 'A' ); - } - else - { - /* Programming error. */ - assert( 0 ); - } - return '0'; -} - - -static UCHAR -prvucMBLRC( UCHAR * pucFrame, USHORT usLen ) -{ - UCHAR ucLRC = 0; /* LRC char initialized */ - - while( usLen-- ) - { - ucLRC += *pucFrame++; /* Add buffer byte without carry */ - } - - /* Return twos complement */ - ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) ); - return ucLRC; -} - -#endif diff --git a/libs/freemodbus/modbus/ascii/mbascii.h b/libs/freemodbus/modbus/ascii/mbascii.h deleted file mode 100644 index df308b3..0000000 --- a/libs/freemodbus/modbus/ascii/mbascii.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbascii.h,v 1.8 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_ASCII_H -#define _MB_ASCII_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if MB_SLAVE_ASCII_ENABLED > 0 -eMBErrorCode eMBASCIIInit( UCHAR slaveAddress, UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); -void eMBASCIIStart( void ); -void eMBASCIIStop( void ); - -eMBErrorCode eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBASCIISend( UCHAR slaveAddress, const UCHAR * pucFrame, - USHORT usLength ); -BOOL xMBASCIIReceiveFSM( void ); -BOOL xMBASCIITransmitFSM( void ); -BOOL xMBASCIITimerT1SExpired( void ); -#endif - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/functions/mbfunccoils_m.c b/libs/freemodbus/modbus/functions/mbfunccoils_m.c deleted file mode 100644 index 4366b49..0000000 --- a/libs/freemodbus/modbus/functions/mbfunccoils_m.c +++ /dev/null @@ -1,390 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunccoils_m.c,v 1.60 2013/10/12 15:10:12 Armink Add Master Functions - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_COILCNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -#define MB_PDU_REQ_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_REQ_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_SIZE ( 4 ) -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_REQ_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_REQ_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_REQ_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_REQ_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_REQ_WRITE_MUL_COILCNT_MAX ( 0x07B0 ) -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE ( 5 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -#if MB_FUNC_READ_COILS_ENABLED > 0 - -/** - * This function will request read coil. - * - * @param ucSndAddr salve address - * @param usCoilAddr coil start address - * @param usNCoils coil total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils ,LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_COILS; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usCoilAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usCoilAddr; - ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF ] = usNCoils >> 8; - ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF + 1] = usNCoils; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usCoilCount; - UCHAR ucByteCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if ( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF] << 8 ); - usCoilCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_COILCNT_OFF + 1] ); - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usCoilCount & 0x0007 ) != 0 ) - { - ucByteCount = ( UCHAR )( usCoilCount / 8 + 1 ); - } - else - { - ucByteCount = ( UCHAR )( usCoilCount / 8 ); - } - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usCoilCount >= 1 ) && - ( ucByteCount == pucFrame[MB_PDU_FUNC_READ_COILCNT_OFF] ) ) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegCoilsCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usCoilCount, MB_REG_READ ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - -/** - * This function will request write one coil. - * - * @param ucSndAddr salve address - * @param usCoilAddr coil start address - * @param usCoilData data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - * - * @see eMBMasterReqWriteMultipleCoils - */ -eMBMasterReqErrCode -eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( ( usCoilData != 0xFF00 ) && ( usCoilData != 0x0000 ) ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_SINGLE_COIL; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF] = usCoilAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF + 1] = usCoilAddr; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF ] = usCoilData >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF + 1] = usCoilData; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - UCHAR ucBuf[2]; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_WRITE_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - if( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF + 1] == 0x00 ) && - ( ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) || - ( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0x00 ) ) ) - { - ucBuf[1] = 0; - if( pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF] == 0xFF ) - { - ucBuf[0] = 1; - } - else - { - ucBuf[0] = 0; - } - eRegStatus = - eMBMasterRegCoilsCB( &ucBuf[0], usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - -/** - * This function will request write multiple coils. - * - * @param ucSndAddr salve address - * @param usCoilAddr coil start address - * @param usNCoils coil total number - * @param usCoilData data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - * - * @see eMBMasterReqWriteCoil - */ -eMBMasterReqErrCode -eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut) -{ - UCHAR *ucMBFrame; - USHORT usRegIndex = 0; - UCHAR ucByteCount; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( usNCoils > MB_PDU_REQ_WRITE_MUL_COILCNT_MAX ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_MULTIPLE_COILS; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] = usCoilAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1] = usCoilAddr; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_COILCNT_OFF] = usNCoils >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_COILCNT_OFF + 1] = usNCoils ; - if( ( usNCoils & 0x0007 ) != 0 ) - { - ucByteCount = ( UCHAR )( usNCoils / 8 + 1 ); - } - else - { - ucByteCount = ( UCHAR )( usNCoils / 8 ); - } - ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF] = ucByteCount; - ucMBFrame += MB_PDU_REQ_WRITE_MUL_VALUES_OFF; - while( ucByteCount > usRegIndex) - { - *ucMBFrame++ = pucDataBuffer[usRegIndex++]; - } - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + ucByteCount ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usCoilCnt; - UCHAR ucByteCount; - UCHAR ucByteCountVerify; - UCHAR *ucMBFrame; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, the *usLen is not need check. */ - if( ( *usLen == MB_PDU_FUNC_WRITE_MUL_SIZE ) || xMBMasterRequestIsBroadcast() ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usCoilCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF] << 8 ); - usCoilCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_MUL_COILCNT_OFF + 1] ); - - ucByteCount = ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF]; - - /* Compute the number of expected bytes in the request. */ - if( ( usCoilCnt & 0x0007 ) != 0 ) - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 + 1 ); - } - else - { - ucByteCountVerify = ( UCHAR )( usCoilCnt / 8 ); - } - - if( ( usCoilCnt >= 1 ) && ( ucByteCountVerify == ucByteCount ) ) - { - eRegStatus = - eMBMasterRegCoilsCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], - usRegAddress, usCoilCnt, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid write coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif -#endif diff --git a/libs/freemodbus/modbus/functions/mbfuncdiag.c b/libs/freemodbus/modbus/functions/mbfuncdiag.c deleted file mode 100644 index 20be3fc..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncdiag.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncdiag.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ diff --git a/libs/freemodbus/modbus/functions/mbfuncdisc.c b/libs/freemodbus/modbus/functions/mbfuncdisc.c deleted file mode 100644 index 5f14129..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncdisc.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_DISCCNT_MAX ( 0x07D0 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ - -#if MB_FUNC_READ_COILS_ENABLED > 0 - -eMBException -eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usDiscreteCnt; - UCHAR ucNBytes; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usDiscreteCnt = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF] << 8 ); - usDiscreteCnt |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usDiscreteCnt >= 1 ) && - ( usDiscreteCnt < MB_PDU_FUNC_READ_DISCCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_DISCRETE_INPUTS; - *usLen += 1; - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usDiscreteCnt & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR ) ( usDiscreteCnt / 8 ); - } - *pucFrameCur++ = ucNBytes; - *usLen += 1; - - eRegStatus = - eMBRegDiscreteCB( pucFrameCur, usRegAddress, usDiscreteCnt ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - /* The response contains the function code, the starting address - * and the quantity of registers. We reuse the old values in the - * buffer because they are still valid. */ - *usLen += ucNBytes;; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif diff --git a/libs/freemodbus/modbus/functions/mbfuncdisc_m.c b/libs/freemodbus/modbus/functions/mbfuncdisc_m.c deleted file mode 100644 index ca666bb..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncdisc_m.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncdisc_m.c,v 1.60 2013/10/15 8:48:20 Armink Add Master Functions Exp $ - */ - - - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_DISCCNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 - -/** - * This function will request read discrete inputs. - * - * @param ucSndAddr salve address - * @param usDiscreteAddr discrete start address - * @param usNDiscreteIn discrete total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_DISCRETE_INPUTS; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usDiscreteAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usDiscreteAddr; - ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF ] = usNDiscreteIn >> 8; - ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF + 1] = usNDiscreteIn; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usDiscreteCnt; - UCHAR ucNBytes; - UCHAR *ucMBFrame; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usDiscreteCnt = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF] << 8 ); - usDiscreteCnt |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_DISCCNT_OFF + 1] ); - - /* Test if the quantity of coils is a multiple of 8. If not last - * byte is only partially field with unused coils set to zero. */ - if( ( usDiscreteCnt & 0x0007 ) != 0 ) - { - ucNBytes = ( UCHAR )( usDiscreteCnt / 8 + 1 ); - } - else - { - ucNBytes = ( UCHAR )( usDiscreteCnt / 8 ); - } - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if ((usDiscreteCnt >= 1) && ucNBytes == pucFrame[MB_PDU_FUNC_READ_DISCCNT_OFF]) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegDiscreteCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usDiscreteCnt ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read coil register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif -#endif diff --git a/libs/freemodbus/modbus/functions/mbfuncholding_m.c b/libs/freemodbus/modbus/functions/mbfuncholding_m.c deleted file mode 100644 index 999c9a1..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncholding_m.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncholding_m.c,v 1.60 2013/09/02 14:13:40 Armink Add Master Functions Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) -#define MB_PDU_FUNC_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -#define MB_PDU_REQ_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_REQ_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_SIZE ( 4 ) -#define MB_PDU_FUNC_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 0) -#define MB_PDU_FUNC_WRITE_VALUE_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_SIZE ( 4 ) - -#define MB_PDU_REQ_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_REQ_WRITE_MUL_VALUES_OFF ( MB_PDU_DATA_OFF + 5 ) -#define MB_PDU_REQ_WRITE_MUL_SIZE_MIN ( 5 ) -#define MB_PDU_REQ_WRITE_MUL_REGCNT_MAX ( 0x0078 ) -#define MB_PDU_FUNC_WRITE_MUL_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_WRITE_MUL_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_WRITE_MUL_SIZE ( 4 ) - -#define MB_PDU_REQ_READWRITE_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READWRITE_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF ( MB_PDU_DATA_OFF + 4 ) -#define MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF ( MB_PDU_DATA_OFF + 6 ) -#define MB_PDU_REQ_READWRITE_WRITE_BYTECNT_OFF ( MB_PDU_DATA_OFF + 8 ) -#define MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF ( MB_PDU_DATA_OFF + 9 ) -#define MB_PDU_REQ_READWRITE_SIZE_MIN ( 9 ) -#define MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READWRITE_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READWRITE_SIZE_MIN ( 1 ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - -/** - * This function will request write holding register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usRegData register data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_REGISTER; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF] = usRegData >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_VALUE_OFF + 1] = usRegData ; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_SIZE ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_WRITE_ADDR_OFF + 1] ); - usRegAddress++; - - /* Make callback to update the value. */ - eRegStatus = eMBMasterRegHoldingCB( &pucFrame[MB_PDU_FUNC_WRITE_VALUE_OFF], - usRegAddress, 1, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - -/** - * This function will request write multiple holding register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usNRegs register total number - * @param pusDataBuffer data to be written - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usRegAddr, USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - USHORT usRegIndex = 0; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_WRITE_MULTIPLE_REGISTERS; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF] = usNRegs >> 8; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF + 1] = usNRegs ; - ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF] = usNRegs * 2; - ucMBFrame += MB_PDU_REQ_WRITE_MUL_VALUES_OFF; - while( usNRegs > usRegIndex) - { - *ucMBFrame++ = pusDataBuffer[usRegIndex] >> 8; - *ucMBFrame++ = pusDataBuffer[usRegIndex++] ; - } - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_WRITE_MUL_SIZE_MIN + 2*usNRegs ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usRegCount; - UCHAR ucRegByteCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, the *usLen is not need check. */ - if( ( *usLen == MB_PDU_SIZE_MIN + MB_PDU_FUNC_WRITE_MUL_SIZE ) || xMBMasterRequestIsBroadcast() ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_WRITE_MUL_REGCNT_OFF + 1] ); - - ucRegByteCount = ucMBFrame[MB_PDU_REQ_WRITE_MUL_BYTECNT_OFF]; - - if( ucRegByteCount == 2 * usRegCount ) - { - /* Make callback to update the register values. */ - eRegStatus = - eMBMasterRegHoldingCB( &ucMBFrame[MB_PDU_REQ_WRITE_MUL_VALUES_OFF], - usRegAddress, usRegCount, MB_REG_WRITE ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - -/** - * This function will request read holding register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usNRegs register total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_HOLDING_REGISTER; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] = usNRegs >> 8; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] = usNRegs; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usRegCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame[MB_PDU_FUNC_READ_BYTECNT_OFF] ) ) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegHoldingCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount, MB_REG_READ ); - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - -/** - * This function will request read and write holding register. - * - * @param ucSndAddr salve address - * @param usReadRegAddr read register start address - * @param usNReadRegs read register total number - * @param pusDataBuffer data to be written - * @param usWriteRegAddr write register start address - * @param usNWriteRegs write register total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - USHORT usRegIndex = 0; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READWRITE_MULTIPLE_REGISTERS; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] = usReadRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF + 1] = usReadRegAddr; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF] = usNReadRegs >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF + 1] = usNReadRegs ; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF] = usWriteRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF + 1] = usWriteRegAddr; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF] = usNWriteRegs >> 8; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF + 1] = usNWriteRegs ; - ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_BYTECNT_OFF] = usNWriteRegs * 2; - ucMBFrame += MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF; - while( usNWriteRegs > usRegIndex) - { - *ucMBFrame++ = pusDataBuffer[usRegIndex] >> 8; - *ucMBFrame++ = pusDataBuffer[usRegIndex++] ; - } - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READWRITE_SIZE_MIN + 2*usNWriteRegs ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegReadAddress; - USHORT usRegReadCount; - USHORT usRegWriteAddress; - USHORT usRegWriteCount; - UCHAR *ucMBFrame; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READWRITE_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegReadAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF] << 8U ); - usRegReadAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_ADDR_OFF + 1] ); - usRegReadAddress++; - - usRegReadCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF] << 8U ); - usRegReadCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_READ_REGCNT_OFF + 1] ); - - usRegWriteAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF] << 8U ); - usRegWriteAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_ADDR_OFF + 1] ); - usRegWriteAddress++; - - usRegWriteCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF] << 8U ); - usRegWriteCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_REGCNT_OFF + 1] ); - - if( ( 2 * usRegReadCount ) == pucFrame[MB_PDU_FUNC_READWRITE_READ_BYTECNT_OFF] ) - { - /* Make callback to update the register values. */ - eRegStatus = eMBMasterRegHoldingCB( &ucMBFrame[MB_PDU_REQ_READWRITE_WRITE_VALUES_OFF], - usRegWriteAddress, usRegWriteCount, MB_REG_WRITE ); - - if( eRegStatus == MB_ENOERR ) - { - /* Make the read callback. */ - eRegStatus = eMBMasterRegHoldingCB(&pucFrame[MB_PDU_FUNC_READWRITE_READ_VALUES_OFF], - usRegReadAddress, usRegReadCount, MB_REG_READ); - } - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - return eStatus; -} - -#endif -#endif - diff --git a/libs/freemodbus/modbus/functions/mbfuncinput.c b/libs/freemodbus/modbus/functions/mbfuncinput.c deleted file mode 100644 index 9260550..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncinput.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncinput.c,v 1.10 2007/09/12 10:15:56 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_FUNC_READ_ADDR_OFF ( MB_PDU_DATA_OFF ) -#define MB_PDU_FUNC_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_FUNC_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_REGCNT_MAX ( 0x007D ) - -#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_FUNC_READ_INPUT_ENABLED > 0 - -eMBException -eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - USHORT usRegAddress; - USHORT usRegCount; - UCHAR *pucFrameCur; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) - { - usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) - && ( usRegCount < MB_PDU_FUNC_READ_REGCNT_MAX ) ) - { - /* Set the current PDU data pointer to the beginning. */ - pucFrameCur = &pucFrame[MB_PDU_FUNC_OFF]; - *usLen = MB_PDU_FUNC_OFF; - - /* First byte contains the function code. */ - *pucFrameCur++ = MB_FUNC_READ_INPUT_REGISTER; - *usLen += 1; - - /* Second byte in the response contain the number of bytes. */ - *pucFrameCur++ = ( UCHAR )( usRegCount * 2 ); - *usLen += 1; - - eRegStatus = - eMBRegInputCB( pucFrameCur, usRegAddress, usRegCount ); - - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - else - { - *usLen += usRegCount * 2; - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid read input register request because the length - * is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif diff --git a/libs/freemodbus/modbus/functions/mbfuncinput_m.c b/libs/freemodbus/modbus/functions/mbfuncinput_m.c deleted file mode 100644 index 7e6cb19..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncinput_m.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncinput_m.c,v 1.60 2013/10/12 14:23:40 Armink Add Master Functions Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_REQ_READ_ADDR_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_REQ_READ_REGCNT_OFF ( MB_PDU_DATA_OFF + 2 ) -#define MB_PDU_REQ_READ_SIZE ( 4 ) -#define MB_PDU_FUNC_READ_BYTECNT_OFF ( MB_PDU_DATA_OFF + 0 ) -#define MB_PDU_FUNC_READ_VALUES_OFF ( MB_PDU_DATA_OFF + 1 ) -#define MB_PDU_FUNC_READ_SIZE_MIN ( 1 ) - -#define MB_PDU_FUNC_READ_RSP_BYTECNT_OFF ( MB_PDU_DATA_OFF ) - -/* ----------------------- Static functions ---------------------------------*/ -eMBException prveMBError2Exception( eMBErrorCode eErrorCode ); - -/* ----------------------- Start implementation -----------------------------*/ -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -#if MB_FUNC_READ_INPUT_ENABLED > 0 - -/** - * This function will request read input register. - * - * @param ucSndAddr salve address - * @param usRegAddr register start address - * @param usNRegs register total number - * @param lTimeOut timeout (-1 will waiting forever) - * - * @return error code - */ -eMBMasterReqErrCode -eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ) -{ - UCHAR *ucMBFrame; - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - - if ( ucSndAddr > MB_MASTER_TOTAL_SLAVE_NUM ) eErrStatus = MB_MRE_ILL_ARG; - else if ( xMBMasterRunResTake( lTimeOut ) == FALSE ) eErrStatus = MB_MRE_MASTER_BUSY; - else - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - vMBMasterSetDestAddress(ucSndAddr); - ucMBFrame[MB_PDU_FUNC_OFF] = MB_FUNC_READ_INPUT_REGISTER; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] = usRegAddr >> 8; - ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] = usRegAddr; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] = usNRegs >> 8; - ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] = usNRegs; - vMBMasterSetPDUSndLength( MB_PDU_SIZE_MIN + MB_PDU_REQ_READ_SIZE ); - ( void ) xMBMasterPortEventPost( EV_MASTER_FRAME_SENT ); - eErrStatus = eMBMasterWaitRequestFinish( ); - } - return eErrStatus; -} - -eMBException -eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ) -{ - UCHAR *ucMBFrame; - USHORT usRegAddress; - USHORT usRegCount; - - eMBException eStatus = MB_EX_NONE; - eMBErrorCode eRegStatus; - - /* If this request is broadcast, and it's read mode. This request don't need execute. */ - if ( xMBMasterRequestIsBroadcast() ) - { - eStatus = MB_EX_NONE; - } - else if( *usLen >= MB_PDU_SIZE_MIN + MB_PDU_FUNC_READ_SIZE_MIN ) - { - vMBMasterGetPDUSndBuf(&ucMBFrame); - usRegAddress = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF] << 8 ); - usRegAddress |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_ADDR_OFF + 1] ); - usRegAddress++; - - usRegCount = ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF] << 8 ); - usRegCount |= ( USHORT )( ucMBFrame[MB_PDU_REQ_READ_REGCNT_OFF + 1] ); - - /* Check if the number of registers to read is valid. If not - * return Modbus illegal data value exception. - */ - if( ( usRegCount >= 1 ) && ( 2 * usRegCount == pucFrame[MB_PDU_FUNC_READ_BYTECNT_OFF] ) ) - { - /* Make callback to fill the buffer. */ - eRegStatus = eMBMasterRegInputCB( &pucFrame[MB_PDU_FUNC_READ_VALUES_OFF], usRegAddress, usRegCount ); - /* If an error occured convert it into a Modbus exception. */ - if( eRegStatus != MB_ENOERR ) - { - eStatus = prveMBError2Exception( eRegStatus ); - } - } - else - { - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - } - else - { - /* Can't be a valid request because the length is incorrect. */ - eStatus = MB_EX_ILLEGAL_DATA_VALUE; - } - return eStatus; -} - -#endif -#endif diff --git a/libs/freemodbus/modbus/functions/mbfuncother.c b/libs/freemodbus/modbus/functions/mbfuncother.c deleted file mode 100644 index 6161894..0000000 --- a/libs/freemodbus/modbus/functions/mbfuncother.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfuncother.c,v 1.8 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbconfig.h" - -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - -/* ----------------------- Static variables ---------------------------------*/ -static UCHAR ucMBSlaveID[MB_FUNC_OTHER_REP_SLAVEID_BUF]; -static USHORT usMBSlaveIDLen; - -/* ----------------------- Start implementation -----------------------------*/ - -eMBErrorCode -eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, - UCHAR const *pucAdditional, USHORT usAdditionalLen ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* the first byte and second byte in the buffer is reserved for - * the parameter ucSlaveID and the running flag. The rest of - * the buffer is available for additional data. */ - if( usAdditionalLen + 2 < MB_FUNC_OTHER_REP_SLAVEID_BUF ) - { - usMBSlaveIDLen = 0; - ucMBSlaveID[usMBSlaveIDLen++] = ucSlaveID; - ucMBSlaveID[usMBSlaveIDLen++] = ( UCHAR )( xIsRunning ? 0xFF : 0x00 ); - if( usAdditionalLen > 0 ) - { - memcpy( &ucMBSlaveID[usMBSlaveIDLen], pucAdditional, - ( size_t )usAdditionalLen ); - usMBSlaveIDLen += usAdditionalLen; - } - } - else - { - eStatus = MB_ENORES; - } - return eStatus; -} - -eMBException -eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ) -{ - memcpy( &pucFrame[MB_PDU_DATA_OFF], &ucMBSlaveID[0], ( size_t )usMBSlaveIDLen ); - *usLen = ( USHORT )( MB_PDU_DATA_OFF + usMBSlaveIDLen ); - return MB_EX_NONE; -} - -#endif diff --git a/libs/freemodbus/modbus/functions/mbutils.c b/libs/freemodbus/modbus/functions/mbutils.c deleted file mode 100644 index b32a596..0000000 --- a/libs/freemodbus/modbus/functions/mbutils.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbutils.c,v 1.6 2007/02/18 23:49:07 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbproto.h" - -/* ----------------------- Defines ------------------------------------------*/ -#define BITS_UCHAR 8U - -/* ----------------------- Start implementation -----------------------------*/ -void -xMBUtilSetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits, - UCHAR ucValue ) -{ - USHORT usWordBuf; - USHORT usMask; - USHORT usByteOffset; - USHORT usNPreBits; - USHORT usValue = ucValue; - - RT_ASSERT( ucNBits <= 8 ); - RT_ASSERT( ( size_t )BITS_UCHAR == sizeof( UCHAR ) * 8 ); - - /* Calculate byte offset for first byte containing the bit values starting - * at usBitOffset. */ - usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); - - /* How many bits precede our bits to set. */ - usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); - - /* Move bit field into position over bits to set */ - usValue <<= usNPreBits; - - /* Prepare a mask for setting the new bits. */ - usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); - usMask <<= usBitOffset - usByteOffset * BITS_UCHAR; - - /* copy bits into temporary storage. */ - usWordBuf = ucByteBuf[usByteOffset]; - usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; - - /* Zero out bit field bits and then or value bits into them. */ - usWordBuf = ( USHORT )( ( usWordBuf & ( ~usMask ) ) | usValue ); - - /* move bits back into storage */ - ucByteBuf[usByteOffset] = ( UCHAR )( usWordBuf & 0xFF ); - ucByteBuf[usByteOffset + 1] = ( UCHAR )( usWordBuf >> BITS_UCHAR ); -} - -UCHAR -xMBUtilGetBits( UCHAR * ucByteBuf, USHORT usBitOffset, UCHAR ucNBits ) -{ - USHORT usWordBuf; - USHORT usMask; - USHORT usByteOffset; - USHORT usNPreBits; - - /* Calculate byte offset for first byte containing the bit values starting - * at usBitOffset. */ - usByteOffset = ( USHORT )( ( usBitOffset ) / BITS_UCHAR ); - - /* How many bits precede our bits to set. */ - usNPreBits = ( USHORT )( usBitOffset - usByteOffset * BITS_UCHAR ); - - /* Prepare a mask for setting the new bits. */ - usMask = ( USHORT )( ( 1 << ( USHORT ) ucNBits ) - 1 ); - - /* copy bits into temporary storage. */ - usWordBuf = ucByteBuf[usByteOffset]; - usWordBuf |= ucByteBuf[usByteOffset + 1] << BITS_UCHAR; - - /* throw away unneeded bits. */ - usWordBuf >>= usNPreBits; - - /* mask away bits above the requested bitfield. */ - usWordBuf &= usMask; - - return ( UCHAR ) usWordBuf; -} - -eMBException -prveMBError2Exception( eMBErrorCode eErrorCode ) -{ - eMBException eStatus; - - switch ( eErrorCode ) - { - case MB_ENOERR: - eStatus = MB_EX_NONE; - break; - - case MB_ENOREG: - eStatus = MB_EX_ILLEGAL_DATA_ADDRESS; - break; - - case MB_ETIMEDOUT: - eStatus = MB_EX_SLAVE_BUSY; - break; - - default: - eStatus = MB_EX_SLAVE_DEVICE_FAILURE; - break; - } - - return eStatus; -} diff --git a/libs/freemodbus/modbus/include/mb_m.h b/libs/freemodbus/modbus/include/mb_m.h deleted file mode 100644 index 35eff37..0000000 --- a/libs/freemodbus/modbus/include/mb_m.h +++ /dev/null @@ -1,416 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb_m.h,v 1.60 2013/09/03 10:20:05 Armink Add Master Functions $ - */ - -#ifndef _MB_M_H -#define _MB_M_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*! \defgroup modbus Modbus - * \code #include "mb_m.h" \endcode - * - * This module defines the interface for the application. It contains - * the basic functions and types required to use the Modbus Master protocol stack. - * A typical application will want to call eMBMasterInit() first. If the device - * is ready to answer network requests it must then call eMBEnable() to activate - * the protocol stack. In the main loop the function eMBMasterPoll() must be called - * periodically. The time interval between pooling depends on the configured - * Modbus timeout. If an RTOS is available a separate task should be created - * and the task should always call the function eMBMasterPoll(). - * - * \code - * // Initialize protocol stack in RTU mode for a Master - * eMBMasterInit( MB_RTU, 38400, MB_PAR_EVEN ); - * // Enable the Modbus Protocol Stack. - * eMBMasterEnable( ); - * for( ;; ) - * { - * // Call the main polling loop of the Modbus Master protocol stack. - * eMBMasterPoll( ); - * ... - * } - * \endcode - */ - -/* ----------------------- Defines ------------------------------------------*/ - -/*! \ingroup modbus - * \brief Use the default Modbus Master TCP port (502) - */ -#define MB_MASTER_TCP_PORT_USE_DEFAULT 0 - -/* ----------------------- Type definitions ---------------------------------*/ -/*! \ingroup modbus - * \brief Errorcodes used by all function in the Master request. - */ -typedef enum -{ - MB_MRE_NO_ERR, /*!< no error. */ - MB_MRE_NO_REG, /*!< illegal register address. */ - MB_MRE_ILL_ARG, /*!< illegal argument. */ - MB_MRE_REV_DATA, /*!< receive data error. */ - MB_MRE_TIMEDOUT, /*!< timeout error occurred. */ - MB_MRE_MASTER_BUSY, /*!< master is busy now. */ - MB_MRE_EXE_FUN /*!< execute function error. */ -} eMBMasterReqErrCode; -/*! \ingroup modbus - * \brief TimerMode is Master 3 kind of Timer modes. - */ -typedef enum -{ - MB_TMODE_T35, /*!< Master receive frame T3.5 timeout. */ - MB_TMODE_RESPOND_TIMEOUT, /*!< Master wait respond for slave. */ - MB_TMODE_CONVERT_DELAY /*!< Master sent broadcast ,then delay sometime.*/ -}eMBMasterTimerMode; - -/* ----------------------- Function prototypes ------------------------------*/ -/*! \ingroup modbus - * \brief Initialize the Modbus Master protocol stack. - * - * This functions initializes the ASCII or RTU module and calls the - * init functions of the porting layer to prepare the hardware. Please - * note that the receiver is still disabled and no Modbus frames are - * processed until eMBMasterEnable( ) has been called. - * - * \param eMode If ASCII or RTU mode should be used. - * \param ucPort The port to use. E.g. 1 for COM1 on windows. This value - * is platform dependent and some ports simply choose to ignore it. - * \param ulBaudRate The baudrate. E.g. 19200. Supported baudrates depend - * on the porting layer. - * \param eParity Parity used for serial transmission. - * - * \return If no error occurs the function returns eMBErrorCode::MB_ENOERR. - * The protocol is then in the disabled state and ready for activation - * by calling eMBMasterEnable( ). Otherwise one of the following error codes - * is returned: - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBMasterInit( eMBMode eMode, UCHAR ucPort, - ULONG ulBaudRate, eMBParity eParity ); - -/*! \ingroup modbus - * \brief Initialize the Modbus Master protocol stack for Modbus TCP. - * - * This function initializes the Modbus TCP Module. Please note that - * frame processing is still disabled until eMBEnable( ) is called. - * - * \param usTCPPort The TCP port to listen on. - * \return If the protocol stack has been initialized correctly the function - * returns eMBErrorCode::MB_ENOERR. Otherwise one of the following error - * codes is returned: - * - eMBErrorCode::MB_EINVAL If the slave address was not valid. Valid - * slave addresses are in the range 1 - 247. - * - eMBErrorCode::MB_EPORTERR IF the porting layer returned an error. - */ -eMBErrorCode eMBMasterTCPInit( USHORT usTCPPort ); - -/*! \ingroup modbus - * \brief Release resources used by the protocol stack. - * - * This function disables the Modbus Master protocol stack and release all - * hardware resources. It must only be called when the protocol stack - * is disabled. - * - * \note Note all ports implement this function. A port which wants to - * get an callback must define the macro MB_PORT_HAS_CLOSE to 1. - * - * \return If the resources where released it return eMBErrorCode::MB_ENOERR. - * If the protocol stack is not in the disabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBMasterClose( void ); - -/*! \ingroup modbus - * \brief Enable the Modbus Master protocol stack. - * - * This function enables processing of Modbus Master frames. Enabling the protocol - * stack is only possible if it is in the disabled state. - * - * \return If the protocol stack is now in the state enabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the disabled state it - * return eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBMasterEnable( void ); - -/*! \ingroup modbus - * \brief Disable the Modbus Master protocol stack. - * - * This function disables processing of Modbus frames. - * - * \return If the protocol stack has been disabled it returns - * eMBErrorCode::MB_ENOERR. If it was not in the enabled state it returns - * eMBErrorCode::MB_EILLSTATE. - */ -eMBErrorCode eMBMasterDisable( void ); - -/*! \ingroup modbus - * \brief Check the Modbus Master protocol stack has established or not. - * - * This function must be called and check the return value before calling - * any other functions. - * - * \return If the protocol stack has been established or not - * TRUE. the protocol stack has established - * FALSE. the protocol stack hasn't established - */ -BOOL eMBMasterIsEstablished( void ); - -/*! \ingroup modbus - * \brief The main pooling loop of the Modbus Master protocol stack. - * - * This function must be called periodically. The timer interval required - * is given by the application dependent Modbus slave timeout. Internally the - * function calls xMBMasterPortEventGet() and waits for an event from the receiver or - * transmitter state machines. - * - * \return If the protocol stack is not in the enabled state the function - * returns eMBErrorCode::MB_EILLSTATE. Otherwise it returns - * eMBErrorCode::MB_ENOERR. - */ -eMBErrorCode eMBMasterPoll( void ); - -/*! \ingroup modbus - * \brief Registers a callback handler for a given function code. - * - * This function registers a new callback handler for a given function code. - * The callback handler supplied is responsible for interpreting the Modbus PDU and - * the creation of an appropriate response. In case of an error it should return - * one of the possible Modbus exceptions which results in a Modbus exception frame - * sent by the protocol stack. - * - * \param ucFunctionCode The Modbus function code for which this handler should - * be registers. Valid function codes are in the range 1 to 127. - * \param pxHandler The function handler which should be called in case - * such a frame is received. If \c NULL a previously registered function handler - * for this function code is removed. - * - * \return eMBErrorCode::MB_ENOERR if the handler has been installed. If no - * more resources are available it returns eMBErrorCode::MB_ENORES. In this - * case the values in mbconfig.h should be adjusted. If the argument was not - * valid it returns eMBErrorCode::MB_EINVAL. - */ -eMBErrorCode eMBMasterRegisterCB( UCHAR ucFunctionCode, - pxMBFunctionHandler pxHandler ); - -/* ----------------------- Callback -----------------------------------------*/ - -/*! \defgroup modbus_master registers Modbus Registers - * \code #include "mb_m.h" \endcode - * The protocol stack does not internally allocate any memory for the - * registers. This makes the protocol stack very small and also usable on - * low end targets. In addition the values don't have to be in the memory - * and could for example be stored in a flash.
- * Whenever the protocol stack requires a value it calls one of the callback - * function with the register address and the number of registers to read - * as an argument. The application should then read the actual register values - * (for example the ADC voltage) and should store the result in the supplied - * buffer.
- * If the protocol stack wants to update a register value because a write - * register function was received a buffer with the new register values is - * passed to the callback function. The function should then use these values - * to update the application register values. - */ - -/*! \ingroup modbus_registers - * \brief Callback function used if the value of a Input Register - * is required by the protocol stack. The starting register address is given - * by \c usAddress and the last register is given by usAddress + - * usNRegs - 1. - * - * \param pucRegBuffer A buffer where the callback function should write - * the current value of the modbus registers to. - * \param usAddress The starting address of the register. Input registers - * are in the range 1 - 65535. - * \param usNRegs Number of registers the callback function must supply. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Holding Register value is - * read or written by the protocol stack. The starting register address - * is given by \c usAddress and the last register is given by - * usAddress + usNRegs - 1. - * - * \param pucRegBuffer If the application registers values should be updated the - * buffer points to the new registers values. If the protocol stack needs - * to now the current values the callback function should write them into - * this buffer. - * \param usAddress The starting address of the register. - * \param usNRegs Number of registers to read or write. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application register - * values should be updated from the values in the buffer. For example - * this would be the case when the Modbus master has issued an - * WRITE SINGLE REGISTER command. - * If the value eMBRegisterMode::MB_REG_READ the application should copy - * the current values into the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Coil Register value is - * read or written by the protocol stack. If you are going to use - * this function you might use the functions xMBUtilSetBits( ) and - * xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The bits are packed in bytes where the first coil - * starting at address \c usAddress is stored in the LSB of the - * first byte in the buffer pucRegBuffer. - * If the buffer should be written by the callback function unused - * coil values (I.e. if not a multiple of eight coils is used) should be set - * to zero. - * \param usAddress The first coil number. - * \param usNCoils Number of coil values requested. - * \param eMode If eMBRegisterMode::MB_REG_WRITE the application values should - * be updated from the values supplied in the buffer \c pucRegBuffer. - * If eMBRegisterMode::MB_REG_READ the application should store the current - * values in the buffer \c pucRegBuffer. - * - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode ); - -/*! \ingroup modbus_registers - * \brief Callback function used if a Input Discrete Register value is - * read by the protocol stack. - * - * If you are going to use his function you might use the functions - * xMBUtilSetBits( ) and xMBUtilGetBits( ) for working with bitfields. - * - * \param pucRegBuffer The buffer should be updated with the current - * coil values. The first discrete input starting at \c usAddress must be - * stored at the LSB of the first byte in the buffer. If the requested number - * is not a multiple of eight the remaining bits should be set to zero. - * \param usAddress The starting address of the first discrete input. - * \param usNDiscrete Number of discrete input values. - * \return The function must return one of the following error codes: - * - eMBErrorCode::MB_ENOERR If no error occurred. In this case a normal - * Modbus response is sent. - * - eMBErrorCode::MB_ENOREG If the application does not map an coils - * within the requested address range. In this case a - * ILLEGAL DATA ADDRESS is sent as a response. - */ -eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNDiscrete ); - -/*! \ingroup modbus - *\brief These Modbus functions are called for user when Modbus run in Master Mode. - */ -eMBMasterReqErrCode -eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, - USHORT usNRegs, USHORT * pusDataBuffer, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr, - USHORT usReadRegAddr, USHORT usNReadRegs, USHORT * pusDataBuffer, - USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadCoils( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteCoil( UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr, - USHORT usCoilAddr, USHORT usNCoils, UCHAR * pucDataBuffer, LONG lTimeOut ); -eMBMasterReqErrCode -eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut ); - -eMBException -eMBMasterFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ); -eMBException -eMBMasterFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); - -/*\ingroup modbus - *\brief These functions are interface for Modbus Master - */ -void vMBMasterGetPDUSndBuf( UCHAR ** pucFrame ); -UCHAR ucMBMasterGetDestAddress( void ); -void vMBMasterSetDestAddress( UCHAR Address ); -BOOL xMBMasterGetCBRunInMasterMode( void ); -void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode ); -USHORT usMBMasterGetPDUSndLength( void ); -void vMBMasterSetPDUSndLength( USHORT SendPDULength ); -void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode ); -BOOL xMBMasterRequestIsBroadcast( void ); -eMBMasterErrorEventType eMBMasterGetErrorType( void ); -void vMBMasterSetErrorType( eMBMasterErrorEventType errorType ); -eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ); - -/* ----------------------- Callback -----------------------------------------*/ - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/include/mbconfig.h b/libs/freemodbus/modbus/include/mbconfig.h deleted file mode 100644 index d7ee9e5..0000000 --- a/libs/freemodbus/modbus/include/mbconfig.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbconfig.h,v 1.14 2006/12/07 22:10:34 wolti Exp $ - * $Id: mbconfig.h,v 1.60 2013/08/13 21:19:55 Armink Add Master Functions $ - */ - -#ifndef _MB_CONFIG_H -#define _MB_CONFIG_H - -#ifdef __cplusplus -extern "C" { -#endif -/* ----------------------- Defines ------------------------------------------*/ -/*! \defgroup modbus_cfg Modbus Configuration - * - * Most modules in the protocol stack are completly optional and can be - * excluded. This is specially important if target resources are very small - * and program memory space should be saved.
- * - * All of these settings are available in the file mbconfig.h - */ - -#include - -/*! \addtogroup modbus_cfg - * @{ - */ -/*! \brief If Modbus Master ASCII support is enabled. */ -#define MB_MASTER_ASCII_ENABLED ( 0 ) -/*! \brief If Modbus Master RTU support is enabled. */ -#define MB_MASTER_RTU_ENABLED ( 1 ) -/*! \brief If Modbus Master TCP support is enabled. */ -#define MB_MASTER_TCP_ENABLED ( 0 ) - -/*! \brief If Modbus Slave ASCII support is enabled. */ -#ifdef PKG_MODBUS_SLAVE_ASCII -#define MB_SLAVE_ASCII_ENABLED ( 1 ) -#else -#define MB_SLAVE_ASCII_ENABLED ( 0 ) -#endif - -/*! \brief If Modbus Slave RTU support is enabled. */ -#ifdef PKG_MODBUS_SLAVE_RTU -#define MB_SLAVE_RTU_ENABLED ( 1 ) -#else -#define MB_SLAVE_RTU_ENABLED ( 0 ) -#endif - -/*! \brief If Modbus Slave TCP support is enabled. */ -#ifdef PKG_MODBUS_SLAVE_TCP -#define MB_SLAVE_TCP_ENABLED ( 1 ) -#else -#define MB_SLAVE_TCP_ENABLED ( 0 ) -#endif - -/*! \brief The character timeout value for Modbus ASCII. - * - * The character timeout value is not fixed for Modbus ASCII and is therefore - * a configuration option. It should be set to the maximum expected delay - * time of the network. - */ -#define MB_ASCII_TIMEOUT_SEC ( 1 ) -/*! \brief Maximum number of Modbus functions codes the protocol stack - * should support. - * - * The maximum number of supported Modbus functions must be greater than - * the sum of all enabled functions in this file and custom function - * handlers. If set to small adding more functions will fail. - */ -#define MB_FUNC_HANDLERS_MAX ( 16 ) -/*! \brief Number of bytes which should be allocated for the Report Slave ID - * command. - * - * This number limits the maximum size of the additional segment in the - * report slave id function. See eMBSetSlaveID( ) for more information on - * how to set this value. It is only used if MB_FUNC_OTHER_REP_SLAVEID_ENABLED - * is set to 1. - */ -#define MB_FUNC_OTHER_REP_SLAVEID_BUF ( 32 ) -/*! \brief If the Report Slave ID function should be enabled. */ -#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED ( 1 ) -/*! \brief If the Read Input Registers function should be enabled. */ -#define MB_FUNC_READ_INPUT_ENABLED ( 1 ) -/*! \brief If the Read Holding Registers function should be enabled. */ -#define MB_FUNC_READ_HOLDING_ENABLED ( 1 ) -/*! \brief If the Write Single Register function should be enabled. */ -#define MB_FUNC_WRITE_HOLDING_ENABLED ( 1 ) -/*! \brief If the Write Multiple registers function should be enabled. */ -#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED ( 1 ) -/*! \brief If the Read Coils function should be enabled. */ -#define MB_FUNC_READ_COILS_ENABLED ( 1 ) -/*! \brief If the Write Coils function should be enabled. */ -#define MB_FUNC_WRITE_COIL_ENABLED ( 1 ) -/*! \brief If the Write Multiple Coils function should be enabled. */ -#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED ( 1 ) -/*! \brief If the Read Discrete Inputs function should be enabled. */ -#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED ( 1 ) -/*! \brief If the Read/Write Multiple Registers function should be enabled. */ -#define MB_FUNC_READWRITE_HOLDING_ENABLED ( 1 ) -/*! @} */ -#ifdef __cplusplus -} -#endif - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -/*! \brief If master send a broadcast frame,the master will wait time of convert to delay, - * then master can send other frame */ -#define MB_MASTER_DELAY_MS_CONVERT (200 ) -/*! \brief If master send a frame which is not broadcast,the master will wait sometime for slave. - * And if slave is not respond in this time,the master will process this timeout error. - * Then master can send other frame */ -#define MB_MASTER_TIMEOUT_MS_RESPOND (100 ) -/*! \brief The total slaves in Modbus Master system. Default 16. - * \note : The slave ID must be continuous from 1.*/ -#define MB_MASTER_TOTAL_SLAVE_NUM ( 16 ) -#endif - -#endif - - diff --git a/libs/freemodbus/modbus/include/mbframe.h b/libs/freemodbus/modbus/include/mbframe.h deleted file mode 100644 index 6b86b97..0000000 --- a/libs/freemodbus/modbus/include/mbframe.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbframe.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_FRAME_H -#define _MB_FRAME_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*! - * Constants which defines the format of a modbus frame. The example is - * shown for a Modbus RTU/ASCII frame. Note that the Modbus PDU is not - * dependent on the underlying transport. - * - * - * <------------------------ MODBUS SERIAL LINE PDU (1) -------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+----------------------------+-------------+ - * | Address | Function Code | Data | CRC/LRC | - * +-----------+---------------+----------------------------+-------------+ - * | | | | - * (2) (3/2') (3') (4) - * - * (1) ... MB_SER_PDU_SIZE_MAX = 256 - * (2) ... MB_SER_PDU_ADDR_OFF = 0 - * (3) ... MB_SER_PDU_PDU_OFF = 1 - * (4) ... MB_SER_PDU_SIZE_CRC = 2 - * - * (1') ... MB_PDU_SIZE_MAX = 253 - * (2') ... MB_PDU_FUNC_OFF = 0 - * (3') ... MB_PDU_DATA_OFF = 1 - * - */ - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_PDU_SIZE_MAX 253 /*!< Maximum size of a PDU. */ -#define MB_PDU_SIZE_MIN 1 /*!< Function Code */ -#define MB_PDU_FUNC_OFF 0 /*!< Offset of function code in PDU. */ -#define MB_PDU_DATA_OFF 1 /*!< Offset for response data in PDU. */ - -/* ----------------------- Prototypes 0-------------------------------------*/ -typedef void ( *pvMBFrameStart ) ( void ); - -typedef void ( *pvMBFrameStop ) ( void ); - -typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress, - UCHAR ** pucFrame, - USHORT * pusLength ); - -typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress, - const UCHAR * pucFrame, - USHORT usLength ); - -typedef void( *pvMBFrameClose ) ( void ); - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/include/mbfunc.h b/libs/freemodbus/modbus/include/mbfunc.h deleted file mode 100644 index 58ccc06..0000000 --- a/libs/freemodbus/modbus/include/mbfunc.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbfunc.h,v 1.12 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_FUNC_H -#define _MB_FUNC_H - -#ifdef __cplusplus -extern "C" { -#endif -#if MB_FUNC_OTHER_REP_SLAVEID_BUF > 0 -eMBException eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_INPUT_ENABLED > 0 -eMBException eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_HOLDING_ENABLED > 0 -eMBException eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 -eMBException eMBFuncWriteHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 -eMBException eMBFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_COILS_ENABLED > 0 -eMBException eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_COIL_ENABLED > 0 -eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 -eMBException eMBFuncWriteMultipleCoils( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 -eMBException eMBFuncReadDiscreteInputs( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 -eMBException eMBFuncReadWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen ); -#endif - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/include/mbport.h b/libs/freemodbus/modbus/include/mbport.h deleted file mode 100644 index fe779ec..0000000 --- a/libs/freemodbus/modbus/include/mbport.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbport.h,v 1.17 2006/12/07 22:10:34 wolti Exp $ - * mbport.h,v 1.60 2013/08/17 11:42:56 Armink Add Master Functions $ - */ - -#ifndef _MB_PORT_H -#define _MB_PORT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- Type definitions ---------------------------------*/ - -typedef enum -{ - EV_READY = 1<<0, /*!< Startup finished. */ - EV_FRAME_RECEIVED = 1<<1, /*!< Frame received. */ - EV_EXECUTE = 1<<2, /*!< Execute function. */ - EV_FRAME_SENT = 1<<3 /*!< Frame sent. */ -} eMBEventType; - -typedef enum -{ - EV_MASTER_READY = 1<<0, /*!< Startup finished. */ - EV_MASTER_FRAME_RECEIVED = 1<<1, /*!< Frame received. */ - EV_MASTER_EXECUTE = 1<<2, /*!< Execute function. */ - EV_MASTER_FRAME_SENT = 1<<3, /*!< Frame sent. */ - EV_MASTER_ERROR_PROCESS = 1<<4, /*!< Frame error process. */ - EV_MASTER_PROCESS_SUCESS = 1<<5, /*!< Request process success. */ - EV_MASTER_ERROR_RESPOND_TIMEOUT = 1<<6, /*!< Request respond timeout. */ - EV_MASTER_ERROR_RECEIVE_DATA = 1<<7, /*!< Request receive data error. */ - EV_MASTER_ERROR_EXECUTE_FUNCTION = 1<<8, /*!< Request execute function error. */ -} eMBMasterEventType; - -typedef enum -{ - EV_ERROR_RESPOND_TIMEOUT, /*!< Slave respond timeout. */ - EV_ERROR_RECEIVE_DATA, /*!< Receive frame data erroe. */ - EV_ERROR_EXECUTE_FUNCTION, /*!< Execute function error. */ -} eMBMasterErrorEventType; - -/*! \ingroup modbus - * \brief Parity used for characters in serial mode. - * - * The parity which should be applied to the characters sent over the serial - * link. Please note that this values are actually passed to the porting - * layer and therefore not all parity modes might be available. - */ -typedef enum -{ - MB_PAR_NONE, /*!< No parity. */ - MB_PAR_ODD, /*!< Odd parity. */ - MB_PAR_EVEN /*!< Even parity. */ -} eMBParity; - -/* ----------------------- Supporting functions -----------------------------*/ -BOOL xMBPortEventInit( void ); - -BOOL xMBPortEventPost( eMBEventType eEvent ); - -BOOL xMBPortEventGet( /*@out@ */ eMBEventType * eEvent ); - -BOOL xMBMasterPortEventInit( void ); - -BOOL xMBMasterPortEventPost( eMBMasterEventType eEvent ); - -BOOL xMBMasterPortEventGet( /*@out@ */ eMBMasterEventType * eEvent ); - -void vMBMasterOsResInit( void ); - -BOOL xMBMasterRunResTake( int32_t time ); - -void vMBMasterRunResRelease( void ); - -/* ----------------------- Serial port functions ----------------------------*/ - -BOOL xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, - UCHAR ucDataBits, eMBParity eParity ); - -void vMBPortClose( void ); - -void xMBPortSerialClose( void ); - -void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ); - -INLINE BOOL xMBPortSerialGetByte( CHAR * pucByte ); - -INLINE BOOL xMBPortSerialPutByte( CHAR ucByte ); - -BOOL xMBMasterPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, - UCHAR ucDataBits, eMBParity eParity ); - -void vMBMasterPortClose( void ); - -void xMBMasterPortSerialClose( void ); - -void vMBMasterPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ); - -INLINE BOOL xMBMasterPortSerialGetByte( CHAR * pucByte ); - -INLINE BOOL xMBMasterPortSerialPutByte( CHAR ucByte ); - -/* ----------------------- Timers functions ---------------------------------*/ -BOOL xMBPortTimersInit( USHORT usTimeOut50us ); - -void xMBPortTimersClose( void ); - -INLINE void vMBPortTimersEnable( void ); - -INLINE void vMBPortTimersDisable( void ); - -BOOL xMBMasterPortTimersInit( USHORT usTimeOut50us ); - -void xMBMasterPortTimersClose( void ); - -INLINE void vMBMasterPortTimersT35Enable( void ); - -INLINE void vMBMasterPortTimersConvertDelayEnable( void ); - -INLINE void vMBMasterPortTimersRespondTimeoutEnable( void ); - -INLINE void vMBMasterPortTimersDisable( void ); - -/* ----------------- Callback for the master error process ------------------*/ -void vMBMasterErrorCBRespondTimeout( UCHAR ucDestAddress, const UCHAR* pucPDUData, - USHORT ucPDULength ); - -void vMBMasterErrorCBReceiveData( UCHAR ucDestAddress, const UCHAR* pucPDUData, - USHORT ucPDULength ); - -void vMBMasterErrorCBExecuteFunction( UCHAR ucDestAddress, const UCHAR* pucPDUData, - USHORT ucPDULength ); - -void vMBMasterCBRequestScuuess( void ); - -/* ----------------------- Callback for the protocol stack ------------------*/ - -/*! - * \brief Callback function for the porting layer when a new byte is - * available. - * - * Depending upon the mode this callback function is used by the RTU or - * ASCII transmission layers. In any case a call to xMBPortSerialGetByte() - * must immediately return a new character. - * - * \return TRUE if a event was posted to the queue because - * a new byte was received. The port implementation should wake up the - * tasks which are currently blocked on the eventqueue. - */ -extern BOOL( *pxMBFrameCBByteReceived ) ( void ); - -extern BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); - -extern BOOL( *pxMBPortCBTimerExpired ) ( void ); - -extern BOOL( *pxMBMasterFrameCBByteReceived ) ( void ); - -extern BOOL( *pxMBMasterFrameCBTransmitterEmpty ) ( void ); - -extern BOOL( *pxMBMasterPortCBTimerExpired ) ( void ); - -/* ----------------------- TCP port functions -------------------------------*/ -BOOL xMBTCPPortInit( USHORT usTCPPort ); - -void vMBTCPPortClose( void ); - -void vMBTCPPortDisable( void ); - -BOOL xMBTCPPortGetRequest( UCHAR **ppucMBTCPFrame, USHORT * usTCPLength ); - -BOOL xMBTCPPortSendResponse( const UCHAR *pucMBTCPFrame, USHORT usTCPLength ); - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/include/mbproto.h b/libs/freemodbus/modbus/include/mbproto.h deleted file mode 100644 index bc7c776..0000000 --- a/libs/freemodbus/modbus/include/mbproto.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbproto.h,v 1.14 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_PROTO_H -#define _MB_PROTO_H - -#ifdef __cplusplus -extern "C" { -#endif -/* ----------------------- Defines ------------------------------------------*/ -#define MB_ADDRESS_BROADCAST ( 0 ) /*! Modbus broadcast address. */ -#define MB_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ -#define MB_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ -#define MB_FUNC_NONE ( 0 ) -#define MB_FUNC_READ_COILS ( 1 ) -#define MB_FUNC_READ_DISCRETE_INPUTS ( 2 ) -#define MB_FUNC_WRITE_SINGLE_COIL ( 5 ) -#define MB_FUNC_WRITE_MULTIPLE_COILS ( 15 ) -#define MB_FUNC_READ_HOLDING_REGISTER ( 3 ) -#define MB_FUNC_READ_INPUT_REGISTER ( 4 ) -#define MB_FUNC_WRITE_REGISTER ( 6 ) -#define MB_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) -#define MB_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) -#define MB_FUNC_DIAG_READ_EXCEPTION ( 7 ) -#define MB_FUNC_DIAG_DIAGNOSTIC ( 8 ) -#define MB_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) -#define MB_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) -#define MB_FUNC_OTHER_REPORT_SLAVEID ( 17 ) -#define MB_FUNC_ERROR ( 128 ) -/* ----------------------- Type definitions ---------------------------------*/ - typedef enum -{ - MB_EX_NONE = 0x00, - MB_EX_ILLEGAL_FUNCTION = 0x01, - MB_EX_ILLEGAL_DATA_ADDRESS = 0x02, - MB_EX_ILLEGAL_DATA_VALUE = 0x03, - MB_EX_SLAVE_DEVICE_FAILURE = 0x04, - MB_EX_ACKNOWLEDGE = 0x05, - MB_EX_SLAVE_BUSY = 0x06, - MB_EX_MEMORY_PARITY_ERROR = 0x08, - MB_EX_GATEWAY_PATH_FAILED = 0x0A, - MB_EX_GATEWAY_TGT_FAILED = 0x0B -} eMBException; - -typedef eMBException( *pxMBFunctionHandler ) ( UCHAR * pucFrame, USHORT * pusLength ); - -typedef struct -{ - UCHAR ucFunctionCode; - pxMBFunctionHandler pxHandler; -} xMBFunctionHandler; - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/mb.c b/libs/freemodbus/modbus/mb.c deleted file mode 100644 index 6861f37..0000000 --- a/libs/freemodbus/modbus/mb.c +++ /dev/null @@ -1,412 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mb.c,v 1.27 2007/02/18 23:45:41 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ - -#include "mb.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbfunc.h" - -#include "mbport.h" -#if MB_SLAVE_RTU_ENABLED == 1 -#include "mbrtu.h" -#endif -#if MB_SLAVE_ASCII_ENABLED == 1 -#include "mbascii.h" -#endif -#if MB_SLAVE_TCP_ENABLED == 1 -#include "mbtcp.h" -#endif - -#ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 0 -#endif - -/* ----------------------- Static variables ---------------------------------*/ - -static UCHAR ucMBAddress; -//static eMBMode eMBCurrentMode; - -static enum -{ - STATE_ENABLED, - STATE_DISABLED, - STATE_NOT_INITIALIZED -} eMBState = STATE_NOT_INITIALIZED; - -/* Functions pointer which are initialized in eMBInit( ). Depending on the - * mode (RTU or ASCII) the are set to the correct implementations. - * Using for Modbus Slave - */ -static peMBFrameSend peMBFrameSendCur; -static pvMBFrameStart pvMBFrameStartCur; -static pvMBFrameStop pvMBFrameStopCur; -static peMBFrameReceive peMBFrameReceiveCur; -static pvMBFrameClose pvMBFrameCloseCur; - -/* Callback functions required by the porting layer. They are called when - * an external event has happend which includes a timeout or the reception - * or transmission of a character. - * Using for Modbus Slave - */ -BOOL( *pxMBFrameCBByteReceived ) ( void ); -BOOL( *pxMBFrameCBTransmitterEmpty ) ( void ); -BOOL( *pxMBPortCBTimerExpired ) ( void ); - -BOOL( *pxMBFrameCBReceiveFSMCur ) ( void ); -BOOL( *pxMBFrameCBTransmitFSMCur ) ( void ); - -/* An array of Modbus functions handlers which associates Modbus function - * codes with implementing functions. - */ -static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX] = { -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, -#endif -#if MB_FUNC_READ_INPUT_ENABLED > 0 - {MB_FUNC_READ_INPUT_REGISTER, eMBFuncReadInputRegister}, -#endif -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - {MB_FUNC_READ_HOLDING_REGISTER, eMBFuncReadHoldingRegister}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBFuncWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_REGISTER, eMBFuncWriteHoldingRegister}, -#endif -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBFuncReadWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_READ_COILS_ENABLED > 0 - {MB_FUNC_READ_COILS, eMBFuncReadCoils}, -#endif -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - {MB_FUNC_WRITE_SINGLE_COIL, eMBFuncWriteCoil}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_COILS, eMBFuncWriteMultipleCoils}, -#endif -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 - {MB_FUNC_READ_DISCRETE_INPUTS, eMBFuncReadDiscreteInputs}, -#endif -}; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - /* check preconditions */ - if( ( ucSlaveAddress == MB_ADDRESS_BROADCAST ) || - ( ucSlaveAddress < MB_ADDRESS_MIN ) || ( ucSlaveAddress > MB_ADDRESS_MAX ) ) - { - eStatus = MB_EINVAL; - } - else - { - ucMBAddress = ucSlaveAddress; - - switch ( eMode ) - { -#if MB_SLAVE_RTU_ENABLED > 0 - case MB_RTU: - pvMBFrameStartCur = eMBRTUStart; - pvMBFrameStopCur = eMBRTUStop; - peMBFrameSendCur = eMBRTUSend; - peMBFrameReceiveCur = eMBRTUReceive; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; - pxMBFrameCBByteReceived = xMBRTUReceiveFSM; - pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM; - pxMBPortCBTimerExpired = xMBRTUTimerT35Expired; - - eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity ); - break; -#endif -#if MB_SLAVE_ASCII_ENABLED > 0 - case MB_ASCII: - pvMBFrameStartCur = eMBASCIIStart; - pvMBFrameStopCur = eMBASCIIStop; - peMBFrameSendCur = eMBASCIISend; - peMBFrameReceiveCur = eMBASCIIReceive; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose : NULL; - pxMBFrameCBByteReceived = xMBASCIIReceiveFSM; - pxMBFrameCBTransmitterEmpty = xMBASCIITransmitFSM; - pxMBPortCBTimerExpired = xMBASCIITimerT1SExpired; - - eStatus = eMBASCIIInit( ucMBAddress, ucPort, ulBaudRate, eParity ); - break; -#endif - default: - eStatus = MB_EINVAL; - break; - } - - if( eStatus == MB_ENOERR ) - { - if( !xMBPortEventInit( ) ) - { - /* port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { -// eMBCurrentMode = eMode; - eMBState = STATE_DISABLED; - } - } - } - return eStatus; -} - -#if MB_SLAVE_TCP_ENABLED > 0 -eMBErrorCode -eMBTCPInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( ( eStatus = eMBTCPDoInit( ucTCPPort ) ) != MB_ENOERR ) - { - eMBState = STATE_DISABLED; - } - else if( !xMBPortEventInit( ) ) - { - /* Port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - pvMBFrameStartCur = eMBTCPStart; - pvMBFrameStopCur = eMBTCPStop; - peMBFrameReceiveCur = eMBTCPReceive; - peMBFrameSendCur = eMBTCPSend; - pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBTCPPortClose : NULL; - ucMBAddress = MB_TCP_PSEUDO_ADDRESS; -// eMBCurrentMode = MB_TCP; - eMBState = STATE_DISABLED; - } - return eStatus; -} -#endif - -eMBErrorCode -eMBRegisterCB( UCHAR ucFunctionCode, pxMBFunctionHandler pxHandler ) -{ - int i; - eMBErrorCode eStatus; - - if( ( 0 < ucFunctionCode ) && ( ucFunctionCode <= 127 ) ) - { - ENTER_CRITICAL_SECTION( ); - if( pxHandler != NULL ) - { - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - if( ( xFuncHandlers[i].pxHandler == NULL ) || - ( xFuncHandlers[i].pxHandler == pxHandler ) ) - { - xFuncHandlers[i].ucFunctionCode = ucFunctionCode; - xFuncHandlers[i].pxHandler = pxHandler; - break; - } - } - eStatus = ( i != MB_FUNC_HANDLERS_MAX ) ? MB_ENOERR : MB_ENORES; - } - else - { - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - xFuncHandlers[i].ucFunctionCode = 0; - xFuncHandlers[i].pxHandler = NULL; - break; - } - } - /* Remove can't fail. */ - eStatus = MB_ENOERR; - } - EXIT_CRITICAL_SECTION( ); - } - else - { - eStatus = MB_EINVAL; - } - return eStatus; -} - - -eMBErrorCode -eMBClose( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - if( pvMBFrameCloseCur != NULL ) - { - pvMBFrameCloseCur( ); - } - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - - -eMBErrorCode -eMBEnable( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - /* Activate the protocol stack. */ - pvMBFrameStartCur( ); - eMBState = STATE_ENABLED; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBDisable( void ) -{ - eMBErrorCode eStatus; - - if( eMBState == STATE_ENABLED ) - { - pvMBFrameStopCur( ); - eMBState = STATE_DISABLED; - eStatus = MB_ENOERR; - } - else if( eMBState == STATE_DISABLED ) - { - eStatus = MB_ENOERR; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode eMBPoll( void ) -{ - static UCHAR *ucMBFrame; - static UCHAR ucRcvAddress; - static UCHAR ucFunctionCode; - static USHORT usLength; - static eMBException eException; - - int i; - eMBErrorCode eStatus = MB_ENOERR; - eMBEventType eEvent; - - /* Check if the protocol stack is ready. */ - if( eMBState != STATE_ENABLED ) - { - return MB_EILLSTATE; - } - - /* Check if there is a event available. If not return control to caller. - * Otherwise we will handle the event. */ - if( xMBPortEventGet( &eEvent ) == TRUE ) - { - switch ( eEvent ) - { - case EV_READY: - break; - - case EV_FRAME_RECEIVED: - eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength ); - if( eStatus == MB_ENOERR ) - { - /* Check if the frame is for us. If not ignore the frame. */ - if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) - { - ( void )xMBPortEventPost( EV_EXECUTE ); - } - } - break; - - case EV_EXECUTE: - ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; - eException = MB_EX_ILLEGAL_FUNCTION; - for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) - { - /* No more function handlers registered. Abort. */ - if( xFuncHandlers[i].ucFunctionCode == 0 ) - { - break; - } - else if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) - { - eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength ); - break; - } - } - - /* If the request was not sent to the broadcast address we - * return a reply. */ - if( ucRcvAddress != MB_ADDRESS_BROADCAST ) - { - if( eException != MB_EX_NONE ) - { - /* An exception occured. Build an error frame. */ - usLength = 0; - ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR ); - ucMBFrame[usLength++] = eException; - } - eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength ); - } - break; - - case EV_FRAME_SENT: - break; - } - } - return MB_ENOERR; -} diff --git a/libs/freemodbus/modbus/mb_m.c b/libs/freemodbus/modbus/mb_m.c deleted file mode 100644 index b0ed47e..0000000 --- a/libs/freemodbus/modbus/mb_m.c +++ /dev/null @@ -1,429 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (C) 2013 Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu_m.c,v 1.60 2013/08/20 11:18:10 Armink Add Master Functions $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ - -#include "mb.h" -#include "mb_m.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbproto.h" -#include "mbfunc.h" - -#include "mbport.h" -#if MB_MASTER_RTU_ENABLED == 1 -#include "mbrtu.h" -#endif -#if MB_MASTER_ASCII_ENABLED == 1 -#include "mbascii.h" -#endif -#if MB_MASTER_TCP_ENABLED == 1 -#include "mbtcp.h" -#endif - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 - -#ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 0 -#endif - -/* ----------------------- Static variables ---------------------------------*/ - -static UCHAR ucMBMasterDestAddress; -static BOOL xMBRunInMasterMode = FALSE; -static eMBMasterErrorEventType eMBMasterCurErrorType; - -static enum -{ - STATE_ENABLED, - STATE_DISABLED, - STATE_NOT_INITIALIZED, - STATE_ESTABLISHED, -} eMBState = STATE_NOT_INITIALIZED; - -/* Functions pointer which are initialized in eMBInit( ). Depending on the - * mode (RTU or ASCII) the are set to the correct implementations. - * Using for Modbus Master,Add by Armink 20130813 - */ -static peMBFrameSend peMBMasterFrameSendCur; -static pvMBFrameStart pvMBMasterFrameStartCur; -static pvMBFrameStop pvMBMasterFrameStopCur; -static peMBFrameReceive peMBMasterFrameReceiveCur; -static pvMBFrameClose pvMBMasterFrameCloseCur; - -/* Callback functions required by the porting layer. They are called when - * an external event has happend which includes a timeout or the reception - * or transmission of a character. - * Using for Modbus Master,Add by Armink 20130813 - */ -BOOL( *pxMBMasterFrameCBByteReceived ) ( void ); -BOOL( *pxMBMasterFrameCBTransmitterEmpty ) ( void ); -BOOL( *pxMBMasterPortCBTimerExpired ) ( void ); - -BOOL( *pxMBMasterFrameCBReceiveFSMCur ) ( void ); -BOOL( *pxMBMasterFrameCBTransmitFSMCur ) ( void ); - -/* An array of Modbus functions handlers which associates Modbus function - * codes with implementing functions. - */ -static xMBFunctionHandler xMasterFuncHandlers[MB_FUNC_HANDLERS_MAX] = { -#if MB_FUNC_OTHER_REP_SLAVEID_ENABLED > 0 - //TODO Add Master function define - {MB_FUNC_OTHER_REPORT_SLAVEID, eMBFuncReportSlaveID}, -#endif -#if MB_FUNC_READ_INPUT_ENABLED > 0 - {MB_FUNC_READ_INPUT_REGISTER, eMBMasterFuncReadInputRegister}, -#endif -#if MB_FUNC_READ_HOLDING_ENABLED > 0 - {MB_FUNC_READ_HOLDING_REGISTER, eMBMasterFuncReadHoldingRegister}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_REGISTERS, eMBMasterFuncWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_WRITE_HOLDING_ENABLED > 0 - {MB_FUNC_WRITE_REGISTER, eMBMasterFuncWriteHoldingRegister}, -#endif -#if MB_FUNC_READWRITE_HOLDING_ENABLED > 0 - {MB_FUNC_READWRITE_MULTIPLE_REGISTERS, eMBMasterFuncReadWriteMultipleHoldingRegister}, -#endif -#if MB_FUNC_READ_COILS_ENABLED > 0 - {MB_FUNC_READ_COILS, eMBMasterFuncReadCoils}, -#endif -#if MB_FUNC_WRITE_COIL_ENABLED > 0 - {MB_FUNC_WRITE_SINGLE_COIL, eMBMasterFuncWriteCoil}, -#endif -#if MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED > 0 - {MB_FUNC_WRITE_MULTIPLE_COILS, eMBMasterFuncWriteMultipleCoils}, -#endif -#if MB_FUNC_READ_DISCRETE_INPUTS_ENABLED > 0 - {MB_FUNC_READ_DISCRETE_INPUTS, eMBMasterFuncReadDiscreteInputs}, -#endif -}; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBMasterInit( eMBMode eMode, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - switch (eMode) - { -#if MB_MASTER_RTU_ENABLED > 0 - case MB_RTU: - pvMBMasterFrameStartCur = eMBMasterRTUStart; - pvMBMasterFrameStopCur = eMBMasterRTUStop; - peMBMasterFrameSendCur = eMBMasterRTUSend; - peMBMasterFrameReceiveCur = eMBMasterRTUReceive; - pvMBMasterFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBMasterPortClose : NULL; - pxMBMasterFrameCBByteReceived = xMBMasterRTUReceiveFSM; - pxMBMasterFrameCBTransmitterEmpty = xMBMasterRTUTransmitFSM; - pxMBMasterPortCBTimerExpired = xMBMasterRTUTimerExpired; - - eStatus = eMBMasterRTUInit(ucPort, ulBaudRate, eParity); - break; -#endif -#if MB_MASTER_ASCII_ENABLED > 0 - case MB_ASCII: - pvMBMasterFrameStartCur = eMBMasterASCIIStart; - pvMBMasterFrameStopCur = eMBMasterASCIIStop; - peMBMasterFrameSendCur = eMBMasterASCIISend; - peMBMasterFrameReceiveCur = eMBMasterASCIIReceive; - pvMBMasterFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBMasterPortClose : NULL; - pxMBMasterFrameCBByteReceived = xMBMasterASCIIReceiveFSM; - pxMBMasterFrameCBTransmitterEmpty = xMBMasterASCIITransmitFSM; - pxMBMasterPortCBTimerExpired = xMBMasterASCIITimerT1SExpired; - - eStatus = eMBMasterASCIIInit(ucPort, ulBaudRate, eParity ); - break; -#endif - default: - eStatus = MB_EINVAL; - break; - } - - if (eStatus == MB_ENOERR) - { - if (!xMBMasterPortEventInit()) - { - /* port dependent event module initalization failed. */ - eStatus = MB_EPORTERR; - } - else - { - eMBState = STATE_DISABLED; - } - /* initialize the OS resource for modbus master. */ - vMBMasterOsResInit(); - } - return eStatus; -} - -eMBErrorCode -eMBMasterClose( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - if( pvMBMasterFrameCloseCur != NULL ) - { - pvMBMasterFrameCloseCur( ); - } - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -eMBErrorCode -eMBMasterEnable( void ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( eMBState == STATE_DISABLED ) - { - /* Activate the protocol stack. */ - pvMBMasterFrameStartCur( ); - eMBState = STATE_ENABLED; - } - else - { - eStatus = MB_EILLSTATE; - } - - xMBMasterPortEventPost( EV_MASTER_FRAME_RECEIVED ); - - return eStatus; -} - -eMBErrorCode -eMBMasterDisable( void ) -{ - eMBErrorCode eStatus; - - if(( eMBState == STATE_ENABLED ) || ( eMBState == STATE_ESTABLISHED)) - { - pvMBMasterFrameStopCur( ); - eMBState = STATE_DISABLED; - eStatus = MB_ENOERR; - } - else if( eMBState == STATE_DISABLED ) - { - eStatus = MB_ENOERR; - } - else - { - eStatus = MB_EILLSTATE; - } - return eStatus; -} - -BOOL -eMBMasterIsEstablished( void ) -{ - if(eMBState == STATE_ESTABLISHED) - { - return TRUE; - } - else - { - return FALSE; - } -} - - -eMBErrorCode -eMBMasterPoll( void ) -{ - static UCHAR *ucMBFrame; - static UCHAR ucRcvAddress; - static UCHAR ucFunctionCode; - static USHORT usLength; - static eMBException eException; - - int i , j; - eMBErrorCode eStatus = MB_ENOERR; - eMBMasterEventType eEvent; - eMBMasterErrorEventType errorType; - - /* Check if the protocol stack is ready. */ - if(( eMBState != STATE_ENABLED ) && ( eMBState != STATE_ESTABLISHED)) - { - return MB_EILLSTATE; - } - - /* Check if there is a event available. If not return control to caller. - * Otherwise we will handle the event. */ - if( xMBMasterPortEventGet( &eEvent ) == TRUE ) - { - switch ( eEvent ) - { - case EV_MASTER_READY: - eMBState = STATE_ESTABLISHED; - break; - - case EV_MASTER_FRAME_RECEIVED: - eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength ); - /* Check if the frame is for us. If not ,send an error process event. */ - if ( ( eStatus == MB_ENOERR ) && ( ucRcvAddress == ucMBMasterGetDestAddress() ) ) - { - ( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE ); - } - else - { - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - } - break; - - case EV_MASTER_EXECUTE: - ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF]; - eException = MB_EX_ILLEGAL_FUNCTION; - /* If receive frame has exception .The receive function code highest bit is 1.*/ - if(ucFunctionCode >> 7) { - eException = (eMBException)ucMBFrame[MB_PDU_DATA_OFF]; - } - else - { - for (i = 0; i < MB_FUNC_HANDLERS_MAX; i++) - { - /* No more function handlers registered. Abort. */ - if (xMasterFuncHandlers[i].ucFunctionCode == 0) { - break; - } - else if (xMasterFuncHandlers[i].ucFunctionCode == ucFunctionCode) { - vMBMasterSetCBRunInMasterMode(TRUE); - /* If master request is broadcast, - * the master need execute function for all slave. - */ - if ( xMBMasterRequestIsBroadcast() ) { - usLength = usMBMasterGetPDUSndLength(); - for(j = 1; j <= MB_MASTER_TOTAL_SLAVE_NUM; j++){ - vMBMasterSetDestAddress(j); - eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame, &usLength); - } - } - else { - eException = xMasterFuncHandlers[i].pxHandler(ucMBFrame, &usLength); - } - vMBMasterSetCBRunInMasterMode(FALSE); - break; - } - } - } - /* If master has exception ,Master will send error process.Otherwise the Master is idle.*/ - if (eException != MB_EX_NONE) { - vMBMasterSetErrorType(EV_ERROR_EXECUTE_FUNCTION); - ( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - } - else { - vMBMasterCBRequestScuuess( ); - vMBMasterRunResRelease( ); - } - break; - - case EV_MASTER_FRAME_SENT: - /* Master is busy now. */ - vMBMasterGetPDUSndBuf( &ucMBFrame ); - eStatus = peMBMasterFrameSendCur( ucMBMasterGetDestAddress(), ucMBFrame, usMBMasterGetPDUSndLength() ); - break; - - case EV_MASTER_ERROR_PROCESS: - /* Execute specified error process callback function. */ - errorType = eMBMasterGetErrorType(); - vMBMasterGetPDUSndBuf( &ucMBFrame ); - switch (errorType) { - case EV_ERROR_RESPOND_TIMEOUT: - vMBMasterErrorCBRespondTimeout(ucMBMasterGetDestAddress(), - ucMBFrame, usMBMasterGetPDUSndLength()); - break; - case EV_ERROR_RECEIVE_DATA: - vMBMasterErrorCBReceiveData(ucMBMasterGetDestAddress(), - ucMBFrame, usMBMasterGetPDUSndLength()); - break; - case EV_ERROR_EXECUTE_FUNCTION: - vMBMasterErrorCBExecuteFunction(ucMBMasterGetDestAddress(), - ucMBFrame, usMBMasterGetPDUSndLength()); - break; - } - vMBMasterRunResRelease(); - break; - - default: - break; - } - - } - return MB_ENOERR; -} - -/* Get whether the Modbus Master is run in master mode.*/ -BOOL xMBMasterGetCBRunInMasterMode( void ) -{ - return xMBRunInMasterMode; -} -/* Set whether the Modbus Master is run in master mode.*/ -void vMBMasterSetCBRunInMasterMode( BOOL IsMasterMode ) -{ - xMBRunInMasterMode = IsMasterMode; -} -/* Get Modbus Master send destination address. */ -UCHAR ucMBMasterGetDestAddress( void ) -{ - return ucMBMasterDestAddress; -} -/* Set Modbus Master send destination address. */ -void vMBMasterSetDestAddress( UCHAR Address ) -{ - ucMBMasterDestAddress = Address; -} -/* Get Modbus Master current error event type. */ -eMBMasterErrorEventType eMBMasterGetErrorType( void ) -{ - return eMBMasterCurErrorType; -} -/* Set Modbus Master current error event type. */ -void vMBMasterSetErrorType( eMBMasterErrorEventType errorType ) -{ - eMBMasterCurErrorType = errorType; -} - - - -#endif diff --git a/libs/freemodbus/modbus/rtu/mbcrc.h b/libs/freemodbus/modbus/rtu/mbcrc.h deleted file mode 100644 index 92168c2..0000000 --- a/libs/freemodbus/modbus/rtu/mbcrc.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbcrc.h,v 1.5 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_CRC_H -#define _MB_CRC_H - -USHORT usMBCRC16( UCHAR * pucFrame, USHORT usLen ); - -#endif diff --git a/libs/freemodbus/modbus/rtu/mbrtu.h b/libs/freemodbus/modbus/rtu/mbrtu.h deleted file mode 100644 index 599be50..0000000 --- a/libs/freemodbus/modbus/rtu/mbrtu.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu.h,v 1.9 2006/12/07 22:10:34 wolti Exp $ - * File: $Id: mbrtu.h,v 1.60 2013/08/17 13:11:42 Armink Add Master Functions $ - */ -#include "mbconfig.h" - -#ifndef _MB_RTU_H -#define _MB_RTU_H - -#ifdef __cplusplus -extern "C" { -#endif -eMBErrorCode eMBRTUInit( UCHAR slaveAddress, UCHAR ucPort, ULONG ulBaudRate, - eMBParity eParity ); -void eMBRTUStart( void ); -void eMBRTUStop( void ); -eMBErrorCode eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ); -eMBErrorCode eMBRTUSend( UCHAR slaveAddress, const UCHAR * pucFrame, USHORT usLength ); -BOOL xMBRTUReceiveFSM( void ); -BOOL xMBRTUTransmitFSM( void ); -BOOL xMBRTUTimerT15Expired( void ); -BOOL xMBRTUTimerT35Expired( void ); - -#if MB_MASTER_RTU_ENABLED > 0 -eMBErrorCode eMBMasterRTUInit( UCHAR ucPort, ULONG ulBaudRate,eMBParity eParity ); -void eMBMasterRTUStart( void ); -void eMBMasterRTUStop( void ); -eMBErrorCode eMBMasterRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ); -eMBErrorCode eMBMasterRTUSend( UCHAR slaveAddress, const UCHAR * pucFrame, USHORT usLength ); -BOOL xMBMasterRTUReceiveFSM( void ); -BOOL xMBMasterRTUTransmitFSM( void ); -BOOL xMBMasterRTUTimerExpired( void ); -#endif - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/modbus/rtu/mbrtu_m.c b/libs/freemodbus/modbus/rtu/mbrtu_m.c deleted file mode 100644 index 907cbb4..0000000 --- a/libs/freemodbus/modbus/rtu/mbrtu_m.c +++ /dev/null @@ -1,446 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2013 China Beijing Armink - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbrtu_m.c,v 1.60 2013/08/17 11:42:56 Armink Add Master Functions $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbrtu.h" -#include "mbframe.h" - -#include "mbcrc.h" -#include "mbport.h" - -#if MB_MASTER_RTU_ENABLED > 0 -/* ----------------------- Defines ------------------------------------------*/ -#define MB_SER_PDU_SIZE_MIN 4 /*!< Minimum size of a Modbus RTU frame. */ -#define MB_SER_PDU_SIZE_MAX 256 /*!< Maximum size of a Modbus RTU frame. */ -#define MB_SER_PDU_SIZE_CRC 2 /*!< Size of CRC field in PDU. */ -#define MB_SER_PDU_ADDR_OFF 0 /*!< Offset of slave address in Ser-PDU. */ -#define MB_SER_PDU_PDU_OFF 1 /*!< Offset of Modbus-PDU in Ser-PDU. */ - -/* ----------------------- Type definitions ---------------------------------*/ -typedef enum -{ - STATE_M_RX_INIT, /*!< Receiver is in initial state. */ - STATE_M_RX_IDLE, /*!< Receiver is in idle state. */ - STATE_M_RX_RCV, /*!< Frame is beeing received. */ - STATE_M_RX_ERROR, /*!< If the frame is invalid. */ -} eMBMasterRcvState; - -typedef enum -{ - STATE_M_TX_IDLE, /*!< Transmitter is in idle state. */ - STATE_M_TX_XMIT, /*!< Transmitter is in transfer state. */ - STATE_M_TX_XFWR, /*!< Transmitter is in transfer finish and wait receive state. */ -} eMBMasterSndState; - -/* ----------------------- Static variables ---------------------------------*/ -static volatile eMBMasterSndState eSndState; -static volatile eMBMasterRcvState eRcvState; - -static volatile UCHAR ucMasterRTUSndBuf[MB_PDU_SIZE_MAX]; -static volatile UCHAR ucMasterRTURcvBuf[MB_SER_PDU_SIZE_MAX]; -static volatile USHORT usMasterSendPDULength; - -static volatile UCHAR *pucMasterSndBufferCur; -static volatile USHORT usMasterSndBufferCount; - -static volatile USHORT usMasterRcvBufferPos; -static volatile BOOL xFrameIsBroadcast = FALSE; - -static volatile eMBMasterTimerMode eMasterCurTimerMode; - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBMasterRTUInit(UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ) -{ - eMBErrorCode eStatus = MB_ENOERR; - ULONG usTimerT35_50us; - - ENTER_CRITICAL_SECTION( ); - - /* Modbus RTU uses 8 Databits. */ - if( xMBMasterPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - else - { - /* If baudrate > 19200 then we should use the fixed timer values - * t35 = 1750us. Otherwise t35 must be 3.5 times the character time. - */ - if( ulBaudRate > 19200 ) - { - usTimerT35_50us = 35; /* 1800us. */ - } - else - { - /* The timer reload value for a character is given by: - * - * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 ) - * = 11 * Ticks_per_1s / Baudrate - * = 220000 / Baudrate - * The reload for t3.5 is 1.5 times this value and similary - * for t3.5. - */ - usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); - } - if( xMBMasterPortTimersInit( ( USHORT ) usTimerT35_50us ) != TRUE ) - { - eStatus = MB_EPORTERR; - } - } - EXIT_CRITICAL_SECTION( ); - - return eStatus; -} - -void -eMBMasterRTUStart( void ) -{ - ENTER_CRITICAL_SECTION( ); - /* Initially the receiver is in the state STATE_M_RX_INIT. we start - * the timer and if no character is received within t3.5 we change - * to STATE_M_RX_IDLE. This makes sure that we delay startup of the - * modbus protocol stack until the bus is free. - */ - eRcvState = STATE_M_RX_INIT; - vMBMasterPortSerialEnable( TRUE, FALSE ); - vMBMasterPortTimersT35Enable( ); - - EXIT_CRITICAL_SECTION( ); -} - -void -eMBMasterRTUStop( void ) -{ - ENTER_CRITICAL_SECTION( ); - vMBMasterPortSerialEnable( FALSE, FALSE ); - vMBMasterPortTimersDisable( ); - EXIT_CRITICAL_SECTION( ); -} - -eMBErrorCode -eMBMasterRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - ENTER_CRITICAL_SECTION( ); - RT_ASSERT( usMasterRcvBufferPos < MB_SER_PDU_SIZE_MAX ); - - /* Length and CRC check */ - if( ( usMasterRcvBufferPos >= MB_SER_PDU_SIZE_MIN ) - && ( usMBCRC16( ( UCHAR * ) ucMasterRTURcvBuf, usMasterRcvBufferPos ) == 0 ) ) - { - /* Save the address field. All frames are passed to the upper layed - * and the decision if a frame is used is done there. - */ - *pucRcvAddress = ucMasterRTURcvBuf[MB_SER_PDU_ADDR_OFF]; - - /* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus - * size of address field and CRC checksum. - */ - *pusLength = ( USHORT )( usMasterRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC ); - - /* Return the start of the Modbus PDU to the caller. */ - *pucFrame = ( UCHAR * ) & ucMasterRTURcvBuf[MB_SER_PDU_PDU_OFF]; - } - else - { - eStatus = MB_EIO; - } - - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -eMBErrorCode -eMBMasterRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT usCRC16; - - if ( ucSlaveAddress > MB_MASTER_TOTAL_SLAVE_NUM ) return MB_EINVAL; - - ENTER_CRITICAL_SECTION( ); - - /* Check if the receiver is still in idle state. If not we where to - * slow with processing the received frame and the master sent another - * frame on the network. We have to abort sending the frame. - */ - if( eRcvState == STATE_M_RX_IDLE ) - { - /* First byte before the Modbus-PDU is the slave address. */ - pucMasterSndBufferCur = ( UCHAR * ) pucFrame - 1; - usMasterSndBufferCount = 1; - - /* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */ - pucMasterSndBufferCur[MB_SER_PDU_ADDR_OFF] = ucSlaveAddress; - usMasterSndBufferCount += usLength; - - /* Calculate CRC16 checksum for Modbus-Serial-Line-PDU. */ - usCRC16 = usMBCRC16( ( UCHAR * ) pucMasterSndBufferCur, usMasterSndBufferCount ); - ucMasterRTUSndBuf[usMasterSndBufferCount++] = ( UCHAR )( usCRC16 & 0xFF ); - ucMasterRTUSndBuf[usMasterSndBufferCount++] = ( UCHAR )( usCRC16 >> 8 ); - - /* Activate the transmitter. */ - eSndState = STATE_M_TX_XMIT; - vMBMasterPortSerialEnable( FALSE, TRUE ); - } - else - { - eStatus = MB_EIO; - } - EXIT_CRITICAL_SECTION( ); - return eStatus; -} - -BOOL -xMBMasterRTUReceiveFSM( void ) -{ - BOOL xTaskNeedSwitch = FALSE; - UCHAR ucByte; - - RT_ASSERT(( eSndState == STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR )); - - /* Always read the character. */ - ( void )xMBMasterPortSerialGetByte( ( CHAR * ) & ucByte ); - - switch ( eRcvState ) - { - /* If we have received a character in the init state we have to - * wait until the frame is finished. - */ - case STATE_M_RX_INIT: - vMBMasterPortTimersT35Enable( ); - break; - - /* In the error state we wait until all characters in the - * damaged frame are transmitted. - */ - case STATE_M_RX_ERROR: - vMBMasterPortTimersT35Enable( ); - break; - - /* In the idle state we wait for a new character. If a character - * is received the t1.5 and t3.5 timers are started and the - * receiver is in the state STATE_RX_RECEIVCE and disable early - * the timer of respond timeout . - */ - case STATE_M_RX_IDLE: - /* In time of respond timeout,the receiver receive a frame. - * Disable timer of respond timeout and change the transmiter state to idle. - */ - vMBMasterPortTimersDisable( ); - eSndState = STATE_M_TX_IDLE; - - usMasterRcvBufferPos = 0; - ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte; - eRcvState = STATE_M_RX_RCV; - - /* Enable t3.5 timers. */ - vMBMasterPortTimersT35Enable( ); - break; - - /* We are currently receiving a frame. Reset the timer after - * every character received. If more than the maximum possible - * number of bytes in a modbus frame is received the frame is - * ignored. - */ - case STATE_M_RX_RCV: - if( usMasterRcvBufferPos < MB_SER_PDU_SIZE_MAX ) - { - ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte; - } - else - { - eRcvState = STATE_M_RX_ERROR; - } - vMBMasterPortTimersT35Enable(); - break; - } - return xTaskNeedSwitch; -} - -BOOL -xMBMasterRTUTransmitFSM( void ) -{ - BOOL xNeedPoll = FALSE; - - RT_ASSERT( eRcvState == STATE_M_RX_IDLE ); - - switch ( eSndState ) - { - /* We should not get a transmitter event if the transmitter is in - * idle state. */ - case STATE_M_TX_IDLE: - /* enable receiver/disable transmitter. */ - vMBMasterPortSerialEnable( TRUE, FALSE ); - break; - - case STATE_M_TX_XMIT: - /* check if we are finished. */ - if( usMasterSndBufferCount != 0 ) - { - xMBMasterPortSerialPutByte( ( CHAR )*pucMasterSndBufferCur ); - pucMasterSndBufferCur++; /* next byte in sendbuffer. */ - usMasterSndBufferCount--; - } - else - { - xFrameIsBroadcast = ( ucMasterRTUSndBuf[MB_SER_PDU_ADDR_OFF] == MB_ADDRESS_BROADCAST ) ? TRUE : FALSE; - /* Disable transmitter. This prevents another transmit buffer - * empty interrupt. */ - eSndState = STATE_M_TX_XFWR; - vMBMasterPortSerialEnable( TRUE, FALSE ); - /* If the frame is broadcast ,master will enable timer of convert delay, - * else master will enable timer of respond timeout. */ - if ( xFrameIsBroadcast == TRUE ) - { - vMBMasterPortTimersConvertDelayEnable( ); - } - else - { - vMBMasterPortTimersRespondTimeoutEnable( ); - } - } - break; - - default: - break; - } - - return xNeedPoll; -} - -BOOL -xMBMasterRTUTimerExpired(void) -{ - BOOL xNeedPoll = FALSE; - - switch (eRcvState) - { - /* Timer t35 expired. Startup phase is finished. */ - case STATE_M_RX_INIT: - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_READY); - break; - - /* A frame was received and t35 expired. Notify the listener that - * a new frame was received. */ - case STATE_M_RX_RCV: - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_FRAME_RECEIVED); - break; - - /* An error occured while receiving the frame. */ - case STATE_M_RX_ERROR: - vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA); - xNeedPoll = xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS ); - break; - - /* Function called in an illegal state. */ - default: - RT_ASSERT( - ( eRcvState == STATE_M_RX_INIT ) || ( eRcvState == STATE_M_RX_RCV ) || - ( eRcvState == STATE_M_RX_ERROR ) || ( eRcvState == STATE_M_RX_IDLE )); - break; - } - eRcvState = STATE_M_RX_IDLE; - - switch (eSndState) - { - /* A frame was send finish and convert delay or respond timeout expired. - * If the frame is broadcast,The master will idle,and if the frame is not - * broadcast.Notify the listener process error.*/ - case STATE_M_TX_XFWR: - if ( xFrameIsBroadcast == FALSE ) { - vMBMasterSetErrorType(EV_ERROR_RESPOND_TIMEOUT); - xNeedPoll = xMBMasterPortEventPost(EV_MASTER_ERROR_PROCESS); - } - break; - /* Function called in an illegal state. */ - default: - RT_ASSERT( - ( eSndState == STATE_M_TX_XFWR ) || ( eSndState == STATE_M_TX_IDLE )); - break; - } - eSndState = STATE_M_TX_IDLE; - - vMBMasterPortTimersDisable( ); - /* If timer mode is convert delay, the master event then turns EV_MASTER_EXECUTE status. */ - if (eMasterCurTimerMode == MB_TMODE_CONVERT_DELAY) { - xNeedPoll = xMBMasterPortEventPost( EV_MASTER_EXECUTE ); - } - - return xNeedPoll; -} - -/* Get Modbus Master send RTU's buffer address pointer.*/ -void vMBMasterGetRTUSndBuf( UCHAR ** pucFrame ) -{ - *pucFrame = ( UCHAR * ) ucMasterRTUSndBuf; -} - -/* Get Modbus Master send PDU's buffer address pointer.*/ -void vMBMasterGetPDUSndBuf( UCHAR ** pucFrame ) -{ - *pucFrame = ( UCHAR * ) &ucMasterRTUSndBuf[MB_SER_PDU_PDU_OFF]; -} - -/* Set Modbus Master send PDU's buffer length.*/ -void vMBMasterSetPDUSndLength( USHORT SendPDULength ) -{ - usMasterSendPDULength = SendPDULength; -} - -/* Get Modbus Master send PDU's buffer length.*/ -USHORT usMBMasterGetPDUSndLength( void ) -{ - return usMasterSendPDULength; -} - -/* Set Modbus Master current timer mode.*/ -void vMBMasterSetCurTimerMode( eMBMasterTimerMode eMBTimerMode ) -{ - eMasterCurTimerMode = eMBTimerMode; -} - -/* The master request is broadcast? */ -BOOL xMBMasterRequestIsBroadcast( void ){ - return xFrameIsBroadcast; -} -#endif - diff --git a/libs/freemodbus/modbus/tcp/mbtcp.c b/libs/freemodbus/modbus/tcp/mbtcp.c deleted file mode 100644 index e6ce040..0000000 --- a/libs/freemodbus/modbus/tcp/mbtcp.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.c,v 1.3 2006/12/07 22:10:34 wolti Exp $ - */ - -/* ----------------------- System includes ----------------------------------*/ -#include "stdlib.h" -#include "string.h" - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbconfig.h" -#include "mbtcp.h" -#include "mbframe.h" -#include "mbport.h" - -#if MB_SLAVE_TCP_ENABLED > 0 - -/* ----------------------- Defines ------------------------------------------*/ - -/* ----------------------- MBAP Header --------------------------------------*/ -/* - * - * <------------------------ MODBUS TCP/IP ADU(1) -------------------------> - * <----------- MODBUS PDU (1') ----------------> - * +-----------+---------------+------------------------------------------+ - * | TID | PID | Length | UID |Code | Data | - * +-----------+---------------+------------------------------------------+ - * | | | | | - * (2) (3) (4) (5) (6) - * - * (2) ... MB_TCP_TID = 0 (Transaction Identifier - 2 Byte) - * (3) ... MB_TCP_PID = 2 (Protocol Identifier - 2 Byte) - * (4) ... MB_TCP_LEN = 4 (Number of bytes - 2 Byte) - * (5) ... MB_TCP_UID = 6 (Unit Identifier - 1 Byte) - * (6) ... MB_TCP_FUNC = 7 (Modbus Function Code) - * - * (1) ... Modbus TCP/IP Application Data Unit - * (1') ... Modbus Protocol Data Unit - */ - -#define MB_TCP_TID 0 -#define MB_TCP_PID 2 -#define MB_TCP_LEN 4 -#define MB_TCP_UID 6 -#define MB_TCP_FUNC 7 - -#define MB_TCP_PROTOCOL_ID 0 /* 0 = Modbus Protocol */ - - -/* ----------------------- Start implementation -----------------------------*/ -eMBErrorCode -eMBTCPDoInit( USHORT ucTCPPort ) -{ - eMBErrorCode eStatus = MB_ENOERR; - - if( xMBTCPPortInit( ucTCPPort ) == FALSE ) - { - eStatus = MB_EPORTERR; - } - return eStatus; -} - -void -eMBTCPStart( void ) -{ -} - -void -eMBTCPStop( void ) -{ - /* Make sure that no more clients are connected. */ - vMBTCPPortDisable( ); -} - -eMBErrorCode -eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** ppucFrame, USHORT * pusLength ) -{ - eMBErrorCode eStatus = MB_EIO; - UCHAR *pucMBTCPFrame; - USHORT usLength; - USHORT usPID; - - if( xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength ) != FALSE ) - { - usPID = pucMBTCPFrame[MB_TCP_PID] << 8U; - usPID |= pucMBTCPFrame[MB_TCP_PID + 1]; - - if( usPID == MB_TCP_PROTOCOL_ID ) - { - *ppucFrame = &pucMBTCPFrame[MB_TCP_FUNC]; - *pusLength = usLength - MB_TCP_FUNC; - eStatus = MB_ENOERR; - - /* Modbus TCP does not use any addresses. Fake the source address such - * that the processing part deals with this frame. - */ - *pucRcvAddress = MB_TCP_PSEUDO_ADDRESS; - } - } - else - { - eStatus = MB_EIO; - } - return eStatus; -} - -eMBErrorCode -eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, USHORT usLength ) -{ - eMBErrorCode eStatus = MB_ENOERR; - UCHAR *pucMBTCPFrame = ( UCHAR * ) pucFrame - MB_TCP_FUNC; - USHORT usTCPLength = usLength + MB_TCP_FUNC; - - /* The MBAP header is already initialized because the caller calls this - * function with the buffer returned by the previous call. Therefore we - * only have to update the length in the header. Note that the length - * header includes the size of the Modbus PDU and the UID Byte. Therefore - * the length is usLength plus one. - */ - pucMBTCPFrame[MB_TCP_LEN] = ( usLength + 1 ) >> 8U; - pucMBTCPFrame[MB_TCP_LEN + 1] = ( usLength + 1 ) & 0xFF; - if( xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength ) == FALSE ) - { - eStatus = MB_EIO; - } - return eStatus; -} - -#endif diff --git a/libs/freemodbus/modbus/tcp/mbtcp.h b/libs/freemodbus/modbus/tcp/mbtcp.h deleted file mode 100644 index 7a87693..0000000 --- a/libs/freemodbus/modbus/tcp/mbtcp.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU. - * Copyright (c) 2006-2018 Christian Walter - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * File: $Id: mbtcp.h,v 1.2 2006/12/07 22:10:34 wolti Exp $ - */ - -#ifndef _MB_TCP_H -#define _MB_TCP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------- Defines ------------------------------------------*/ -#define MB_TCP_PSEUDO_ADDRESS 255 - -/* ----------------------- Function prototypes ------------------------------*/ - eMBErrorCode eMBTCPDoInit( USHORT ucTCPPort ); -void eMBTCPStart( void ); -void eMBTCPStop( void ); -eMBErrorCode eMBTCPReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, - USHORT * pusLength ); -eMBErrorCode eMBTCPSend( UCHAR _unused, const UCHAR * pucFrame, - USHORT usLength ); - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/libs/freemodbus/port/port.c b/libs/freemodbus/port/port.c deleted file mode 100644 index b659218..0000000 --- a/libs/freemodbus/port/port.c +++ /dev/null @@ -1,49 +0,0 @@ - /* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: port.c,v 1.60 2015/02/01 9:18:05 Armink $ - */ - -/* ----------------------- System includes --------------------------------*/ - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "port.h" -/* ----------------------- Variables ----------------------------------------*/ -static struct rt_semaphore lock; -static int is_inited = 0; -/* ----------------------- Start implementation -----------------------------*/ -void EnterCriticalSection(void) -{ - rt_err_t err; - if(!is_inited) - { - err = rt_sem_init(&lock, "fmb_lock", 1, RT_IPC_FLAG_PRIO); - if(err != RT_EOK) - { - rt_kprintf("Freemodbus Critical init failed!\n"); - } - is_inited = 1; - } - rt_sem_take(&lock, RT_WAITING_FOREVER); -} - -void ExitCriticalSection(void) -{ - rt_sem_release(&lock); -} - diff --git a/libs/freemodbus/port/port.h b/libs/freemodbus/port/port.h deleted file mode 100644 index 97b648a..0000000 --- a/libs/freemodbus/port/port.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * FreeModbus Libary: BARE Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: port.h ,v 1.60 2013/08/13 15:07:05 Armink add Master Functions $ - */ - -#ifndef _PORT_H -#define _PORT_H - -#include "mbconfig.h" -#include -#include - -#include -#include - -#define INLINE -#define PR_BEGIN_EXTERN_C extern "C" { -#define PR_END_EXTERN_C } - -#define ENTER_CRITICAL_SECTION() EnterCriticalSection() -#define EXIT_CRITICAL_SECTION() ExitCriticalSection() - -typedef uint8_t BOOL; - -typedef unsigned char UCHAR; -typedef char CHAR; - -typedef uint16_t USHORT; -typedef int16_t SHORT; - -typedef uint32_t ULONG; -typedef int32_t LONG; - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -void EnterCriticalSection(void); -void ExitCriticalSection(void); - -#endif diff --git a/libs/freemodbus/port/portevent.c b/libs/freemodbus/port/portevent.c deleted file mode 100644 index 1a88116..0000000 --- a/libs/freemodbus/port/portevent.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portevent.c,v 1.60 2013/08/13 15:07:05 Armink $ - */ - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -/* ----------------------- Variables ----------------------------------------*/ -static struct rt_event xSlaveOsEvent; -/* ----------------------- Start implementation -----------------------------*/ -BOOL -xMBPortEventInit( void ) -{ - rt_event_init(&xSlaveOsEvent,"slave event",RT_IPC_FLAG_PRIO); - return TRUE; -} - -BOOL -xMBPortEventPost( eMBEventType eEvent ) -{ - rt_event_send(&xSlaveOsEvent, eEvent); - return TRUE; -} - -BOOL -xMBPortEventGet( eMBEventType * eEvent ) -{ - rt_uint32_t recvedEvent; - /* waiting forever OS event */ - rt_event_recv(&xSlaveOsEvent, - EV_READY | EV_FRAME_RECEIVED | EV_EXECUTE | EV_FRAME_SENT, - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, - &recvedEvent); - switch (recvedEvent) - { - case EV_READY: - *eEvent = EV_READY; - break; - case EV_FRAME_RECEIVED: - *eEvent = EV_FRAME_RECEIVED; - break; - case EV_EXECUTE: - *eEvent = EV_EXECUTE; - break; - case EV_FRAME_SENT: - *eEvent = EV_FRAME_SENT; - break; - } - return TRUE; -} diff --git a/libs/freemodbus/port/portevent_m.c b/libs/freemodbus/port/portevent_m.c deleted file mode 100644 index 18c9333..0000000 --- a/libs/freemodbus/port/portevent_m.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portevent_m.c v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ - */ - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbport.h" -#include "port.h" - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -/* ----------------------- Defines ------------------------------------------*/ -/* ----------------------- Variables ----------------------------------------*/ -static struct rt_semaphore xMasterRunRes; -static struct rt_event xMasterOsEvent; -/* ----------------------- Start implementation -----------------------------*/ -BOOL -xMBMasterPortEventInit( void ) -{ - rt_event_init(&xMasterOsEvent,"master event",RT_IPC_FLAG_PRIO); - return TRUE; -} - -BOOL -xMBMasterPortEventPost( eMBMasterEventType eEvent ) -{ - rt_event_send(&xMasterOsEvent, eEvent); - return TRUE; -} - -BOOL -xMBMasterPortEventGet( eMBMasterEventType * eEvent ) -{ - rt_uint32_t recvedEvent; - - /* waiting forever OS event */ - rt_event_recv(&xMasterOsEvent, - EV_MASTER_READY | EV_MASTER_FRAME_RECEIVED | EV_MASTER_EXECUTE | - EV_MASTER_FRAME_SENT | EV_MASTER_ERROR_PROCESS, - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, - &recvedEvent); - - /* the enum type couldn't convert to int type */ - switch (recvedEvent) - { - case EV_MASTER_READY: - *eEvent = EV_MASTER_READY; - break; - case EV_MASTER_FRAME_RECEIVED: - *eEvent = EV_MASTER_FRAME_RECEIVED; - break; - case EV_MASTER_EXECUTE: - *eEvent = EV_MASTER_EXECUTE; - break; - case EV_MASTER_FRAME_SENT: - *eEvent = EV_MASTER_FRAME_SENT; - break; - case EV_MASTER_ERROR_PROCESS: - *eEvent = EV_MASTER_ERROR_PROCESS; - break; - default: - *eEvent = EV_MASTER_FRAME_RECEIVED; - break; - } - return TRUE; -} -/** - * This function is initialize the OS resource for modbus master. - * Note:The resource is define by OS.If you not use OS this function can be empty. - * - */ -void vMBMasterOsResInit( void ) -{ - rt_sem_init(&xMasterRunRes, "master res", 0x01 , RT_IPC_FLAG_PRIO); -} - -/** - * This function is take Mobus Master running resource. - * Note:The resource is define by Operating System.If you not use OS this function can be just return TRUE. - * - * @param lTimeOut the waiting time. - * - * @return resource taked result - */ -BOOL xMBMasterRunResTake( LONG lTimeOut ) -{ - /*If waiting time is -1 .It will wait forever */ - return rt_sem_take(&xMasterRunRes, lTimeOut) ? FALSE : TRUE ; -} - -/** - * This function is release Mobus Master running resource. - * Note:The resource is define by Operating System.If you not use OS this function can be empty. - * - */ -void vMBMasterRunResRelease( void ) -{ - /* release resource */ - rt_sem_release(&xMasterRunRes); -} - -/** - * This is modbus master respond timeout error process callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * So,for real-time of system.Do not execute too much waiting process. - * - * @param ucDestAddress destination salve address - * @param pucPDUData PDU buffer data - * @param ucPDULength PDU buffer length - * - */ -void vMBMasterErrorCBRespondTimeout(UCHAR ucDestAddress, const UCHAR* pucPDUData, - USHORT ucPDULength) { - /** - * @note This code is use OS's event mechanism for modbus master protocol stack. - * If you don't use OS, you can change it. - */ - rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_RESPOND_TIMEOUT); - - /* You can add your code under here. */ - -} - -/** - * This is modbus master receive data error process callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * So,for real-time of system.Do not execute too much waiting process. - * - * @param ucDestAddress destination salve address - * @param pucPDUData PDU buffer data - * @param ucPDULength PDU buffer length - * - */ -void vMBMasterErrorCBReceiveData(UCHAR ucDestAddress, const UCHAR* pucPDUData, - USHORT ucPDULength) { - /** - * @note This code is use OS's event mechanism for modbus master protocol stack. - * If you don't use OS, you can change it. - */ - rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_RECEIVE_DATA); - - /* You can add your code under here. */ - -} - -/** - * This is modbus master execute function error process callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * So,for real-time of system.Do not execute too much waiting process. - * - * @param ucDestAddress destination salve address - * @param pucPDUData PDU buffer data - * @param ucPDULength PDU buffer length - * - */ -void vMBMasterErrorCBExecuteFunction(UCHAR ucDestAddress, const UCHAR* pucPDUData, - USHORT ucPDULength) { - /** - * @note This code is use OS's event mechanism for modbus master protocol stack. - * If you don't use OS, you can change it. - */ - rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_EXECUTE_FUNCTION); - - /* You can add your code under here. */ - -} - -/** - * This is modbus master request process success callback function. - * @note There functions will block modbus master poll while execute OS waiting. - * So,for real-time of system.Do not execute too much waiting process. - * - */ -void vMBMasterCBRequestScuuess( void ) { - /** - * @note This code is use OS's event mechanism for modbus master protocol stack. - * If you don't use OS, you can change it. - */ - rt_event_send(&xMasterOsEvent, EV_MASTER_PROCESS_SUCESS); - - /* You can add your code under here. */ - -} - -/** - * This function is wait for modbus master request finish and return result. - * Waiting result include request process success, request respond timeout, - * receive data error and execute function error.You can use the above callback function. - * @note If you are use OS, you can use OS's event mechanism. Otherwise you have to run - * much user custom delay for waiting. - * - * @return request error code - */ -eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) { - eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR; - rt_uint32_t recvedEvent; - /* waiting for OS event */ - rt_event_recv(&xMasterOsEvent, - EV_MASTER_PROCESS_SUCESS | EV_MASTER_ERROR_RESPOND_TIMEOUT - | EV_MASTER_ERROR_RECEIVE_DATA - | EV_MASTER_ERROR_EXECUTE_FUNCTION, - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, - &recvedEvent); - switch (recvedEvent) - { - case EV_MASTER_PROCESS_SUCESS: - break; - case EV_MASTER_ERROR_RESPOND_TIMEOUT: - { - eErrStatus = MB_MRE_TIMEDOUT; - break; - } - case EV_MASTER_ERROR_RECEIVE_DATA: - { - eErrStatus = MB_MRE_REV_DATA; - break; - } - case EV_MASTER_ERROR_EXECUTE_FUNCTION: - { - eErrStatus = MB_MRE_EXE_FUN; - break; - } - } - return eErrStatus; -} - -#endif diff --git a/libs/freemodbus/port/portserial_m.c b/libs/freemodbus/port/portserial_m.c deleted file mode 100644 index 7d66bf2..0000000 --- a/libs/freemodbus/port/portserial_m.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portserial_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions $ - */ - -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "rtdevice.h" -#include "board.h" - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -/* ----------------------- Static variables ---------------------------------*/ -/* software simulation serial transmit IRQ handler thread stack */ -#ifdef rt_align -rt_align(RT_ALIGN_SIZE) -#else -ALIGN(RT_ALIGN_SIZE) -#endif -static rt_uint8_t serial_soft_trans_irq_stack[512]; -/* software simulation serial transmit IRQ handler thread */ -static struct rt_thread thread_serial_soft_trans_irq; -/* serial event */ -static struct rt_event event_serial; -/* modbus master serial device */ -static struct rt_serial_device *serial; - -/* ----------------------- Defines ------------------------------------------*/ -/* serial transmit event */ -#define EVENT_SERIAL_TRANS_START (1<<0) - -/* ----------------------- static functions ---------------------------------*/ -static void prvvUARTTxReadyISR(void); -static void prvvUARTRxISR(void); -static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size); -static void serial_soft_trans_irq(void* parameter); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBMasterPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, - eMBParity eParity) -{ - rt_device_t dev = RT_NULL; - char uart_name[20]; - - /** - * set 485 mode receive and transmit control IO - * @note MODBUS_MASTER_RT_CONTROL_PIN_INDEX need be defined by user - */ -#if defined(RT_MODBUS_MASTER_USE_CONTROL_PIN) - rt_pin_mode(MODBUS_MASTER_RT_CONTROL_PIN_INDEX, PIN_MODE_OUTPUT); -#endif - /* set serial name */ - rt_snprintf(uart_name,sizeof(uart_name), "uart%d", ucPORT); - - dev = rt_device_find(uart_name); - if(dev == RT_NULL) - { - /* can not find uart */ - return FALSE; - } - else - { - serial = (struct rt_serial_device*)dev; - } - - /* set serial configure parameter */ - serial->config.baud_rate = ulBaudRate; - serial->config.stop_bits = STOP_BITS_1; - switch(eParity){ - case MB_PAR_NONE: { - serial->config.data_bits = DATA_BITS_8; - serial->config.parity = PARITY_NONE; - break; - } - case MB_PAR_ODD: { - serial->config.data_bits = DATA_BITS_9; - serial->config.parity = PARITY_ODD; - break; - } - case MB_PAR_EVEN: { - serial->config.data_bits = DATA_BITS_9; - serial->config.parity = PARITY_EVEN; - break; - } - } - /* set serial configure */ - serial->ops->configure(serial, &(serial->config)); - - /* open serial device */ - if (!rt_device_open(&serial->parent, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX)) { - rt_device_set_rx_indicate(&serial->parent, serial_rx_ind); - } else { - return FALSE; - } - - /* software initialize */ - rt_event_init(&event_serial, "master event", RT_IPC_FLAG_PRIO); - rt_thread_init(&thread_serial_soft_trans_irq, - "master trans", - serial_soft_trans_irq, - RT_NULL, - serial_soft_trans_irq_stack, - sizeof(serial_soft_trans_irq_stack), - 10, 5); - rt_thread_startup(&thread_serial_soft_trans_irq); - - return TRUE; -} - -void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable) -{ - rt_uint32_t recved_event; - if (xRxEnable) - { - /* enable RX interrupt */ - serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX); - /* switch 485 to receive mode */ -#if defined(RT_MODBUS_MASTER_USE_CONTROL_PIN) - rt_pin_write(MODBUS_MASTER_RT_CONTROL_PIN_INDEX, PIN_LOW); -#endif - } - else - { - /* switch 485 to transmit mode */ -#if defined(RT_MODBUS_MASTER_USE_CONTROL_PIN) - rt_pin_write(MODBUS_MASTER_RT_CONTROL_PIN_INDEX, PIN_HIGH); -#endif - /* disable RX interrupt */ - serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_RX); - } - if (xTxEnable) - { - /* start serial transmit */ - rt_event_send(&event_serial, EVENT_SERIAL_TRANS_START); - } - else - { - /* stop serial transmit */ - rt_event_recv(&event_serial, EVENT_SERIAL_TRANS_START, - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 0, - &recved_event); - } -} - -void vMBMasterPortClose(void) -{ - serial->parent.close(&(serial->parent)); -} - -BOOL xMBMasterPortSerialPutByte(CHAR ucByte) -{ - serial->parent.write(&(serial->parent), 0, &ucByte, 1); - return TRUE; -} - -BOOL xMBMasterPortSerialGetByte(CHAR * pucByte) -{ - serial->parent.read(&(serial->parent), 0, pucByte, 1); - return TRUE; -} - -/* - * Create an interrupt handler for the transmit buffer empty interrupt - * (or an equivalent) for your target processor. This function should then - * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that - * a new character can be sent. The protocol stack will then call - * xMBPortSerialPutByte( ) to send the character. - */ -void prvvUARTTxReadyISR(void) -{ - pxMBMasterFrameCBTransmitterEmpty(); -} - -/* - * Create an interrupt handler for the receive interrupt for your target - * processor. This function should then call pxMBFrameCBByteReceived( ). The - * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the - * character. - */ -void prvvUARTRxISR(void) -{ - pxMBMasterFrameCBByteReceived(); -} - -/** - * Software simulation serial transmit IRQ handler. - * - * @param parameter parameter - */ -static void serial_soft_trans_irq(void* parameter) { - rt_uint32_t recved_event; - while (1) - { - /* waiting for serial transmit start */ - rt_event_recv(&event_serial, EVENT_SERIAL_TRANS_START, RT_EVENT_FLAG_OR, - RT_WAITING_FOREVER, &recved_event); - /* execute modbus callback */ - prvvUARTTxReadyISR(); - } -} - -/** - * This function is serial receive callback function - * - * @param dev the device of serial - * @param size the data size that receive - * - * @return return RT_EOK - */ -static rt_err_t serial_rx_ind(rt_device_t dev, rt_size_t size) { - prvvUARTRxISR(); - return RT_EOK; -} - -#endif diff --git a/libs/freemodbus/port/porttcp.c b/libs/freemodbus/port/porttcp.c deleted file mode 100644 index 0196393..0000000 --- a/libs/freemodbus/port/porttcp.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2019 flybreak - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: portserial.c,v 1.60 2019/07/11 17:04:32 flybreak $ - */ - -#include "port.h" - -#ifdef PKG_MODBUS_SLAVE_TCP -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" -#include "tcpserver.h" - -/* ----------------------- Defines -----------------------------------------*/ -#define MB_TCP_DEFAULT_PORT 502 -#define MB_TCP_BUF_SIZE ( 256 + 7 ) - -/* ----------------------- Static variables ---------------------------------*/ -static tcpclient_t mb_client; -static UCHAR prvvTCPBuf[MB_TCP_BUF_SIZE]; -static USHORT prvvTCPLength; - -static void tcpserver_event_notify(tcpclient_t client, rt_uint8_t event) -{ - static rt_tick_t recv_tick = 0; - switch (event) - { - case TCPSERVER_EVENT_CONNECT: - if (mb_client == RT_NULL) - { - mb_client = client; - } - else - { - if(rt_tick_get() - recv_tick > 30 * RT_TICK_PER_SECOND) /* set timeout as 30s */ - { - tcpserver_close(mb_client); - mb_client = client; - recv_tick = rt_tick_get(); - } - else - { - tcpserver_close(client); - rt_kprintf("Multi-host is not supported, please disconnect the current host first!\n"); - } - } - break; - case TCPSERVER_EVENT_RECV: - if( mb_client == client) - { - recv_tick = rt_tick_get(); - prvvTCPLength = tcpserver_recv(mb_client, &prvvTCPBuf, MB_TCP_BUF_SIZE, 100); - if (prvvTCPLength) - { - xMBPortEventPost(EV_FRAME_RECEIVED); - } - } - break; - case TCPSERVER_EVENT_DISCONNECT: - if (mb_client == client) - mb_client = RT_NULL; - break; - default: - break; - } -} - -BOOL -xMBTCPPortInit(USHORT usTCPPort) -{ - struct tcpserver *serv; - - if (usTCPPort == 0) - usTCPPort = MB_TCP_DEFAULT_PORT; - - serv = tcpserver_create(0, usTCPPort); - - tcpserver_set_notify_callback(serv, tcpserver_event_notify); - - return TRUE; -} - -void -vMBTCPPortClose(void) -{ - tcpserver_destroy(mb_client->server); -} - -void -vMBTCPPortDisable(void) -{ - tcpserver_close(mb_client); -} - -BOOL -xMBTCPPortGetRequest(UCHAR **ppucMBTCPFrame, USHORT *usTCPLength) -{ - *ppucMBTCPFrame = &prvvTCPBuf[0]; - *usTCPLength = prvvTCPLength; - - return TRUE; -} - -BOOL -xMBTCPPortSendResponse(const UCHAR *pucMBTCPFrame, USHORT usTCPLength) -{ - rt_int16_t ret; - BOOL bFrameSent = FALSE; - - if (mb_client) - { - ret = tcpserver_send(mb_client, (void *)pucMBTCPFrame, usTCPLength, 0); - if (ret == usTCPLength) - bFrameSent = TRUE; - } - return bFrameSent; -} -#endif diff --git a/libs/freemodbus/port/porttimer.c b/libs/freemodbus/port/porttimer.c deleted file mode 100644 index 8c51ad0..0000000 --- a/libs/freemodbus/port/porttimer.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: porttimer.c,v 1.60 2013/08/13 15:07:05 Armink $ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mbport.h" - -/* ----------------------- static functions ---------------------------------*/ -static struct rt_timer timer; -static void prvvTIMERExpiredISR(void); -static void timer_timeout_ind(void* parameter); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBPortTimersInit(USHORT usTim1Timerout50us) -{ - rt_timer_init(&timer, "slave timer", - timer_timeout_ind, /* bind timeout callback function */ - RT_NULL, - (50 * usTim1Timerout50us) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1, - RT_TIMER_FLAG_ONE_SHOT); /* one shot */ - return TRUE; -} - -void vMBPortTimersEnable() -{ - rt_timer_start(&timer); -} - -void vMBPortTimersDisable() -{ - rt_timer_stop(&timer); -} - -void prvvTIMERExpiredISR(void) -{ - (void) pxMBPortCBTimerExpired(); -} - -static void timer_timeout_ind(void* parameter) -{ - prvvTIMERExpiredISR(); -} diff --git a/libs/freemodbus/port/porttimer_m.c b/libs/freemodbus/port/porttimer_m.c deleted file mode 100644 index 429aa31..0000000 --- a/libs/freemodbus/port/porttimer_m.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * FreeModbus Libary: RT-Thread Port - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: porttimer_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions$ - */ - -/* ----------------------- Platform includes --------------------------------*/ -#include "port.h" - -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbport.h" - -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -/* ----------------------- Variables ----------------------------------------*/ -static USHORT usT35TimeOut50us; -static struct rt_timer timer; -static void prvvTIMERExpiredISR(void); -static void timer_timeout_ind(void* parameter); - -/* ----------------------- static functions ---------------------------------*/ -static void prvvTIMERExpiredISR(void); - -/* ----------------------- Start implementation -----------------------------*/ -BOOL xMBMasterPortTimersInit(USHORT usTimeOut50us) -{ - /* backup T35 ticks */ - usT35TimeOut50us = usTimeOut50us; - - rt_timer_init(&timer, "master timer", - timer_timeout_ind, /* bind timeout callback function */ - RT_NULL, - (50 * usT35TimeOut50us) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1, - RT_TIMER_FLAG_ONE_SHOT); /* one shot */ - - return TRUE; -} - -void vMBMasterPortTimersT35Enable() -{ - rt_tick_t timer_tick = (50 * usT35TimeOut50us) - / (1000 * 1000 / RT_TICK_PER_SECOND) + 1; - - /* Set current timer mode, don't change it.*/ - vMBMasterSetCurTimerMode(MB_TMODE_T35); - - rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); - - rt_timer_start(&timer); -} - -void vMBMasterPortTimersConvertDelayEnable() -{ - rt_tick_t timer_tick = MB_MASTER_DELAY_MS_CONVERT * RT_TICK_PER_SECOND / 1000; - - /* Set current timer mode, don't change it.*/ - vMBMasterSetCurTimerMode(MB_TMODE_CONVERT_DELAY); - - rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); - - rt_timer_start(&timer); -} - -void vMBMasterPortTimersRespondTimeoutEnable() -{ - rt_tick_t timer_tick = MB_MASTER_TIMEOUT_MS_RESPOND * RT_TICK_PER_SECOND / 1000; - - /* Set current timer mode, don't change it.*/ - vMBMasterSetCurTimerMode(MB_TMODE_RESPOND_TIMEOUT); - - rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); - - rt_timer_start(&timer); -} - -void vMBMasterPortTimersDisable() -{ - rt_timer_stop(&timer); -} - -void prvvTIMERExpiredISR(void) -{ - (void) pxMBMasterPortCBTimerExpired(); -} - -static void timer_timeout_ind(void* parameter) -{ - prvvTIMERExpiredISR(); -} - -#endif diff --git a/libs/freemodbus/port/user_mb_app.h b/libs/freemodbus/port/user_mb_app.h deleted file mode 100644 index 7f3c20c..0000000 --- a/libs/freemodbus/port/user_mb_app.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef USER_APP -#define USER_APP -/* ----------------------- Modbus includes ----------------------------------*/ -#include "mb.h" -#include "mb_m.h" -#include "mbconfig.h" -#include "mbframe.h" -#include "mbutils.h" - -/* -----------------------Slave Defines -------------------------------------*/ -#define S_DISCRETE_INPUT_START RT_S_DISCRETE_INPUT_START -#define S_DISCRETE_INPUT_NDISCRETES RT_S_DISCRETE_INPUT_NDISCRETES -#define S_COIL_START RT_S_COIL_START -#define S_COIL_NCOILS RT_S_COIL_NCOILS -#define S_REG_INPUT_START RT_S_REG_INPUT_START -#define S_REG_INPUT_NREGS RT_S_REG_INPUT_NREGS -#define S_REG_HOLDING_START RT_S_REG_HOLDING_START -#define S_REG_HOLDING_NREGS RT_S_REG_HOLDING_NREGS -/* salve mode: holding register's all address */ -#define S_HD_RESERVE RT_S_HD_RESERVE -/* salve mode: input register's all address */ -#define S_IN_RESERVE RT_S_IN_RESERVE -/* salve mode: coil's all address */ -#define S_CO_RESERVE RT_S_CO_RESERVE -/* salve mode: discrete's all address */ -#define S_DI_RESERVE RT_S_DI_RESERVE - -/* -----------------------Master Defines -------------------------------------*/ -#define M_DISCRETE_INPUT_START RT_M_DISCRETE_INPUT_START -#define M_DISCRETE_INPUT_NDISCRETES RT_M_DISCRETE_INPUT_NDISCRETES -#define M_COIL_START RT_M_COIL_START -#define M_COIL_NCOILS RT_M_COIL_NCOILS -#define M_REG_INPUT_START RT_M_REG_INPUT_START -#define M_REG_INPUT_NREGS RT_M_REG_INPUT_NREGS -#define M_REG_HOLDING_START RT_M_REG_HOLDING_START -#define M_REG_HOLDING_NREGS RT_M_REG_HOLDING_NREGS -/* master mode: holding register's all address */ -#define M_HD_RESERVE RT_M_HD_RESERVE -/* master mode: input register's all address */ -#define M_IN_RESERVE RT_M_IN_RESERVE -/* master mode: coil's all address */ -#define M_CO_RESERVE RT_M_CO_RESERVE -/* master mode: discrete's all address */ -#define M_DI_RESERVE RT_M_DI_RESERVE - -#endif diff --git a/libs/freemodbus/port/user_mb_app_m.c b/libs/freemodbus/port/user_mb_app_m.c deleted file mode 100644 index 12fabf2..0000000 --- a/libs/freemodbus/port/user_mb_app_m.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * FreeModbus Libary: user callback functions and buffer define in master mode - * Copyright (C) 2013 Armink - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * File: $Id: user_mb_app_m.c,v 1.60 2013/11/23 11:49:05 Armink $ - */ -#include "user_mb_app.h" - -/*-----------------------Master mode use these variables----------------------*/ -#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0 -//Master mode:DiscreteInputs variables -USHORT usMDiscInStart = M_DISCRETE_INPUT_START; -#if M_DISCRETE_INPUT_NDISCRETES%8 -UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8+1]; -#else -UCHAR ucMDiscInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_DISCRETE_INPUT_NDISCRETES/8]; -#endif -//Master mode:Coils variables -USHORT usMCoilStart = M_COIL_START; -#if M_COIL_NCOILS%8 -UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8+1]; -#else -UCHAR ucMCoilBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_COIL_NCOILS/8]; -#endif -//Master mode:InputRegister variables -USHORT usMRegInStart = M_REG_INPUT_START; -USHORT usMRegInBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_INPUT_NREGS]; -//Master mode:HoldingRegister variables -USHORT usMRegHoldStart = M_REG_HOLDING_START; -USHORT usMRegHoldBuf[MB_MASTER_TOTAL_SLAVE_NUM][M_REG_HOLDING_NREGS]; - -/** - * Modbus master input register callback function. - * - * @param pucRegBuffer input register buffer - * @param usAddress input register address - * @param usNRegs input register number - * - * @return result - */ -eMBErrorCode eMBMasterRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex; - USHORT * pusRegInputBuf; - USHORT REG_INPUT_START; - USHORT REG_INPUT_NREGS; - USHORT usRegInStart; - - pusRegInputBuf = usMRegInBuf[ucMBMasterGetDestAddress() - 1]; - REG_INPUT_START = M_REG_INPUT_START; - REG_INPUT_NREGS = M_REG_INPUT_NREGS; - usRegInStart = usMRegInStart; - - /* it already plus one in modbus function method. */ - usAddress--; - - if ((usAddress >= REG_INPUT_START) - && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)) - { - iRegIndex = usAddress - usRegInStart; - while (usNRegs > 0) - { - pusRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8; - pusRegInputBuf[iRegIndex] |= *pucRegBuffer++; - iRegIndex++; - usNRegs--; - } - } - else - { - eStatus = MB_ENOREG; - } - - return eStatus; -} - -/** - * Modbus master holding register callback function. - * - * @param pucRegBuffer holding register buffer - * @param usAddress holding register address - * @param usNRegs holding register number - * @param eMode read or write - * - * @return result - */ -eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNRegs, eMBRegisterMode eMode) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex; - USHORT * pusRegHoldingBuf; - USHORT REG_HOLDING_START; - USHORT REG_HOLDING_NREGS; - USHORT usRegHoldStart; - - pusRegHoldingBuf = usMRegHoldBuf[ucMBMasterGetDestAddress() - 1]; - REG_HOLDING_START = M_REG_HOLDING_START; - REG_HOLDING_NREGS = M_REG_HOLDING_NREGS; - usRegHoldStart = usMRegHoldStart; - /* if mode is read, the master will write the received date to buffer. */ - eMode = MB_REG_WRITE; - - /* it already plus one in modbus function method. */ - usAddress--; - - if ((usAddress >= REG_HOLDING_START) - && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)) - { - iRegIndex = usAddress - usRegHoldStart; - switch (eMode) - { - /* read current register values from the protocol stack. */ - case MB_REG_READ: - while (usNRegs > 0) - { - *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8); - *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF); - iRegIndex++; - usNRegs--; - } - break; - /* write current register values with new values from the protocol stack. */ - case MB_REG_WRITE: - while (usNRegs > 0) - { - pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8; - pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++; - iRegIndex++; - usNRegs--; - } - break; - } - } - else - { - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master coils callback function. - * - * @param pucRegBuffer coils buffer - * @param usAddress coils address - * @param usNCoils coils number - * @param eMode read or write - * - * @return result - */ -eMBErrorCode eMBMasterRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress, - USHORT usNCoils, eMBRegisterMode eMode) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucCoilBuf; - USHORT COIL_START; - USHORT COIL_NCOILS; - USHORT usCoilStart; - iNReg = usNCoils / 8 + 1; - - pucCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress() - 1]; - COIL_START = M_COIL_START; - COIL_NCOILS = M_COIL_NCOILS; - usCoilStart = usMCoilStart; - - /* if mode is read,the master will write the received date to buffer. */ - eMode = MB_REG_WRITE; - - /* it already plus one in modbus function method. */ - usAddress--; - - if ((usAddress >= COIL_START) - && (usAddress + usNCoils <= COIL_START + COIL_NCOILS)) - { - iRegIndex = (USHORT) (usAddress - usCoilStart) / 8; - iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8; - switch (eMode) - { - /* read current coil values from the protocol stack. */ - case MB_REG_READ: - while (iNReg > 0) - { - *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++], - iRegBitIndex, 8); - iNReg--; - } - pucRegBuffer--; - /* last coils */ - usNCoils = usNCoils % 8; - /* filling zero to high bit */ - *pucRegBuffer = *pucRegBuffer << (8 - usNCoils); - *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils); - break; - - /* write current coil values with new values from the protocol stack. */ - case MB_REG_WRITE: - while (iNReg > 1) - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8, - *pucRegBuffer++); - iNReg--; - } - /* last coils */ - usNCoils = usNCoils % 8; - /* xMBUtilSetBits has bug when ucNBits is zero */ - if (usNCoils != 0) - { - xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils, - *pucRegBuffer++); - } - break; - } - } - else - { - eStatus = MB_ENOREG; - } - return eStatus; -} - -/** - * Modbus master discrete callback function. - * - * @param pucRegBuffer discrete buffer - * @param usAddress discrete address - * @param usNDiscrete discrete number - * - * @return result - */ -eMBErrorCode eMBMasterRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) -{ - eMBErrorCode eStatus = MB_ENOERR; - USHORT iRegIndex , iRegBitIndex , iNReg; - UCHAR * pucDiscreteInputBuf; - USHORT DISCRETE_INPUT_START; - USHORT DISCRETE_INPUT_NDISCRETES; - USHORT usDiscreteInputStart; - iNReg = usNDiscrete / 8 + 1; - - pucDiscreteInputBuf = ucMDiscInBuf[ucMBMasterGetDestAddress() - 1]; - DISCRETE_INPUT_START = M_DISCRETE_INPUT_START; - DISCRETE_INPUT_NDISCRETES = M_DISCRETE_INPUT_NDISCRETES; - usDiscreteInputStart = usMDiscInStart; - - /* it already plus one in modbus function method. */ - usAddress--; - - if ((usAddress >= DISCRETE_INPUT_START) - && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)) - { - iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8; - iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8; - - /* write current discrete values with new values from the protocol stack. */ - while (iNReg > 1) - { - xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, 8, - *pucRegBuffer++); - iNReg--; - } - /* last discrete */ - usNDiscrete = usNDiscrete % 8; - /* xMBUtilSetBits has bug when ucNBits is zero */ - if (usNDiscrete != 0) - { - xMBUtilSetBits(&pucDiscreteInputBuf[iRegIndex++], iRegBitIndex, - usNDiscrete, *pucRegBuffer++); - } - } - else - { - eStatus = MB_ENOREG; - } - - return eStatus; -} -#endif diff --git a/libs/freemodbus/samples/README.md b/libs/freemodbus/samples/README.md deleted file mode 100644 index 25bfaa9..0000000 --- a/libs/freemodbus/samples/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# 示例代码说明 - -## 运行方法 - -### 配置工程 - -使用 Freemodbus 软件包示例代码,需要在 RT-Thread 的包管理器中选择它,并根据需要进行配置,具体路径如下: - -``` -RT-Thread online packages - IoT - internet of things ---> - [*] FreeModbus: Modbus master and slave stack ---> - [*] Master mode ---> - [*] Enable RTU master mode - [*] Enable master sample - (1) Test slave device address - (2) uart number used by master sample, e.g. 2 means uart2 - (115200) uart baudrate used by master sample - [*] Slave mode ---> - [*] Enable RTU slave mode - [ ] Enable ASCII slave mode - [ ] Use Contorl Pin - [*] Enable slave sample - (1) Slave device address - (2) uart number used by slave sample, e.g. 2 means uart2 - (115200) uart baudrate used by slave sample -``` - -添加示例代码到工程中,并编译下载之后,可以在控制台中看到这两个命令,分别是 Modbus 主机和从机的示例代码。要看代码运行的效果还需要 PC 端 Modbus Poll 和 Modbus slave 这两个软件的配合。 - -![1561348568591](figures/run.png) - -### 运行主机示例 - -首先下载安装和主机示例代码配合的 Modbus slave 软件。 - -然后,在命令行输入 `mb_master_sample` 命令就可以运行主机的示例代码。 - -运行之后,打开 Modbus slave 软件,点击菜单“Setup”中“Slave Definition.. F2”进行参数设置。 - -![img](figures/slave_cfg.png) - -点击菜单“Connection”中“Connect.. F3”进行连接。弹出连接对话框,根据具体情况配置: - -![1561351899477](figures/slave_con.png) - -连接成功,可以看到寄存器列表中的第 2、3个寄存器的数值在不断变化。 - -![1561352048209](figures/slave_run.png) - -### 运行从机示例 - -从机的运行示例和主机相差不大,只是 PC 端配合调试的软件,换成 Modbus Poll 即可。不再赘述。 - -## 注意事项 - -- 暂无 diff --git a/libs/freemodbus/samples/figures/run.png b/libs/freemodbus/samples/figures/run.png deleted file mode 100644 index 188449395760f22db4e5875df7437909791d80ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12294 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 diff --git a/libs/freemodbus/samples/figures/slave_cfg.png b/libs/freemodbus/samples/figures/slave_cfg.png deleted file mode 100644 index 1d6aa94e42270009a5d145ab4edc67b9f8ac1b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78068 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⋘B38&ADP&p1QG?fzm2{xZI1j~(xYJ1af1@D?{EM4FIQ%y}uG zQXs$h09s$c7B#&s2U=rdh$dorHz(Isudx+eJz7i4c2)e&9oV6k($mI6W*k!2VO>ACh*5VXOlCP&$L=#>Ya zr)fcFZuBTmVZ{mx3Jm*O(bo#%ek43>1-~vj8vi-BSL8wgIS-+h&bd-Ra1)ZqLwAm}a?F&MB@}}g1l3-C zib>;5Cox-I9DLFc+Vrnc>i5;?Z#l_~t4+QgiN52l#!)^~~bG;CskhdB}+7 zZ&LoC<$yN)EtUUlj{Gf^zoqhjC$8A6uQ#oBjq_VW7aZRmAsTejm&jBD4U#Tcnevfc z3WyhWlgB)jaX!G)I5-BYrMj?{QG0HF>&FK4BLC-?Ke>xnA161q3wS)IIp!tCBqPH zH13cvDqCkN$sEtvx|wMIjU(Ej;MA%8?BJVR#U5~sFN_~JpmKPhG))18W|Fz8o2L)J zm3_dvpO`EOUf|KScve~^-!+P=Fe)auFEXn1P5d0I7Es$fSl)IbZ}MLvq&&Umh;A#t zy~-EFES_|iIRy8@cV{s~{6kR`Scsq0 zY=tnwG2lb%qHe!}L(7rzbqmKa`OWbKuw?fZ{&l^dpZ2WwKIiV{0ltm`>UXlZ>;Nt^ zXx9z{)A<9I8d5^kohEZZgZzPGp)C+XcftEZNrF;QHM(iEoOZ0fTiGIU!B)`Y+ics8 zJnl$4eTLYMe}qA;)6Br%K)8z=M6sIMVeh5p+qk1ZjFN%L`270h!qJ;4sE9(x zw3PFj?8N$W@5cat{Ji0u|-#arN3mv$&~fOp)cHUM%5IH~edT^40=& z;HQx2F*U)U>)~h4OlG4qWOpt2VbZwGHfASMlH>iM@T7m1M1vB)5A0cbir9Q8zN@ zHF$qG>vCHgvSCpme|gwrVkmxm)}X~AG>r>a914ucAep7FOg-JgblRERUy*>-mR+&K zY?qatT(1syUU;T`&VbnNv5bELDw6LKe9G7qw z>WaLn6ZnuW9wtTd%o zx(AAyOm7YPcGbO7ifhHPzfpeo962{wKWRr#ZicW}c2ph3pL-+1_R=@hr zH-1I+MZ1~7!T}ruC5dYjZ%OwN%`9+XfUs>3H`gIV)uzFtL~<<&A+io>q<|jHJ5Q2) z@f~7)6p$6M0zO3yZ5H3yS_9Ns@LE!S`$`yI8nJhvB&>}9p4yQuuc zCFaddCF)KKR+0j4a}5GiCTS9@C;!-1M65~DuhdOVOFD1Lt#NL9-V z$WJ)t>`;S&{Sjip8}ifq^01rMl+EN6^rytR?Xps*Z8@iIr;df*lE4P393tcv61NfO z@_EA87`in#EaO=8V7a>f#L z0pEsTgx!LKuJ0Z;dTQXF)~9WL`C**(XnAXTqWhdwcH5(N&c(_KTBFA~m_UEA8M-w+ zV4_BcHPIOnGc9mgX}m;wAVD*l;E|p?Y1-|F1+ORZsV*8T((?x=@3w*b8>!TUZ0vhD40ab(u$iV32#$)IrKQ8w$i$!2*?G>`vRb_MLp>NUoK zK&Nk1J4Ng|H);OMTle9yevKMkXLitvXni1WAV@yU8KZ`|$&`^&qf_&cIxlB~{r~ir zS}hS_AmfV}uTK6iZbdjyAV7R|dUw_xIQosQBGV94TI+&awHfR<<>v!?b2Evy>f|34 zVHh4q?Q6ZV(LFakh3AhK&s?Kbwe%V!t2X+Q8=O%)CI+46tU!8PTnqTLdta0}FIOV< z7h}n{kgDfrr=}hIi+AiY>)Y%jH^GVQ1&s+ZTj5n6VIK!saZNqw<$A~kn{g7eZD9HJ z#n`q-@eed^EB2FjKF*%#>`wYNy0q@c+z(+UM&H7l$1ycxQXM+=2c12=bu~n z@fY=>UvyqwFa5BD_0}syqcB_)P_t?&WFm0w&?e^xRS6+?Wk#P>3aSLy?dQ(D+ALcU?((S zYiebqqu;u8sI-;kM8=(~urKQ|rt@4Mof)lK;9#=2m*+Yh-E{F+(&IXqZWMbQj@H*- zCiva*w2?l%ruuJu6>cfe0#U!mgx2ji*-8elcb~~hH6!!UwmH2`xc=Lt1 zTyj!?mDZ4subdNSM~(UE0tcY5_ly)v_E0vG_Ah}V^xE||oR=$1dg?5sXB+(VVb$Nh~Eu!tg$%t9| zm&WTyNOiNS2bGF@Q=MZ&1|g)=_}oZIWigmG(EqnQ+ zOK+A=-b>}Anw!&CyPU7C50BsbTqIz<(6nf^;6mg{a)&O1^x@s(7_TnAz0VP* zbD8{O*WN$n5`7-IEYY%;r$yvg-1bVr@_p>Yy>0sfHklNofZ{HdjW%6?_Y2}h$h6BA zq$CqRV}A=GJN$d=svC*C43AlcppQkbQ<*y*)#Js;q2N#mPVOF%6!8sG?f=IY)rWKE zDWKQtq|V(se>jk(^K}QYPNhzGRU%8CB*s%fccR-6MBZ%pmNj@B#fn;rAp+-LsNG7) z_cK=pw}8Z`O!CveU;SH5f2+jbGw1&!N{A3P+fWBW{=lK4FOxuOS=_~gN)ieOn9dJ= z&IkmMZnmX#75aKpU$AC!s-X$O0#l1#h{JG&zJM(6{R7;VU|?*w1&5uyXUOFN!`?dQ`xtV(&oH#{d3 zTDtPz^z!^^h_N8qdsg>-w`FzD-+%G;@aWkcl8yoUWoDj z$w6$W#|XSF09Ntk3&cR|Bv0oZTuERWdRo0Hie22ra^ZH%UEmO3nplKYf$fdrkGfhN z3)hXlT{0~mReoDf)WP-cwaTV30qJO%u1Ycb$oAqS;Uos*X3@)~{vNwB z{mVY)shRdwXtg*in$*aTVl<7&2FvT|k!l<)>L)*eKztyvP9XOF07ykvjmARBjO*}y z&N63zo)sOh@%y+rIJdH(U+lK}kPN-yO2U+F(s6>$r$+=B&H0tvFX@FOPBizOkFYA2 zUo0@e@o5w~%UEq&nvyOQ?HxRo$EWl}T98$dzd*N(R z`IR$+X4%D4~v7#a5gv&>IfXU1PaZiCX&O!ZGaz$2F`?vE8i^+sM|G< z(%ytG_(%qj`Ml`9Og{%4Kgniefk47K!hzgV8aCcLR&R6k%6YuDEG;EUe%O!eUm_s= zQv`R;4mqv6eYK3*y25=tUhihii;XK|+%~&1%|Mqaf9w*B%e4Vk9G!SM;9x2NMG99J zGPu>C=P~Z;gFa|2L`I7+tLXBoDfADUhI*F91UO)MKZ+Wn6XawdC1l!6rMlyo0DCM zGuzj!g2;TCIAnhZtPiep1&DrR<*+6&wQ=V`D9#**HEfIv$ic|(dxh>F{>#ch%2 zR}<*OCj@@VBXAl1Qb3rj&k;_%L;-Dtfet*v_QT2S+8ywN8|zRCh{ocmU!8Oj5kUd% zxT2@YCsBtPuar|Wnk<263mYCmj`B4DNHCy)+;jkzL}npJe1vKsPrQV@^ocpwuH*v> zbB6?|S7sWJ`hx?GDo(P)TSAF_6p*?Su-!OQKmpZVq+UjgEl3h|AZLI|k&8$ai37d| zlydwlaj{KSf9dz3|MA~CpxW^pf2!qe(J2;9tTGof-R*~}lW+QL`$oY8v#w=c4z zfF{I%mD#8Wb~B(!dH{9-tBK-(J;w{zR2^vbe7~Z~V{&I)(6Z~I)j9X)uLCc+q810JM&K_s-n#czhV!%#0&iCc)nawOxVrLYGkUrC|jV=8y> zN6{ievCjmlowWt=K!7PR8IL0uWswx{ITfFmg*^w6B{Tpk`5)-# zLtAtqSp;@_u!)l>vDbl4i^+F*H>LqSIkud^=BgOi$H$W4J)q8gVcy(qh$=4m8&17_ zRhz>r2uiz3rpHUZY0%)WuxQO%#iNrX)`nw@vGi+;HC6F?lY0Hu*VK#{GC~CpbQ4}yEp<*n=-WM9!!60GTJE9v@Dj4ADnWbdd;gthqHG^4&WbN5&%&THs0awp zBYnJZ3T9FTlaQWG)Hdo@lsU@IH{rj(;@Ndt?lOUOLIryA#6!Wt*n7t6mNEN|3+hr2 z%o6wEAH*N~Sdgh!DIoR+KPay6i+o??!eG`AQxeFoi1pT)nxrwSFr~TEue01}Nu=C_Ury1$ zVlv5JE2dx~_~LM`mJ${d?Sl5KPOjhvE#`m>WZD8lcC2R2O#i2-iMozngk36WQTN+p zP<_3hCc(aGh;$##-`VPSwSf`XoYx;UF_SSKyBrnB6{!D(+PRP_!1Q9kc>I3i4V5#( z#bQ(T`?QNFVns)CaDdD?-+V7mfzuWJo4Z=JZD28593o3k3=gm8vUXWrf~p!AXtNbND- zwz|})^qCPNJO>gK*QyNZ-$@b6cbc!Lbez=foxK}&JzOr~^^<9Cy>aIEnRDk<@1Uqi zesX~%RYwdw0Ep4r8>F$~qSDBmhfaafgyf$N2HPviHmjmpVUm@tvT~d(U4+!)Z>Q?- zuA+8VmmbGgDYy3(acl|X;uwtaT!AE$Tq4&DVCxuRaz)c#I$X_N?m1(j^A#iKYnp}v zjQ!dYeq2SKNQu>vM%cDWb}{)?&n&hwKm+R*qjnHXMC0z(CU(@wr^X*UM@m*;Av34@Vu3k8bm$`{GmeI+vKtFm3`qJ%J36 zZ;teDcJ#Uj#Il7Z>x5H37T!1Lw$;8|*AOEV>W2s4LK0u+lCD*}+0z}BSWhG4FV7l8 zYgC*ho3+m-9J`Qk=jxqIw^&(hp6(5EMajrS9zxNl+*Zj`#Pic_TvJj(*bXD4BPZg{ zU}4MWJ{Opm5y%J>_47)s$8{PO>tqRq8R#pS&9QMq@X5_{BQUcJuPA%TLXy*qNcVgV zuhIogKbwcw?na%h+7n^fw@X-K84!FywJ``UfM$CcG>f$Y24%ICzCI_~2C{Y1pst5p z)D(~JY(WLQT$y6&cc;Q@cFNvfXqkeZA32z`40m(zIBQ3LQVJ+8Mb!fZ?|J)_d{YO^ zn|CzPVj;RfdcT^=JP-WNx((H*sm!}obg z<+V*S8Zyc3>_FU7S@_p!+EJjcLLOjzXe5s~`$ADfX(SMFZ~*Q4h<$@#ZfOF(Tg5Lg z^Vi$a#D_p?W&iVkIB%L3WVKJs2LJcAc5(`+wi*L9r+`X$OO7~)Tgg2r{C)vYWGojb zNq(-Tc=k{3eGPo9nhcSFAF}_dik>CMF&Mh!iaAKbm^Lnw;(@9p?Wv9wkf!wK6|qF1 zWN~bMI?z%@5q#Mu-n8@9(C?8XgP`WayILhMNn-A-5?5>K@#Fdtf?9SD z5LPT=?9tb%lWGEz!sa3iGYgU92XLIS&Aa)9$ivlT_aj)ec?B`jK3xSn>5Em5Qe?;` z!qos@c6}pJ_q5+@p{i=A*hB9RLXRrTV?Upuy>V`1VroSB3P}*R7wp!@<@FYu7$Dul zVBATt0f;bewfBvw@s?5uh&#)+71!>q9@<1tGBk;1nf7|5+i$Jq+Tr3@KE`h|doKa| z#qOP9rOLyg5&O05?F{jzNtF*|olDTCrW=WevLr)XbZZIIGMOpmHWJ?v>W&qz7!|~u zXR-`nhmdr2d_9gY>OPIn)1Pk$UvQf$7sIUVz=KI_7s|$~!7?%jwGdekqYp;X3`eCfhc)=&R?HY$eWrt<4LX?a z6f@2B>clFK&#~OaP7zlb9Fxu^++dZCwT8%7NrVaS@EenT`K=tU3hU9lYC?KRW zq&zV8r&92k|1?2c!CQmp|6%Vvqng~-cHyW9Dqy6E)UfDCQ=}*@BGN=eQ0WjAsSzU5 zLXCp-rYInwpwdJL5$Q#uR2At>Y9vSpNhl#e63=v81MeR@xEi6ANj%5 zr_A}xdEeK4-3_C*^bXY=bRg;2kUb`^mr$q{0xuYv{^CzlTse%671C&GfKpxD0;b#~ z1{?>D@^X3APJJ)T`^+qMTYG#iW`aJaBvbA>0n2j$7)x{7@8&LjvzpBH7 z+xQ5S=iayP5US(xR_JUu*_tCtPdJqdm|}BWNEl+l-3?hpG=nFpF#{L3Ay%yVwt%nz z%EJU^?nIZc41YHtv9_}<=V(=HZg5ZYp6047Mo?u!g=hyFNLKyqYxAMJ_(Wt5EN%94 zPg?Tnbd5b4$5|iVIsLH}S+JMp9y~e$4;h@WI8~bc?rCLt!=e_gt8j2(2!MCPxPr|V z#StuKmZ-S1WO+)@`z>Fe(1RZOt06|H=nqIk3(OtJ=j>?wN~zs6ccc&IfBk9jhpQm} zrtw|gIXhQyG@9NINJy;q0FZxh4h-RX%_nKrr?7uM&x}%p*rLWUc6d6?P7D3N;h$gb zKeHxGRTizPEzS1u2H9Cc7-m(3>dknsn!PQ7{DN$20M6eJ;gelEOe2`Nl#*y1#SOlq z`0)vjz5t)ZWN1A!o~!8A-9%>hZp-@|qL0j~$Gm(I3z7btAF#mqF(0aMn4yFrMw~mT zD^gpO8iOQ8kg}U>O%GP)6{4k@Y~uSClP`!QvLbc(^sMxWOGAb_;t-DNQ%5%8f4rKE zxPw@=1&3@$V#JaW_on2Dscts3e?5uX4&BbhZ<%8i_frv5kyv0g;rNga%zY~!%9(LO zYC8(8s|#YYb~YbRfI^!bCl7yk#S^8_Oz##jAo8|oAa)Vl0(sKz1?vzyf~*o}W=0LV z2fvKbQ^#boCNmaXuUmD0f{2j=5V^?!H2ojwkCfQue?Qd*ZT4YIj&z? zcaC`K?|Kk<>&hLGuzep&oL<$c3uit8JQ@eJ6odtD-ouj~fmE951Q;orX7w|?wh=)+ z2QqtBTi-IrLe^HOXG7&M-SkOCnuG#o%h7-)3O@{=3nis7IMd*?Qk>3R|ACQE8b+J@Cj07fYfkOOkaZqPCTgmm09Ahyw=6TorYXg>P`k_v)& z#K?|}sFnSgNg0rm)6T!nFTJM=|L=T3ZGUQ^lRs(2qNm|_unAdCJr5VQtmsr(+3j<} zL+ovT>Ra1KD=Ux$h& z4@d*8;rkGS0VUGFr7$wbi7YZ8x-nm~{Xv$sKTQf`8bRamBwJu#f4q$Ob>s>uf*aGU z{t=G{?mEmnC^b603k^UwoMifUi=n&YA1u{IyAx~=COV2@oWtG29MCnO=@w`1fF^pJIRZbIqHQ44AGc4`2%w6=LJQUu)~^gGHMbLOVgRGv)326-0O=} zwVmUXVR~TOIJ-;yK98vHtjM$}54j+MCYG}>qFO*iaie2BV1|A9Rpo2)#S!DpLnlzu zF&xP%Bb+iqkE`EZgj`3?bwxBBsVAX;0*?+o(oh{6a1++d5%Z$+)&DD!z&5&I62P^1$-!eRt8Q_=TMPb&#Z27-Dy{e2juafoi?3RdloC$>UhS<;Wh$n^G>gBCAVjx@Or zsk^RSHInB*P4`Y&f6s}DT{zms?QnLHUwZpMEE%>pv{!9HnTqxLY72|lCUx^#4ERV_ zeCyj#HT+(_nI-eB`oWS#qlRB&M!CzkWXr`KK$l9`rdR0}ej$-P02e3oB} z(E6x1H|jijFC|lSSg~oK;qXV5;?j0OguB_Pgd;K!<#fcq?O8Y=3ra*SYD?K$woEWt z<15w)OwDAI$9! z7JKf>5UcNDuEKtF^YwLMuYVXI0~!ET1XI81q=jidt$8Qns6y1=<)urZI^x|kq{O* zSXzvPGpAV&;1na0;#D*>5ape{0f*<2`AacsTot@h2Tt;xSTguJVF=f- zqd}8>rEPGm<#ME(!NIJD$)+K12`Z?#(oJ64Q35BX2MJi&-2fxe!VUg8koJ!OhiLT! zvhS^4;d>F^LKOSww&<%rASXJ3ys@A@WW*uj@gyz-AZ|dwvc(l##%50l7Yt39QYYAtz(bWUP1{ zz9Z$Hr&XY*?JDjgh{3XY`qKpYKmAyeX)Yjck++c{PqGZx7964a854Lgt}731j6NGt zT&M0|ZG0CW8QRe~@njHAXt4k6+thY!H>c!aGRk(-x1W)s6F)39UH(l zPb$*a3NZ-*+0FA6NGz0chnfIXr)dn<7Z>pZ;s(?tVo7~tIqxZMn0CtXWy{R4?$J>o z9rNryFH@rPCW^&EdR{&2BXz~lj7k{Y6WSzLjHXWEd?b~%G78H|4P@R_$E}4U;!nKek$sxI2~o7n9|{eKjk!~!28dy2m8~z59OH| z?-(}shs@FsXnY6B+( z?OXA|xqAxWjO<4dS2BPTDEL0_PW=YYoXSisoc6Q~Gpq^UzRlAY)vU|QUz#Faq*vZs zR$G<%{r2@+W$!Pc0Rd1fHz; zF$-v$K*ZnS!AO4E)aPEJKYnG=!rJa%>G_#OxCeFs?)8M3;tZTlgCu5`HcdOW@ zP{W3;rwILyS^pCkE;on{Q~R2-IekoH7+fTUoT($%yI0l)-YS~Zmsi!qhFcN$TfCdj);J7mf zf)O(C;!Q&zF?)ND8-l6?c6+=TC7T-n90B0je*Y+&cKwcuYcZ~zTEMsiU@;r;4^MH2 z6aeJJ+>0kUfvip9*go8mf>TJaX4veW}B#MV^C9x_j^MP+Tuqq>RqOR^#yV@9G^!w=6%ZXu&=1oW`EHDFjG`06~+j&*;ehE$k;ZSGo ze#c2r+93c^0-jKken);(_1K*@hS1Je%=UgHfvOet19BhWx?f+2DEf^+_#N9t(R4r0 zmScWm&-eY76Y#%2NMrLI@EdXt;YmT@r9{jCTH*a2Y5v4zaH6n_R?hE$Px~OvjXh)< zG%=!+;B=;n6`C-R8Xvg9V*WZCGRJMy%J0xnm+{+-_Xr%oy**P&Z0PXD*~Z#}Fq)%k zk%yyykVoO@xLf5%Z*lMDH~JS_#7he;jWTE0@0+2o_08d;gu%@2^-aQ?O}RpnmL5!~ zzMa;o^NJOJ-Pfxk-%8}Ll-eUDwYyFh_XYZ{2S~e^#GfBv4t#*@08-io>Iu?N^8|0N z!;G=*Q(l{XwXq3obEJOc_z|aT(R+7Gv@w0l3bg#>GNzj{^U>hIbmuJZt2g5g6O{wHIO8z za`-yQT?)A17?UNx!}lU4-B>>&FjjU=#Y-MTzz z@u`w6D-v44dbTWi&~T#fI>N!=@qxp!0ixG?o~9td`tA#bQ4z+Z?+s^o} z27P!Qa^bs)_Ta*;#-O4gmPaF_V@5M34d@p}uw`C>$6LKCMMTtHV0+MPng4Dciz=(Xo8U23W$D>xsL7?9biyjFcNjsG{&#xMV z^mTE2F=piJ`G7Fy?3QbN_KjU>$Ph}*RIX%*`OKQyli^1!0{v#E1(TAl4d(RM|AupA z2-XiV$6!DD`yyRb>b(OL3np}Gg15wUqp~y;hTn_3@XRpyK}0}NBmYKPOug2QJhgMk zyf2??q=Wv}nPHn4gpX+?N# zhDwrzvx)7B5JK>o$kFEQN6ZWDdYR3=67SFa{{UdtoTqb20morLu98QSCV7RO~7j1;kh9)a4TGQRm@ zNagiF$ey)q#ZY;`p4+28F-cxVHva-RV? zX;jis_h>qw=+nm{E~l;HogVq~0DqBF8&Cx7wm=D1A!xVD3f0Unpo(hV9(7MS*=H-B zHs)7uxkrj}Ui}fjT!YA4lQRqZJ)f0(xPLW~JFbkBi_LPLIqUYE?cKHWFAu7*4Kv!4 z7-9TX40caEbz0~7NROT6pJsNn95Z~v{nA`1I&5Qu)k?HBtH-w}T>0XsUO986fXo!3 z=Z|GMB9EWs8@aWMU}kqPjs6fjUzsr&M`RtPYcuwJ$0{uQ7R6kvj_6l15-5(a=QI56 zE?|Ljj2RyX*GEl|dgQ&!jBE^(zeSo~?LhPEu`>&N;t7LiO5$@5y}Pf&bde=Q&kHf^ z1(c1h1yD9vumplRI|}gaeeMLRN-a?8k9Pg#wWa?wF9=u@9(o##&ZL5(@sDH3pXP!U zm4}4+dKDBT0-TZ?$H&KGoE`a-jWm-@10ntYXs5MjmM|jQVgn5em8VIN;W4;|w*28A z5LCe0mZ@Y1rAL(Zl2x!w`m28d(2$pcfku74_yZ#2pG|XqyPc5JZCO%Ut^UZZui5$+s0z=N&T+Zn>D-S%7?U9P?TW%cBP zRGMYT;lfu+Bksmx6MF3R$HvYs+{I2O$St2o?bkPm5I29rzOf}Yo5G5xv-W`=D9w_Cu6OL#SNuz9w4v$2Mq7Ne?oY0LjSW6 ze)0#znLwot{D3T7BDpZ`k6C*CDXGv7z69_xECWxE{n=)_S0Hx2dHobf7t|*!wwOj` z9U`m7eeF6#ebYLGAhUgB&dg_4vNx%JZOvxLDsKA-m+@8q$g9+`cLMhT8+M(vNsm(} zFjCxnKhkdY`r2Fn>~r8WU*(^Do!px4?@dA5m`XBP`=8s<83`AYL-X+r>H>l>u8BaA zTf}T%$s3Zh@55tygrLMX%M6zs;9-6DcRco|YCu2~n1cFtA+wD5O03Oa2L3{S%LwGj zi}^f*s#5dFHhu3bM;z`tO+pV*%Nz#9YHBKb*2OE;;7(QhT&kUGvyP-HD>Xj(Sd(%2 z0Jc-Ji)a~J4i^eOk=Cj$P>W1Zv?h5L1R%xqdrA|g?j?M9r*y3Iz-y*MI*{1KhND*0 z(IyOMxoND!??#UFPa}u5<9``B6X=p%^;t*GUmbmOlD!^vhUd=7HTz5N1CyHYcWcu$CLBGvr`cy`C{e<= z?#b%}=9$yB5|?*cu1=uUj2p-kN#p~zanE1Q)n3TUv28AHFxCxHdGw|%tS&C{^*tFj z2)m^24W35ZGBizkdWu^542?1#D5qcW2)dHps4dxD4}FQS)43`6wqJ#(k4f!hTzk?r zb!?sC6|wi$l?He2)?lEF!7QdBnpz(98CAE{#;GdC2edP6I<%l3e5?Z(^IdNFtm^zM zOlEM!th9>Y{jG6kQX zbJ)41sct4cj@4?uG&g82ePh)s=CEO|{s@PGBAJDfIH(D~CGV@ai`w3#ew(V;%1@~c z{djexA%6R^O>n8*=@rdXHR+y-*9hq`Tox%eQ?n?=WQB{-@4!w<$f_!FXYi0ugG@tu z6$)8mz>{O^UbTIm*BfCqYCuUUFMe6;ONDA4Yiu2;{G{7_qk;$>ZaYo(yX%{W#DtuPRqkBr%zkBSu(zW+=IY_sB0DON;wWg*=G0dmb)7Y93)F0iJqZ<8 zyzv%lNw$oIM){(a>*DMWp7J<6dJaGEtS)kUd&IPio|os_kNRLVlfk2AQYpgu+YuJC zNmyKJ=)bvnG7rbQTq$$dBr7q#!8kT5R zy&{_i@D_6?JlY?@DYwyKKDfKh8HZ{ zI_w-vw5W7slNZW4Q)zj;{L(RbC_qpyG+@<7cvDuW#+oX?%t)gtLbrf#p;60=4jv)F z1tZfb1X((&>jy*_@BM9Y=hJqd`YioGMiQM-0Z>A}3vehszhnkVwhiKGfp@e|QYXo} zEjDR)L&fLH&^ybuZHc>&Yo+CkxA#uoRPWU$y4fCB7?@*?hOcoEnXBb49 zR(!v_k9?F~_SBmZVPXLMB7lG+FPtdBbQit^tlT1kp>-Oj=>7x36M71bYO)m8>ZR!b zHqL}mK*R}Ak@}=Aikvf4@qCg)R$DZrrn**X{-RFG1GDE3QIA|Yn*3qAgF~P(4HD>~ zra<1dY^qHttk*}2d3)jqq_fv$M`F68^<~-0xSf%&y1hshm%f?ko$_P@5vR+pHyTOsHbkOLVt7a~ zI=n55Ps#4fd>J~ivvpfzr)$qguR^OPbZ=wrO^$hlQ$=Wg6B3SR}MN~XI7s^L}hOIZA>`-U--+{OAT5N|ji|DXK@ZCtBY3%zL^IM3e z*`?dvAK9xx|4DC&nsbWvK~o*ti_I{u`V+*_bX)}nf_4~eU9_mEcpW+O86C+GSiWFw zE;FfEFg&3rS5?_)%w~rjdMHs}Ij8-c6csi}Qpi+Dn&XY}sOBN@mbnfYy)%eHj1v?^k_&8F;3*0@fofJQoO`&v410~(CX;xqs0DV2cm_9VC2RxEIgE}X zs%Ga?V~0$t%M!o2Vke&p;W+k=k;DSX1;hKTlMN$=)AzfERrL%H!RIdbV^%hB;NTUH zLJz8@VcoMt`e@LXqZ5mvy6)^k{ks&zBMyjTVcBIJtCUtJ*0;&hX6dQYjdy|zNlC=) zB<1W~G;UI7rb=hpa|g7>yY5AAJ6-qX$?4>I?6SnZ21f_U@*aA^nPW%^y)3qL-EhaKD+xINb!v`9vT7FJ>R5D7cN$+ z9sQv1nC>^DD&=e}3lRwPoc)uWiT~qXyvWQOevRxyTyY@#G>&)}T&wDtlJ1#*UE)_{ z$b2Kc%2}Vq`OK>@-XO{Z2f$UPdH`4XRx#piTK_CdQPkVL#HOYZ`-HJjI|}8NuIM+R zl9#*qKqpFfNY6jbmnUS2!Q9%CY)8jercQ!`n5ch&AHezj3!TlH!fc?eM>Ez zGGWm*9|2-6?WS$WWFFvj6Y3y-LThL+Dv}=u+WZ!XyuNL>gorUnm^wt9+|za zvH;(l0Y^1{sC^`AS%-Xm)U3)w;Qh99UM{+Ai9an&h5cNQPaSexJ;dLr)P9+L`P=f0 z?IMSvWa`8KQF?#nqcS~SL_W=&T2n$@UHpnoESzM8bIq+Sm;@1J$^{CG6`ogA^my(z zD2VG%=DmhHTQ~Ckw07$(YNfGp*LN$hfstSXcYqDdm-EL-tE>%VFYhJW+K|6F>X00w z{J*}1U+FH_GBq#nmn(Rk;h{g+=&jXIpt4aPamd|kUyg~oqu2B^Oa1Cmmgk|LF{>Wg z`vKfH=*F*y@k7=%|2WtFZTUegEc#k$?Vu-0B%?DRwnI=1nbWvyFNdjtXL)&t8biO` zbcY4_TjtsWAqz#nM4$YP$D!7du>jolc*)!N%{-7vkTa~@5NFQ>_p6~Rz8KPhj+Z#T z%!rkKw)<~>P}rXw3Tjknp*#PLjNB3b$PIRPeG)#L=h>T#K{Xu;Yj|~L%nQ3)%zL;# zO!0~JY68MXbOI2W4r+*P`JyO#CT42Q@&}~U^nLcWu9yAEtSD_*;XI6#ip~LPwXtxL zh5@ix7dn7~!`cVicYmt~-FUC|P*K*G6N8>=ja>9BA4^#+v4d3ejp=Mfo>+5qY|iG? z7N)9Q?p=o;L9aE{3g?v=eVg|SOfB47zS&h{d6VPA`#g=O%-me5W@DFsF@QQ|d_0~5 z{{5yqd|hS%zq$HTE11zsf!^&dcmiGCmu zN2mQfAOl5u5GT+$^uNYUZg28eY>_46vq|v_I;pM8XG5JTXPAwHAMA`>z3L(bKh_%1 zn*Gascwwu`^FJUIXg!D{P8}#Z&4>8Y4Ez5)I}0rLu9RPv$>5h;y7&BlbCZN(_me*b z;1wWmQUO}4C=|$pc&m-HJ}(DNKxAJ*cYY=zwShyS>R@M&M%u5f*A;0s92p?bmK*q) zD`eSLnFjmfjHpk^rtcAK*rn{2s-bq(+*OIZ{LI|(1%K}VR|f;zAj7=Jt+7h0H^0=S zc?qOxyO1$9y}^24H3)}X)l(Xt=Px)M8c$yJHUh$Ym%;G=!;a@w^*dX8;kS7#(l&7@DWrsVpX z)Fn=OzO`KWa&uJNj`8w=BevDW5_PIcjY$_@G=xxxcZ>}RKtUI^=ms`7_08xC4$^m1 ze(Qx1pTk~FIo9JgV+~I+Uc%4iKB`>(&t=fb(QY!G&4w@iB&%! zV*YpGOImP725zxg6I$eEsjWoyC(RHpm8Z32@l$)Ix(+Sc95|1CIiGQ*o2*mWP*cg$ z5jkRpx$cgIs$f-1uFSdd-l)Ly{7AFKdw_qfp|^yZ^R$vKjNHmlyXX&+De?{P2m3dN@ur?_^RuRzXe^L8@%BtE_J@ zF((QcHzs%s4#n)d>nU{OUgV=QMTflCm@d}5YY80S-ZecG%107@4ty*yM6g!mZ1eU_ z=D~KG%qAr*db#+?<88ODt#Ry2HLI|KPQW)4eb(_yPq|FWdwdYki7#%HLk37UH{^>k zK$c2BH$U0qcp&-}(fRb0Di;J^V66WW18Zc!5g=b!?pWDm%X71SZ4+XA?>Y_t5pUW-&(jvC9j_m# z$i5Ren^4dGwVl9?4wa@E;HVGHE6UL2Fvul&+qK~O2k$@b*%QCP2lmr{i`lygSAEEC62 zGn|muv- z{HqnQMpwjb{Vz$XGM{C$yd~8U6;XlT%jojc<|j+MtmwyT@)oPKyncXK`n)5)>MwKj z9LxR`iBN}=Eg|wDL=(+IkY79iCtdluc@_cmaJSfwimV`rYUHibju*{#Rip|R@|qsk z5A-XEht@f;?tl$@&UEcm>8o{+?FC#_>#0dsOQ0=;J&Yr?vt$iwCJ}zm2hY3wI;^qF zbZAL_gH>LmJ=rB0>6)KVpYFW&z}XkBJ~Fx+?ssCs%*xmg1&a_C1MH+hV{KLBhUo!U z{2@)JNvwu_uV=l+tCqZmEaIYmGI7;Pd74-Cq5RvouNHVOj$*50l6lWMV~#3C#RDe* z>;QE{V_fPY_3o4`g57=$nN~{m8(1g1cmxy;6KoN7ZL%XOJ${V-w~u8z$;HX>A_<%- zlm!{?Ti&2yGuSo6l~#UKLamDX`(o67NdhCCWn?TwQ#;WT8f_ma!qfAw`N$B~q_4gYRpQhYov@GE{=5 zcInd#F1a^aZ_Ap1B49>Dt;47WH%Cq5tOpdAFMTq;+^?YBBT;PjUhvFu4XFCf$0HWW z{;3uLHzYnSUjd#w$ZY*(6^#(nCjN=c=i>`ah67m(#ED)*bA)`c=ku`!p9jyIKBo(m zg#{AJ@sl^)3G3&AtpVU)$1~0s6aH0jQN%%2$sh1kmJU@$$85-Ipgq6K^}9);ucqf( z<)K@$rVU&ruUtRYDg)^pe76@zwdSv)b7liHKnG~xp)}C@4*(jF0cZetdH@_y0#qqe z%Oobo=5p;yQ}&4ZW{b^DUUoP6nV5hV2pz$NR~=kN>_yVIO5!g+ne1N|t%d%A6y`v9 z@~<}q4W9q<+&`m`zd(zB&s}y$-SKH(=6%;7*t2mmIJ2EyvU8BA^}f>Z{;N0BMl4Jm z_YJWN?@0#>La=Dwri|7CwWk4?++jckmMd%t^Els>hTKTL1>t%7AC$uT`%-!Pf7O~n z?C8z+@U26^r$AHVOj9~%MIUU_k|D8m0-(dUiX?o8@W;G$o4Mb1D!S(Xp-+X*f~>;7 zMMvl#kOcTQ+adg7>mo?dthfb|$56CTz}-@0s3$-gk*93+AC2h}7zG5VCv_kgEpTSc zJbQ}|F;I{iT2O7l24A(R2SDh0CqSNgHumU(We?ycgf4^%G>}zhBiGr_pbpG0zO-Ld zaTk#2%;Ft{+o4XRLyQmRyBH=w|XSpF!>buEz+)*tJea6I%C|(=QSIK|nrn z<*<7OEPSZZL4vGWC?6HAP_C8y#m?<`o90mJo2H{Jf|gZI_dkeggsVT~SK5)d%}}Kx zC*jfX>kpd`E!-b>o47tgaO3az{xFF9w#V8vUJLUUwMR22(}{%A4C(Yo<*t_dJv*jI zIh~>VXvPDQwLRMW3+=vzS}ko!dJP4>=-v+YtO(-SK98&Ss}(gKD_my|5d6@(yYof> zU+cll9YotpOk-_-+B=3{(v&S=S_@R})h2wa70xN%+C9!s;DrN zZ#10tn6z-V>Si+gR$H}fN>;Q7NdO%|22@|j~;oW93Jm3}$uT!#4a2C6^yRp5}E&bg4+n!HQMJMY(wMZZM!7Z;jRroOFwUy0$ zDn)fw-P#6J0$nv{y&C-ZmiW>0u6Zer77~u}3VD#LiGpdnt2X&iiokp|)v9_{8Un`q#ZTmp#SC1a8C}C{nn5|CSCPQ|!dw zvY~&+kp6Lu=`YdVZzJo2zGl;+wFLoXZ&JXBv6)ZW0dSR*mj3AnWFqZnv49)@ObcB9 z2Q8cU!u?+>oK-*i)ig#^W72OxvEBqXKVni23MJn#QrYOgC3fm{jfU5fu!~)E? z{VoysIVTW{tpq3MFgUwdG2QJT*82u#>UTDlCXsa*_#D#Cfw-a%0C6V)&#yd)B2oZK z`|bmvgnuU=0j+Gyh_sglB^Jd%P9=O&j#NcwtF>e>8!%LUr)(RoCsEscJ~$d%5)H_? zdu5G;b)|U(l@CT8{7G^CTV6!)ZCgye>V$ad(_o$a$Gxq~e2gLC?pEX5yH33mmvx*A zkv09(4E5S*3F;Vn_zHa8slvUR+48^aY#-EHPu|3Q_~)1DPw2gKDszPgZCBV9qYTUe z)Xz_W-fZo-biTh{r36GdEvQyGAR<*l7-v82+I7%=ZoWPZ~AwE%#-p@`Sf8oAl@vtJM2AbAziPvRS{!x@5(! z65@qjB2;jDX*Zm#NhC~uUSv9e=%rj&pZkjo%5+Cq-m+YY<)hIRhN zoEPHl#WLbttr~c<%9Z29kqt~ZoZB}kjvo_Ue|AE!x_7-U#DUdbSYXkwvUc@gx|958 ze=%>|h)6>QrT2<%^tXy+$t~jT(^`_T;UO!uo%g^nNdg^n^mhnbo8dr)!Wfcwq+UED z1pR<$lQ4v-pY3iMHW?vb0Z-lrg!8lgb1&6^%fG80wn_cjM+OBPGudeP3Rrid>+Zm# z?3?(t6&5-JPBRf$!OTuTcW4-D1|;kMJ@3EfdS>}He&jb{yK2~S`wdrkc~*o$9>ny& zhkdhW=W1y82rP;*L~1)rt;(gsEqfxL7Q3%$*RUt7m%i;ia&!5vml*GX-t(3b5q{Yl z?~nP~#OsLFIXx*qqdGQLc{@O59p4NE`Et~_e7)RY9nyun#30sy zh|j9Eotf-QW}mrVJ}|%H#J1a&dF_R^;T zwv)m*WJRfJ*l=OSG26xnlBwlOE(RR%Y$awtAZmpROu%3r#woJkbhLSRR+B_G-W8DuSyaAV)67FH1^W^?^p1~z&E{EByi_fKLK4SO_C zeZ{hz>#K)*Nen)8amsIEQV;HxD-utgi#;smRQ=?H2vbZh%SxrM^0?ypp5=)y!#JnM%-t`@xv?%Qk@m<&Pe)#(MkQb*4QdM1|+`rff8mb+s>)10D)r8@2Kg_R^U+~J> zJ>x00&%F$@16=@t`C?X@M`XlzK zSR~Q7sK0;xsjS`Wsy96=B{;>K8xl1^s#O)ShqGMJOC{f2bM%u>E`JN);V`!JDp(v5 z#^nz$s$VE`3@TVqC65n}+m4CfAA2tvnP@d`WT|hy@2a6lnDp)q9+uH!{Ol@phYAOc zOsz3p-(Z_0OajDIPlvLoxJ3(RFrc7&=OAKji-k^uO`YcIxfoL0&cKKOH4_fHmHMX9 z7&<^Vu~562)-S_6-vA}^0losX5Wn^~*hTRB7{Yso@-D6aAD<-Xe|SyxONrQR=3B+k z)nYgg?F;d$~|UvZ^3_jOp94(UOx{t<5T zw?)=oD!_+qF+-OC)=@FNXoo2Qbr(v2a5?P`$@tY^pz!|^kDd?zj-wf`x&UnZpA9}= z!`xvAlQv_-2jpl*lk^joRY{Euwv^xc<)&&95KFv!Zdr5R`6BL8vVQ|-_^*&xxtPXR zR7>EJs(O#7nhpb~Q40b(_J6fkBz})#PWhS*wQ7S$ZltBl`&9pC&F5L(ofjs;cG|Bs z(DSCR%KKnHvQ#tv0JU+bnPVYTtA`;lZ(}f0kzm?bIl|sJdR|J>+OzMXwZeIhcXdg_ z*PY)xeuP*SS+@i0iZ@tIQ%SZ>Dq#`q?pXUpBBsY=A9t5YCXS zaDB#xqn@P!Yvaryun+Ed{e)7OMk!!O90r-8djKYj!2&<0EQ13MtdtPv+k6RGg!PB;me-@|$H z87SaxGN#ZDEoEsO z*LuaG&Xr;?d;giV64ODyJ2jrn$L)_ubvQsfF!M&CE~+Y{P?c{#{X1RxNB_6(TnM}i zpQ0ePr(tV>|1((s58}X^z)j-6vO(c!4|RjMc{?%=C5BNRyF65UMw6gBC?{OR<3~tlo>p>14&7JT^_)8 z(SS`$JS%`x&t%waTJ=iI73mj<7~tew$H!*mK15~=43s?e|BC0JDy&Wns&HxY*IA`y zow7Ze#Q){~u7vkWVP0kIt<+4)je2Sdy`U)A3bwKHVrRbC zzWvr4P^B8!igRDv`l448YdB?e_25_m=#&)K6sl4-7_18b(S#UTC@s=VQH3tm5@?c; zM^pE@m5i`yzg{RHZX2$yUdAJIIc0naL_ar3xx?6qq>UE*oeh(~A={zyx12NE6AOa^ z9*WDg3D^u{c)CdXs^^;x{n{NKmI7Ib@qUFwrDj1EtI>wT=ND%Zjk!t17OTmYGcxuW|u5h^tLkCr)1~RmC zR7?!5=ubw6qxnx^-w)jM|FC&n9fVhSB+$ya0tX=6mIBHXN6E9X6{!7G)8;)*BmPnK z(G~U<8dl#Gvc6k27kPNTiHteWOg8*J_XD!{;LOIg!#U7+?ZX5&bL7Oa>=p;1fr@=T zH43<8`L7MHYo1ox)*x>r%3KdPch(@a7%M9H`U3=TWV3KyZ3%SKWL8=swX$uJUQz_` zliLYogGj%E%5yiRk;XSha(;*B+45&5MI*lCb|CqbP8Z2~K59yPM)Mj_!5nc*wG?Kr zs3KKG2b&a8;RgK=E!p=c*^LcCy{MVqsoK}&Rax7N8Rp?zlO^VcFJdI1hlFiUD0|+{f!y(1w-jKT zI7))WmS^v$mNoBb1_kKPlIH`9Q%gt3CHl?MZAK=qvvQ@zNIVeYfcIC+_9U@Dm)T#r zBZM}x!)o=CnjX*g_#*93eI3yB8_ZZ2t#|QeI0#@sPJkUhCks2$~6#v71+wd70?R+?w-S zQyl__+7~ZF%7kxtD*zGR?CjnwLvwGoY;!mPyFJtTrFaC zAbPMwk9FXlO}zFos%=P~5f0sm;X(Ub^#9iTtrlNi6}H_t<2UR%jZHq87c(uxA#C%e zJoPTB~qd@iA24!!e~Qa^Gs< zVi%^JUGx<@t~#0wKTf+3MZc(qL#UwW{A|od*DmT>W359JQT||)>A<*h!gZ4ipKN7^ z6^M6YrYkG&pA&ywGm&M{oi8dBr&JJd`VgEJ+VTTpm&O784;oB6fh+ZZ4+i8Tg2rO+|-?O@{ELwUbMe#QMSB2{K;xx33iyz z=A*vRRoyJ+UC*F4xFl?_HPLh*?KgUwXT4g^;z-|wasJ4->$b{3J(v5jpJZmC(R9^_ zOC-zLaIyRsoP(ewGPDbX^Wu^S}puCP|e04 zrg}!$}W~(pzAh|1MbMh9m9@()P4 zBoe`GM{tKb5?(o=yR2*av5a=gU6x^-Q!O&{y!@iustZ%mY zvQ&iaJP=o`f|W@6=`NE+0$N-*LOJl6S9;S+oCCz(X0Se%tVz|sy~+70txDfWQlZ!A z#D|t#jYY*a_-@AGV55FT6$C#Tv7^7hc;}YJ8B#kVL}?r{tJoj??IPT(*j?s60Pu#L z{^CxMlcPT%BW6pX3a}`PhP|~zK8vGq9VZO>%N@}(o0ls}vlfC>Q)hbFkK3C(9b+y5;qfGKqBtGW$d-~c8xYFRc%HIEcTe#Z%pIoM;I?U1~^t`olF^_0!q7$@b{ zw&0#|`+$URP9sE@oAvQ+K{`~YuNWxR(To&Q8ADlCv|hthJhZCGyqtD<&5;8>DpeOC zQTzGaea2Qchk>BuzSw7b5(bsEU|$a=c}+pt7aWuZCK$w~Gf{?vGgE&ob<2%-V#L%Hb(8M0A{Jcv_+cvlqHJch4cD}QkUwj)G&KY>JD%>5)vAXUF|k!?btw)Tnb_-WLNO5Ea8 zosQkdiY#o8)%5pog^3mxDu2oH86;tyKW)GPXxSN7O0 z@|V;ENmh58(9`nWY9%&6U2Ikt>yiVDcR6{J#U)4Ol>)LQUcy}w(f*8+Ns|f>Nm0gi zigLNh1^CPsS&G{s(*S9o5v@u6tuaEFjW*QJP9qT9g(M0WktLdQ*`ST0}rV zN))6E2nZ+$q4y#X2ql1Y5s=;j1QHaa1QKc>A?r-nde2_E-g5T%&fa^x-x%jFH6tdO zPcr9x?)$#3-{qSCtE$Swh($pBT@Tc{c$Kv52AGCbefH#pSIRb@IHBg+G1jbNLlOun z$X)8eB+Tjha^}##=ORc&oqL+-F;v1B&o++?Tj$ykOPI+YqVaeOK}hWjZN36*pGh3R zPcC4-V4SI!vEj=a^w`2_tG;^0_4)$?->gs!mk^7eF0R{O=wp&mnjpy_ z#F+}o!_HW@b8JjbnP<};SJ8Efp|!7<%sZ3{dY6j7RI3SeC`F7G1rf_W_64UMA6D>( zw5oGa_>-A}8xeW!+sp5yaVFA6gOV|)zg|?tUw18okGD>o-_NAcj_wq z_5)|1Y_E&3bnWVjWOQ8l-*`)da3KI?V{flF0t}3c42Xp38svxvlj6!8azt1P(y379 zI(A(^S9{$)@?7T=C)Y1$XUX-rn$uBtE>UGm&Yyope{dN>cRYv&grfdNw=mZ(LmUzH5Kzc6z2BRkK!b`a-%&O4EtHIw^$s~fRM>?se!6pD?lPuk-b_+}+0x)) zWQ;)>J+~{`vU_tLXnvPmuwCg$@DM6(OG=W}qUY zTHhGvaoKRG2Ndm`s$$o11VJTrg4O&*$c7w)gfPFLe7}vszw;4iyCx(7)$wR5(3|2d zqcN2Nv)uVnOHu@%(oc5!6& z^|tLN?dPIC@?}YvR~HB;SooB6xX9}d__5_X?5PDeBm~F2^fY%eck*s?(`3~-o_Qvk z;|d+!B|75|Gu|+R%Dd8h` zbXgctI};PxNKfll=Os!b!Z*PTSnqnP22$#aenmYeGvY|c3#Z)g>vdJbw_DxA?bEcb zM0`4aDDcK}O@A=SrnxRJnks9P3FYGa(C31Ooph2JllmOO$Mo>awk^G3^ae*|Fn9CA z^n}A7R`S!CSx7&i)B;OZ7sghQJN*X1Xwx|ZW-^{~CwcGDu$1^HDPl^j@Q*f|Is%DvPx??gb)Xz|XH+VSNveMFG+*$`FP$_So z`zTH#0|A zxI0g7l3IFJA~J40H$e$Zvmf}{#ICABiZml(3Jw&|*FHU*mg z@=IJBjzRZ&-&fnwM^B$o?rCZ=e+Su50DGjlouYWM(-|Mbt)1#6K6NqI98*;(wI)BM z7@|iN2s%1LcEe^z>fe>h2&bL!^l4`6k}oQhOL%GJC`?(oPJRw_gWx5WAM2~br@GZCIU{m6ZZ=IQ{> zVL!bL??Q@c2sC}<8pgIa;bVyT?GrlQ>jKJW8wbZuy~W3JeTG*ugGYaSk7N)L-Wk9+ zqRPe`DWnmjPqvw@r7~wtLC1zH^hz`(p{;}@7Tv>;hd7V?zSnUUfvy%lS)Y$sy8?<$ z{DWZ_5XREfro5Saq@c*#tNpG5t{(}XPNQf?Nm zFjY-Z$2nva+cn~9?E~C0lTn|^u&02HUWz^xGiY0b3Op*qAtBnwFZBgr8Xu*PbekTy z!Vin4@)de#wF{lBYEZ|IUQ!joL$^}Cy?d+rx-q7}ls=4JxGBY#rImxv@XM2fs3>yl zHk33IjbzfqS<*_<7t=T`%{zDr(M^mS7E5e;W#*2=6d#WbcDJ_I0#EMFmrR8iR7i9Q zrTHOpfJM1X_Q6>T#0Ze%@%C-fV2wdV0hsQf$5~_p-@TMOA(x!Ro8DR|_EeAdHfj%B zGG3KB`@-DUC)j4w@of50AsYB0P)^=~D-^^2)2(dhrhi_PJwFR?)u0{%^gT1P%+zzv zz!mW6UO-mf(w={HN%o96cEYM9iE~V8y*So@E&oxhfG%Tk_9>0#!z`A;eukwMOOZsb zZM#8_eQ<}_dtP*%Vaaw9PR$?buX!ujPdfjm2-lg_;lrj6BJ7M(53Iw(aMu||kj7u& z$H(x3L8PK9fDt!LjHI1_n}z^+x*1vCaH}!>Jh;6Jdn0d@)(Reva~0!~bG*~m>vlPs zul>p=c}8E1^~%mYOQu#gl>qtbP=yrb7U_>RKM6}m_4Dx)>*J@E7E zKF8_;@8c3LA8IS&rrTbU1g*`OJ2cp9MrhZ zFfqse+2|89X(UL{a|-^j#_q1@`Qi_R1XQK=fh~HD^|B6YjAZAt6Al1>B<2{Vb2f&F zoYMZG#(-7tWJZZz=Jx<$(-K!{&f!*pdQ0f)q6FgN{s=lm?4gl*R}<8lMU$kb&fCE59ou}Yxw(GFv3Pw7f8y(s6(-R!E~CoBx`-9(wMshQb`HE8 ztzZ2@Of&5?Nfc-$YRLz1>goKXaJeq6`P>2Z=A z203=i5RUOOj>jkafh))$e7KAA+Geka*?W^23yZ}uRQ2c>w=@*0p8W8ItV_?Dcm~^9 zNXWHVBeqKn=-U=TElpvVg*G9=$S4)4hK^E`)pje_^)r*?+NKbd)16g3Vz6EF7}!w{uF)@!ZU77)iYW*-c#C2# zG}g)jTW8^)JWs$iMST9^+wBxaDB(3Sk#v!O@C_glsv6>b)CB@Q zn{9Q5D?%dIIL1w(bzf0jaeDh%>{yQa#@IY#u}5#F#wV|fi}Z5GY6d48K4#83eNGN zkWi^A&m4%T9*WnKZ6)MDA1|AYmgSR;?~o2FRd48?zb44XbB3Y-uT8)%`51{F&tgI& z1B&d=^pf0L@9LbtUWW6BCJe290GU~flpU!-goBSz_3#Z|#-plSbIV{Ri3p??aVKo9 zw!b5Nhckb0_la3kD%Zq_nY?iy`$c6-O7HTNvf$il#n>2PYfx69;|dd zb7@r}=a%l$V+O@up&+2QQbuOD)+h}eO9r_~>NK zA?7EaNe1EC`+`+L52Y0vB%1efa*9vCtJaQfIbs@ar`CN@G)`AE`TNI3GcFo1?#+=M z(o7NXx(deuVuF27wZe1*@_rJnR)>ns`&m~2_*_9TE#aaO=aQTUvYxw#So}t(9J8Wi zy|KWsPZ7f1L+jzo7`-JlYe}G2Xx*Ie%4&&y$R*y?uTQJ{*F3MyNWDC>`qYp|HIeR# zV`MMB%R40$eVZ;)6#Up zL+wNhm>GS!2((=?)>`CiI3(NX4IX?r^z8$bTJ=QTLE^ph!&#qq-x5rozPZJ~H&^yD z-~>6U5Nb9P1_WhfWlm0;O;|Z#MTe0-aeRrvc~NN{-e%XHRzFX8(t5FgySM?e?N7EY zvJl-1j&6`sM01Xf0?8YWkxoU~x21%ajPSEs1uB~SZr695tMNwAb)$%1 zLY?sbnjJ>lDvD8eTKaC**KY9dCXQBE=pJ;IxR2RMk`O-V*TZ_X^b(jg0B{aa4fC+j zXGx)35MN6JiiYRe%{~@KGq3GeUMOQO<5SZq=3%`(+P>W=lN?!K_W4#jzv6;=h8CR< zJREF?2nvuMmX+Q5;e<(InfZ;*L80!McjTQ=JyTg=(*zTb?obJ?iZIQrubVlqU226l z1^GmO@v4%231;4caZ5zYA|rE$wc5DiT9Q+zp81aqAGpS4%z5lAU=@$)4t=!Vwk|P2 z*#5BoaAM;26+w5Ql`UfQ45VhznF{i>i?`5J<>E|k-)fkDf7+Cl+u1eit-%8ryZe-m zKtp9aqubQfnau3LA~S;*@DsvgQi|QOC-y@rDl1VZQ*8X*U9yph`Qc6q$ME_{e2#L~^~!kfMgazE&C2GM5I*zC7or38E`c1P#STSA;E83NKx2|y_5|5=saL!v#9KxhXyN+y zUbfjuBA19FlES=jo>kWK4Q{wN`^|%d4=T zOGLUw<5ZAwy;7xSx;b&$KB9@*e~@?H#mF=rMXFp5;Dgrj&rCE5kRR0PN$5pc=`x1r zLGsKc4MZxrv#RTA8FL`@Z_Rsd^A$IIW2d|K(U8zs$0c{~hd5 zn_1ecZonmdImN)-MkMBg1ydg3)aQDizT+paEbuV==Se9cPS%@7s=$pk02xEOQaml& znw*o=K7I1CpAVjIKECx?w^Y*Yao4aDC7{!OMfZTP=T*i4!wz+4Jk^#QPcp`pq;}Nf z5TWX@u7HAG7I{85uyRY(a{8u|E(h z#hP}kGHGVA)_$9%0DkV3`e{%U(mDiu!c|q}LD9@&66V`#PU(2BKa9SlzLoV_HL>qd zWw&$-j@p}FuDf0?%&b7-iWViu6OCl~4RT8nZiQrdqqzA2+YQcRBR0A=#==`?=9Mymb)Xxze=t89cw$Cq014LtAQB4Nj$~0Y(Sz1@{N;4;*)N>-TT8h;B&poY^yr z&=TUC1{7-tg07=TTm(QBc62q#XRbNhDea7&3ZybpPkUg?yd26u29&pmHJ4%=fAwv) z{E5$E(a=&>UnoLGC=x4GHH@~!L&`Yd_A`!k%%MmZaECEhqM2nNbad}Gx=8xO5+7g1 z)RAl!s|k!o^&_OWT{4Y6_>5_m1MSnOs(i*WCM2|QX;j^REM#rw?vUt)KtSJ<(Mn7u z?mF{ZnY^19L>9h)=tb^4SJxohlji2YQ4jhRw#HmMRc6>MOw7M~@haSM>7ypw>;Q`S#wUubHPZkzR17`Uz<3>FPvx7`GgyDp< z7>DE2t|-G`^heEkv3n|wx3~@>i>b`GdRcC3?{yXPf~tCoo1?2t*{TdHhF@Dy#U$rx z^nmDvmcil^+zFXc+1O9nx^qXr#cRUEkL5n9L%zWRn6|p;gkM;2Z)sw>qHej6u zX00lcOf5;iEsdWz7UdCh+}nsr8%TaZk64YF5KF4iNtKX-MZPn!iA&!&5-e>i)$Ni_ zN{D%BID*3hKqCOJr4ncG+=Y4?h*72(ZSU#XZCp#5iKD&1$E)LaSETY_IyB+Et<^Kg*PUU3BUb#`0F~aLcFF zE%y=+Tz&4-)CzEN@C&b0Wo=0(%m%5aPX==q%}xuhj*gzl@bXcre~?*^bRB$C4S{aC z3ybR8y*e89BEByX^%4kUDU0H*4$2|NSOIy(P);kA^1(7yS;d735sJ`uNKT&VwVSt= z?oK(nU8^g;gHF>&&@xyOmFlb|rl~5kF`;Q3#1X_x1zEbTBe6EyMkzdGgJWHh9xX6XmmU}TWf>JUDtJZ_r1^pj}X z)0^V`?vjrJy%`*~mcF4+;{fKL+K}yl-y!0*5EFDm-!&UKK$RDJFMHAOu88QZ!ld(I zCs^K}k8VMMtAPGZdO!(Kix&a(hbvqTh1Qr@;NAl^0_JUoz|Dv+i*g6N$FMX*KL2Bu z<8k0=M9we#mH&>HIQjVLEbm4P`9`C-4}us7h*B;!5o1>Y+|SO$Bt>Kev9YuBqn>7- z@N%7@T3N42*8jrA5&Fw9q@OUegX1JCrvu@YfRAd^w!zc$)AuL3o_Gftk&4FXv&AyE z(|j*KxYa94uWflnG}x6PqqOe%@qgkW{Ex>2=k`5O`<~#vL-)4mJNK4hdrR=mBk9MA z{wI-gf9Hbt68v>K3@p?E!q#%q2wN)#m~QK<%Fec|TP^l^ze3!v*}W=CeC-}o@Ah5$ z@~6LXv2{safu1l9ziULRDmOO=KfoT@IGj^$4_CIlon_*}f7UWrA;P@n$&7!dF#jXx z)?e_}Bi1WT;WL|RAIh|JQ$xABjHy*UO>3 zXbS&j0Ty{@+5zeJ>;G6Ey2oJl00DBD6^S!p4!Alh3{gRNX{FC=H+-t31-2ljE2X>= zo)^U0YfU+?pLz6J_eChZ2}saouJ6bqoH>BKYqo?F67IYi!>}~EDBXG_@geJ(!OL_9 zSKHst9!R`I=VnFlhvB30lskZ-^Y7mX;E(*Yb&2}J9tpKF>q9U)QdA@DB85avzgSjI z4%S_;TK#kA3)&ysl^;J}WWWfj@EH>I3BOqTyia!7DF2WCS=i4Oi=S*6j?d1q|6~8g z-GM8oetP21{*B?yTZjLde?w7?{lGtViWq3o{l9kt+%Nx@tCtmr$3h8-d|^}J$67vs zKVlPHBj|4Y#ar_CX|`|wmURH6*)GC^X%5?Ze}jg?|CVa|c1ir7SX~ZvQlbAE0tzsC z|1~iskF9^9bxRo>ju1qGLzGijQ$2yPIlEIq=HiL6-lqq@w&_?$rfWZ8B> z(W+spOdUAXzTZ!eGr=X>>YW(W`fl**1BwMB!I^T?%c+{{?h%7E|N2&v<7?^-;!EY} z9%J5D0W2el>kdhdx)*8&gDPGz9-I)iX>ivxv0MX2Iv#zxrY^8`HGP1ps__r<0*@H} zV)Y*V^`HHJ7cY2y`W%3~qVutDHweR?`!O|DfFJTxBN`&Y(Yi%uR*o(wGm4bn*}K@f zd@HK|@>(BjqpNy0HjFs&#Pq8Be1HIZ^ubnxr}mj>0vsj`*C)tn;JMdLaSETVLY%|t^Cy{;*Dv$7SYvKD=v zZvC^1ZET~huzfG}_N*rvMs)EzRrjLFU$Pm4cDLlFHmTd0V08~ZT47vilhHqLNP?&I z6$1$ep9cy%sx4u;M>j zVN>MDHscwf6*gYn&G(}fR_vz9emf)%`Y1N;5- zoQ5n?em?MG&GhfeUy5mub};*CC47@uwfXLf^9E)~m+YtP2X6~VQrsyzvl9^(1s=6J9kprW*FxiNw2UXH8nL9^(yA=tC*`@XV+Ke zudgZ|J{!p&zpE$KiI8$ROSh*K5wx-a?*qn%JD=es1^+bIE)7B3HTZ)=KvA99*az>g zBLMH4eF_Z@IM5n_4e{?70`)!+6-XcjVm5(C*>om={XJswH@dYqedD zocm$H+xBT%*n?BPf&ZWp{J%E^Fc1HA%R6Lh7vcaO%zmwsV0*u5+Gd{!yd%ngE1{)Y`--FMDatp8E~=e2kOmkpB!f2CVshuIdW{_mC%3Af9hX}&)YxV z$OKf~X&b-MC5)uxOnWaj$~d?bepeR^(ZDs>cbQu{`XnR~%v|y91QCqJ zsdMlsYbKh&@+k)^snOMvH8DVdQBs}c<(+7hYanG|*#%?Ec~2j7K#IU`Z$q6Cv9X&9 zB1N{g@h`Ogk*U;EWvrt)FuwAy<41qDk^Zar(cdkk|1y45@`r=;U#6h`u(SRbe2k=; z8j=K6G*JqppDfA=@-?Ph)ywhg_KWj-A9!+#k^k%Z#V?4z1hD?KYWy$xApbg!_5aIy z+)?a{01Ujs{}CKJ`a^)xGh^YM1^p6}1Ei__NSC!zBUR|>8!$OFVT_)BuxaIO>^pFeTje`E1$m0p~1enF7;b+6rXknD4G={Liefl()o|4G!7q> z%%U$n!}LS*+XwW&ReqzBq`o7J{MqqVyMiE5WcQ!M>^3}*o* zsUj_aA-Kx_ZaZ%))QGgi`#zDAHD(oxLq2)+u~E20*Lrvmrv^z)b|c zo*Aq2KN_5OE$Yq!r7LW0cb23)?pt`(p z#`RT4cdV4{bCvVwi=QQ+>vB3?mroxfq=$T)F0nPaabxiO%eQ5TtBeM<9Ff8o6OW5t z9nJrTPWt~SJ!*j+u@%s8dCB}yU5wN@u0H*vA0OjWTxu6B}Hg3ZRMWHWd0U1=F8JB^r=!*sRaXJqOY*3fSMq85q&gB-7 z3v;eusKLwa-{>ZYC1VjXuqvTy=fM>!Pw~_e&=a+#Tt*O-Zktv0=5lWLb|UzFruulQ-MtlKwn6K(&;G6)l9i7*-R7lk8---G)cktGhzI>C zsq05LLvO2#lLZZqjeAdfq8;|4_Hz>$dtENX!dzi@I#i$!&ds-;t&6=McbUUX z;$+3)vy>~!5t30rz96udG9W|q{H#)p>rz@U4UH-84?LZ6rl)#6lGZf^-bRm}O~$1e z*92cZx?|gMWr4#35K9X&Z80$$jiuZjQ6O(xix3i@RR`rmF<~21oi5+Tr+$e0%dff0U-;?9d-e|$nPlCHEZ2xXx?k@ocW*igc94nye+{0B}<}Fx8 zqreWxBM<8j7Jgr+Agptj_%EtPUyM`!U43^~X!{khEFzmE5mrLuTTX6!*4JimqAauw zIYKm?&vH`Es4)>#yM5dYT1wy3jQRRmiC`P{;lO@b>z*$Z%!)ppgY1ZW^nK5I zpIUtSZH^&QHRfh~^t3wwY_RFxhnuCc?&S0We+uSl{U4$=uJ9s_{&hab@PVR#mlvV? zD?-RU4(mARWKXpeo%nz9QFay#??TVCTwGxgVykiSNA zJXb~Gb7G>UuiFx87ZpX}H? zZE`3^aYU612$UytF$8TzhDi(qH9Uip&>xBNDWb8rJ{(TBzkiJG^#Ngfj!nz$@_ZLC z>BdqJ4fFf)ugga1`TOF8PGR-3rcGNJLbk4V>yrd}NEvj8pQ^FcjcFfyG8Xtd^);UQ z#o4jpSko#nRxbOr_4!XGL)xD@#Se)qSn%=7LVN&}QiH4m#7g;((X#d$o)G{CRD`Mk zPKa-jw5YB?ER89f(7I3)J$bJ@VoCIkdG4&S_{dH}dV zjR4(WzUAHPg zdDHdv&8aUYni7Y~%>AB_I^t&wRAuv>#^e{RS!9J;0g!_Di+w~sBnNSP>F5q<6hEj~ z0Y_O_U^Eq~HMlq{6dU@TE&LVJ$-Y;JrSV6CaQ@5&1DoBJSgnNM3iD>pd6`L@D;!UH zdLCaEP0K}|Jv0XoPdh!FMUI^7+#edH) z#?$kBw@WU1uvIkkUNqK5^uwEk240FDIjT6|%d@AkZW6Du8X8HtDK3YaJ$;>u%YtXx z9~X;5vux4f9k1?w@iBGf@Ef|!dW^}peLgAIk&6?Q9FpSXuKw<^Yq4!Ihga3xc2Vu? z;XFDQAyU3c49?LF+(C}d)gk>z;HEG`M4@%^9o1z?3zLmAcmt5`Ao{Y;H@FRt0+1tFKc%LX2kAemOiwWQNjHIB97L4Nv%VR>Qc$v3I%90lyQ8s zdqyYISiCd5`p(oY>Xpdws}LTE#7o~2nJaW9Fos5YvNu!ip+@J2T&!;+QOToNQpR0{ z3!ev&(iQwJ)M>08B7tJdImu0_1iapfpZnu!OWVahAfUw~1A2ezrbt z+a*`myNyEhcpey3u7wk@mt;H@<0R$j_j}xKF0Es;-I>b(n@OafjXi0>FuwK9VxuTI z3KwZW)^UK&-}sW$%5(9m1e1`)m6wq!WxabHvNoN(X; z4dF4C-{=^30fLq0NAG}YZF=cD=| ziZNA~#?Y^-vQ0oZ(z=EoAUC#MCz?JRPNRHn)Ij{6ig+mSt4tfh8wYKs8n@P&5D^ho zYnJuP3lXx(xrUPQ*ZHX-dvpzuv!HE`>m0Ik4Nx-_ZS(xe#J)*+*Pwx!(6cPm|3isREi z`;=#3$uN?aCixwnndf^Qqq=8VuPdH74Tb72LD(dgvVRRZ{S(@4gLq$|V489pwSLbsBwmDeX8 zF~-OxdA*^Flbc3^)65mHNt5rJn3)})4*G|D^-07KhRhZXg1ANc zQh6?1xi}|x*vcu2tU?&5a<6QjUbuqQ#N#fl##D4C}A zupNk%^V`rnlEf2*k`#q7?hIR%7lOe+55=(u)3KUr(Cxyn48y3Fl(SSNGAP?Yhy`iD`CSRn7d#ji zgdJLX3d>VVE6J7~F4yz7-!`>kiV+8U*FW?+KaiD-CFQlQ@dJ5Mk)!i4cJIj*II&c5 zo<)|{cVeSv0#$%qV!$a@pu`E_t3;?@*=Tf&KTK`BWY8L z>M2q3XF3)>SJ#H@IWZ;4?FLwurTDn0p^w;UxJx;|<}rEr!H<~&@e?6kd!`=4&?aeV zZCr;M99>=NyVi)T)LknktU6<@6)m0b5L`1j7u{qY#lAW^sK*~cry_fpdS!^}zdaen z*NQz`QC_*;Z@K)8V>EW*^JHWvKUX+M*LbGfAook1-doWtam8?9GNiQ$DV~ubjfhZ% zl6W@^hf7rzUFOUsrTMG}gG*MDX^FB?jT!3c-*3A_7Z&e{-kR7I*Ky~S&O{WVMM$l< zrf9T&8Vm7DUZI7xg^5AoM6Xg%zPYKR(ycDWCl(V}y@QihT6ObN;li;aiH~f>Ocd{v zz1pm~OB=!7kss@tB2@W6!ALa;{jocIFve-kdj2N$LiXdN^s#Hmqvxa7ef(p2w5Efp@7rnm_PguumOg1Awl!4s)*B7VsT!yZ=35C1y_IweyZxEt zE8{Vk^wrs>_P*$TS|6Z|LB8=)KU6=krpn+oCn-RWOzHMbl~uOEPU=XHVX`6n(Psj+ zOk6;rK89ImPy4R{_b?ts10FH~Ey3I_6bfcTE)2SQ@Sb|EZW}-<2M@fZfr2} z&8c~Z?{2$NjyNHs8+K?izbpaPqjv8zmG+#7B+F0b`>+WA5H_h zlY{4$3w{CWnQz|%v~C_GOoz;fdF7ue?K!_-KmPzOcZ`&(>iOV%C0l6x!yfg_Rf}U|8wUP)U0$?I$h~`px|tmT{cUju z)BJ{gujdzA`^&{ zx>Lc zZwq$WQZ=L)_-PJOMT*GlU-~{it*)jWsu^=et`S5EB^?L8yA&#-wu6fUd2C;C8;qlC zdbXeVSD(ncmy8u=&Ocj*@B~K+aU+?-IGYZ6G8s3c8qbZEDs+^SM3w1>dHu6NPm`y+ zbUlXr)^9GUg3rUuYnmyJ0!=lNAX!<0G${fiE4a-0%pgcRl~~jYGFz<~)bLzz+<@*? zH#~5Ixo{`B6k5uJ&u5oz@ZF*C$b!~h9a<`sTmbV0^f#TNN`fO3JN1Z-ywUgiBOsYC_%q-rpYauFp=VYC~B9)!vM6cUaC3=tD3%5JU>sfst>wwhY z;wz#)B)`Zd*EfR@NTpCG+$U8oJXBRnacL4`-n*ZM(6 zaTZATbh9c9-6+@OmbxMWG@;^Or<4I*}wF%ioX@V z{IR3AE-X${j+a1NA5$*_fhYN>wDO$K#8f z%1%sl**+-2SU}Twi0^p?lLsAHq1SX7FMe80Vbj&adc@bGSFgo(#I{tI1TZWm%eKq} z(-?_suSy<_(b&z$OXG{I7NyZBV20T z^?`dAH}C<|fG~8e0^b_pgz1X3r;6{g_w-6>NhxSomj09A%?XyoGoXis1C?|Y+9rn< zW+rxUYwZmZodLWl?ScYz1FAg4 zP!FC(e51OMBwOIjjqO5VVnEE$uwO@2`JjT+wAr@F+~j>OjPWOwC5WVz%8 z=qZ43*|f4nIthP?nmO=|+>p~c`-Ye>^U~uj!B5Kgwz=I0Up^auH?hf1_ir7`B4MYi z4pog?y+~)ok zOy}09M3w;d3NevY1|0Afy=^c-maGYO+m@B@1~x+yBkDVE-OFjrknf5|uR`RHA06pRbU@L^^u(#H9U;%P z2B;5y8}S2qdUUxw9z_}LRC951CC1YmudhnG-nl&M&ewUSI4mbC5yYcoq%!<_lGeYC zb?wPaMIJS{s*J)$1=^n3cgODj8W4(FDfo@c6AsBiqTmD~<(JA0HIgXkpK`iq`6!x&i=&ZkH0ETYgan-_#t_ zXWPdk$Vv0j&eoI$gC7*6@LwoM%#2ufJ;qP<3HL%?p{^P{RCD@c!`l0oO{XPu2u+a8 z&|FtqRZ7N>NV-1Jf8ZSwW3B}7Ax^Kd&)^QX@dz}g&T0-|QrflY5qiV?8cEYuRr z((>`53M%-Y=Hrj+{+`Av=AXSI8Lt!zHUhOEQ;gX4DtCSyuTF>qn@jR z(QahXPVvF^xc&5iQ%R`=Sc-cGg7Ir~6V#h9A+phi#fSooT%_QyKXYqHH3m6pF=4)F z{95@KK2apxW$u&rI7@7_Q+^GR`Gri$LS-G%C`f@zX)mgHKsUFgOA53e4x77g%$UTQ zA7`t2klh@wm=uEtMAU=WI8mA9JmFT_J?S7mY%4Wvb;2K6K_w`fNkd3-QpaMBkL z>70Vk0DAUzAk&s~XtpWH&mR}V=j|yB9M_X&yg=Y$+L_T!h|2XU$z|JDtrfaCAsP~^ zyw~s5m0ydkW_P}@l0CTDRRw_eT$Dz(_#i$dE^E9T@|uh#d=TEtdFDrsVE}p)O zxv-CF+8{CP?}Dj@d@%R|o|&=^Cl>;djvB;D0F&&YNbHMfY!?> z%_ppM62EGlVP~!HlUH~yRc=|{FhPX;+A`wxHYxE440a(%ivLZtQ$Vmfa}TTuk~7ETYYDqQm8NY736%5F`! zFfC0v8sZ`&7W=Tm<3v@-fZbcEYtFYNpC6e^_5bs|em>++Ngve@r_Hs2;=Ls`;^187 zIb~tCE=sI>ZRgmo#ZJcocH8je3l**hO!8;(Q6S*S15_aBg4rX6-a$#7GY;!(+)qG` zKODmFMDk=QEoI8Z@$gp=T4Bx$;#J#NAR(qrXy+?1NxJ9K00^_fz-wKAE-U|#NOR)> zqC{(|j3paxEf6Wh2pyVI9Ik$*l*05zR{nfJY@C>(jNvIxkxPaG!G^@Xmc9`6W0loI zR6gQD%N|on0%fVXADXPzQ2ZE+W^&y*Tb_PG@=7nuYrl5x0u_D9jGuo{x2tz(0l?3w z3Aj{8q%$iSOw{9KQhe_FoyJ+pw(weTZ6~MYWP7_`|1dr+F<^{TwTh_Cp?1-NP(_$Bxth(;P$~cvFi8VCQk??1B4l|B(+rShplN zz`Eu6!Mb%tbImrj%7zKD5@9PNZg^=}hZz}(Di7Jw9QByI{(zVTTpeWnat$fc#at|C zSfsG5Xo8zZb3)$5>xiq~cX2a8REF&`vIbQMhX67P>@iIh9^NHDMnN@fy?S-Bp*$@m zS~+><*Mn-ofCJSpk&~KtjDQ4Kt+`&uML14ynCh0RneJ3AWY>fo^XRVctf;SPdab8$ zOQVoG?CG$(fw>!WMymP?Ls zInKTM8d$B>4djfNbWbEq>O%YJzz2*j+b93=dE$q2!!d_pn8Q^~@zPwDvHn#Gb~_U&8G4dudp>kA4rxC?^d&6O2F>6dz!)>UAKoGf zz){#8o>@F&%A<-1ji>RCR9UN7g1D?5Hq=}Fo$NW;p(*fc(1g-_$FOa*DxRTf5AW3~A)mC*{A0WQW5_mc<+jL`URbi{ZQ;M>vMo^ArAY{P(|#KZl_eUTMG zuOtdEnkl4eR+16`$W@IWGu|N5Ot$rfTaiK%@0Un?)ZKedz10T?IHi@BCauk%=$C5F zT(>z{eEe;Sf#g=>KUpCF)uP!sW~Dl^N$K^)hZK-hbV;z6&R>1l?nG+F=qc+5$skb| z%)7*c4wo?273WH?;C1hP?3tgAwtf!OY?96D+(exq&u*azPAi6fKQWxNe1{UoBe^H( z@l>-=xJVO3qDq`py#&b$bUt=u*qk8V&9QBn7IPBe=I@h-SsWc&@;bP*XX4zVHr#R+ z&w4}Cc1nx=_NsGgdFJLV`jS7dM09@s`#~fOr4^VH_}#?xwI9tTHa-6~qAs+!?B*kc zS+f~Yy|xE2U=j46#*B-{RbZwPp?=@nH|0LF*`xd*jq%OD(Q%`>NRsykJePY9cDAaY z>0h-QKtg)W9Li)?k>MpHCB>PEkD~;l2IN-Ohck=hkg*|KYJYx&pD%{wp;?_Enmm<9 zSts}rjK_3&2PMd)tE!MJ#T6h>Glc8kv{W&ytr-!i_6)?+R}SCM+5V1d$f-5SF-@@F zHi*HrH?_$=ck>SY=#{+n?M81--hC3zE@!}3EY~UJ zSaCK{iM|2hvPPu>myZBI#mb@m=ePP?-HzBz?rW8FA)V5i>jq2!h;Ueu<6cfjuoq`- z>7qmn;eHZVvQ`87u0V1a3T2X6@yh2Zz=d)?G_7V$kM%QZB!PlFW!V<3Ig4dn0gRD2 zuX7JxQqq{jM9E0Lo@NfZzG8%xh#pM!Nso-R!V zv@yZxL{y@e(L)p0)3GZ5x6Q2reurW}!$ijp1l}L7`uVe^ANyH8^V7P;chx{ed~#ofjaPHZ$vur7 zF5gN&w*0@^yYi@}t~4IdHWsxgBB&s-Es|JNia+nkPuKHP?V*CAeAc5s#K&bCL$=Sghe8Y3G0I-kGY7)gI3$loHOV2%;e7`H#hIz z`+eX2wNI%0frY0do-8U#|e~qlo8dYkBhinD@ z=y}@%2AMHLT*0`tqMh5l9q-|}{Y`t^xp8wXa;-3pRc-|(8c3fCbh}(=InH?rZA%Vl zJf$QHoni`a?8@ytTA8dC!W>s{wN>N&)B^(S=RjM^(It9Ca?}*(`k{0v$jpH1SG4JG zM(mc(i;>jP!N%`czt|@6w3L7?W994xVb+OM{2ftLmloC7g*4*X1R)dO^q5NEJLpI0 znV)C|YKfPkGDB>qIOw)a2=I=Y$3lXrL`|fk^1rQjPUpi{or1f`h&QXn5+1fUCsM0(p~sEDt_f#GK)VgP$s%huHyAO#>Ppz#xn@eKZ5_d3t$I=vR=q!? z&qg;QV||e?%%WCzM3V5Gry;)j@TxZNkvq!Q~fD3E9*uF3kl;*uFm?n?= z{m9(&aPK$D8ZQ89-rg-m(BrJ9U6M~T=eZ5-2hs`I*At>%Cn!@1zn{Q7|GDfYWj!-q z+dn84aSzuSKfoFhGgL@h_W5oMnxYg?j)mD1YpbH8wnIZH=rHbyrlj>bu@>%7j7Whh z35!zE`{WUhBoXc?&KbHY;g~;h5@kyV|Fw66bKvDM(Mn6EOff+}@DD-Xv3-YtziPSn zmeQGhu}c(X6t#V?YVL3e`E7?uyZKz@6QI}b!b;jdaN#-Q$~2O$cn5Txpo*+3X*Q3- zHM^ZRj~HL@xcIab()W`wAnSb?s$j7=#V42-s)|JB!yE^Q4et79j7C%zAlthf$z}gp zjPVF0P$Hum*At>2tp>FrUFgYnP&ly}28Ca(O0$@;hG&4j0Wem9CbQB3(tVK1gH$i1 z_Tj&5Cl@u8FLe!j1PHs%?DjV}!Hi?ca7xz(F8ORj=9zWnULn5utvf;Dt^>2Yh)r4c z#qA>&y!ah*S1t>#U@$VbWUG9L1muz>p4VI%)Fsll1Q85FQa2vCJc}{)as&J`e!%Hp z6Vg0rpL#dJ!z?#aDMCk52%=@m5;4eZkIfP72TZtHqG>JAVuGv#-L@6(La7ZP)*pQhzO<#aS0IQrm3fcAnRioSTd8g!K1 z2(FO9et*OgB|x10EhK?!?kr|>Jx-7$-UF!X%Zj0=6)&IEgo*2um(C>JC#e)jwMA+R zq&Cy=|K&zdacpI#H?P2|U)P2hZlUEuEFZdv6y6iV3#Di4z}j3PNW%z*1&QHSN8PN2_O20++ZaYxDi#|?)|9Q~Cj@TKA12IV2w{eB zU4+)cmFE?+i?>~4txSXmHJ%%g?hTXm?(k@5uWmR=)TH?R^Z2%F^xUXB4|sKIp~t*` z80=bc#;0CrUrA$vJPgTZ9fg|a%19<#l4 zYg{o5penV7{4pF5frUV7VBv|j)RP70!}oOb0Y`pYi~bDc>1`50>S;J1ZV7(Q6R9YU zzqja>P&}Mu{|TW`7i!(@JDdaXW56tCPyO6;@|EwxitD3Gsu@9e^zuv0$9c82S#=TG z3%B-7_^7LYHd14FGpww4=QM5lLvNBe#s=U=8ZWTtcy)cSM<9vkl-tvSh7Y`!*OY~; z<1Tm3G|l}x)M5#N+Jgu{B z*W_c<`38W%V8c!PL(qgYi`t`0gJN5i-vZ7Pdkg^A^GZ};8{$&&YQ@YN#EaETSQTE>xNG18+(b+rW{8+ zv(OxEoi`;4pgW0UQ-{#rWlZ^aqlC`%qPX|ndn{}-(YarsauA7EjaDI1UFs{p_Knx= z*!;c0{l21)dV42c{DM`yS@a5?GvAcn zI1Jp7^HsbRV6YYu( zT7hbTs%Lg~EJjjWbEWOO_VE`s-mByC`=@6DUf9{0MkNIwF)R9M=@iROn5jc0wJEPWm^7o1C$Q^dkzY8Mt50`Lr884QT}Hah6GAwTGss*4ygT zudNwI4rgaasnY^AwaLi|M0V5X*WEK{KTYIuOruik>^`lz^bCm^tJWB3{?eh{a>Mxd z1KGE%j>OfF`+r_6lW=iOu4A0pKEDrW`1Mx|2|viS9bbR_-Zxf+yx)-jy(fzOR~m<% Geey5p19~0+ diff --git a/libs/freemodbus/samples/figures/slave_con.png b/libs/freemodbus/samples/figures/slave_con.png deleted file mode 100644 index 925bd9e2de6600c3aa14b8d3c97e1d8b37c39c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9571 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 diff --git a/libs/freemodbus/samples/sample_mb_master.c b/libs/freemodbus/samples/sample_mb_master.c deleted file mode 100644 index 33a1ae7..0000000 --- a/libs/freemodbus/samples/sample_mb_master.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-06-21 flybreak first version - */ - -#include - -#include "mb.h" -#include "mb_m.h" - -#ifdef PKG_MODBUS_MASTER_SAMPLE -#define SLAVE_ADDR MB_SAMPLE_TEST_SLAVE_ADDR -#define PORT_NUM MB_MASTER_USING_PORT_NUM -#define PORT_BAUDRATE MB_MASTER_USING_PORT_BAUDRATE -#else -#define SLAVE_ADDR 0x01 -#define PORT_NUM 3 -#define PORT_BAUDRATE 115200 -#endif -#define PORT_PARITY MB_PAR_EVEN - -#define MB_POLL_THREAD_PRIORITY 10 -#define MB_SEND_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 1 - -#define MB_SEND_REG_START 2 -#define MB_SEND_REG_NUM 2 - -#define MB_POLL_CYCLE_MS 500 - -static void send_thread_entry(void *parameter) -{ - eMBMasterReqErrCode error_code = MB_MRE_NO_ERR; - rt_uint16_t error_count = 0; - USHORT data[MB_SEND_REG_NUM] = {0}; - - while (1) - { - /* Test Modbus Master */ - data[0] = (USHORT)(rt_tick_get() / 10); - data[1] = (USHORT)(rt_tick_get() % 10); - - error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR, /* salve address */ - MB_SEND_REG_START, /* register start address */ - MB_SEND_REG_NUM, /* register total number */ - data, /* data to be written */ - RT_WAITING_FOREVER); /* timeout */ - - /* Record the number of errors */ - if (error_code != MB_MRE_NO_ERR) - { - error_count++; - } - } -} - -static void mb_master_poll(void *parameter) -{ - eMBMasterInit(MB_RTU, 6, PORT_BAUDRATE, PORT_PARITY); - eMBMasterEnable(); - - while (1) - { - eMBMasterPoll(); - rt_thread_mdelay(MB_POLL_CYCLE_MS); - } -} - -static int mb_master_sample(int argc, char **argv) -{ - static rt_uint8_t is_init = 0; - rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL; - - if (is_init > 0) - { - rt_kprintf("sample is running\n"); - return -RT_ERROR; - } - tid1 = rt_thread_create("md_m_poll", mb_master_poll, RT_NULL, 512, MB_POLL_THREAD_PRIORITY, 10); - if (tid1 != RT_NULL) - { - rt_thread_startup(tid1); - } - else - { - goto __exit; - } - - tid2 = rt_thread_create("md_m_send", send_thread_entry, RT_NULL, 512, MB_SEND_THREAD_PRIORITY - 2, 10); - if (tid2 != RT_NULL) - { - rt_thread_startup(tid2); - } - else - { - goto __exit; - } - - is_init = 1; - return RT_EOK; - -__exit: - if (tid1) - rt_thread_delete(tid1); - if (tid2) - rt_thread_delete(tid2); - - return -RT_ERROR; -} - -MSH_CMD_EXPORT(mb_master_sample, run a modbus master sample); - - diff --git a/libs/freemodbus/samples/sample_mb_slave.c b/libs/freemodbus/samples/sample_mb_slave.c deleted file mode 100644 index d476692..0000000 --- a/libs/freemodbus/samples/sample_mb_slave.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-06-21 flybreak first version - */ - -#include - -#include "mb.h" -#include "user_mb_app.h" - -#ifdef PKG_MODBUS_SLAVE_SAMPLE -#define SLAVE_ADDR MB_SAMPLE_SLAVE_ADDR -#define PORT_NUM MB_SLAVE_USING_PORT_NUM -#define PORT_BAUDRATE MB_SLAVE_USING_PORT_BAUDRATE -#else -#define SLAVE_ADDR 0x01 -#define PORT_NUM 2 -#define PORT_BAUDRATE 115200 -#endif - -#define PORT_PARITY MB_PAR_EVEN - -#define MB_POLL_THREAD_PRIORITY 10 -#define MB_SEND_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 1 - -#define MB_POLL_CYCLE_MS 200 - -extern USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS]; - -static void send_thread_entry(void *parameter) -{ - USHORT *usRegHoldingBuf; - usRegHoldingBuf = usSRegHoldBuf; - rt_base_t level; - - while (1) - { - /* Test Modbus Master */ - level = rt_hw_interrupt_disable(); - - usRegHoldingBuf[3] = (USHORT)(rt_tick_get() / 100); - - rt_hw_interrupt_enable(level); - - rt_thread_mdelay(1000); - } -} - -static void mb_slave_poll(void *parameter) -{ - if (rt_strstr(parameter, "RTU")) - { -#ifdef PKG_MODBUS_SLAVE_RTU - eMBInit(MB_RTU, SLAVE_ADDR, PORT_NUM, PORT_BAUDRATE, PORT_PARITY); -#else - rt_kprintf("Error: Please open RTU mode first"); -#endif - } - else if (rt_strstr(parameter, "ASCII")) - { -#ifdef PKG_MODBUS_SLAVE_ASCII - eMBInit(MB_ASCII, SLAVE_ADDR, PORT_NUM, PORT_BAUDRATE, PORT_PARITY); -#else - rt_kprintf("Error: Please open ASCII mode first"); -#endif - } - else if (rt_strstr(parameter, "TCP")) - { -#ifdef PKG_MODBUS_SLAVE_TCP - eMBTCPInit(0); -#else - rt_kprintf("Error: Please open TCP mode first"); -#endif - } - else - { - rt_kprintf("Error: unknown parameter"); - } - eMBEnable(); - while (1) - { - eMBPoll(); - rt_thread_mdelay(MB_POLL_CYCLE_MS); - } -} - -static int mb_slave_sample(int argc, char **argv) -{ - static rt_uint8_t is_init = 0; - rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL; - - if (is_init > 0) - { - rt_kprintf("sample is running\n"); - return -RT_ERROR; - } - if (argc < 2) - { - rt_kprintf("Usage: mb_slave_sample RTU/ASCII/TCP\n"); - return -1; - } - - tid1 = rt_thread_create("md_s_poll", mb_slave_poll, argv[1], 1024, MB_POLL_THREAD_PRIORITY, 10); - if (tid1 != RT_NULL) - { - rt_thread_startup(tid1); - } - else - { - goto __exit; - } - - tid2 = rt_thread_create("md_s_send", send_thread_entry, RT_NULL, 512, MB_SEND_THREAD_PRIORITY, 10); - if (tid2 != RT_NULL) - { - rt_thread_startup(tid2); - } - else - { - goto __exit; - } - - is_init = 1; - return RT_EOK; - -__exit: - if (tid1) - rt_thread_delete(tid1); - if (tid2) - rt_thread_delete(tid2); - - return -RT_ERROR; -} -MSH_CMD_EXPORT(mb_slave_sample, run a modbus slave sample);