From 37e5042808264bed993887a9ff97989b082baf04 Mon Sep 17 00:00:00 2001 From: Frederic Date: Thu, 4 Jun 2015 18:42:08 +0200 Subject: [PATCH] added configuration file support --- configreader.py | 120 +++++++++++++++++++++++++++++++++++++++++++ fetap.ini.example | 34 ++++++++++++ fetapdtest.py | 15 ++++-- linphone.conf | 19 +++++++ phoneinterface.py | 31 ++++++----- shortcuts.csv.sample | 2 + tuitest.py | 29 +++++++---- 7 files changed, 223 insertions(+), 27 deletions(-) create mode 100644 configreader.py create mode 100644 fetap.ini.example create mode 100644 linphone.conf create mode 100644 shortcuts.csv.sample diff --git a/configreader.py b/configreader.py new file mode 100644 index 0000000..cefb826 --- /dev/null +++ b/configreader.py @@ -0,0 +1,120 @@ + +import csv +import ConfigParser +import tuitest +import phoneinterface +import fetapdtest + +class ConfigurationReader(object): + DEFAULTS = { + 'gpio_numbering': 'BOARD', + 'pin_nsa': '11', + 'pin_nsi': '13', + 'pin_gabelschalter': '15', + 'pin_schauzeichen': '12', + 'pin_wecker_enable': '16', + 'pin_wecker_a': '18', + 'pin_wecker_b': '19', + + 'default_proxy': '' + } + + + def __init__(self): + self.__cp = ConfigParser.ConfigParser(defaults=ConfigurationReader.DEFAULTS) + self.__pinconfig = None + self.__dialconfig = None + self.__proxyconfigs = None + self.__phoneconfig = None + + + def __get_global_val(self, option): + return self.__cp.get('fetapd', option) + + + def __get_global_val_int(self, option): + return int(self.__cp.get('fetapd', option)) + + + def __get_proxy_val(self, proxyname, option): + return self.__cp.get('proxy_'+proxyname, option) + + + def __get_proxy_val_int(self, proxyname, option): + return self.__cp.getint('proxy_'+proxyname, option) + + + def __read_shortcuts(self): + fname = self.__get_global_val('shortcuts_file') + shortcuts = {} + with open(fname, 'r') as csvfile: + for row in csv.DictReader(csvfile): + print 'row', row + shortcuts[row['shortcut']] = row['number'] + return shortcuts + + + def read(self, f): + self.__cp.read(f) + + print 'pin_nsa:', self.__get_global_val_int('pin_nsa'), + self.__pinconfig = tuitest.FeApPinConfiguration( + gpio_numbering = self.__get_global_val('gpio_numbering'), + pin_nsa = self.__get_global_val_int('pin_nsa'), + pin_nsi = self.__get_global_val_int('pin_nsi'), + pin_gabelschalter = self.__get_global_val_int('pin_gabelschalter'), + pin_schauzeichen = self.__get_global_val_int('pin_schauzeichen'), + pin_wecker_enable = self.__get_global_val_int('pin_wecker_enable'), + pin_wecker_a = self.__get_global_val_int('pin_wecker_a'), + pin_wecker_b = self.__get_global_val_int('pin_wecker_b') + ) + + self.__dialconfig = fetapdtest.DialConfiguration( + self.__get_global_val('dial_timeout'), + self.__read_shortcuts(), + ) + + proxyconfigs = [] + for secname in self.__cp.sections(): + if secname.startswith('proxy_'): + proxyname = secname[6:] + proxyconfig = phoneinterface.PhoneProxyConfiguration( + name = proxyname, + proxy = self.__get_proxy_val(proxyname, 'proxy'), + identity = self.__get_proxy_val(proxyname, 'identity'), + username = self.__get_proxy_val(proxyname, 'username'), + password = self.__get_proxy_val(proxyname, 'password'), + realm = self.__get_proxy_val(proxyname, 'realm'), + prefix = self.__get_proxy_val(proxyname, 'prefix') + ) + proxyconfigs.append(proxyconfig) + + self.__phoneconfig = phoneinterface.PhoneConfiguration( + sound_device = self.__get_global_val('sound_device'), + incoming_timeout = self.__get_global_val_int('incoming_timeout'), + linphone_config = self.__get_global_val('linphone_config'), + default_proxy = self.__get_global_val('default_proxy'), + stun_server = self.__get_global_val('stun_server'), + proxies = proxyconfigs + ) + + + @property + def pinconfig(self): + return self.__pinconfig + + + @property + def dialconfig(self): + return self.__dialconfig + + + @property + def phoneconfig(self): + return self.__phoneconfig + + + + + + diff --git a/fetap.ini.example b/fetap.ini.example new file mode 100644 index 0000000..8aced0d --- /dev/null +++ b/fetap.ini.example @@ -0,0 +1,34 @@ + +[fetapd] + +sound_device = default:CARD=Set + +gpio_mode = BOARD +pin_nsa = 11 +pin_nsi = 13 +pin_gabelschalter = 15 +pin_schauzeichen = 12 +pin_wecker_enable = 16 +pin_wecker_a = 18 +pin_wecker_b = 19 + +incoming_timeout = 60 +dial_timeout = 3 + +shortcuts_file = shortcuts.csv +linphone_config = linphone.conf + +default_proxy = eventphone + +stun_server = sipgate.de + +[proxy_eventphone] +proxy = sip:hg.eventphone.de +realm = hg.eventphone.de +identity = sip:XXXX@hg.eventphone.de +username = XXXX +password = *** +prefix = 1 + + + diff --git a/fetapdtest.py b/fetapdtest.py index 339b5c6..6f73984 100644 --- a/fetapdtest.py +++ b/fetapdtest.py @@ -3,6 +3,13 @@ import threading import Queue as queue from phoneinterface import PhoneInterface, PhoneEvent from tuitest import FeApPinConfiguration, FeApUserInterface +import configreader + + +class DialConfiguration(object): + def __init__(self, dial_timeout, shortcuts): + self.dial_timeout = dial_timeout + self.shortcuts = shortcuts class IllegalEventError(Exception): pass @@ -342,9 +349,11 @@ def phone_cb(event): c.queue_event('invalid_number') if __name__ == '__main__': - phone = PhoneInterface(None, '.linphonerc') - pinconf = FeApPinConfiguration() - feap = FeApUserInterface(pinconf) + cfg = configreader.ConfigurationReader() + cfg.read('fetap.ini') + + phone = PhoneInterface(cfg.phoneconfig) + feap = FeApUserInterface(cfg.pinconfig) c = StateMachineController(phone, feap) feap.add_gabelschalter_callback(gabelschalter_cb) diff --git a/linphone.conf b/linphone.conf new file mode 100644 index 0000000..a67611b --- /dev/null +++ b/linphone.conf @@ -0,0 +1,19 @@ +[sip] +register_only_when_network_is_up=1 +root_ca=/etc/ssl/certs +verify_server_certs=1 +verify_server_cn=1 + +[sound] +playback_dev_id=ALSA: USB PnP Sound Device +ringer_dev_id=ALSA: USB PnP Sound Device +capture_dev_id=ALSA: USB PnP Sound Device +playback_gain_db=0.000000 +mic_gain_db=0.000000 + +[net] +adaptive_rate_control=1 +firewall_policy=2 +mtu=0 +download_bw=0 +upload_bw=0 diff --git a/phoneinterface.py b/phoneinterface.py index 16b827c..2b19688 100644 --- a/phoneinterface.py +++ b/phoneinterface.py @@ -4,22 +4,25 @@ import threading import subprocess class PhoneProxyConfiguration(object): - def __init__(self): - self.name = 'eventphone' - self.proxy = 'sip:hg.eventphone.de' - self.identity = 'sip:0815@hg.eventphone.de' - self.username = '0815' - self.password = 'secret' - self.realm = 'hg.eventphone.de' + def __init__(self, name, proxy, identity, username, password, realm, + prefix): + self.name = name + self.proxy = proxy + self.identity = identity + self.username = username + self.password = password + self.realm = realm + self.prefix = prefix class PhoneConfiguration(object): - def __init__(self): - self.sound_device = 'default:CARD=Device' - self.incoming_timeout = 3*60 - self.linphone_config = 'linphone.conf' - self.default_proxy = 'eventphone' - self.proxies = [] - self.stun_server = 'sipgate.de' + def __init__(self, sound_device, incoming_timeout, linphone_config, + default_proxy, proxies, stun_server): + self.sound_device = sound_device + self.incoming_timeout = incoming_timeout + self.linphone_config = linphone_config + self.default_proxy = default_proxy + self.proxies = proxies + self.stun_server = stun_server class PhoneEvent(object): RegInProgress,\ diff --git a/shortcuts.csv.sample b/shortcuts.csv.sample new file mode 100644 index 0000000..b6f4d56 --- /dev/null +++ b/shortcuts.csv.sample @@ -0,0 +1,2 @@ +shortcut,number +0,3474 diff --git a/tuitest.py b/tuitest.py index 1735c57..250613c 100644 --- a/tuitest.py +++ b/tuitest.py @@ -5,21 +5,30 @@ import threading class FeApPinConfiguration(object): - def __init__(self): - self.numbering = gpio.BOARD - self.pin_nsa = 11 - self.pin_nsi = 13 - self.pin_gabelschalter = 15 - self.pin_schauzeichen = 12 - self.pin_wecker_enable = 16 - self.pin_wecker_a = 18 - self.pin_wecker_b = 19 + def __init__(self, gpio_numbering, pin_nsa, pin_nsi, pin_gabelschalter, + pin_schauzeichen, pin_wecker_enable, pin_wecker_a, + pin_wecker_b): + if gpio_numbering == 'BOARD': + gpio_numbering = gpio.BOARD + elif gpio_numbering == 'BCM': + gpio_numbering = gpio.BCM + else: + raise ValueError('Illegal gpio numbering: %s' % (gpio_numbering)) + + self.gpio_numbering = gpio_numbering + self.pin_nsa = pin_nsa + self.pin_nsi = pin_nsi + self.pin_gabelschalter = pin_gabelschalter + self.pin_schauzeichen = pin_schauzeichen + self.pin_wecker_enable = pin_wecker_enable + self.pin_wecker_a = pin_wecker_a + self.pin_wecker_b = pin_wecker_b class FeApUserInterface(object): def __init__(self, pinconfig): self.__pinconfig = pinconfig - gpio.setmode(self.__pinconfig.numbering) + gpio.setmode(self.__pinconfig.gpio_numbering) gpio.setup(self.__pinconfig.pin_nsa, gpio.IN, gpio.PUD_UP) gpio.setup(self.__pinconfig.pin_nsi, gpio.IN, gpio.PUD_UP) gpio.setup(self.__pinconfig.pin_gabelschalter, gpio.IN, gpio.PUD_UP)