Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/communication/commands_proto.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class CommandsProto {
int dac = 6;
int setDac = 1;
int setCalibratedDac = 2;
int setPower = 3;

int wavegen = 7;
int setWg = 1;
Expand Down
27 changes: 27 additions & 0 deletions lib/communication/peripherals/dac_channel.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:data/polynomial.dart';
import 'package:data/type.dart';

class DACChannel {
late String name;
late int channum;
late int offset;
late List<double> range;
late double slope;
late double intercept;
late Polynomial vToCode;
late Polynomial codeToV;
late int channelCode;
late String calibrationEnabled;

DACChannel(this.name, List<double> span, this.channum, this.channelCode) {
range = span;
slope = span[1] - span[0];
intercept = span[0];
vToCode = Polynomial.fromCoefficients(
DataType.float, [3300.0 / slope, -3300.0 * intercept / slope]);
codeToV = Polynomial.fromCoefficients(
DataType.float, [slope / 3300.0, intercept]);
calibrationEnabled = "false";
offset = 0;
}
}
66 changes: 66 additions & 0 deletions lib/communication/science_lab.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import 'package:flutter/foundation.dart';
import 'package:pslab/communication/commands_proto.dart';
import 'package:pslab/communication/handler/base.dart';
import 'package:pslab/communication/packet_handler.dart';
import 'package:pslab/communication/peripherals/dac_channel.dart';
import 'package:pslab/communication/socket_client.dart';
import 'package:pslab/others/logger_service.dart';
import 'package:pslab/providers/board_state_provider.dart';
import 'package:pslab/providers/locator.dart';

import 'analogChannel/analog_acquisition_channel.dart';
Expand Down Expand Up @@ -35,6 +37,7 @@ class ScienceLab {
Map<String, String> waveType = {};
List<AnalogAcquisitionChannel> aChannels = [];
List<DigitalChannel> dChannels = [];
Map<String, DACChannel> dacChannels = {};
static final double capacitorDischargeVoltage = 0.01 * 3.3;

late CommunicationHandler mCommunicationHandler;
Expand Down Expand Up @@ -115,6 +118,17 @@ class ScienceLab {
squareWaveFrequency['SQR2'] = 0.0;
squareWaveFrequency['SQR3'] = 0.0;
squareWaveFrequency['SQR4'] = 0.0;
if (getIt<BoardStateProvider>().pslabVersion == 6) {
dacChannels['PCS'] = DACChannel('PCS', [0, 3.3], 0, 0);
dacChannels['PV3'] = DACChannel('PV3', [0, 3.3], 1, 1);
dacChannels['PV2'] = DACChannel('PV2', [-3.3, 3.3], 2, 0);
dacChannels['PV1'] = DACChannel('PV1', [-5, 5], 3, 1);
} else {
dacChannels['PCS'] = DACChannel('PCS', [0, 3.3], 0, 0);
dacChannels['PV3'] = DACChannel('PV3', [0, 3.3], 1, 1);
dacChannels['PV2'] = DACChannel('PV2', [-3.3, 3.3], 2, 2);
dacChannels['PV1'] = DACChannel('PV1', [-5, 5], 3, 3);
}

if (isConnected()) {
await runInitSequence(true);
Expand Down Expand Up @@ -1024,6 +1038,58 @@ class ScienceLab {
return null;
}

Future<void> setVoltage(String channel, double voltage) async {
DACChannel dacChannel = dacChannels[channel]!;
int v = dacChannel.vToCode(voltage).toInt();
try {
mPacketHandler.sendByte(mCommandsProto.dac);
mPacketHandler.sendByte(mCommandsProto.setPower);
mPacketHandler.sendByte(dacChannel.channelCode);
mPacketHandler.sendInt(v);
await mPacketHandler.getAcknowledgement();
} catch (e) {
logger.e("Error in setVoltage: $e");
}
}

Future<void> setCurrent(double current) async {
DACChannel dacChannel = dacChannels['PCS']!;
int v = (3300 - dacChannel.vToCode(current)).toInt();
try {
mPacketHandler.sendByte(mCommandsProto.dac);
mPacketHandler.sendByte(mCommandsProto.setPower);
mPacketHandler.sendByte(dacChannel.channelCode);
mPacketHandler.sendInt(v);
await mPacketHandler.getAcknowledgement();
} catch (e) {
logger.e("Error in setCurrent: $e");
}
}

Future<void> setPV1(double voltage) async {
if (isConnected()) {
await setVoltage('PV1', voltage);
}
}

Future<void> setPV2(double voltage) async {
if (isConnected()) {
await setVoltage('PV2', voltage);
}
}

Future<void> setPV3(double voltage) async {
if (isConnected()) {
await setVoltage('PV3', voltage);
}
}

Future<void> setPCS(double current) async {
if (isConnected()) {
await setCurrent(current);
}
}

Future<void> servo4(
double? angle1,
double? angle2,
Expand Down
5 changes: 5 additions & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,11 @@
"analysisOptionEveryRisingEdge": "EVERY RISING EDGE",
"analysisOptionEveryFourthRisingEdge": "EVERY FOURTH RISING EDGE",
"analysisOptionDisabled": "DISABLED",
"powerSourceTitle": "Power Source",
"pinPV1": "PV1",
"pinPV2": "PV2",
"pinPV3": "PV3",
"pinPCS": "PCS",
"analyze": "ANALYZE",
"settings": "Settings",
"autoStart": "Auto Start",
Expand Down
30 changes: 30 additions & 0 deletions lib/l10n/app_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -658,6 +658,36 @@ abstract class AppLocalizations {
/// **'DISABLED'**
String get analysisOptionDisabled;

/// No description provided for @powerSourceTitle.
///
/// In en, this message translates to:
/// **'Power Source'**
String get powerSourceTitle;

/// No description provided for @pinPV1.
///
/// In en, this message translates to:
/// **'PV1'**
String get pinPV1;

/// No description provided for @pinPV2.
///
/// In en, this message translates to:
/// **'PV2'**
String get pinPV2;

/// No description provided for @pinPV3.
///
/// In en, this message translates to:
/// **'PV3'**
String get pinPV3;

/// No description provided for @pinPCS.
///
/// In en, this message translates to:
/// **'PCS'**
String get pinPCS;

/// No description provided for @analyze.
///
/// In en, this message translates to:
Expand Down
15 changes: 15 additions & 0 deletions lib/l10n/app_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,21 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get analysisOptionDisabled => 'DISABLED';

@override
String get powerSourceTitle => 'Power Source';

@override
String get pinPV1 => 'PV1';

@override
String get pinPV2 => 'PV2';

@override
String get pinPV3 => 'PV3';

@override
String get pinPCS => 'PCS';

@override
String get analyze => 'ANALYZE';

Expand Down
2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:pslab/view/logic_analyzer_screen.dart';
import 'package:pslab/view/luxmeter_screen.dart';
import 'package:pslab/view/multimeter_screen.dart';
import 'package:pslab/view/oscilloscope_screen.dart';
import 'package:pslab/view/power_source_screen.dart';
import 'package:pslab/view/robotic_arm_screen.dart';
import 'package:pslab/view/settings_screen.dart';
import 'package:pslab/view/about_us_screen.dart';
Expand Down Expand Up @@ -60,6 +61,7 @@ class MyApp extends StatelessWidget {
'/oscilloscope': (context) => const OscilloscopeScreen(),
'/multimeter': (context) => const MultimeterScreen(),
'/logicAnalyzer': (context) => const LogicAnalyzerScreen(),
'/powerSource': (context) => const PowerSourceScreen(),
'/connectDevice': (context) => const ConnectDeviceScreen(),
'/faq': (context) => FAQScreen(),
'/settings': (context) => const SettingsScreen(),
Expand Down
8 changes: 8 additions & 0 deletions lib/providers/board_state_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ class BoardStateProvider extends ChangeNotifier {
bool hasPermission = false;
late ScienceLabCommon scienceLabCommon;
String pslabVersionID = 'Not Connected';
String pslabVersionIDV6 = 'PSLab V6';
String pslabVersionIDV5 = 'PSLab V5';
int pslabVersion = 0;
late String exportFormat;
bool autoStart = true;

Expand Down Expand Up @@ -67,6 +70,11 @@ class BoardStateProvider extends ChangeNotifier {

Future<void> setPSLabVersionIDs() async {
pslabVersionID = await getIt.get<ScienceLab>().getVersion();
if (pslabVersionID == pslabVersionIDV6) {
pslabVersion = 6;
} else if (pslabVersionID == pslabVersionIDV5) {
pslabVersion = 5;
}
notifyListeners();
}

Expand Down
154 changes: 154 additions & 0 deletions lib/providers/power_source_state_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import 'package:flutter/material.dart';
import 'package:pslab/communication/science_lab.dart';
import 'package:pslab/providers/locator.dart';

enum Pin {
pv1,
pv2,
pv3,
pcs,
}

class PowerSourceStateProvider extends ChangeNotifier {
late double voltagePV1;
late double voltagePV2;
late double voltagePV3;
late double currentPCS;

late List<double> rangePV1;
late List<double> rangePV2;
late List<double> rangePV3;
late List<double> rangePCS;

late double step;

late ScienceLab _scienceLab;

PowerSourceStateProvider() {
voltagePV1 = -5.00;
voltagePV2 = -3.30;
voltagePV3 = 0.00;
currentPCS = 0.00;

rangePV1 = [-5.00, 5.00];
rangePV2 = [-3.30, 3.30];
rangePV3 = [0.00, 3.30];
rangePCS = [0.00, 3.30];

step = 0.01;

_scienceLab = getIt.get<ScienceLab>();
}

double valueToIndex(double value, Pin pin) {
List<double> range;
int sections;
switch (pin) {
case Pin.pv1:
range = rangePV1;
sections = 1000;
break;
case Pin.pv2:
range = rangePV2;
sections = 660;
break;
case Pin.pv3:
range = rangePV3;
sections = 330;
break;
case Pin.pcs:
range = rangePCS;
sections = 330;
break;
}
final clampedValue = value.clamp(range[0], range[1]);
return ((clampedValue - range[0]) / (range[1] - range[0])) * sections;
}

double indexToValue(double index, Pin pin) {
List<double> range;
int sections;
switch (pin) {
case Pin.pv1:
range = rangePV1;
sections = 1000;
break;
case Pin.pv2:
range = rangePV2;
sections = 660;
break;
case Pin.pv3:
range = rangePV3;
sections = 330;
break;
case Pin.pcs:
range = rangePCS;
sections = 330;
break;
}
final clampedIndex = index.clamp(0, sections);
return (clampedIndex / sections) * (range[1] - range[0]) + range[0];
}

Future<void> setPV1(double value) async {
final clampedValue = value.clamp(rangePV1[0], rangePV1[1]);
voltagePV1 = clampedValue;
voltagePV3 = (3.3 / 2) * (1 + (voltagePV1 / 5.0));
await _scienceLab.setPV1(voltagePV1);
notifyListeners();
}

Future<void> setPV2(double value) async {
final clampedValue = value.clamp(rangePV2[0], rangePV2[1]);
voltagePV2 = clampedValue;
currentPCS = (3.3 - voltagePV2) / 2;
await _scienceLab.setPV2(voltagePV2);
notifyListeners();
}

Future<void> setPV3(double value) async {
final clampedValue = value.clamp(rangePV3[0], rangePV3[1]);
voltagePV3 = clampedValue;
voltagePV1 = 5 * (2 * voltagePV3 / 3.3 - 1);
await _scienceLab.setPV3(voltagePV3);
notifyListeners();
}

Future<void> setPCS(double value) async {
final clampedValue = value.clamp(rangePCS[0], rangePCS[1]);
currentPCS = clampedValue;
voltagePV2 = 3.3 - 2 * currentPCS;
await _scienceLab.setPCS(currentPCS);
notifyListeners();
}

Future<void> setValue(double value, Pin pin) async {
switch (pin) {
case Pin.pv1:
await setPV1(value);
break;
case Pin.pv2:
await setPV2(value);
break;
case Pin.pv3:
await setPV3(value);
break;
case Pin.pcs:
await setPCS(value);
break;
}
}

double getValue(Pin pin) {
switch (pin) {
case Pin.pv1:
return voltagePV1;
case Pin.pv2:
return voltagePV2;
case Pin.pv3:
return voltagePV3;
case Pin.pcs:
return currentPCS;
}
}
}
Loading
Loading