Skip to content

Commit 4822340

Browse files
authored
Merge pull request #3 from JorgeMaker/Updated16022021
Updated16022021
2 parents 19291ba + 128baaa commit 4822340

25 files changed

+995
-703
lines changed

README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
### SimpleFOCStudio
1+
## SimpleFOCStudio
22

33
A GIU application developed with Python/PyQt5 to manage and configure any [SimpleFOC](https://github.com/simplefoc) BLDC controlled device using serial port communications. It as a UI that plots in real time monitored variables PyQtGraph.
44
<p align="center">
5-
<img src="https://github.com/JorgeMaker/SimpleFOCStudio/blob/main/DOC/SimpleFOCStudio.gif?raw=true"">
5+
<img src="https://github.com/JorgeMaker/SimpleFOCStudio/blob/main/DOC/SimpleFOCStudio.gif?raw=true">
66
</p>
77

8-
#### Installation and Usage
8+
### Installation and Usage
99

1010
- Install Python if you don't have it installed yet
1111
- Clone this repo or download the zip file
@@ -15,5 +15,4 @@ A GIU application developed with Python/PyQt5 to manage and configure any [Simp
1515
- Once in the application add a device (+) and configure serial port settings
1616
- Connect to the serial port you have to have a SimpleDOC device that
1717
attends to the command as explained in [this example](https://docs.simplefoc.com/communication)
18-
- Start playing and have fun :)
19-
18+
- Start playing and have fun :)

SimpleFOCStudio.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ a.datas += [('src/gui/resources/start.png', 'src/gui/resources/start.png', 'DATA
3131
a.datas += [('src/gui/resources/statistics.png', 'src/gui/resources/statistics.png', 'DATA'),]
3232
a.datas += [('src/gui/resources/stop.png', 'src/gui/resources/stop.png', 'DATA'),]
3333
a.datas += [('src/gui/resources/zoomall.png', 'src/gui/resources/zoomall.png', 'DATA'),]
34+
a.datas += [('src/gui/resources/consoletool.png', 'src/gui/resources/consoletool.png', 'DATA'),]
3435
exe = EXE(pyz,
3536
a.scripts,
3637
a.binaries,

device.json

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1 @@
1-
{
2-
"proportionalGainPID": "0.3",
3-
"integralGainPID": 5,
4-
"derivativeGainPID": 0,
5-
"voltageRampPID": 12,
6-
"lowPassFilter": 0.01,
7-
"anglePGain": 20,
8-
"velocityLimit": 50,
9-
"voltageLimit": 1,
10-
"controlType": 2,
11-
"initialTarget": 0,
12-
"connectionID": "SimpleFOC1",
13-
"serialPortName": "/dev/tty.usbmodem6D7F478857481",
14-
"serialRate": "115200",
15-
"serialByteSize": 8, "serialParity": "N", "stopBits": 1
16-
}
1+
{"proportionalGainPID": "", "integralGainPID": "", "derivativeGainPID": "", "voltageRampPID": "", "lowPassFilter": "", "anglePGain": "", "velocityLimit": "", "voltageLimit": " 2.00", "controlType": 2, "initialTarget": 0, "connectionID": "", "serialPortName": "/dev/cu.usbserial-14130", "serialRate": "115200", "serialByteSize": 8, "serialParity": "N", "stopBits": 1}

simpleFOCStudio.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@
77
from PyQt5 import QtWidgets
88
from src.gui.mainWindow import UserInteractionMainWindow
99
import sys
10+
import logging
1011

11-
if __name__ == "__main__":
12-
app = QtWidgets.QApplication(sys.argv)
13-
mainWindow = QtWidgets.QMainWindow()
14-
userInteractionMainWindow = UserInteractionMainWindow()
15-
userInteractionMainWindow.setupUi(mainWindow)
16-
mainWindow.show()
17-
sys.exit(app.exec_())
12+
if __name__ == '__main__':
13+
try:
14+
logging.basicConfig(filename='.SimpleFOCConfigTool.log', filemode='w',
15+
format='%(name)s - %(levelname)s - %(message)s')
16+
app = QtWidgets.QApplication(sys.argv)
17+
mainWindow = QtWidgets.QMainWindow()
18+
userInteractionMainWindow = UserInteractionMainWindow()
19+
userInteractionMainWindow.setupUi(mainWindow)
20+
mainWindow.show()
21+
sys.exit(app.exec_())
22+
except Exception as exception:
23+
logging.error(exception, exc_info=True)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
from PyQt5 import QtWidgets
4+
from src.gui.sharedcomnponets.commandLineInterface import CommandLineWidget
5+
from src.gui.commandlinetool.configureConnectionWidget import ConfigureConnection
6+
from src.gui.sharedcomnponets.sharedcomponets import (WorkAreaTabWidget, GUIToolKit)
7+
from src.simpleFOCConnector import SimpleFOCDevice
8+
9+
class CommandLineConsoleTool(WorkAreaTabWidget):
10+
11+
def __init__(self, parent=None):
12+
super().__init__(parent)
13+
14+
self.device = SimpleFOCDevice.getInstance()
15+
16+
self.verticalLayout = QtWidgets.QVBoxLayout(self)
17+
self.verticalLayout.setObjectName('verticalLayout')
18+
19+
self.configureConnection = ConfigureConnection()
20+
self.verticalLayout.addWidget(self.configureConnection)
21+
22+
self.commandLineInterface = CommandLineWidget()
23+
self.verticalLayout.addWidget(self.commandLineInterface)
24+
25+
self.device.commProvider.rawDataReceived.connect(self.commandLineInterface.publishCommandResponseData)
26+
27+
def getTabIcon(self):
28+
return GUIToolKit.getIconByName('consoletool')
29+
30+
def getTabName(self):
31+
return self.device.connectionID
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
import serial
4+
from PyQt5 import (QtGui,QtCore,QtWidgets)
5+
from src.gui.sharedcomnponets.sharedcomponets import SerialPortComboBox
6+
from src.gui.sharedcomnponets.sharedcomponets import GUIToolKit
7+
from src.simpleFOCConnector import SimpleFOCDevice
8+
9+
class ConfigureConnection(QtWidgets.QGroupBox):
10+
11+
def __init__(self, parent=None):
12+
super().__init__(parent)
13+
14+
self.device = SimpleFOCDevice.getInstance()
15+
16+
self.setTitle('Configure serial connection')
17+
self.setObjectName('configureConnection')
18+
19+
self.configCoonLayout = QtWidgets.QHBoxLayout(self)
20+
self.configCoonLayout.setObjectName(
21+
'configureConnectionorizontalLayout')
22+
23+
self.portNameLabel = QtWidgets.QLabel(self)
24+
self.portNameLabel.setObjectName('portNameLabel')
25+
self.configCoonLayout.addWidget(self.portNameLabel)
26+
27+
self.portNameComboBox = SerialPortComboBox(self)
28+
self.portNameComboBox.setObjectName('portNameComboBox')
29+
self.portNameComboBox.setMinimumWidth(250)
30+
self.configCoonLayout.addWidget(self.portNameComboBox)
31+
32+
self.bitRateLabel = QtWidgets.QLabel(self)
33+
self.bitRateLabel.setObjectName('bitRateLabel')
34+
self.configCoonLayout.addWidget(self.bitRateLabel)
35+
36+
self.bitRatelineEdit = QtWidgets.QLineEdit(self)
37+
self.bitRatelineEdit.setObjectName('bitRatelineEdit')
38+
self.bitRatelineEdit.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp("^[0-9]*$")))
39+
self.bitRatelineEdit.setText('115200')
40+
self.configCoonLayout.addWidget(self.bitRatelineEdit)
41+
42+
self.parityLabel = QtWidgets.QLabel(self)
43+
self.parityLabel.setObjectName('parityLabel')
44+
self.configCoonLayout.addWidget(self.parityLabel)
45+
46+
self.parityComboBox = QtWidgets.QComboBox(self)
47+
self.parityComboBox.setObjectName('parityComboBox')
48+
self.parityComboBox.addItems(serial.PARITY_NAMES.values())
49+
self.configCoonLayout.addWidget(self.parityComboBox)
50+
51+
serial.PARITY_NAMES.values()
52+
53+
self.byteSizeLabel = QtWidgets.QLabel(self)
54+
self.byteSizeLabel.setObjectName('byteSizeLabel')
55+
self.configCoonLayout.addWidget(self.byteSizeLabel)
56+
57+
self.byteSizeComboBox = QtWidgets.QComboBox(self)
58+
self.byteSizeComboBox.setObjectName('byteSizeComboBox')
59+
byteSizeList = [str(serial.EIGHTBITS), str(serial.FIVEBITS),
60+
str(serial.SIXBITS),
61+
str(serial.SEVENBITS)]
62+
self.byteSizeComboBox.addItems(byteSizeList)
63+
self.configCoonLayout.addWidget(self.byteSizeComboBox)
64+
65+
self.stopBitsLabel = QtWidgets.QLabel(self)
66+
self.stopBitsLabel.setObjectName('stopBitsLabel')
67+
self.configCoonLayout.addWidget(self.stopBitsLabel)
68+
69+
self.stopBitsComboBox = QtWidgets.QComboBox(self)
70+
byteStopBitsList = [str(serial.STOPBITS_ONE),
71+
str(serial.STOPBITS_ONE_POINT_FIVE),
72+
str(serial.STOPBITS_TWO)]
73+
self.stopBitsComboBox.addItems(byteStopBitsList)
74+
self.stopBitsComboBox.setObjectName('stopBitsComboBox')
75+
self.configCoonLayout.addWidget(self.stopBitsComboBox)
76+
77+
self.connectDisconnectButton = QtWidgets.QPushButton(self)
78+
self.connectDisconnectButton.setIcon(
79+
GUIToolKit.getIconByName('connect'))
80+
self.connectDisconnectButton.setObjectName('connectDeviceButton')
81+
self.connectDisconnectButton.setText('Connect')
82+
self.connectDisconnectButton.clicked.connect(
83+
self.connectDisconnectDeviceAction)
84+
85+
self.configCoonLayout.addWidget(self.connectDisconnectButton)
86+
87+
self.portNameLabel.setText('Port Name')
88+
self.bitRateLabel.setText('Bit rate')
89+
self.parityLabel.setText('Parity')
90+
self.byteSizeLabel.setText('Byte size')
91+
self.stopBitsLabel.setText('Stop bits')
92+
93+
self.device.addConnectionStateListener(self)
94+
self.connectionStateChanged(self.device.isConnected)
95+
96+
def getConfigValues(self):
97+
values = {
98+
'connectionID': '',
99+
'serialPortName': self.portNameComboBox.currentText(),
100+
'serialRate': self.bitRatelineEdit.text(),
101+
'stopBits': self.stopBitsExtractor(self.stopBitsComboBox.currentText()),
102+
'serialByteSize': int(str(self.byteSizeComboBox.currentText())),
103+
'serialParity': list(serial.PARITY_NAMES.keys())[list(serial.PARITY_NAMES.values()).index(self.parityComboBox.currentText())][0]
104+
}
105+
return values
106+
107+
def stopBitsExtractor(self, value):
108+
if value == '1.5':
109+
return float(self.stopBitsComboBox.currentText())
110+
else:
111+
return int(self.stopBitsComboBox.currentText())
112+
113+
def connectionStateChanged(self, isConnectedFlag):
114+
if isConnectedFlag:
115+
self.connectDisconnectButton.setText('Disconnect')
116+
self.connectDisconnectButton.setIcon(
117+
GUIToolKit.getIconByName('disconnect'))
118+
else:
119+
self.connectDisconnectButton.setText('Connect')
120+
self.connectDisconnectButton.setIcon(
121+
GUIToolKit.getIconByName('connect'))
122+
123+
self.portNameLabel.setEnabled(not isConnectedFlag)
124+
self.portNameComboBox.setEnabled(not isConnectedFlag)
125+
self.bitRateLabel.setEnabled(not isConnectedFlag)
126+
self.bitRatelineEdit.setEnabled(not isConnectedFlag)
127+
self.parityLabel.setEnabled(not isConnectedFlag)
128+
self.parityComboBox.setEnabled(not isConnectedFlag)
129+
self.byteSizeLabel.setEnabled(not isConnectedFlag)
130+
self.byteSizeComboBox.setEnabled(not isConnectedFlag)
131+
self.stopBitsLabel.setEnabled(not isConnectedFlag)
132+
self.stopBitsComboBox.setEnabled(not isConnectedFlag)
133+
134+
def connectDisconnectDeviceAction(self):
135+
if self.device.isConnected:
136+
self.disConnectAction()
137+
else:
138+
self.connectAction()
139+
140+
def connectAction(self):
141+
deviceConfig = self.getConfigValues()
142+
self.device.configureConnection(deviceConfig)
143+
self.device.connect(SimpleFOCDevice.ONLY_CONNECT)
144+
145+
def disConnectAction(self):
146+
self.device.disConnect()

src/gui/configtool/commandLineInterface.py

Lines changed: 0 additions & 84 deletions
This file was deleted.

0 commit comments

Comments
 (0)