Browse Source

asdf

old-version
gudae 1 month ago
parent
commit
37d1564bb6
  1. BIN
      DefaultBuild/app_cmd_parser.obj
  2. BIN
      DefaultBuild/app_owi_service.obj
  3. BIN
      DefaultBuild/app_scheduler.obj
  4. BIN
      DefaultBuild/multical.abs
  5. 674
      DefaultBuild/multical.map
  6. 3041
      DefaultBuild/multical.mot
  7. BIN
      DefaultBuild/owi.obj
  8. BIN
      DefaultBuild/r_main.obj
  9. 14
      QualityReport(multical,DefaultBuild).txt
  10. 6
      app_cmd_parser.c
  11. 2
      app_types.h
  12. 6
      multical.mtpj
  13. 104
      multical.temp.mtud
  14. 2
      owi.h
  15. 273
      r_main.c

BIN
DefaultBuild/app_cmd_parser.obj

Binary file not shown.

BIN
DefaultBuild/app_owi_service.obj

Binary file not shown.

BIN
DefaultBuild/app_scheduler.obj

Binary file not shown.

BIN
DefaultBuild/multical.abs

Binary file not shown.

674
DefaultBuild/multical.map

File diff suppressed because it is too large

3041
DefaultBuild/multical.mot

File diff suppressed because it is too large

BIN
DefaultBuild/owi.obj

Binary file not shown.

BIN
DefaultBuild/r_main.obj

Binary file not shown.

14
QualityReport(multical,DefaultBuild).txt

@ -1,13 +1,13 @@
QualityReport QualityReport
2026년 3월 10일 화요일 오후 3:54:12 2026년 3월 11일 수요일 오후 4:43:55
------ Start build(multical, DefaultBuild) ------ ------ Start build(multical, DefaultBuild) ------
------ Build ended(Error:0, Warning:0)(multical, DefaultBuild) ------ ------ Build ended(Error:0, Warning:0)(multical, DefaultBuild) ------
--- SHA1 hash value of output files --- --- SHA1 hash value of output files ---
C:\Users\temp\Desktop\new_fw\DefaultBuild\multical.abs: e144e2578b18d88b4cecc39ec3f958b951e2dc36 C:\Users\temp\Desktop\new_fw\DefaultBuild\multical.abs: 3fbeb32a045c0e455f92f38ab6fa4740da47d88f
C:\Users\temp\Desktop\new_fw\DefaultBuild\multical.mot: 11c38870df999474ddbde22943e325e6360b3c55 C:\Users\temp\Desktop\new_fw\DefaultBuild\multical.mot: bb7e3482cf63197f492ab29b34f58eb7310530e2
--- System Information --- --- System Information ---
@ -35,13 +35,13 @@ C:\Users\temp\Desktop\new_fw\DefaultBuild\multical.mot: 11c38870df999474ddbde229
C:\Program Files (x86)\Renesas Electronics\CS+\CC C:\Program Files (x86)\Renesas Electronics\CS+\CC
*Memory Usage *Memory Usage
*Private Working Set *Private Working Set
292 MB 351 MB
*Number of GDI Objects *Number of GDI Objects
2782 2766
*Number of USER Objects *Number of USER Objects
1708 1728
*Opened Files *Opened Files
30 editors, 30 files, 219 KB 30 editors, 30 files, 224 KB
--- Build Tool Plug-in Information --- --- Build Tool Plug-in Information ---
RH850 Build tool CC-RH Plug-in RH850 Build tool CC-RH Plug-in

6
app_cmd_parser.c

@ -51,10 +51,14 @@ int app_cmd_parse_line(app_cmd_src_t src, const char *line, app_job_t *job)
memset(job, 0, sizeof(*job)); memset(job, 0, sizeof(*job));
job->src = src; job->src = src;
job->check_on = 1; job->check_on = 1;
/* ?? ?? ?? ?? */
strncpy(job->line, line, sizeof(job->line) - 1);
job->line[sizeof(job->line) - 1] = '\0';
len = (int)strlen(line); len = (int)strlen(line);
/* 일반 라인 */ /* ?? ??*/
if (line[0] != 'x' && line[0] != 'X') { if (line[0] != 'x' && line[0] != 'X') {
job->type = APP_JOB_LOCAL_EXEC; job->type = APP_JOB_LOCAL_EXEC;
strncpy(job->line, line, sizeof(job->line) - 1); strncpy(job->line, line, sizeof(job->line) - 1);

2
app_types.h

@ -44,7 +44,7 @@ typedef struct {
uint8_t payload[APP_JOB_PAYLOAD_MAX]; uint8_t payload[APP_JOB_PAYLOAD_MAX];
/* fallback용 짧은 line만 보관 */ /* fallback용 짧은 line만 보관 */
char line[96]; char line[256];
} app_job_t; } app_job_t;
#endif #endif

6
multical.mtpj

@ -3946,9 +3946,9 @@ C:\Program Files (x86)\Renesas Electronics\CS+\CC\FAA\V1.05.00
</SOAP-ENV:Body> </SOAP-ENV:Body>
</SOAP-ENV:Envelope> </SOAP-ENV:Envelope>
</KeyExtGridLayout> </KeyExtGridLayout>
<KeyTopViewZoom>1</KeyTopViewZoom> <KeyTopViewZoom />
<KeyTopViewAngle>0</KeyTopViewAngle> <KeyTopViewAngle />
<KeyTopViewPartsCollapsed>False</KeyTopViewPartsCollapsed> <KeyTopViewPartsCollapsed />
<KEY_SAVE_ALLOCATED_FUNCTION>False</KEY_SAVE_ALLOCATED_FUNCTION> <KEY_SAVE_ALLOCATED_FUNCTION>False</KEY_SAVE_ALLOCATED_FUNCTION>
<KEY_SAVE_DEVICE_PIN_LIST_ZOOM>100</KEY_SAVE_DEVICE_PIN_LIST_ZOOM> <KEY_SAVE_DEVICE_PIN_LIST_ZOOM>100</KEY_SAVE_DEVICE_PIN_LIST_ZOOM>
<KEY_SAVE_COLUMN_WIDTH_PIN_NUMBER>0:78:78,1:77:77,2:400:400,3:61:61,4:40:40,5:50:50,6:160:160,7:210:210,8:239:239,9:210:210,10:100:100</KEY_SAVE_COLUMN_WIDTH_PIN_NUMBER> <KEY_SAVE_COLUMN_WIDTH_PIN_NUMBER>0:78:78,1:77:77,2:400:400,3:61:61,4:40:40,5:50:50,6:160:160,7:210:210,8:239:239,9:210:210,10:100:100</KEY_SAVE_COLUMN_WIDTH_PIN_NUMBER>

104
multical.temp.mtud

File diff suppressed because one or more lines are too long

2
owi.h

@ -29,7 +29,7 @@
#define RAM_BYTES 3 #define RAM_BYTES 3
#endif #endif
#define OWI_IO_MAX_BYTES 256u #define OWI_IO_MAX_BYTES 320u
typedef struct { typedef struct {
uint8_t ok; uint8_t ok;

273
r_main.c

@ -58,8 +58,8 @@ Includes
#define UART_RX_BUF_SIZE 1024 #define UART_RX_BUF_SIZE 1024
#define RS485_BRIDGE_FIFO_SZ 2048 #define RS485_BRIDGE_FIFO_SZ 2048
#define BRIDGE_IDLE_DONE_US 5000U // ? 3ms ? ? #define BRIDGE_IDLE_DONE_US 20000U // ? 3ms ? ?
#define BRIDGE_TOTAL_WAIT_US 1290000U #define BRIDGE_TOTAL_WAIT_US 3000000U
/* ========================= /* =========================
* UART RX Buffers * UART RX Buffers
@ -445,7 +445,7 @@ static void RS485_FlushJunk(uint16_t loops, uint16_t step_us)
static void PC_PrintLine_CRLF(const char *line) static void PC_PrintLine_CRLF(const char *line)
{ {
char tmp[40]; char tmp[320];
size_t n = strlen(line); size_t n = strlen(line);
size_t i; size_t i;
@ -487,7 +487,7 @@ static void scan_one_addr_rs485(uint8_t addr)
for (try = 0; try < 1; try++) { /* 재시도도 우선 1회로 줄이기 */ for (try = 0; try < 1; try++) { /* 재시도도 우선 1회로 줄이기 */
uint32_t total_wait_us; uint32_t total_wait_us;
char linebuf[32]; char linebuf[320];
if (g_rs485_need_recover) { if (g_rs485_need_recover) {
rs485_recover(); rs485_recover();
@ -617,7 +617,7 @@ static void print_owi_write_result(CmdSource src, const app_owi_result_t *r)
static void print_owi_read_result(CmdSource src, const app_owi_result_t *r) static void print_owi_read_result(CmdSource src, const app_owi_result_t *r)
{ {
char out[(2 * OWI_IO_MAX_BYTES) + 40]; char out[(2 * OWI_IO_MAX_BYTES) + 64];
uint16_t p = 0; uint16_t p = 0;
uint16_t i; uint16_t i;
@ -650,11 +650,148 @@ static void print_owi_read_result(CmdSource src, const app_owi_result_t *r)
OUT_PRINT(src, out); OUT_PRINT(src, out);
} }
typedef struct {
uint8_t active;
uint8_t addr;
uint8_t channel;
uint8_t mode;
uint8_t hash_on;
uint8_t anaout_on;
uint8_t check_on;
uint8_t id;
uint8_t first_tx[3];
uint8_t expected_tail[3];
} connect_verify_ctx_t;
static connect_verify_ctx_t g_connect_verify;
static void connect_verify_reset(void)
{
memset(&g_connect_verify, 0, sizeof(g_connect_verify));
}
static void print_hex_line(CmdSource src, const uint8_t *data, uint16_t len)
{
char out[(2 * OWI_IO_MAX_BYTES) + 64];
uint16_t p = 0;
uint16_t i;
if (!data || len == 0) {
OUT_PRINT(src, "\r\n");
return;
}
for (i = 0; i < len && i < OWI_IO_MAX_BYTES; i++) {
uint8_t b = data[i];
out[p++] = "0123456789ABCDEF"[b >> 4];
out[p++] = "0123456789ABCDEF"[b & 0x0F];
}
out[p++] = '\r';
out[p++] = '\n';
out[p] = '\0';
OUT_PRINT(src, out);
}
static int execute_connect_verify_sequence(CmdSource src, const app_job_t *job)
{
app_owi_result_t r_write1;
app_owi_result_t r_read2;
app_owi_result_t r_write3;
app_owi_result_t r_read3;
uint8_t write1_data[3];
uint8_t expected_tail[3];
uint8_t cmd_7c = 0x7C;
if (!job) return 0;
/* connect 전용 패턴
xNNc_XXX...:owt28006 AABBCC DDEEFF
- id = 0x28
- len = 6
- payload[0..2] = write 3
- payload[3..5] = 3
*/
if (job->type != APP_JOB_PROTO_OW) return 0;
if (job->proto != APP_PROTO_OWIT) return 0;
if (job->id != 0x28u) return 0;
if (job->len != 6u) return 0;
if (job->addr != g_fixed_addr) return 0;
if (job->channel < 1 || job->channel > 20) {
OUT_PRINT(src, "Err:ch_range\r\n");
return 1;
}
/* prefix / gate */
if (job->mode == 'C') {
s_prefix_mode = PREFIX_CAL;
Cal_Init();
} else {
s_prefix_mode = PREFIX_EOL;
Eol_Init();
}
Gate_SetByNum(job->channel, job->hash_on, job->anaout_on, job->check_on);
GateCtrl_SelectChannel(job->channel);
memcpy(write1_data, &job->payload[0], 3);
memcpy(expected_tail, &job->payload[3], 3);
/* 1) OWT 28 003 + first3 */
r_write1 = app_owi_write_t_basic(0x28u, write1_data, 3);
print_owi_write_result(src, &r_write1);
if (!r_write1.ok || r_write1.timeout) {
OUT_PRINT(src, "Fail\r\n");
return 1;
}
/* 2) OR 28 002 -> 예: 7272 */
r_read2 = app_owi_read_basic(0x28u, 2);
print_owi_read_result(src, &r_read2);
if (!r_read2.ok || r_read2.timeout || r_read2.read_len < 2) {
OUT_PRINT(src, "Fail\r\n");
return 1;
}
/* 3) OWT 28 001 + 7C */
r_write3 = app_owi_write_t_basic(0x28u, &cmd_7c, 1);
print_owi_write_result(src, &r_write3);
if (!r_write3.ok || r_write3.timeout) {
OUT_PRINT(src, "Fail\r\n");
return 1;
}
/* 4) OR 28 003 -> 실제 칩 결과 읽기 */
r_read3 = app_owi_read_basic(0x28u, 3);
print_owi_read_result(src, &r_read3);
if (!r_read3.ok || r_read3.timeout || r_read3.read_len < 3) {
OUT_PRINT(src, "Fail\r\n");
return 1;
}
/* 실제 읽은 3바이트와 기대값 비교 */
if (memcmp(r_read3.data, expected_tail, 3) == 0) {
OUT_PRINT(src, "Success\r\n");
} else {
OUT_PRINT(src, "Fail\r\n");
}
return 1;
}
static int execute_owi_service_from_job(CmdSource src, const app_job_t *job) static int execute_owi_service_from_job(CmdSource src, const app_job_t *job)
{ {
app_owi_result_t r; app_owi_result_t r;
if (!job) return 0; if (!job) return 0;
if (execute_connect_verify_sequence(src, job)) {
return 1;
}
if (job->addr != g_fixed_addr) return 0; if (job->addr != g_fixed_addr) return 0;
if (job->channel < 1 || job->channel > 20) { if (job->channel < 1 || job->channel > 20) {
OUT_PRINT(src, "Err:ch_range\r\n"); OUT_PRINT(src, "Err:ch_range\r\n");
@ -695,7 +832,9 @@ static void forward_line_rs485_and_bridge(const char *line)
{ {
static char txbuf[UART_RX_BUF_SIZE + 4]; static char txbuf[UART_RX_BUF_SIZE + 4];
uint32_t total_us; uint32_t total_us;
char linebuf[128]; uint32_t idle_us = 0;
char linebuf[320];
int line_len = 0;
int n; int n;
uint8_t got_any_line = 0; uint8_t got_any_line = 0;
@ -721,29 +860,81 @@ static void forward_line_rs485_and_bridge(const char *line)
g_uart0_tx_done = 0; g_uart0_tx_done = 0;
RS485_PRINT(txbuf); RS485_PRINT(txbuf);
/* scan_one_addr_rs485()와 동일하게 TX -> RX 전환 */
UART0_WaitTxDone_Flag(10000); UART0_WaitTxDone_Flag(10000);
rs485_set_tx(0); rs485_set_tx(0);
delay_us(500); delay_us(500);
total_us = 100000U; /* 100 ms */ total_us = BRIDGE_TOTAL_WAIT_US;
line_len = 0;
linebuf[0] = '\0';
while (total_us >= 50U) {
uint8_t had_byte = 0;
/* FIFO에서 바이트를 하나씩 꺼내 누적 */
while (s_rb_tail != s_rb_head) {
char c = (char)s_rb_fifo[s_rb_tail];
s_rb_tail++;
if (s_rb_tail >= RS485_BRIDGE_FIFO_SZ) s_rb_tail = 0;
had_byte = 1;
/* CR 무시 */
if (c == '\r') continue;
/* 버퍼에 누적 */
if (line_len < (int)sizeof(linebuf) - 1) {
linebuf[line_len++] = c;
linebuf[line_len] = '\0';
} else {
/* overflow 보호: 강제로 한 줄 종료 처리 */
linebuf[line_len] = '\0';
if (!(linebuf[0] == 'x' || linebuf[0] == 'X')) {
PC_PrintLine_CRLF(linebuf);
got_any_line = 1;
}
line_len = 0;
linebuf[0] = '\0';
}
/* LF 도착 = 한 줄 완성 */
if (c == '\n') {
if (!(linebuf[0] == 'x' || linebuf[0] == 'X')) {
PC_PrintLine_CRLF(linebuf);
got_any_line = 1;
}
line_len = 0;
linebuf[0] = '\0';
while (total_us >= 1000U) { /* OFF 응답처럼 <end>가 오면 종료 */
int got = RS485_Bridge_ReadLine(linebuf, sizeof(linebuf), 1000); if (g_rs485_bridge_done) {
g_rs485_bridge_active = 0;
return;
}
}
}
if (got) { if (had_byte) {
/* 자기 echo 무시 */ idle_us = 0;
if (linebuf[0] == 'x' || linebuf[0] == 'X') { } else if (got_any_line) {
total_us -= 1000U; idle_us += 50U;
continue; if (idle_us >= BRIDGE_IDLE_DONE_US) {
break;
} }
}
delay_us(50);
total_us -= 50U;
}
/* 남은 partial line이 있으면 마지막으로 출력 */
if (line_len > 0) {
linebuf[line_len] = '\0';
if (!(linebuf[0] == 'x' || linebuf[0] == 'X')) {
PC_PrintLine_CRLF(linebuf); PC_PrintLine_CRLF(linebuf);
got_any_line = 1; got_any_line = 1;
break;
} }
total_us -= 1000U;
} }
if (!got_any_line) { if (!got_any_line) {
@ -1378,39 +1569,35 @@ static void app_job_tick(void)
} }
/* 마스터 x00v */ /* 마스터 x00v */
if (g_fixed_addr == 0 && src == CMD_SRC_PC && scan_addr == 0) { if (g_fixed_addr == 0 && src == CMD_SRC_PC && scan_addr == 0) {
if (!g_app_runtime_job.scan_started) { if (!g_app_runtime_job.scan_started) {
send_v_response(CMD_SRC_PC, 0); send_v_response(CMD_SRC_PC, 0);
g_app_runtime_job.scan_started = 1; g_app_runtime_job.scan_started = 1;
g_app_runtime_job.current_scan_addr = 1; g_app_runtime_job.current_scan_addr = 1;
return; return;
} }
if (g_app_runtime_job.current_scan_addr <= 31) { if (g_app_runtime_job.current_scan_addr <= 31) {
scan_one_addr_rs485(g_app_runtime_job.current_scan_addr); scan_one_addr_rs485(g_app_runtime_job.current_scan_addr);
g_app_runtime_job.current_scan_addr++; g_app_runtime_job.current_scan_addr++;
return; return;
} }
app_runtime_reset(); app_runtime_reset();
return; return;
} }
/* 슬레이브 xNNv 직접 처리 */ /* 슬레이브 xNNv 직접 처리 */
if (scan_addr == g_fixed_addr) { if (scan_addr == g_fixed_addr) {
send_v_response(src, g_fixed_addr); send_v_response(src, g_fixed_addr);
} }
app_runtime_reset();
return;
/* 나머지는 기존 실행 경로 그대로 */
process_one_line_now(src, g_app_runtime_job.job.line);
app_runtime_reset(); app_runtime_reset();
return; return;
case APP_JOB_PROTO_OW: case APP_JOB_PROTO_OW:
case APP_JOB_PROTO_OR: case APP_JOB_PROTO_OR:
/* 자기 주소면 실행 */
if (g_app_runtime_job.job.addr == g_fixed_addr) { if (g_app_runtime_job.job.addr == g_fixed_addr) {
if (!execute_owi_service_from_job(src, &g_app_runtime_job.job)) { if (!execute_owi_service_from_job(src, &g_app_runtime_job.job)) {
OUT_PRINT(src, "Err:job_exec\r\n"); OUT_PRINT(src, "Err:job_exec\r\n");
@ -1420,15 +1607,21 @@ static void app_job_tick(void)
} }
/* 마스터가 PC 명령을 원격 보드로 forwarding */ /* 마스터가 PC 명령을 원격 보드로 forwarding */
if (g_fixed_addr == 0 && src == CMD_SRC_PC && g_app_runtime_job.job.addr != 0) { if (g_fixed_addr == 0 && src == CMD_SRC_PC && g_app_runtime_job.job.addr != 0) {
forward_line_rs485_and_bridge(g_app_runtime_job.job.line); forward_line_rs485_and_bridge(g_app_runtime_job.job.line);
app_runtime_reset(); app_runtime_reset();
return; return;
} }
OUT_PRINT(src, "Err:job_exec\r\n"); /* 슬레이브가 RS485에서 받은 비대상 명령은 무시 */
app_runtime_reset(); if (src == CMD_SRC_RS485) {
return; app_runtime_reset();
return;
}
OUT_PRINT(src, "Err:job_exec\r\n");
app_runtime_reset();
return;
case APP_JOB_FORWARD_LINE: case APP_JOB_FORWARD_LINE:
case APP_JOB_LOCAL_EXEC: case APP_JOB_LOCAL_EXEC:

Loading…
Cancel
Save