mirror of
https://gitea.ecohim.ru:3000/RS485_Relay/RS485_Relay2_fw.git
synced 2025-08-05 23:56:37 +03:00
164 lines
3.4 KiB
C
164 lines
3.4 KiB
C
/*
|
|
* board_logic.c
|
|
*
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
#include "main.h"
|
|
#include "modbus_logic.h"
|
|
#include "board_logic.h"
|
|
|
|
#define BOARD_DESC_LEN (23)
|
|
|
|
extern TIM_HandleTypeDef htim3;
|
|
static const char board_description[BOARD_DESC_LEN] = "RS485 Relay Module v1";
|
|
extern uint16_t tranfer_errors_count;
|
|
extern uint16_t last_rx_time;
|
|
|
|
#define REL_MAIN_ON HAL_GPIO_WritePin(RL_MAIN_GPIO_Port, RL_MAIN_Pin, GPIO_PIN_SET)
|
|
#define REL_MAIN_OFF HAL_GPIO_WritePin(RL_MAIN_GPIO_Port, RL_MAIN_Pin, GPIO_PIN_RESET)
|
|
#define REL_AUX_ON HAL_GPIO_WritePin(RL_AUX_GPIO_Port, RL_AUX_Pin, GPIO_PIN_SET)
|
|
#define REL_AUX_OFF HAL_GPIO_WritePin(RL_AUX_GPIO_Port, RL_AUX_Pin, GPIO_PIN_RESET)
|
|
#define LED_MAIN_ON HAL_GPIO_WritePin(LED_MAIN_GPIO_Port, LED_MAIN_Pin, GPIO_PIN_SET)
|
|
#define LED_MAIN_OFF HAL_GPIO_WritePin(LED_MAIN_GPIO_Port, LED_MAIN_Pin, GPIO_PIN_RESET)
|
|
#define LED_AUX_ON HAL_GPIO_WritePin(LED_AUX_GPIO_Port, LED_AUX_Pin, GPIO_PIN_SET)
|
|
#define LED_AUX_OFF HAL_GPIO_WritePin(LED_AUX_GPIO_Port, LED_AUX_Pin, GPIO_PIN_RESET)
|
|
#define LED_ACT_ON HAL_GPIO_WritePin(LED_ACT_GPIO_Port, LED_ACT_Pin, GPIO_PIN_SET)
|
|
#define LED_ACT_OFF HAL_GPIO_WritePin(LED_ACT_GPIO_Port, LED_ACT_Pin, GPIO_PIN_RESET)
|
|
|
|
uint16_t relays=0;
|
|
uint16_t motor_pwm=0;
|
|
uint16_t led_time_act=0;
|
|
|
|
void update_service_indication(void);
|
|
|
|
void loop_iterate()
|
|
{
|
|
|
|
if(relays&REL_MAIN_BIT)
|
|
{
|
|
REL_MAIN_ON;
|
|
LED_MAIN_ON;
|
|
}
|
|
else
|
|
{
|
|
REL_MAIN_OFF;
|
|
LED_MAIN_OFF;
|
|
}
|
|
if(relays&REL_AUX_BIT)
|
|
{
|
|
REL_AUX_ON;
|
|
LED_AUX_ON;
|
|
}
|
|
else
|
|
{
|
|
REL_AUX_OFF;
|
|
LED_AUX_OFF;
|
|
}
|
|
|
|
|
|
/* */
|
|
modbus_loop_iterate();
|
|
HAL_Delay(1);
|
|
}
|
|
|
|
// Timer1 overflow interrupt service routine
|
|
void timer1_ovf_isr(void) //1 ms
|
|
{
|
|
static uint32_t count_1sec=0;
|
|
if(last_rx_time<0xFFFF)last_rx_time++;
|
|
|
|
update_service_indication();
|
|
|
|
if(++count_1sec==1000)
|
|
{
|
|
count_1sec = 0;
|
|
//led_time_g += 10;
|
|
}
|
|
|
|
}
|
|
|
|
void update_service_indication(void)
|
|
{
|
|
if(led_time_act)
|
|
{
|
|
LED_ACT_ON;
|
|
led_time_act--;
|
|
}
|
|
else
|
|
LED_ACT_OFF;
|
|
/*
|
|
if(led_time_g)
|
|
{
|
|
LED_G_ON;
|
|
led_time_g--;
|
|
}
|
|
else
|
|
LED_G_OFF;
|
|
*/
|
|
}
|
|
|
|
|
|
uint8_t read_register(uint16_t address, uint16_t* value)
|
|
{
|
|
if (address == 0x0001)
|
|
*value = MODBUS_PROTOCOL_VERSION;
|
|
else if (address == 0x0002)
|
|
*value = MODBUS_FIRMWARE_VERSION;
|
|
else if (address == 0x0003)
|
|
*value = MODBUS_BOARD_TYPE;
|
|
else if (address == 0x0004)
|
|
*value = tranfer_errors_count;
|
|
else if (address == 0x0005)
|
|
*value = 0; // supported data rate: unknown
|
|
else if (address >= 0x0010 && address <= 0x0099)
|
|
{
|
|
int index = address - 0x0010;
|
|
if (index < BOARD_DESC_LEN)
|
|
*value = board_description[index];
|
|
else
|
|
*value = 0;
|
|
}
|
|
else if (address == 0x2001) //Read relays state
|
|
{
|
|
*value = relays;
|
|
}
|
|
else if (address == 0x2002) //Read motor pwm
|
|
{
|
|
*value = motor_pwm;
|
|
}
|
|
else
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
uint8_t write_register(uint16_t address, uint16_t value)
|
|
{
|
|
uint8_t ret;
|
|
ret=0;
|
|
#ifdef UART_DEBUG
|
|
printf("Write A=0x%X D=0x%X\n\r",address,value);
|
|
#endif
|
|
switch (address)
|
|
{
|
|
case 0x2001: relays = value; break;
|
|
case 0x2002: motor_pwm = value;
|
|
if(motor_pwm>MOTOR_MAX)motor_pwm=MOTOR_MAX;
|
|
if(motor_pwm<MOTOR_MIN)motor_pwm=MOTOR_MIN;
|
|
if(motor_pwm==0)
|
|
HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
|
|
else
|
|
{
|
|
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
|
|
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, motor_pwm);
|
|
HAL_Delay(5);
|
|
}
|
|
break;
|
|
default: ret = 1;
|
|
}
|
|
return ret;
|
|
}
|
|
|