From 0ede6c9cb81fea2849387859b4b272c99840a315 Mon Sep 17 00:00:00 2001 From: jhchun Date: Tue, 14 Apr 2026 20:00:10 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=8C=EC=8B=B1=20BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc_firm/parser.c | 59 ++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/pc_firm/parser.c b/pc_firm/parser.c index b94f570..a5a38a0 100644 --- a/pc_firm/parser.c +++ b/pc_firm/parser.c @@ -12,8 +12,8 @@ * * 패킷 구조: [TAG 4바이트] [데이터 N바이트] [CRC16 2바이트(선택)] * - TAG: 4글자 ASCII 명령 식별자 (예: "mta?", "mec?") - * - 데이터: Little-Endian uint16 또는 ASCII 문자열 - * - CRC16: g_plat.crc_check가 true일 때 패킷 끝 2바이트로 무결성 검증 + * - 데이터: Big-Endian uint16 또는 ASCII 문자열 + * - CRC16: g_plat.crc_check가 true일 때 패킷 끝 2바이트(Little-Endian)로 무결성 검증 * * 동작 흐름: * 1) dr_cmd_parser() → 외부에서 호출하는 진입점 @@ -169,13 +169,13 @@ static bool dr_tag_eq(const char *tag, const char *key4) tag[3] == key4[3]); } -/* 파싱된 명령 데이터에서 uint16 값 추출 (Little-Endian) +/* 파싱된 명령 데이터에서 uint16 값 추출 (Big-Endian) * * word_index: 추출할 워드 인덱스 (0번째 = data[0..1], 1번째 = data[2..3], ...) * out: 추출된 uint16 값 저장 포인터 * 반환값: true=성공, false=데이터 부족 * - * PC와 nRF52 모두 Little-Endian이므로 data[pos]=하위바이트, data[pos+1]=상위바이트 */ + * 패킷 데이터는 빅엔디안: data[pos]=상위바이트, data[pos+1]=하위바이트 */ static bool dr_get_u16(const ParsedCmd *cmd, uint8_t word_index, uint16_t *out) { uint8_t pos = (uint8_t)(word_index * 2); @@ -183,9 +183,9 @@ static bool dr_get_u16(const ParsedCmd *cmd, uint8_t word_index, uint16_t *out) return false; /* 데이터 길이 부족 → 기본값 유지 */ } - /* Little Endian 조합: data[pos]=하위, data[pos+1]=상위 */ - *out = (uint16_t)cmd->data[pos] - | (uint16_t)((uint16_t)cmd->data[pos + 1] << 8); + /* Big Endian 조합: data[pos]=상위, data[pos+1]=하위 */ + *out = (uint16_t)((uint16_t)cmd->data[pos] << 8) + | (uint16_t)cmd->data[pos + 1]; return true; } @@ -724,7 +724,7 @@ static int Cmd_mpb(const ParsedCmd *cmd) * 초음파 트랜스듀서에 지정된 주파수와 사이클 수로 버스트 펄스를 발생시킴 * 에코 캡처 없이 버스트만 발생 (테스트/디버그용) * - * 파라미터 (Little-Endian uint16 x 3): + * 파라미터 (Big-Endian uint16 x 3): * word 0: cycles (3~7, 기본값=5) - 버스트 펄스 사이클 수 * word 1: freq_option (기본값=1) - 주파수 선택 * 0=1.8MHz, 1=2.1MHz(기본), 2=2.0MHz, 3=1.7MHz, 4=2.2MHz @@ -786,7 +786,7 @@ static int Cmd_mpc(const ParsedCmd *cmd) * 12비트 압축(mdc?)과 달리 ADC 원시 16비트 값을 그대로 전송 * 샘플 수가 적은 근거리 측정(~25cm)에 적합 * - * 파라미터 (Little-Endian uint16 x 6): + * 파라미터 (Big-Endian uint16 x 6): * word 0: freq_option (기본=0) - 주파수 선택 (0=1.8MHz, 1=2.1MHz, ...) * word 1: delay_us (기본=20) - 버스트 후 ADC 시작 지연 (us) * word 2: num_samples (기본=140) - ADC 샘플 수 (140샘플 ≒ 20cm 거리) @@ -877,7 +877,7 @@ static int Cmd_mec(const ParsedCmd *cmd) /* cmd? - GPIO 핀 직접 제어 (디버그/테스트용) * - * 파라미터 (Little-Endian uint16 x 3, 총 6바이트): + * 파라미터 (Big-Endian uint16 x 3, 총 6바이트): * v1: GPIO 포트 번호 (0 또는 1, nRF52는 2개 포트) * v2: GPIO 핀 번호 (0~31) * v3: 출력 상태 (1=HIGH, 0=LOW) @@ -898,10 +898,9 @@ static int Cmd_cmd(const ParsedCmd *cmd) return 1; } - /* Little Endian 파라미터 추출 */ - v1 = (uint16_t)cmd->data[0] | ((uint16_t)cmd->data[1] << 8); /* 포트 (0~1) */ - v2 = (uint16_t)cmd->data[2] | ((uint16_t)cmd->data[3] << 8); /* 핀 (0~31) */ - v3 = (uint16_t)cmd->data[4] | ((uint16_t)cmd->data[5] << 8); /* 상태 (1=HIGH, 0=LOW) */ + if (!dr_get_u16(cmd, 0, &v1)) v1 = 0; /* 포트 (0~1) */ + if (!dr_get_u16(cmd, 1, &v2)) v2 = 0; /* 핀 (0~31) */ + if (!dr_get_u16(cmd, 2, &v3)) v3 = 0; /* 상태 (1=HIGH, 0=LOW) */ /* nRF52 GPIO 핀 번호 계산: port * 32 + pin */ pin_number = NRF_GPIO_PIN_MAP(v1, v2); @@ -1052,17 +1051,17 @@ static void all_sensors(void) buf = ble_bin_buffer; buf[0] = 'r'; buf[1] = 'b'; buf[2] = 'b'; buf[3] = ':'; - buf[4] = (uint8_t)(info_batt & 0xFF); - buf[5] = (uint8_t)(info_batt >> 8); + buf[4] = (uint8_t)(info_batt >> 8); + buf[5] = (uint8_t)(info_batt & 0xFF); for (int i = 0; i < 6; i++) { - buf[6 + i * 2] = (uint8_t)(info_imu[i] & 0xFF); - buf[6 + i * 2 + 1] = (uint8_t)(info_imu[i] >> 8); + buf[6 + i * 2] = (uint8_t)(info_imu[i] >> 8); + buf[6 + i * 2 + 1] = (uint8_t)(info_imu[i] & 0xFF); } - buf[18] = (uint8_t)(info_temp & 0xFF); - buf[19] = (uint8_t)(info_temp >> 8); + buf[18] = (uint8_t)(info_temp >> 8); + buf[19] = (uint8_t)(info_temp & 0xFF); dr_binary_tx_safe(buf, 10); /* 20바이트 = 10워드 */ DBG_PRINTF("9"); @@ -1141,11 +1140,11 @@ static int Cmd_mcf(const ParsedCmd *cmd) uint8_t *buf = ble_bin_buffer; buf[0] = 'r'; buf[1] = 'c'; buf[2] = 'f'; buf[3] = ':'; - buf[4] = m_config.piezo_freq_option; buf[5] = 0; - buf[6] = m_config.piezo_cycles; buf[7] = 0; - buf[8] = (uint8_t)(m_config.piezo_averaging & 0xFF); buf[9] = (uint8_t)(m_config.piezo_averaging >> 8); - buf[10] = (uint8_t)(m_config.piezo_delay_us & 0xFF); buf[11] = (uint8_t)(m_config.piezo_delay_us >> 8); - buf[12] = (uint8_t)(m_config.piezo_num_samples & 0xFF); buf[13] = (uint8_t)(m_config.piezo_num_samples >> 8); + buf[4] = 0; buf[5] = m_config.piezo_freq_option; + buf[6] = 0; buf[7] = m_config.piezo_cycles; + buf[8] = (uint8_t)(m_config.piezo_averaging >> 8); buf[9] = (uint8_t)(m_config.piezo_averaging & 0xFF); + buf[10] = (uint8_t)(m_config.piezo_delay_us >> 8); buf[11] = (uint8_t)(m_config.piezo_delay_us & 0xFF); + buf[12] = (uint8_t)(m_config.piezo_num_samples >> 8); buf[13] = (uint8_t)(m_config.piezo_num_samples & 0xFF); dr_binary_tx_safe(buf, 7); /* 14바이트 = 7워드 */ return 1; @@ -1190,11 +1189,11 @@ static int Cmd_mcs(const ParsedCmd *cmd) uint8_t *buf = ble_bin_buffer; buf[0] = 'r'; buf[1] = 'c'; buf[2] = 's'; buf[3] = ':'; - buf[4] = m_config.piezo_freq_option; buf[5] = 0; - buf[6] = m_config.piezo_cycles; buf[7] = 0; - buf[8] = (uint8_t)(m_config.piezo_averaging & 0xFF); buf[9] = (uint8_t)(m_config.piezo_averaging >> 8); - buf[10] = (uint8_t)(m_config.piezo_delay_us & 0xFF); buf[11] = (uint8_t)(m_config.piezo_delay_us >> 8); - buf[12] = (uint8_t)(m_config.piezo_num_samples & 0xFF); buf[13] = (uint8_t)(m_config.piezo_num_samples >> 8); + buf[4] = 0; buf[5] = m_config.piezo_freq_option; + buf[6] = 0; buf[7] = m_config.piezo_cycles; + buf[8] = (uint8_t)(m_config.piezo_averaging >> 8); buf[9] = (uint8_t)(m_config.piezo_averaging & 0xFF); + buf[10] = (uint8_t)(m_config.piezo_delay_us >> 8); buf[11] = (uint8_t)(m_config.piezo_delay_us & 0xFF); + buf[12] = (uint8_t)(m_config.piezo_num_samples >> 8); buf[13] = (uint8_t)(m_config.piezo_num_samples & 0xFF); dr_binary_tx_safe(buf, 7); /* 14바이트 = 7워드 */ return 1;