diff --git a/apps/chrg/applications/bsp/chrg_rel.c b/apps/chrg/applications/bsp/chrg_rel.c index 42e7d15..44d2e68 100644 --- a/apps/chrg/applications/bsp/chrg_rel.c +++ b/apps/chrg/applications/bsp/chrg_rel.c @@ -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) { diff --git a/apps/chrg/applications/thread/chrg_lcd.c b/apps/chrg/applications/thread/chrg_lcd.c index b9f669e..22eb35b 100644 --- a/apps/chrg/applications/thread/chrg_lcd.c +++ b/apps/chrg/applications/thread/chrg_lcd.c @@ -1,9 +1,13 @@ +#include +#include #include #include #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 (len < 5) { + return -1; + } - 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 (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 \r\n e.g. %s main.CH1_Volt_Show.txt=\"5.000\"", + rt_kprintf("help : %s \r\n e.g. %s main.CH1_Volt_Show.val=5000", argv[0], argv[0]); return -1; } diff --git a/apps/chrg/applications/thread/chrg_lcd.h b/apps/chrg/applications/thread/chrg_lcd.h index 6d21dde..1802d13 100644 --- a/apps/chrg/applications/thread/chrg_lcd.h +++ b/apps/chrg/applications/thread/chrg_lcd.h @@ -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; diff --git a/apps/chrg/applications/thread/chrg_north.c b/apps/chrg/applications/thread/chrg_north.c index a0f60bf..a823dff 100644 --- a/apps/chrg/applications/thread/chrg_north.c +++ b/apps/chrg/applications/thread/chrg_north.c @@ -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); } diff --git a/apps/chrg/applications/thread/chrg_roll_nor.c b/apps/chrg/applications/thread/chrg_roll_nor.c index 14e8a6b..3a240c1 100644 --- a/apps/chrg/applications/thread/chrg_roll_nor.c +++ b/apps/chrg/applications/thread/chrg_roll_nor.c @@ -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; } diff --git a/apps/chrg/applications/thread/chrg_roll_nor.h b/apps/chrg/applications/thread/chrg_roll_nor.h index 0ff9c13..6aaaa44 100644 --- a/apps/chrg/applications/thread/chrg_roll_nor.h +++ b/apps/chrg/applications/thread/chrg_roll_nor.h @@ -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); diff --git a/apps/chrg/applications/thread/chrg_roll_sou.c b/apps/chrg/applications/thread/chrg_roll_sou.c index 78f5438..f52b230 100644 --- a/apps/chrg/applications/thread/chrg_roll_sou.c +++ b/apps/chrg/applications/thread/chrg_roll_sou.c @@ -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,9 +109,12 @@ void chrg_roll_sou_thread_entry (void *data) rt_thread_mdelay(50); // 间隔 50ms } else { - rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER); - pSOU->manual = 0; - rt_mutex_release(pTHR->mutex); + if (MANU_AUTO != manu) { + rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER); + 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; } diff --git a/apps/chrg/applications/thread/chrg_roll_sou.h b/apps/chrg/applications/thread/chrg_roll_sou.h index b1a2a04..1591b47 100644 --- a/apps/chrg/applications/thread/chrg_roll_sou.h +++ b/apps/chrg/applications/thread/chrg_roll_sou.h @@ -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); diff --git a/apps/chrg/applications/thread/chrg_south.c b/apps/chrg/applications/thread/chrg_south.c index 0954c17..cff9485 100644 --- a/apps/chrg/applications/thread/chrg_south.c +++ b/apps/chrg/applications/thread/chrg_south.c @@ -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); } diff --git a/apps/chrg/applications/thread/chrg_south.h b/apps/chrg/applications/thread/chrg_south.h index 4672ec2..781599a 100644 --- a/apps/chrg/applications/thread/chrg_south.h +++ b/apps/chrg/applications/thread/chrg_south.h @@ -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; diff --git a/apps/chrg/applications/utils/chrg_def.h b/apps/chrg/applications/utils/chrg_def.h index 846b171..db06f4a 100644 --- a/apps/chrg/applications/utils/chrg_def.h +++ b/apps/chrg/applications/utils/chrg_def.h @@ -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 diff --git a/apps/chrg/applications/utils/chrg_eload.c b/apps/chrg/applications/utils/chrg_eload.c index 0ae753c..44ef76a 100644 --- a/apps/chrg/applications/utils/chrg_eload.c +++ b/apps/chrg/applications/utils/chrg_eload.c @@ -1,8 +1,11 @@ - +#include +#include +#include #include #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; diff --git a/apps/chrg/applications/utils/chrg_eload.h b/apps/chrg/applications/utils/chrg_eload.h index 54e9228..707e5b3 100644 --- a/apps/chrg/applications/utils/chrg_eload.h +++ b/apps/chrg/applications/utils/chrg_eload.h @@ -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; // 地址