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