Complete research project
This commit is contained in:
parent
94acfe3ba1
commit
58b74dcc50
16 changed files with 2973 additions and 53 deletions
227
research/05-printer-communication.md
Normal file
227
research/05-printer-communication.md
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
# Printer Communication
|
||||
|
||||
## Summary
|
||||
|
||||
The printer communication system handles serial port connections to 3D printers, sending G-code commands, receiving responses, and managing print state. It uses a stream-based architecture for G-code processing with modular transformers for features like print leveling, pause handling, and temperature monitoring.
|
||||
|
||||
## Technical Description
|
||||
|
||||
### PrinterConnection Class
|
||||
|
||||
`PrinterConnection` is the main class managing printer communication:
|
||||
|
||||
**Communication States:**
|
||||
| State | Description |
|
||||
|-------|-------------|
|
||||
| `Disconnected` | No active connection |
|
||||
| `AttemptingToConnect` | Connection in progress |
|
||||
| `FailedToConnect` | Connection attempt failed |
|
||||
| `Connected` | Ready to receive commands |
|
||||
| `PreparingToPrint` | Setting up for print |
|
||||
| `Printing` | Active print from host |
|
||||
| `PrintingFromSd` | Printing from SD card |
|
||||
| `Paused` | Print paused |
|
||||
| `FinishedPrint` | Print completed |
|
||||
| `Disconnecting` | Closing connection |
|
||||
| `ConnectionLost` | Unexpected disconnect |
|
||||
|
||||
**Supported Firmware:**
|
||||
- Marlin
|
||||
- Repetier
|
||||
- Sprinter
|
||||
- Smoothie
|
||||
|
||||
### Serial Communication
|
||||
|
||||
Connection parameters:
|
||||
- `BaudRate` - Typically 115200 or 250000
|
||||
- `SerialPort` - Platform-specific via `IFrostedSerialPort`
|
||||
- Checksum support for error detection
|
||||
- Line-by-line send/receive with buffering
|
||||
|
||||
**Response Parsing:**
|
||||
```csharp
|
||||
// Register callbacks for specific responses
|
||||
readLineStartCallBacks.Register("ok", PrintingCanContinue);
|
||||
readLineStartCallBacks.Register("T:", ReadTemperatures);
|
||||
readLineStartCallBacks.Register("Error:", PrinterReportsError);
|
||||
```
|
||||
|
||||
**Write Callbacks:**
|
||||
```csharp
|
||||
writeLineStartCallBacks.Register("M104", HotendTemperatureWasWritenToPrinter);
|
||||
writeLineStartCallBacks.Register("M140", BedTemperatureWasWritenToPrinter);
|
||||
```
|
||||
|
||||
### G-Code Stream Pipeline
|
||||
|
||||
G-code is processed through a chain of `GCodeStream` transformers:
|
||||
|
||||
```
|
||||
GCodeFileStream (source)
|
||||
└── GCodeSwitcher (file switching)
|
||||
└── QueuedCommandsStream (injected commands)
|
||||
└── PauseHandlingStream (pause/resume)
|
||||
└── RelativeToAbsoluteStream (coordinate conversion)
|
||||
└── PrintLevelingStream (bed leveling adjustments)
|
||||
└── BabyStepsStream (live Z offset)
|
||||
└── MaxLengthStream (segment splitting)
|
||||
└── ToolChangeStream (extruder switching)
|
||||
└── ExtrusionMultiplierStream
|
||||
└── FeedRateMultiplierStream
|
||||
└── WaitForTempStream
|
||||
└── RequestTemperaturesStream
|
||||
└── to Serial Port
|
||||
```
|
||||
|
||||
Each stream can:
|
||||
- Modify G-code lines passing through
|
||||
- Inject additional commands
|
||||
- Block/delay commands
|
||||
- Monitor state
|
||||
|
||||
### Key G-Code Streams
|
||||
|
||||
| Stream | Purpose |
|
||||
|--------|---------|
|
||||
| `GCodeFileStream` | Reads G-code from file |
|
||||
| `GCodeSwitcher` | Switches between print files |
|
||||
| `QueuedCommandsStream` | Injects immediate commands |
|
||||
| `PauseHandlingStream` | Manages pause/resume logic |
|
||||
| `PrintLevelingStream` | Applies bed leveling corrections |
|
||||
| `MaxLengthStream` | Splits long moves into segments |
|
||||
| `ToolChangeStream` | Handles multi-extruder switching |
|
||||
| `WaitForTempStream` | Waits for temperature targets |
|
||||
| `PrintRecoveryStream` | Enables print recovery after failure |
|
||||
| `ValidatePrintLevelingStream` | Validates leveling data |
|
||||
| `SoftwareEndstopsStream` | Enforces software limits |
|
||||
| `BabyStepsStream` | Applies live Z offset adjustments |
|
||||
|
||||
### Temperature Management
|
||||
|
||||
Temperature tracking for:
|
||||
- Heated bed (`ActualBedTemperature`, `TargetBedTemperature`)
|
||||
- Up to 16 hotends (`actualHotendTemperature[]`, `targetHotendTemperature[]`)
|
||||
|
||||
**Temperature Reading:**
|
||||
```csharp
|
||||
// Parses responses like "T:205.3 /210.0 B:60.0 /60.0"
|
||||
readLineContainsCallBacks.Register("T:", ReadTemperatures);
|
||||
```
|
||||
|
||||
**Automatic Heater Shutdown:**
|
||||
- `TimeToHoldTemperature` - Configurable delay
|
||||
- `SecondsToHoldTemperature` - Countdown timer
|
||||
- `TurnOffBedAndExtruders(TurnOff.AfterDelay)` - Scheduled shutdown
|
||||
|
||||
### Print State Management
|
||||
|
||||
**Detailed Printing States:**
|
||||
| State | Description |
|
||||
|-------|-------------|
|
||||
| `HomingAxis` | Executing homing sequence |
|
||||
| `HeatingBed` | Waiting for bed temperature |
|
||||
| `HeatingT0` | Waiting for extruder 0 temp |
|
||||
| `HeatingT1` | Waiting for extruder 1 temp |
|
||||
| `Printing` | Active G-code execution |
|
||||
|
||||
**Events:**
|
||||
| Event | Description |
|
||||
|-------|-------------|
|
||||
| `PrintStarted` | Print begins |
|
||||
| `PrintFinished` | Print completes |
|
||||
| `CancelRequested` | Cancel initiated |
|
||||
| `CancelCompleted` | Cancel finished |
|
||||
| `PauseOnLayer` | Pause at specific layer |
|
||||
| `FilamentRunout` | Filament sensor triggered |
|
||||
|
||||
### Error Handling
|
||||
|
||||
Error detection via response parsing:
|
||||
```csharp
|
||||
readLineContainsCallBacks.Register("MINTEMP", PrinterReportsError);
|
||||
readLineContainsCallBacks.Register("MAXTEMP", PrinterReportsError);
|
||||
readLineContainsCallBacks.Register("Thermal Runaway", PrinterReportsError);
|
||||
```
|
||||
|
||||
Errors trigger:
|
||||
1. `ErrorReported` event
|
||||
2. Print pause (if printing)
|
||||
3. User notification dialog
|
||||
|
||||
### Alternative Drivers
|
||||
|
||||
The system supports alternative communication protocols:
|
||||
|
||||
| Driver | Location | Purpose |
|
||||
|--------|----------|---------|
|
||||
| Emulator | Drivers/Emulator | Virtual printer for testing |
|
||||
| TCPIP | Drivers/TCPIP | Network-connected printers |
|
||||
| X3G | Drivers/X3G | MakerBot X3G protocol |
|
||||
|
||||
### TerminalLog
|
||||
|
||||
All communication is logged via `TerminalLog`:
|
||||
- Send/receive history
|
||||
- Exportable for debugging
|
||||
- Real-time display in UI terminal
|
||||
|
||||
### Design Rationale
|
||||
|
||||
**Stream Pipeline**: The chain-of-responsibility pattern allows:
|
||||
- Modular feature implementation
|
||||
- Easy addition/removal of processing stages
|
||||
- Clear data flow through transformations
|
||||
- Independent testing of each stage
|
||||
|
||||
**Callback-Based Parsing**: Using `StartsWith` and `Contains` callbacks:
|
||||
- Efficient string matching
|
||||
- Handles firmware variations
|
||||
- Easy to extend for new responses
|
||||
|
||||
**State Machine**: The `CommunicationStates` enum ensures:
|
||||
- Clear state transitions
|
||||
- Appropriate UI updates
|
||||
- Safe operation sequencing
|
||||
|
||||
## Reference
|
||||
|
||||
### Core Classes
|
||||
|
||||
| Class | Location | Description |
|
||||
|-------|----------|-------------|
|
||||
| `PrinterConnection` | [PrinterCommunication/PrinterConnection.cs](MatterControlLib/PrinterCommunication/PrinterConnection.cs) | Main communication class |
|
||||
| `TerminalLog` | [PrinterCommunication/TerminalLog.cs](MatterControlLib/PrinterCommunication/TerminalLog.cs) | Communication log |
|
||||
| `PrinterConfig` | [SlicerConfiguration/PrinterConfig.cs](MatterControlLib/SlicerConfiguration/Settings/PrinterConfig.cs) | Printer configuration |
|
||||
|
||||
### G-Code Streams
|
||||
|
||||
| Class | Location | Description |
|
||||
|-------|----------|-------------|
|
||||
| `GCodeStream` | [PrinterCommunication/Io/GCodeStream.cs](MatterControlLib/PrinterCommunication/Io/GCodeStream.cs) | Base stream class |
|
||||
| `GCodeSwitcher` | [PrinterCommunication/Io/GCodeSwitcher.cs](MatterControlLib/PrinterCommunication/Io/GCodeSwitcher.cs) | File switching |
|
||||
| `PauseHandlingStream` | [PrinterCommunication/Io/PauseHandlingStream.cs](MatterControlLib/PrinterCommunication/Io/PauseHandlingStream.cs) | Pause/resume |
|
||||
| `PrintLevelingStream` | [PrinterCommunication/Io/PrintLevelingStream.cs](MatterControlLib/PrinterCommunication/Io/PrintLevelingStream.cs) | Bed leveling |
|
||||
| `ToolChangeStream` | [PrinterCommunication/Io/ToolChangeStream.cs](MatterControlLib/PrinterCommunication/Io/ToolChangeStream.cs) | Tool changes |
|
||||
| `WaitForTempStream` | [PrinterCommunication/Io/WaitForTempStream.cs](MatterControlLib/PrinterCommunication/Io/WaitForTempStream.cs) | Temperature wait |
|
||||
|
||||
### Events
|
||||
|
||||
| Event | Source | Description |
|
||||
|-------|--------|-------------|
|
||||
| `CommunicationStateChanged` | `PrinterConnection` | State transition |
|
||||
| `TemperatureRead` | `PrinterConnection` | Temp update |
|
||||
| `LineReceived` | `PrinterConnection` | Serial input |
|
||||
| `LineSent` | `PrinterConnection` | Serial output |
|
||||
| `PrintFinished` | `PrinterConnection` | Print complete |
|
||||
| `ErrorReported` | `PrinterConnection` | Printer error |
|
||||
|
||||
### Enums
|
||||
|
||||
| Enum | Values |
|
||||
|------|--------|
|
||||
| `CommunicationStates` | Disconnected, Connected, Printing, Paused, etc. |
|
||||
| `DetailedPrintingState` | HomingAxis, HeatingBed, HeatingT0, Printing |
|
||||
| `FirmwareTypes` | Unknown, Repetier, Marlin, Sprinter, Smoothie |
|
||||
| `TurnOff` | Now, AfterDelay |
|
||||
| `Axis` | X, Y, Z, E, XYZ, C |
|
||||
Loading…
Add table
Add a link
Reference in a new issue