# coding: utf8 import os import shutil from glob import glob from luaModule import getBMSSignals, getBMSModule from json import loads as loadJson import WGDBus import Activity import fsio from FilePaths import BMS_PATH from FilePaths import BMS_DEFAULT_PATH import logConfig import status_mod # Fake globals for syntax check import notify_activity if False: response = None request = None session = None db = None auth = None status_mod.sessionUserMgr.setLastVisit(session, request) if logConfig.bmsSessFrgt: if request.function != 'modules': session.forget(response) @auth.requires(request.ajax==True, requires_login=True) def inSignals(): signals = getBMSSignals()[0] res = [] for id, name in signals['id2Name'].iteritems(): res.append({'id': id, 'name': name, 'used': 0}) return response.json(res) @auth.requires(request.ajax==True, requires_login=True) def outSignals(): signals = getBMSSignals()[1] res = [] for id, name in signals['id2Name'].iteritems(): res.append({'id': id, 'name': name, 'used': 0}) return response.json(res) @auth.requires(request.ajax==True, requires_login=True) def modules(): if request.env.request_method == "GET": data = [] dataId = 1 inSignals, outSignals = getBMSSignals() moduleFileList = glob(os.path.join(BMS_PATH, 'mod_*.lua')) def convertNegativeSignal(loc_inSignals, loc_m, loc_i): if loc_m['meta_in_tab'][loc_i] >= 0: return loc_inSignals['id2Name'][loc_m['meta_in_tab'][loc_i]] if loc_m['meta_in_tab'][loc_i] == -1: return 'none' if loc_m['meta_in_tab'][loc_i] == -2: return 'high' for moduleFile in moduleFileList: m = {'name': '', 'active': False, 'nr_in': 0, 'nr_out': 0, 'show': False} m.update(getBMSModule(moduleFile)) if not m['show']: continue mData = {'id': dataId, 'module': m['name'], 'port': 0, 'active': m['active'], 'metasignal': '', 'signal': '', 'direction': ''} data.append(mData) dataId += 1 nr_in = m['nr_in'] if ('nr_in' in m) else 0 for i in xrange(1, nr_in + 1): mData = {'id': dataId, 'module': m['name'], 'port': i, 'active': m['active'], 'metasignal': '', 'signal': '', 'direction': 'in'} if i in m['meta_in_tab']: metaSignalName = convertNegativeSignal(inSignals, m, i) mData.update({'metasignal': metaSignalName}) if i in m['in_tab']: mData.update({'signal': inSignals['id2Name'][m['in_tab'][i]]}) data.append(mData) dataId += 1 nr_in = m['nr_out'] if ('nr_out' in m) else 0 for i in xrange(1, nr_in + 1): mData = {'id': dataId, 'module': m['name'], 'port': i, 'active': m['active'], 'metasignal': '', 'signal': '', 'direction': 'out'} if i in m['meta_out_tab']: metaSignalName = outSignals['id2Name'][m['meta_out_tab'][i]] if m['meta_out_tab'][i] >= 0 else 'none' mData.update({'metasignal': metaSignalName}) if i in m['out_tab']: mData.update({'signal': outSignals['id2Name'][m['out_tab'][i]]}) data.append(mData) dataId += 1 return response.json(data) if request.env.request_method == "POST": data = loadJson(request.body.read()) if not isinstance(data, list): data = [data] inSignals, outSignals = getBMSSignals() moduleFileList = glob(os.path.join(BMS_PATH, 'mod_*.lua')) for moduleFile in moduleFileList: m = {'name': '', 'active': True, 'nr_in': 0, 'nr_out': 0, 'show': False} m.update(getBMSModule(moduleFile)) if not m['show']: continue moduleChanges = [c for c in data if c['module'] == m['name']] for change in moduleChanges: if change['port'] == 0: m['active'] = c['active'] continue if change['signal']: if change['direction'] == 'in': m['in_tab'][change['port']] = inSignals['name2Id'][change['signal']] else: m['out_tab'][change['port']] = outSignals['name2Id'][change['signal']] else: if change['direction'] == 'in' and change['port'] in m['in_tab']: m['in_tab'].pop(change['port']) elif change['port'] in m['out_tab']: m['out_tab'].pop(change['port']) out = 'plc = require "plcsignals"\n\nmodule = {}\nmodule.name = "%s"\nmodule.active = %s\nmodule.show = true\n\n' % (m['name'], 'true' if m['active'] else 'false') if (m['nr_in'] > 0): out += 'module.nr_in = %d\n\n' % m['nr_in'] out += 'module.in_tab = {}\n' for i in xrange(1, m['nr_in'] + 1): if i in m['in_tab']: out += 'module.in_tab[%d] = plc.In.%s\n' % (i, inSignals['id2Name'][m['in_tab'][i]]) def convertToSignalName(inSignals, m, i): if m['meta_in_tab'][i] >= 0: return ('plc.In.' + inSignals['id2Name'][m['meta_in_tab'][i]]) if m['meta_in_tab'][i] == -1: return '-1' if m['meta_in_tab'][i] == -2: return '-2' out += '\nmodule.meta_in_tab = {}\n' for i in xrange(1, m['nr_in'] + 1): if i in m['meta_in_tab']: signalName = convertToSignalName(inSignals, m, i) out += 'module.meta_in_tab[%d] = %s\n' % (i, signalName) if (m['nr_out'] > 0): out += '\nmodule.nr_out = %d\n' % m['nr_out'] out += '\nmodule.out_tab = {}\n' for i in xrange(1, m['nr_out'] + 1): if i in m['out_tab']: out += 'module.out_tab[%d] = plc.Out.%s\n' % (i, outSignals['id2Name'][m['out_tab'][i]]) out += '\nmodule.meta_out_tab = {}\n' for i in xrange(1, m['nr_out'] + 1): if i in m['meta_out_tab']: signalName = ('plc.Out.' + outSignals['id2Name'][m['meta_out_tab'][i]]) if m['meta_out_tab'][i] >= 0 else '-1' out += 'module.meta_out_tab[%d] = %s\n' % (i, signalName) fsio.write(moduleFile, out) notify_activity.configChangedAsync(BMS_PATH, Activity.BMS_CHANGED, session=session) import subprocess subprocess.call("dbus-send --system --type=signal /GUI com.rexroth.akku.gui.systemgoingdown int32:{0}".format(1), shell=True) #auth.logout(next='/login') return response.json(data) return response.json([]) @auth.requires(request.ajax==True, requires_login=True) def resetToFactory(): filelist = glob(BMS_PATH + '/mod_*.lua') for f in filelist: os.remove(f) filelist = glob(BMS_DEFAULT_PATH + '/mod_*.lua') for f in filelist: fsio.shcopy(f, BMS_PATH) notify_activity.configChanged(BMS_PATH, Activity.BMS_CHANGED, session) return ''