Skip to content

Commit 94599a1

Browse files
committed
Add chip number support to GPIO configuration and management
1 parent b22aa6d commit 94599a1

File tree

5 files changed

+62
-21
lines changed

5 files changed

+62
-21
lines changed

lib/features/gpio_control/device/repositories/gpio_repository_impl.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ class GPIORepositoryImpl implements GPIORepository {
1414
GPIO gpio;
1515

1616
if (config != null) {
17-
// Use advanced configuration
17+
// Use advanced configuration with chip number
1818
final peripheryConfig = GPIOConfigMapper.toPeripheryConfig(config);
19-
gpio = GPIO.advanced(pinNumber, peripheryConfig);
19+
gpio = GPIO.advanced(pinNumber, peripheryConfig, config.chip);
2020
} else {
21-
// Use basic configuration
21+
// Use basic configuration with default chip 0
2222
final direction =
2323
isInput ? GPIOdirection.gpioDirIn : GPIOdirection.gpioDirOut;
2424
gpio = GPIO(pinNumber, direction);

lib/features/gpio_control/domain/entities/gpio_config.dart

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class GPIOConfig {
3232
final GPIODrive drive;
3333
final bool inverted;
3434
final String label;
35+
final int chip;
3536

3637
GPIOConfig({
3738
required this.direction,
@@ -40,5 +41,6 @@ class GPIOConfig {
4041
this.drive = GPIODrive.default_,
4142
this.inverted = false,
4243
this.label = '',
44+
this.chip = 0,
4345
});
4446
}

lib/features/gpio_control/domain/entities/gpio_pin.dart

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
class GPIOPin {
22
final int pinNumber;
3+
final int chipNumber; // Added chip number
34
final bool isInput;
45
final String label;
56
final bool value;
67

78
GPIOPin({
89
required this.pinNumber,
10+
required this.chipNumber, // Added chip number
911
required this.isInput,
1012
required this.label,
1113
required this.value,

lib/features/gpio_control/presentation/cubit/gpio_cubit.dart

+31-16
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class GPIOCubit extends Cubit<GPIOState> {
2727
GPIOConfig(
2828
direction: isInput ? GPIODirection.input : GPIODirection.output,
2929
label: label,
30+
chip: 0, // Default to chip 0 if no config provided
3031
);
3132

3233
final result = await setupPin(
@@ -40,6 +41,7 @@ class GPIOCubit extends Cubit<GPIOState> {
4041
if (result) {
4142
final newPin = GPIOPin(
4243
pinNumber: pinNumber,
44+
chipNumber: effectiveConfig.chip, // Include chip number in pin
4345
isInput: isInput,
4446
label: label,
4547
value: false,
@@ -52,26 +54,32 @@ class GPIOCubit extends Cubit<GPIOState> {
5254
} else {
5355
emit(state.copyWith(
5456
isLoading: false,
55-
error: 'Failed to setup pin $pinNumber',
57+
error: 'Failed to setup pin $pinNumber on chip ${effectiveConfig.chip}',
5658
));
5759
}
5860
}
5961

6062
Future<void> togglePin(int pinNumber, bool value) async {
6163
emit(state.copyWith(isLoading: true, error: null));
6264

65+
final pin = state.pins.firstWhere(
66+
(p) => p.pinNumber == pinNumber,
67+
orElse: () => throw Exception('Pin not found'),
68+
);
69+
6370
final result = await repository.writePin(pinNumber, value);
6471
if (result) {
65-
final updatedPins = state.pins.map((pin) {
66-
if (pin.pinNumber == pinNumber) {
72+
final updatedPins = state.pins.map((p) {
73+
if (p.pinNumber == pinNumber) {
6774
return GPIOPin(
68-
pinNumber: pin.pinNumber,
69-
isInput: pin.isInput,
70-
label: pin.label,
75+
pinNumber: p.pinNumber,
76+
chipNumber: pin.chipNumber,
77+
isInput: p.isInput,
78+
label: p.label,
7179
value: value,
7280
);
7381
}
74-
return pin;
82+
return p;
7583
}).toList();
7684

7785
emit(state.copyWith(
@@ -81,23 +89,29 @@ class GPIOCubit extends Cubit<GPIOState> {
8189
} else {
8290
emit(state.copyWith(
8391
isLoading: false,
84-
error: 'Failed to write to pin $pinNumber',
92+
error: 'Failed to write to pin $pinNumber on chip ${pin.chipNumber}',
8593
));
8694
}
8795
}
8896

8997
Future<void> readPin(int pinNumber) async {
98+
final pin = state.pins.firstWhere(
99+
(p) => p.pinNumber == pinNumber,
100+
orElse: () => throw Exception('Pin not found'),
101+
);
102+
90103
final result = await repository.readPin(pinNumber);
91-
final updatedPins = state.pins.map((pin) {
92-
if (pin.pinNumber == pinNumber) {
104+
final updatedPins = state.pins.map((p) {
105+
if (p.pinNumber == pinNumber) {
93106
return GPIOPin(
94-
pinNumber: pin.pinNumber,
95-
isInput: pin.isInput,
96-
label: pin.label,
107+
pinNumber: p.pinNumber,
108+
chipNumber: pin.chipNumber,
109+
isInput: p.isInput,
110+
label: p.label,
97111
value: result,
98112
);
99113
}
100-
return pin;
114+
return p;
101115
}).toList();
102116

103117
emit(state.copyWith(pins: updatedPins));
@@ -124,15 +138,16 @@ class GPIOCubit extends Cubit<GPIOState> {
124138
if (!success) {
125139
emit(state.copyWith(
126140
isLoading: false,
127-
error: 'Failed to close pin ${pin.pinNumber}',
141+
error:
142+
'Failed to close pin ${pin.pinNumber} on chip ${pin.chipNumber}',
128143
));
129144
return;
130145
}
131146
}
132147

133148
emit(state.copyWith(
134149
isLoading: false,
135-
pins: [], // Clear all pins after successful cleanup
150+
pins: [],
136151
));
137152
} catch (e) {
138153
emit(state.copyWith(

lib/features/gpio_control/presentation/pages/gpio_page.dart

+24-2
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ class AddPinDialogState extends State<AddPinDialog> {
101101
final _formKey = GlobalKey<FormState>();
102102
late TextEditingController _pinNumberController;
103103
late TextEditingController _labelController;
104+
late TextEditingController _chipNumberController;
104105
bool _isInput = true;
105106
bool _showAdvancedConfig = false;
106107

107-
// Advanced configuration
108108
GPIOEdge _selectedEdge = GPIOEdge.none;
109109
GPIOBias _selectedBias = GPIOBias.default_;
110110
GPIODrive _selectedDrive = GPIODrive.default_;
@@ -115,6 +115,7 @@ class AddPinDialogState extends State<AddPinDialog> {
115115
super.initState();
116116
_pinNumberController = TextEditingController();
117117
_labelController = TextEditingController();
118+
_chipNumberController = TextEditingController(text: '0');
118119
}
119120

120121
@override
@@ -141,6 +142,20 @@ class AddPinDialogState extends State<AddPinDialog> {
141142
return null;
142143
},
143144
),
145+
TextFormField(
146+
controller: _chipNumberController,
147+
decoration: const InputDecoration(labelText: 'Chip Number'),
148+
keyboardType: TextInputType.number,
149+
validator: (value) {
150+
if (value == null || value.isEmpty) {
151+
return 'Please enter a chip number';
152+
}
153+
if (int.tryParse(value) == null) {
154+
return 'Please enter a valid number';
155+
}
156+
return null;
157+
},
158+
),
144159
TextFormField(
145160
controller: _labelController,
146161
decoration: const InputDecoration(labelText: 'Label'),
@@ -258,8 +273,14 @@ class AddPinDialogState extends State<AddPinDialog> {
258273
drive: _selectedDrive,
259274
inverted: _isInverted,
260275
label: _labelController.text,
276+
chip: int.parse(_chipNumberController.text),
261277
)
262-
: null;
278+
: GPIOConfig(
279+
direction:
280+
_isInput ? GPIODirection.input : GPIODirection.output,
281+
label: _labelController.text,
282+
chip: int.parse(_chipNumberController.text),
283+
);
263284

264285
context.read<GPIOCubit>().setupNewPin(
265286
pinNumber: int.parse(_pinNumberController.text),
@@ -280,6 +301,7 @@ class AddPinDialogState extends State<AddPinDialog> {
280301
void dispose() {
281302
_pinNumberController.dispose();
282303
_labelController.dispose();
304+
_chipNumberController.dispose();
283305
super.dispose();
284306
}
285307
}

0 commit comments

Comments
 (0)