stop시 flush적용

This commit is contained in:
2026-01-27 19:22:25 +00:00
parent 247a695c6b
commit ebc60e9a27

View File

@@ -237,7 +237,7 @@ SPIClass hspi(HSPI);
// 10MHz: 안정적이지만 느림
// 20MHz: 권장 (고속 + 안정성)
// 25MHz: 불안정할 수 있음
MCP2515 mcp2515(HSPI_CS, 40000000, &hspi);
MCP2515 mcp2515(HSPI_CS, 80000000, &hspi);
HardwareSerial SerialComm(1); // UART1
HardwareSerial Serial2Comm(2); // ⭐ UART2 추가
WebServer server(80);
@@ -916,41 +916,51 @@ void checkAutoTriggers(struct can_frame &frame) {
}
if (anyMatch && result) {
// 🎯 파일 닫기 로직 추가
if (xSemaphoreTake(sdMutex, pdMS_TO_TICKS(2000)) == pdTRUE) {
// ⭐⭐⭐ 더블 버퍼: 현재 쓰기 버퍼의 남은 데이터 flush
if (writeBufferIndex > 0 && logFile) {
size_t written = logFile.write(currentWriteBuffer, writeBufferIndex);
logFile.flush();
Serial.printf("✓ Auto Trigger 최종 쓰기 버퍼 플러시: %d bytes\n", written);
writeBufferIndex = 0;
}
// 🎯 파일 닫기 로직
Serial.println("🎯 Auto Trigger: 중지 조건 만족");
// ⭐⭐⭐ 1단계: 로깅 중지 (새 데이터 수신 차단)
loggingEnabled = false;
autoTriggerActive = false;
if (xSemaphoreTake(sdMutex, pdMS_TO_TICKS(5000)) == pdTRUE) {
// ⭐ flush 태스크가 작업 중이면 완료 대기
// ⭐⭐⭐ 2단계: flush 태스크 완료 대기
Serial.println("⏳ Flush 태스크 완료 대기 중...");
int waitCount = 0;
while (flushInProgress && waitCount < 500) {
while (flushInProgress && waitCount < 1000) { // 최대 10초
vTaskDelay(10);
waitCount++;
}
// CSV 형식: 최종 플러시
if (canLogFormatCSV && logFile) {
logFile.flush();
if (waitCount > 0) {
Serial.printf("✓ Flush 완료: %d ms 대기\n", waitCount * 10);
}
// ⭐⭐⭐ 3단계: 현재 쓰기 버퍼의 남은 데이터 flush
if (writeBufferIndex > 0 && logFile) {
size_t written = logFile.write(currentWriteBuffer, writeBufferIndex);
Serial.printf("✓ 쓰기 버퍼 최종 플러시: %d bytes\n", written);
writeBufferIndex = 0;
}
// ⭐⭐⭐ 4단계: 최종 flush
if (logFile) {
logFile.flush();
Serial.println("✓ 최종 flush 완료");
}
// ⭐⭐⭐ 5단계: 파일 닫기
if (logFile) {
size_t finalSize = logFile.size();
logFile.close();
Serial.printf("✓ Auto Trigger 파일 닫힘: %s (%lu bytes)\n", currentFilename, finalSize);
}
loggingEnabled = false;
autoTriggerActive = false;
currentFilename[0] = '\0';
writeBufferIndex = 0;
flushBufferSize = 0;
Serial.println("🎯 Auto Trigger: 로깅 중지!");
Serial.println("🎯 Auto Trigger: 로깅 중지 완료!");
Serial.printf(" 조건: ID 0x%03X 만족\n", frame.can_id);
xSemaphoreGive(sdMutex);
@@ -1527,7 +1537,8 @@ void sdFlushTask(void *parameter) {
// ⭐ SD 뮤텍스 획득 (최대 5초 대기)
if (xSemaphoreTake(sdMutex, pdMS_TO_TICKS(5000)) == pdTRUE) {
if (logFile && sdCardReady && loggingEnabled) {
// ⭐⭐⭐ loggingEnabled 체크 제거! (중지 시에도 flush 필요)
if (logFile && sdCardReady) {
// ⭐ flush 버퍼를 SD에 쓰기
size_t written = logFile.write(currentFlushBuffer, flushSize);
@@ -2099,42 +2110,49 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
if (loggingEnabled) {
Serial.println("🛑 로깅 중지 요청...");
if (xSemaphoreTake(sdMutex, pdMS_TO_TICKS(2000)) == pdTRUE) {
// ⭐⭐⭐ 더블 버퍼: 현재 쓰기 버퍼의 남은 데이터 flush
if (writeBufferIndex > 0 && logFile) {
size_t written = logFile.write(currentWriteBuffer, writeBufferIndex);
logFile.flush();
Serial.printf("✓ 최종 쓰기 버퍼 플러시: %d bytes\n", written);
writeBufferIndex = 0;
}
// ⭐⭐⭐ 1단계: 로깅 중지 (새 데이터 수신 차단)
loggingEnabled = false;
if (xSemaphoreTake(sdMutex, pdMS_TO_TICKS(5000)) == pdTRUE) {
// ⭐ flush 태스크가 작업 중이면 완료 대기
// ⭐⭐⭐ 2단계: flush 태스크 완료 대기 (진행 중인 flush)
Serial.println("⏳ Flush 태스크 완료 대기 중...");
int waitCount = 0;
while (flushInProgress && waitCount < 500) {
while (flushInProgress && waitCount < 1000) { // 최대 10초
vTaskDelay(10);
waitCount++;
}
if (waitCount > 0) {
Serial.printf("✓ Flush 태스크 완료 대기: %d ms\n", waitCount * 10);
Serial.printf("✓ Flush 태스크 완료: %d ms 대기\n", waitCount * 10);
}
// ⭐⭐⭐ CSV 형식: 최종 플러시
if (canLogFormatCSV && logFile) {
// ⭐⭐⭐ 3단계: 현재 쓰기 버퍼의 남은 데이터 flush
if (writeBufferIndex > 0 && logFile) {
size_t written = logFile.write(currentWriteBuffer, writeBufferIndex);
Serial.printf("✓ 쓰기 버퍼 최종 플러시: %d bytes\n", written);
writeBufferIndex = 0;
}
// ⭐⭐⭐ 4단계: 최종 flush (메타데이터 동기화)
if (logFile) {
logFile.flush();
Serial.println("CSV 최종 플러시");
Serial.println("최종 flush 완료");
}
// ⭐⭐⭐ 5단계: 파일 닫기
if (logFile) {
size_t finalSize = logFile.size();
logFile.close();
Serial.printf("✓ 파일 닫힘: %s (%lu bytes)\n", currentFilename, finalSize);
}
loggingEnabled = false;
currentFilename[0] = '\0';
writeBufferIndex = 0;
flushBufferSize = 0;
xSemaphoreGive(sdMutex);
Serial.println("✅ 로깅 중지 완료!");
} else {
Serial.println("✗ sdMutex 획득 실패!");
}