ex lcd & south
This commit is contained in:
@@ -52,7 +52,7 @@ static int chrg_nor_rel_init (void)
|
||||
|
||||
INIT_DEVICE_EXPORT(chrg_nor_rel_init);
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
int rel_test (int argc, char **argv)
|
||||
{
|
||||
if (argc < 3) {
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
|
||||
|
||||
#include "chrg_north.h"
|
||||
#include "chrg_south.h"
|
||||
#include "chrg_roll_sou.h"
|
||||
#include "chrg_eload.h"
|
||||
|
||||
#include "chrg_lcd.h"
|
||||
|
||||
@@ -17,18 +21,72 @@ struct chrg_lcd_t chrglcd = {
|
||||
|
||||
};
|
||||
|
||||
// 55 21 00 0D 0A 负载
|
||||
// 55 21 01 0D 0A 电源
|
||||
// 55 31 00 0D 0A 恒流
|
||||
// 55 31 01 0D 0A 恒压
|
||||
// 55 41 00 0D 0A 停止
|
||||
// 55 41 01 0D 0A 运行
|
||||
|
||||
static int chrg_lcd_parse (char *recv)
|
||||
static int chrg_lcd_parse (rt_uint8_t *recv, rt_uint16_t len)
|
||||
{
|
||||
|
||||
if (rt_strstr(recv, "main.CH1_RunStop.txt")) {
|
||||
if (rt_strstr(recv, "run")) {
|
||||
chrgnorth.enable[IDX_CH1] = 1;
|
||||
} else if (rt_strstr(recv, "stop")) {
|
||||
chrgnorth.enable[IDX_CH1] = 0;
|
||||
if (len < 5) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ...
|
||||
if (0x55 != recv[LCD_IDX_HEAD]) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
rt_uint8_t ch = 0;
|
||||
struct chrg_north_t *pNOR = &chrgnorth;
|
||||
struct chrg_south_t *pSOU = &chrgsouth;
|
||||
struct chrg_switch_t *pSW = RT_NULL;
|
||||
|
||||
switch (recv[LCD_IDX_CMD]) {
|
||||
case 0x21:
|
||||
case 0x22:
|
||||
case 0x23:
|
||||
case 0x24: { // 电源/负载
|
||||
ch = recv[LCD_IDX_CMD] - 0x21;
|
||||
pSW = &pNOR->sw[ch];
|
||||
if (1 == recv[LCD_IDX_VAL]) {
|
||||
pSW->id = ID_SOURCE;
|
||||
} else {
|
||||
pSW->id = ID_SINK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x31:
|
||||
case 0x32:
|
||||
case 0x33:
|
||||
case 0x34: { // 恒压/恒流
|
||||
ch = recv[LCD_IDX_CMD] - 0x31;
|
||||
if (1 == recv[LCD_IDX_VAL]) {
|
||||
chrg_set_sou_mode((eIDX_SOU_CH)ch, MODE_CONSTANT_VOLTAGE);
|
||||
} else {
|
||||
chrg_set_sou_mode((eIDX_SOU_CH)ch, MODE_CONSTANT_CURRENT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x41:
|
||||
case 0x42:
|
||||
case 0x43:
|
||||
case 0x44: { // 运行/停止
|
||||
ch = recv[LCD_IDX_CMD] - 0x41;
|
||||
if (1 == recv[LCD_IDX_VAL]) {
|
||||
pNOR->enable[ch] = 0;
|
||||
pSOU->enable[ch] = 0;
|
||||
} else {
|
||||
pNOR->enable[ch] = 1;
|
||||
pSOU->enable[ch] = 1;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -56,6 +114,7 @@ int chrg_lcd_send (char *cmd)
|
||||
|
||||
if (RT_NULL != pTTY) {
|
||||
ret = chrg_tty_send(pTTY, data, len+3);
|
||||
// LOG_HEX("lcdS", 32, data, len+3);
|
||||
}
|
||||
|
||||
if (RT_NULL != data) {
|
||||
@@ -63,9 +122,14 @@ int chrg_lcd_send (char *cmd)
|
||||
data = RT_NULL;
|
||||
}
|
||||
|
||||
rt_thread_mdelay(10);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void chrg_lcd_thread_entry (void *data)
|
||||
{
|
||||
struct chrg_thread_t *pTHR = (struct chrg_thread_t *)data;
|
||||
@@ -99,9 +163,11 @@ void chrg_lcd_thread_entry (void *data)
|
||||
continue;
|
||||
}
|
||||
|
||||
rt_kprintf("%s\r\n", (char *)pLCD->rx_buf);
|
||||
// LOG_HEX("lcdR", 32, pLCD->rx_buf, len);
|
||||
|
||||
chrg_lcd_parse((char *)pLCD->rx_buf);
|
||||
if (len >= 5) {
|
||||
chrg_lcd_parse(pLCD->rx_buf, len);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -111,7 +177,7 @@ void chrg_lcd_thread_entry (void *data)
|
||||
static int lcdsend(rt_uint8_t argc, char **argv)
|
||||
{
|
||||
if (2 != argc) {
|
||||
rt_kprintf("help : %s <cmd>\r\n e.g. %s main.CH1_Volt_Show.txt=\"5.000\"",
|
||||
rt_kprintf("help : %s <cmd>\r\n e.g. %s main.CH1_Volt_Show.val=5000",
|
||||
argv[0], argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,16 @@
|
||||
#define THR_NAME_LCD "thr.lcd"
|
||||
#define DEV_NAME_LCD "uart2"
|
||||
|
||||
|
||||
#define LCD_FRAME_HEAD 0x55
|
||||
|
||||
enum {
|
||||
LCD_IDX_HEAD = 0,
|
||||
LCD_IDX_CMD,
|
||||
LCD_IDX_VAL,
|
||||
|
||||
};
|
||||
|
||||
struct chrg_lcd_t {
|
||||
const char *devname;
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ struct chrg_north_t chrgnorth = {
|
||||
.sw[IDX_NOR_CH4] = {
|
||||
.id = ID_SINK,
|
||||
},
|
||||
.manual = 0,
|
||||
.manual = MANU_AUTO,
|
||||
};
|
||||
|
||||
// 北向通道选择
|
||||
@@ -52,7 +52,7 @@ int chrg_north_send (rt_uint8_t *data, rt_size_t length)
|
||||
struct chrg_tty_t *pTTY = chrgnorth.tty;
|
||||
|
||||
if (RT_NULL != pTTY) {
|
||||
LOG_HEX("sendN", 32, data, length);
|
||||
//LOG_HEX("sendN", 32, data, length);
|
||||
ret = chrg_tty_send(pTTY, data, length);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ void chrg_roll_nor_thread_entry (void *data)
|
||||
manu = pNOR->manual;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
|
||||
if (1 == manu) {
|
||||
if (MANU_CMD == manu) {
|
||||
chrg_north_switch((eIDX_NOR_CH)nor_ch);
|
||||
source_get_vc(5000, 1000);
|
||||
} else {
|
||||
@@ -102,9 +102,9 @@ void chrg_roll_nor_thread_entry (void *data)
|
||||
if ((RT_EOK == ret)&&(RT_NULL != pMB_R)) {
|
||||
crc = calc_crc8(pMB_R->payload, pMB_R->length-1);
|
||||
if (crc == pMB_R->payload[pMB_R->length-1]) {
|
||||
if (1 == manu) {
|
||||
if (MANU_AUTO != manu) {
|
||||
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
|
||||
pNOR->manual = 0;
|
||||
pNOR->manual = MANU_AUTO;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
} else {
|
||||
// todo
|
||||
@@ -125,7 +125,7 @@ void chrg_roll_nor_thread_entry (void *data)
|
||||
rt_thread_mdelay(50); // 间隔 50ms
|
||||
} else {
|
||||
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
|
||||
pNOR->manual = 0;
|
||||
pNOR->manual = MANU_AUTO;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ static int north_send(rt_uint8_t argc, char **argv)
|
||||
}
|
||||
|
||||
nor_ch = (rt_uint8_t)ch;
|
||||
pNOR->manual = 1;
|
||||
pNOR->manual = MANU_CMD;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#define THR_NAME_ROLL_NOR "thr.rollnor"
|
||||
|
||||
extern rt_uint8_t nor_run;
|
||||
extern rt_uint8_t nor_ch;
|
||||
|
||||
extern void chrg_roll_nor_thread_entry (void *data);
|
||||
|
||||
|
||||
@@ -14,6 +14,19 @@
|
||||
rt_uint8_t sou_run = 1;
|
||||
rt_uint8_t sou_ch = IDX_SOU_CH1;
|
||||
rt_uint8_t sou_pt = MB_R_PART1;
|
||||
rt_uint8_t sou_mode = 0;
|
||||
|
||||
void chrg_set_sou_mode (eIDX_SOU_CH idx, rt_uint8_t mode)
|
||||
{
|
||||
struct chrg_thread_t *pTHR = &chrgthr[IDX_THR_ROLL_SOU];
|
||||
struct chrg_south_t *pSOU = &chrgsouth;
|
||||
sou_run = 0;
|
||||
sou_ch = idx;
|
||||
sou_mode = mode;
|
||||
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
|
||||
pSOU->manual = MANU_INSERT;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
}
|
||||
|
||||
void chrg_roll_sou_thread_entry (void *data)
|
||||
{
|
||||
@@ -34,10 +47,13 @@ void chrg_roll_sou_thread_entry (void *data)
|
||||
manu = pSOU->manual;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
|
||||
if (1 == manu) {
|
||||
if (MANU_CMD == manu) {
|
||||
chrg_south_switch((eIDX_SOU_CH)sou_ch);
|
||||
pt = sou_pt;
|
||||
chrg_eload_refresh(ID_ELOAD, sou_pt);
|
||||
} else if (MANU_INSERT == manu) {
|
||||
chrg_south_switch((eIDX_SOU_CH)sou_ch);
|
||||
chrg_eload_write_reg(ID_ELOAD, REG_MODE, sou_mode);
|
||||
|
||||
} else { // 轮巡4个通道
|
||||
if (0 == sou_run) {
|
||||
@@ -69,9 +85,10 @@ void chrg_roll_sou_thread_entry (void *data)
|
||||
ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R, 200); // 超时 200ms
|
||||
if ((RT_EOK == ret)&&(RT_NULL != pMB_R)) {
|
||||
if (0 == mb_crc16(pMB_R->payload, pMB_R->length)) {
|
||||
if (1 == manu) {
|
||||
if (MANU_AUTO != manu) {
|
||||
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
|
||||
pSOU->manual = 0;
|
||||
pSOU->manual = MANU_AUTO;
|
||||
sou_run = 1;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
} else {
|
||||
chrg_eload_parse(idx, pt, pMB_R->payload, pMB_R->length);
|
||||
@@ -92,10 +109,13 @@ void chrg_roll_sou_thread_entry (void *data)
|
||||
|
||||
rt_thread_mdelay(50); // 间隔 50ms
|
||||
} else {
|
||||
if (MANU_AUTO != manu) {
|
||||
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
|
||||
pSOU->manual = 0;
|
||||
pSOU->manual = MANU_AUTO;
|
||||
sou_run = 1;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -126,7 +146,7 @@ static int south_send(rt_uint8_t argc, char **argv)
|
||||
|
||||
sou_ch = (rt_uint8_t)ch;
|
||||
sou_pt = (rt_uint8_t)pt;
|
||||
pSOU->manual = 1;
|
||||
pSOU->manual = MANU_CMD;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
|
||||
#define THR_NAME_ROLL_SOU "thr.rollsou"
|
||||
|
||||
extern rt_uint8_t sou_run;
|
||||
extern rt_uint8_t sou_ch;
|
||||
|
||||
extern void chrg_set_sou_mode (eIDX_SOU_CH idx, rt_uint8_t mode);
|
||||
|
||||
extern void chrg_roll_sou_thread_entry (void *data);
|
||||
|
||||
|
||||
@@ -21,19 +21,7 @@ struct chrg_south_t chrgsouth = {
|
||||
.rb = RT_NULL,
|
||||
.enable = {1, 1, 1, 1},
|
||||
.idx = IDX_SOU_CH1,
|
||||
/*.sw[IDX_SOU_CH1] = {
|
||||
.id = ID_ELOAD,
|
||||
},
|
||||
.sw[IDX_SOU_CH2] = {
|
||||
.id = ID_ELOAD,
|
||||
},
|
||||
.sw[IDX_SOU_CH3] = {
|
||||
.id = ID_ELOAD,
|
||||
},
|
||||
.sw[IDX_SOU_CH4] = {
|
||||
.id = ID_ELOAD,
|
||||
},*/
|
||||
|
||||
.manual = MANU_AUTO,
|
||||
};
|
||||
|
||||
// 南向1级选通
|
||||
@@ -109,7 +97,7 @@ int chrg_south_send (rt_uint8_t *data, rt_size_t length)
|
||||
struct chrg_tty_t *pTTY = chrgsouth.tty;
|
||||
|
||||
if (RT_NULL != pTTY) {
|
||||
LOG_HEX("sendS", 32, data, length);
|
||||
// LOG_HEX("sendS", 32, data, length);
|
||||
ret = chrg_tty_send(pTTY, data, length);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ struct chrg_south_t {
|
||||
rt_uint8_t rx_buf[SIZE_BUF_TTY];
|
||||
|
||||
rt_uint8_t enable[TOTAL_SOU_CHS]; // 通路使能
|
||||
rt_uint8_t manual; // 手动插入命令
|
||||
rt_uint8_t manual; // 0: 程序自动 1:手动插入命令 2:插入设置模式
|
||||
eIDX_SOU_CH idx; // 当前通路
|
||||
eIDX_MB_PART part;
|
||||
|
||||
|
||||
@@ -19,6 +19,13 @@ typedef enum {
|
||||
ID_ELOAD = 0x03, // LOAD ID 3, 波特率 115200
|
||||
} eIDX_ID;
|
||||
|
||||
enum {
|
||||
MANU_AUTO = 0, // 自动
|
||||
MANU_CMD, // 命令插入
|
||||
MANU_INSERT, // 程序插入
|
||||
|
||||
};
|
||||
|
||||
// 电压电流极值
|
||||
struct vc_mm_t {
|
||||
rt_uint16_t max_vol; // 最大电压 mV
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
|
||||
#include "chrg_south.h"
|
||||
#include "chrg_eload.h"
|
||||
#include "chrg_lcd.h"
|
||||
#include "chrg_utils.h"
|
||||
|
||||
int chrg_eload_read_regs (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t len)
|
||||
@@ -40,7 +43,7 @@ int chrg_eload_refresh (rt_uint8_t addr, rt_uint8_t part)
|
||||
int ret = 0;
|
||||
|
||||
if (0 == part) {
|
||||
chrg_eload_read_regs(addr, REG_TEMPERATUE, SIZE_P1_RD); // reg 0~13
|
||||
chrg_eload_read_regs(addr, REG_STA1, SIZE_P1_RD); // reg 0~13
|
||||
} else if (1 == part) {
|
||||
chrg_eload_read_regs(addr, REG_POWER, SIZE_P2_RD); // reg 20~39
|
||||
}
|
||||
@@ -71,12 +74,23 @@ int chrg_eload_parse (rt_uint8_t idx, rt_uint8_t pt, rt_uint8_t *data, rt_uint16
|
||||
pLOAD->eload = (rt_uint8_t)pP1->eload;
|
||||
pLOAD->work = (rt_uint8_t)pP1->work_cmd;
|
||||
pLOAD->mode = (rt_uint8_t)pP1->work_mode;
|
||||
rt_memcpy((rt_uint8_t *)&pLOAD->voltage, (rt_uint8_t *)&pP1->voltage, sizeof(float));
|
||||
rt_memcpy((rt_uint8_t *)&pLOAD->current, (rt_uint8_t *)&pP1->current, sizeof(float));
|
||||
pLOAD->voltage = pP1->voltage;
|
||||
pLOAD->current = pP1->current;
|
||||
pLOAD->temperatue = pP1->temperature;
|
||||
pLOAD->version = pP1->version;
|
||||
pLOAD->address = (rt_uint8_t)pP1->addr;
|
||||
rt_kprintf("vol %f, cur %f\r\n", pLOAD->voltage, pLOAD->current);
|
||||
rt_kprintf("vol %d, cur %d\r\n", pLOAD->voltage, pLOAD->current);
|
||||
|
||||
char tmp[36] = {0};
|
||||
snprintf(tmp, 36, "status.CH%d_Volt_Sta.txt=\"%d.%03d\"",
|
||||
idx+1, pLOAD->voltage/1000, pLOAD->voltage%1000);
|
||||
chrg_lcd_send(tmp);
|
||||
|
||||
rt_memset(tmp, 0, 36);
|
||||
|
||||
snprintf(tmp, 36, "status.CH%d_Curr_Sta.txt=\"%d.%03d\"",
|
||||
idx+1, pLOAD->current/1000, pLOAD->current%1000);
|
||||
chrg_lcd_send(tmp);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -44,9 +44,9 @@
|
||||
#define MODE_CONSTANT_POWER (0x04) // 恒功率
|
||||
#define MODE_CONSTANT_RESISTANCE (0x05) // 恒阻
|
||||
|
||||
#define REG_VOLTAGE (0x07) // RW 32bit 电压 0.001V (0~60V) 默认5V
|
||||
#define REG_VOLTAGE_OUT (0x07) // RW 32bit 输出电压 0.001V (0~60V) 默认5V
|
||||
|
||||
#define REG_CURRENT (0x09) // RW 32bit 电流 0.001A (0~60A) 默认1A
|
||||
#define REG_CURRENT_OUT (0x09) // RW 32bit 输出电流 0.001A (0~60A) 默认1A
|
||||
|
||||
#define REG_TEMPERATUE (0x0B) // RWP 16bit 读取温度 0.01C (0~100C)
|
||||
|
||||
@@ -54,6 +54,9 @@
|
||||
|
||||
#define REG_ADDRESS (0x0D) // RWP 16bit 从机地址
|
||||
|
||||
#define REG_SET_VOL (0x0E) // RW 32bit 设定电压
|
||||
|
||||
#define REG_SET_CUR (0x10) // RW 32bit 设定电流
|
||||
|
||||
#define REG_POWER (0x14) // RW 32bit 功率 0.01W (0~600W)
|
||||
|
||||
@@ -144,8 +147,8 @@ struct chrg_eload_t {
|
||||
rt_uint8_t eload; // 源载 1:电源 2:负载
|
||||
rt_uint8_t work; // 工作指令
|
||||
rt_uint8_t mode; // 工作模式
|
||||
float voltage; // 电压
|
||||
float current; // 电流
|
||||
rt_uint32_t voltage; // 电压
|
||||
rt_uint32_t current; // 电流
|
||||
rt_uint16_t temperatue; // 温度
|
||||
rt_uint16_t version; // 版本
|
||||
rt_uint8_t address; // 地址
|
||||
|
||||
Reference in New Issue
Block a user