WebguiappTemplate/components/PortExtender/PortExtender.c

156 lines
4.4 KiB
C

/*
* PortExtender.c
*
* Created on: 22 îêò. 2021 ã.
* Author: bogd
*/
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "PortExtender.h"
#include "esp_log.h"
#if CONFIG_PORTS_EXTENDER_ENABLE
#define VGPO_MOSI_PIN (CONFIG_VGPO_MOSI_PIN)
#define VGPO_CLK_PIN (CONFIG_VGPO_CLK_PIN)
#define VGPO_LAT_PIN (CONFIG_VGPO_LAT_PIN)
#define TAKE_TIMEOUT pdMS_TO_TICKS(5000)
#define SHIFR_REGS_CHAIN 5
uint8_t VGPO[SHIFR_REGS_CHAIN] = { 0xff, 0xff, 0xff, 0b00000111, 0b10001000 };
SemaphoreHandle_t xSemaphoreVGPOHandle = NULL;
StaticSemaphore_t xSemaphoreVGPOBuf;
void UpdateVGPO(void)
{
for (uint8_t byte = 0; byte < sizeof(VGPO); ++byte)
{
for (uint8_t bit = 0; bit < 8; ++bit)
{
GPIO.out_w1tc = ((uint32_t) 1 << VGPO_CLK_PIN);
if (VGPO[byte] & 0x80 >> bit)
GPIO.out_w1ts = ((uint32_t) 1 << VGPO_MOSI_PIN);
else
GPIO.out_w1tc = ((uint32_t) 1 << VGPO_MOSI_PIN);
GPIO.out_w1ts = ((uint32_t) 1 << VGPO_CLK_PIN);
}
}
GPIO.out_w1tc = ((uint32_t) 1 << VGPO_MOSI_PIN);
GPIO.out_w1tc = ((uint32_t) 1 << VGPO_CLK_PIN);
GPIO.out_w1ts = ((uint32_t) 1 << VGPO_LAT_PIN);
GPIO.out_w1tc = ((uint32_t) 1 << VGPO_LAT_PIN);
}
void InitVGPO(void)
{
gpio_pad_select_gpio(VGPO_MOSI_PIN);
gpio_pad_select_gpio(VGPO_CLK_PIN);
gpio_pad_select_gpio(VGPO_LAT_PIN);
gpio_set_direction(VGPO_MOSI_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(VGPO_MOSI_PIN, 0);
gpio_set_direction(VGPO_CLK_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(VGPO_CLK_PIN, 0);
gpio_set_direction(VGPO_LAT_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(VGPO_LAT_PIN, 0);
xSemaphoreVGPOHandle = xSemaphoreCreateBinaryStatic(&xSemaphoreVGPOBuf);
xSemaphoreGive(xSemaphoreVGPOHandle);
UpdateVGPO();
}
void SetADCInput(uint8_t N)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
if (N > 0)
{
if (N <= 8)
VGPO[SHIFR_REGS_CHAIN - 1] = (0x80 | ((N - 1) & 0x7));
else
VGPO[SHIFR_REGS_CHAIN - 1] = (0x08 | (((N - 1) & 0x7) << 4));
}
else
{
VGPO[SHIFR_REGS_CHAIN - 1] = 0x88;
}
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetRS485_RE(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 0)) | (level << 0);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetCTRL_BAT(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 1)) | (level << 1);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetCHECK_BAT(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 2)) | (level << 2);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetPGM1(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 3)) | (level << 3);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetPGM2(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 4)) | (level << 4);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetLORA_RST(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 5)) | (level << 5);
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetGSM_PWR(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 6)) | (level << 6);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetETH_RST(uint8_t level)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - 2] = (VGPO[SHIFR_REGS_CHAIN - 2] & ~(1 << 7)) | (level << 7);
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
void SetLEDSRegister(uint8_t addr, uint8_t data)
{
xSemaphoreTake(xSemaphoreVGPOHandle, TAKE_TIMEOUT);
VGPO[SHIFR_REGS_CHAIN - (3 + addr)] = data;
UpdateVGPO();
xSemaphoreGive(xSemaphoreVGPOHandle);
}
#endif