파싱 BE

This commit is contained in:
2026-04-14 20:00:10 +09:00
parent e659db6dbf
commit 0ede6c9cb8

View File

@@ -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;