comparison python/ide.py @ 256:225f444019b1

Added build and flash menu option
author Windel Bouwman
date Sun, 04 Aug 2013 18:32:04 +0200
parents 7416c923a02a
children 04c19282a5aa
comparison
equal deleted inserted replaced
255:7416c923a02a 256:225f444019b1
14 stutil = __import__('st-util') 14 stutil = __import__('st-util')
15 import c3 15 import c3
16 import zcc 16 import zcc
17 import outstream 17 import outstream
18 18
19 logformat='%(asctime)s|%(levelname)s|%(name)s|%(msg)s'
19 20
20 class BuildOutput(QTextEdit): 21 class BuildOutput(QTextEdit):
21 """ Build output component """ 22 """ Build output component """
22 def __init__(self, parent=None): 23 def __init__(self, parent=None):
23 super(BuildOutput, self).__init__(parent) 24 super(BuildOutput, self).__init__(parent)
24 fmt = logging.Formatter(fmt='%(asctime)s %(levelname)s %(name)s %(msg)s') 25 fmt = logging.Formatter(fmt=logformat)
25 class MyHandler(logging.Handler): 26 class MyHandler(logging.Handler):
26 def emit(self2, x): 27 def emit(self2, x):
27 self.append(str(fmt.format(x))) 28 self.append(str(fmt.format(x)))
28 29
29 logging.getLogger().addHandler(MyHandler()) 30 logging.getLogger().addHandler(MyHandler())
55 icol = QStandardItem(str(e.loc.col)) 56 icol = QStandardItem(str(e.loc.col))
56 icol.setData(e) 57 icol.setData(e)
57 self.model.appendRow([item, irow, icol]) 58 self.model.appendRow([item, irow, icol])
58 59
59 def itemSelected(self, index): 60 def itemSelected(self, index):
60 if not index.isValid(): 61 if not index.isValid():
61 return 62 return
62 item = self.model.itemFromIndex(index) 63 item = self.model.itemFromIndex(index)
63 err = item.data() 64 err = item.data()
64 self.sigErrorSelected.emit(err) 65 self.sigErrorSelected.emit(err)
65 66
66 67
67 class AboutDialog(QDialog): 68 class AboutDialog(QDialog):
68 def __init__(self, parent=None): 69 def __init__(self, parent=None):
69 super(AboutDialog, self).__init__(parent) 70 super(AboutDialog, self).__init__(parent)
85 86
86 87
87 class Ide(QMainWindow): 88 class Ide(QMainWindow):
88 def __init__(self, parent=None): 89 def __init__(self, parent=None):
89 super(Ide, self).__init__(parent) 90 super(Ide, self).__init__(parent)
90 91 self.to_open_files = []
91 92
92 self.setWindowTitle('LCFOS IDE') 93 self.setWindowTitle('LCFOS IDE')
93 icon = QIcon('icons/logo.png') 94 icon = QIcon('icons/logo.png')
94 self.setWindowIcon(icon) 95 self.setWindowIcon(icon)
95 96
101 102
102 # Create mdi area: 103 # Create mdi area:
103 self.mdiArea = QMdiArea() 104 self.mdiArea = QMdiArea()
104 self.mdiArea.setViewMode(QMdiArea.TabbedView) 105 self.mdiArea.setViewMode(QMdiArea.TabbedView)
105 self.mdiArea.setTabsClosable(True) 106 self.mdiArea.setTabsClosable(True)
107 self.mdiArea.setTabsMovable(True)
106 self.setCentralWidget(self.mdiArea) 108 self.setCentralWidget(self.mdiArea)
107 109
108 # Create components: 110 # Create components:
109 def addComponent(name, widget): 111 def addComponent(name, widget):
110 dw = QDockWidget(name) 112 dw = QDockWidget(name)
145 147
146 addMenuEntry("New", self.fileMenu, self.newFile, shortcut=QKeySequence(QKeySequence.New)) 148 addMenuEntry("New", self.fileMenu, self.newFile, shortcut=QKeySequence(QKeySequence.New))
147 addMenuEntry("Open", self.fileMenu, self.openFile, shortcut=QKeySequence(QKeySequence.Open)) 149 addMenuEntry("Open", self.fileMenu, self.openFile, shortcut=QKeySequence(QKeySequence.Open))
148 addMenuEntry("Save", self.fileMenu, self.saveFile, shortcut=QKeySequence(QKeySequence.Save)) 150 addMenuEntry("Save", self.fileMenu, self.saveFile, shortcut=QKeySequence(QKeySequence.Save))
149 addMenuEntry("Build", self.fileMenu, self.buildFile, shortcut=QKeySequence("F7")) 151 addMenuEntry("Build", self.fileMenu, self.buildFile, shortcut=QKeySequence("F7"))
152 addMenuEntry("Build and flash", self.fileMenu, self.buildFileAndFlash, shortcut=QKeySequence("F8"))
150 153
151 self.helpAction = QAction('Help', self) 154 self.helpAction = QAction('Help', self)
152 self.helpAction.setShortcut(QKeySequence('F1')) 155 self.helpAction.setShortcut(QKeySequence('F1'))
153 self.helpMenu.addAction(self.helpAction) 156 self.helpMenu.addAction(self.helpAction)
154 addMenuEntry('About', self.helpMenu, self.aboutDialog.open) 157 addMenuEntry('About', self.helpMenu, self.aboutDialog.open)
215 self.restoreState(self.settings.value('mainwindowstate')) 218 self.restoreState(self.settings.value('mainwindowstate'))
216 if self.settings.contains('mainwindowgeometry'): 219 if self.settings.contains('mainwindowgeometry'):
217 self.restoreGeometry(self.settings.value('mainwindowgeometry')) 220 self.restoreGeometry(self.settings.value('mainwindowgeometry'))
218 if self.settings.contains('lastfiles'): 221 if self.settings.contains('lastfiles'):
219 lfs = self.settings.value('lastfiles') 222 lfs = self.settings.value('lastfiles')
220 for lf in lfs: 223 self.to_open_files.extend(lfs)
221 self.loadFile(lf) 224
225 def showEvent(self, ev):
226 super().showEvent(ev)
227 while self.to_open_files:
228 fn = self.to_open_files.pop(0)
229 self.loadFile(fn)
222 230
223 def closeEvent(self, ev): 231 def closeEvent(self, ev):
224 self.settings.setValue('mainwindowstate', self.saveState()) 232 self.settings.setValue('mainwindowstate', self.saveState())
225 self.settings.setValue('mainwindowgeometry', self.saveGeometry()) 233 self.settings.setValue('mainwindowgeometry', self.saveGeometry())
226 ac = self.activeMdiChild() 234 ac = self.activeMdiChild()
280 # Set errors: 288 # Set errors:
281 self.builderrors.setErrorList(self.diag.diags) 289 self.builderrors.setErrorList(self.diag.diags)
282 ce.setErrors(self.diag.diags) 290 ce.setErrors(self.diag.diags)
283 return 291 return
284 292
293 def buildFileAndFlash(self):
294 ce = self.activeMdiChild()
295 if not ce:
296 return
297 self.diag.clear()
298 outs = outstream.TextOutputStream()
299 if not zcc.zcc(ce.Source, outs, self.diag, do_optimize=True):
300 # Set errors:
301 self.builderrors.setErrorList(self.diag.diags)
302 ce.setErrors(self.diag.diags)
303 return
304
285 code_s = outs.getSection('code') 305 code_s = outs.getSection('code')
286 self.debugInfo = code_s.debugInfos() 306 self.debugInfo = code_s.debugInfos()
287 if self.ctrlToolbar.device: 307 if self.ctrlToolbar.device:
288 logging.info('Flashing stm32f4 discovery') 308 logging.info('Flashing stm32f4 discovery')
289 bts = code_s.to_bytes() 309 bts = code_s.to_bytes()
290 self.ctrlToolbar.device.writeFlash(0x08000000, bts) 310 self.ctrlToolbar.device.writeFlash(0x08000000, bts)
291 stl = self.ctrlToolbar.device.iface 311 stl = self.ctrlToolbar.device.iface
292 stl.reset() 312 stl.reset()
293 stl.halt() 313 stl.halt()
314 stl.run()
294 logging.info('Done!') 315 logging.info('Done!')
295 316
317
296 if __name__ == '__main__': 318 if __name__ == '__main__':
297 logging.basicConfig(format='%(asctime)s %(levelname)s %(name)s %(message)s', level=logging.DEBUG) 319 logging.basicConfig(format=logformat, level=logging.DEBUG)
298 app = QApplication(sys.argv) 320 app = QApplication(sys.argv)
299 ide = Ide() 321 ide = Ide()
300 ide.show() 322 ide.show()
301 logging.info('IDE started') 323 logging.info('IDE started')
302 app.exec_() 324 app.exec_()