Skip to content

Commit

Permalink
Terminal: Added configuration tab. Added stream to file.
Browse files Browse the repository at this point in the history
Signed-off-by: Tomasz CEDRO <CeDeROM@tlen.pl>
  • Loading branch information
cederom committed Jan 11, 2015
1 parent 7288204 commit 025b050
Show file tree
Hide file tree
Showing 4 changed files with 157 additions and 16 deletions.
3 changes: 2 additions & 1 deletion iCeDeROM.py
Expand Up @@ -6,7 +6,7 @@
# (C) 2014-2015 Tomasz Bolesław CEDRO (http://www.tomek.cedro.info)
# All rights reserved, so far :-)

import sys
import sys,os
import git

class iCeDeROM(object):
Expand All @@ -19,6 +19,7 @@ def __init__(self, **params):
"""
#Modules related stuff
self.modules=dict()
self.path=os.path.dirname(__file__)
#Setup LOG module (mandatory)
import modules.log.log
module=modules.log.log.module(iCeDeROM=self)
Expand Down
34 changes: 32 additions & 2 deletions modules/cli/terminal.py
Expand Up @@ -20,8 +20,14 @@ def __init__(self, **params):
raise KeyError('iCeDeROM parameter reference mandatory!')
self.iCeDeROM=params['iCeDeROM']
self.ui=dict()
self.logFile=False
self.logFileEnabled=False
self.logFile=None
self.logFileName=self.iCeDeROM.path
self.logFileName+='/'+'iCeDeROM-Terminal-Dump.txt'
if self.iCeDeROM.ui=='qt':
import terminal_qt
params['parent']=self
self.ui['qt']=terminal_qt.module(**params)
self.ui['qt'].parent=self

Expand All @@ -39,6 +45,30 @@ def stop(self, **params):

def write(self, data):
self.iCeDeROM.modules['interface'].write(data)

self.logFileWrite(data)

def read(self, length):
return self.iCeDeROM.modules['interface'].read(length)
chunk=self.iCeDeROM.modules['interface'].read(length)
if chunk!='': self.logFileWrite(chunk)
return chunk

def logFileStart(self, filename):
if self.logFileEnabled: self.logFileStop()
if filename!=self.logFileName: self.logFileName=filename
try:
self.logFile=open(self.logFileName,'w+b')
except:
self.iCeDeROM.modules['log'].log.exception('Cannot open log file for writing!')
if self.iCeDeROM.ui=='qt':
self.iCeDeROM.modules['gui'].dialogs['message'].warning(
self.iCeDeROM.modules['gui'].window,
'Terminal Log File', 'Cannot open log file for writing!')
self.logFileEnabled=True

def logFileStop(self):
self.logFile.flush()
self.logFile.close()
self.logFileEnabled=False

def logFileWrite(self,data):
if self.logFileEnabled: self.logFile.write(data)
135 changes: 122 additions & 13 deletions modules/cli/terminal_qt.py
Expand Up @@ -7,9 +7,10 @@
# (C) 2014-2015 Tomasz Bolesław CEDRO (http://www.tomek.cedro.info)
# All rights reserved, so far :-)

import os
from PyQt4 import QtCore,QtGui

class module(QtGui.QWidget):
class module(object):
"""
Provides Qt Widget for modules.cli.terminal iCeDeROM module.
"""
Expand All @@ -20,54 +21,162 @@ def __init__(self, **params):
raise KeyError('iCeDeROM parameter reference mandatory!')
if not params['iCeDeROM'].modules.has_key('gui'):
raise RuntimeError('Terminal QtWidget requires GUI running!')
self.iCeDeROM=params['iCeDeROM']
super(module, self).__init__()
self.parent=None
self.iCeDeROM=params['iCeDeROM']
self.parent=params['parent'] if params.has_key('parent') else None
self.windows=dict()
self.texts=dict()
self.fonts=dict()
self.layouts=dict()
self.menus=dict()
self.actions=dict()
self.tabs=dict()
self.groups=dict()
self.trees=dict()
self.buttons=dict()
self.logFileEnabled=False
self.logFileName=self.parent.logFileName
self.createQtWidget(**params)
self.setupQtWidget(**params)

def setup(self, **params):
return

def start(self, **params):
self.iCeDeROM.modules['gui'].mdi.addSubWindow(self)
self.show()
if self.iCeDeROM.ui!='qt':
raise RuntimeError('Interface QtWidget requires Qt GUI running!')
self.iCeDeROM.modules['gui'].mdi.addSubWindow(self.windows[self.name])
self.iCeDeROM.modules['gui'].tabs['system'].setUpdatesEnabled(False)
self.tabs['config_id']=self.iCeDeROM.modules['gui'].tabs['system'].addTab(self.tabs['config'], 'Terminal')
self.iCeDeROM.modules['gui'].tabs['system'].setUpdatesEnabled(True)
self.windows[self.name].show()

def stop(self, **params):
self.hide()
if self.iCeDeROM.ui!='qt':
raise RuntimeError('Interface QtWidget requires Qt GUI running!')
self.iCeDeROM.modules['gui'].tabs['system'].setUpdatesEnabled(False)
self.iCeDeROM.modules['gui'].tabs['system'].delTab(self.tabs['config_id'])
self.iCeDeROM.modules['gui'].tabs['system'].setUpdatesEnabled(True)
self.windows[self.name].hide()

def createQtWidget(self, **params):
self.layouts[self.name]=QtGui.QVBoxLayout(self)
self.texts[self.name]=QtGui.QPlainTextEdit()
if self.iCeDeROM.ui!='qt':
raise Warning('Interface QtWidget requires Qt GUI running!')
self.createQtWidgetMdiWindow(**params)
self.createQtWidgetMenu(**params)
self.createQtWidgetConfigTab(**params)

def createQtWidgetMdiWindow(self, **params):
self.windows[self.name]=QtGui.QMainWindow()
self.texts[self.name]=QtGui.QTextEdit(self.windows[self.name])
self.fonts[self.name]=QtGui.QFont('courier')

def createQtWidgetMenu(self, **params):
self.menu=QtGui.QMenu('Terminal')

def createQtWidgetConfigTab(self, **params):
self.tabs['config']=QtGui.QTabWidget()
self.layouts['terminal_config']=QtGui.QVBoxLayout(self.tabs['config'])
self.groups['config']=QtGui.QGroupBox('Terminal Configuration')
self.layouts['config']=QtGui.QVBoxLayout(self.groups['config'])
self.trees['config']=QtGui.QTreeWidget()

def setupQtWidget(self, **params):
self.setWindowTitle('Terminal')
self.layouts[self.name].setContentsMargins(0,0,0,0)
self.layouts[self.name].addWidget(self.texts[self.name])
if self.iCeDeROM.ui!='qt':
raise Warning('Interface QtWidget requires Qt GUI running!')
self.setupQtWidgetMdiWindow(**params)
self.setupQtWidgetMenu(**params)
self.setupQtWidgetConfigTab(**params)

def setupQtWidgetMdiWindow(self, **params):
self.windows[self.name].setWindowTitle('Terminal')
self.windows[self.name].setCentralWidget(self.texts[self.name])
self.texts[self.name].setReadOnly(False)
self.texts[self.name].setFont(self.fonts[self.name])
self.texts[self.name].setAcceptRichText(False)
self.texts[self.name].keyPressEvent=self.keyPressEvent
self.texts[self.name].insertFromMimeData=self.insertFromMimeData
self.texts[self.name].startTimer(0)
self.texts[self.name].timerEvent=self.timerEvent

def setupQtWidgetMenu(self, **params):
self.actions['source']=self.menu.addAction('Test',self.test)
self.iCeDeROM.modules['gui'].menus['modules'].addMenu(self.menu)

def setupQtWidgetConfigTab(self, **params):
self.layouts['terminal_config'].addWidget(self.groups['config'])
self.groups['config'].setLayout(self.layouts['config'])
self.layouts['config'].addWidget(self.trees['config'])
self.layouts['config'].setContentsMargins(0,0,0,0)
self.layouts['config'].setSpacing(0)
self.trees['config'].setMinimumHeight(100)
self.trees['config'].setSizePolicy(QtGui.QSizePolicy(
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Minimum))
#Populate the TreeWidget
self.trees['config'].setHeaderItem(QtGui.QTreeWidgetItem(
['parameter','value','descrption']))
self.trees['config'].setColumnWidth(0,150)
self.trees['config'].setColumnWidth(1,100)
#DEVICE branch
self.trees['logfile']=QtGui.QTreeWidgetItem(self.trees['config'], ['LogFile'])
self.trees['logtofile']=QtGui.QTreeWidgetItem(self.trees['logfile'],
['Log To File','','Stream Terminal data to a local file.'])
self.buttons['logtofile']=QtGui.QCheckBox()
self.buttons['logtofile'].connect(
self.buttons['logtofile'],QtCore.SIGNAL('stateChanged(int)'),self.logFileToggle)
self.trees['config'].setItemWidget(self.trees['logtofile'],1,self.buttons['logtofile'])
self.trees['logfilename']=QtGui.QTreeWidgetItem(self.trees['logfile'],
['Filename','',self.logFileName])
self.buttons['logfilename']=QtGui.QPushButton('Select')
self.trees['config'].setItemWidget(self.trees['logfilename'],1,self.buttons['logfilename'])
self.buttons['logfilename'].connect(
self.buttons['logfilename'],QtCore.SIGNAL('clicked()'),self.logFileSelect)

self.trees['config'].expandAll()


def logFileToggle(self):
if self.buttons['logtofile'].isChecked():
if os.access(self.logFileName,os.F_OK):
res=self.iCeDeROM.modules['gui'].dialogs['message'].information(
self.iCeDeROM.modules['gui'].window,
'File Question', 'File already exist! Do you want to overwrite?',
QtGui.QMessageBox.Yes|QtGui.QMessageBox.No)
if res==QtGui.QMessageBox.Yes:
print 'WRITING\n'
self.parent.logFileStart(self.logFileName)
else:
self.parent.logFileStop()

def logFileSelect(self):
filename=self.iCeDeROM.modules['gui'].dialogs['file'].getSaveFileName(
self.iCeDeROM.modules['gui'].window,'Save File')
if filename=='': return
self.logFileName=str(filename)
self.trees['logfilename'].setText(2,self.logFileName)

def keyPressEvent(self, QKeyEvent):
'''Handle keystrokes.'''
if self.iCeDeROM.modules['interface'].device==None: return
try:
self.parent.write(QKeyEvent.text())
except:
self.iCeDeROM.modules['log'].log.exception('Write failed!')

def insertFromMimeData(self, QMimeData):
'''Handle Paste-From-Clipboard and Drag-And-Drop.'''
if self.iCeDeROM.modules['interface'].device==None: return
try:
self.parent.write(QMimeData.text())
except:
self.iCeDeROM.modules['log'].log.exception('Paste failed!')

def timerEvent(self, QTimerEvent):
if self.iCeDeROM.modules['interface'].device==None: return
self.write(self.iCeDeROM.modules['interface'].device.read(128))
self.write(self.parent.read(32))

def write(self, data):
if data=='': return
self.texts[self.name].insertPlainText(data)
self.texts[self.name].moveCursor(QtGui.QTextCursor.End, QtGui.QTextCursor.MoveAnchor)

Expand Down
1 change: 1 addition & 0 deletions modules/ui/qt/QtMainWindow.py
Expand Up @@ -106,6 +106,7 @@ def setupDocks(self, **params):

def createDialogs(self, **params):
self.dialogs['message']=QtGui.QMessageBox(self.window)
self.dialogs['file']=QtGui.QFileDialog(self.window)

def createMenus(self, **params):
self.menu=self.window.menuBar()
Expand Down

0 comments on commit 025b050

Please sign in to comment.