init
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
# Data Transfer Fix - AudioCoder
|
||||
|
||||
## Problem Identified
|
||||
The GUI would show "CLOCK LOCK pattern=AA" repeatedly but never receive any data. The decoder got stuck in the RX_SEARCH state.
|
||||
|
||||
## Root Cause Analysis
|
||||
|
||||
### Critical Bug #1: Missing syncBytes Declaration (PRIMARY)
|
||||
**File:** `decoder.c` / `decoder.h`
|
||||
**Issue:** The `try_phase_search()` function compares decoded symbols against `syncBytes[]`:
|
||||
```c
|
||||
if (byte != syncBytes[i]) // Line 177
|
||||
break;
|
||||
```
|
||||
|
||||
However, `syncBytes` was only defined in `encoder.c` and **NOT** declared as `extern` in `decoder.h`. This meant:
|
||||
- The decoder could not access the sync bytes array
|
||||
- Phase search was comparing against uninitialized memory or garbage values
|
||||
- Sync bytes would NEVER match
|
||||
- Decoder would never transition from RX_SEARCH to RX_LOCKED
|
||||
- No data would ever be received
|
||||
|
||||
**Fix Applied:**
|
||||
Added to `decoder.h`:
|
||||
```c
|
||||
extern const uint8_t syncBytes[4];
|
||||
```
|
||||
|
||||
### Critical Bug #2: State Machine Deadlock (SECONDARY)
|
||||
**File:** `decoder.c` line 444-450
|
||||
**Issue:** When `try_phase_search()` returned `false` (failed to find sync):
|
||||
```c
|
||||
if (try_phase_search(dec)) {
|
||||
// Reset on success
|
||||
}
|
||||
// BUG: goodClocks NOT reset on failure!
|
||||
```
|
||||
|
||||
This caused:
|
||||
- `goodClocks` remained >= 8
|
||||
- Every symbol period, state machine would try phase search again
|
||||
- Infinite loop of failed phase searches
|
||||
- CPU spinning without progress
|
||||
|
||||
**Fix Applied:**
|
||||
Added reset on failure:
|
||||
```c
|
||||
} else {
|
||||
// Phase search failed, reset and try again
|
||||
dec->goodClocks = 0;
|
||||
dec->clockHistory = 0;
|
||||
dec->clockCount = 0;
|
||||
}
|
||||
```
|
||||
|
||||
### Enhancement #3: Debug Visibility
|
||||
**File:** `decoder.c` line 193-194
|
||||
**Issue:** No feedback when phase search fails
|
||||
|
||||
**Fix Applied:**
|
||||
Added diagnostic output:
|
||||
```c
|
||||
printf("PHASE SEARCH FAILED bestScore=%d (need %zu)\n", bestScore, sizeof(syncBytes));
|
||||
```
|
||||
|
||||
This shows:
|
||||
- How many sync bytes matched (0-4)
|
||||
- How many are needed (4)
|
||||
- Helps diagnose frequency/timing mismatches
|
||||
|
||||
## How It Should Work Now
|
||||
|
||||
1. **Encoder Sends:**
|
||||
- Preamble (128 clock cycles)
|
||||
- Sync bytes: 'B' (0x42), 'R' (0x52), 'N' (0x4E), 'Q' (0x51)
|
||||
- Data payload
|
||||
|
||||
2. **Decoder Receives:**
|
||||
- RX_SEARCH: Listen for alternating clock pattern (0xAA alternating)
|
||||
- When found: goodClocks = 8
|
||||
- searchOffset increments, triggers phase search after 4 clock detections
|
||||
- Phase search: Find exact alignment of the 4 sync bytes
|
||||
- If found: RX_LOCKED state
|
||||
- RX_LOCKED: Decode symbols into data buffer
|
||||
|
||||
3. **Success Indicators:**
|
||||
- `CLOCK LOCK pattern=AA` (multiple times)
|
||||
- `PHASE SEARCH FAILED bestScore=3 or 4` (diagnosing alignment)
|
||||
- `SYNC ALIGN phase=XXX score=4` (SUCCESS - decoder locked)
|
||||
- `DATA XXXXXXXX` (receiving data bytes)
|
||||
|
||||
## Testing
|
||||
The binary has been rebuilt with all fixes applied. Expected output should progress from CLOCK LOCK → PHASE SEARCH FAILED (or SUCCEED) → SYNC ALIGN → DATA.
|
||||
Reference in New Issue
Block a user