Browse Source

removed obsolete test file, cosmetics

master
Fr3deric 7 years ago
parent
commit
2bdf0f7485
  1. 2
      apparatinterface.py
  2. 6
      configreader.py
  3. 38
      phoneinterface.py
  4. 23
      statemachine.py
  5. 206
      statemachinetest.py

2
apparatinterface.py

@ -25,6 +25,7 @@ class FeApPinConfiguration(object):
self.pin_wecker_b = pin_wecker_b self.pin_wecker_b = pin_wecker_b
self.invert_gs = invert_gs self.invert_gs = invert_gs
class FeApUserInterface(object): class FeApUserInterface(object):
def __init__(self, pinconfig): def __init__(self, pinconfig):
self.__pinconfig = pinconfig self.__pinconfig = pinconfig
@ -115,6 +116,7 @@ class FeApUserInterface(object):
def set_schauzeichen(self, enabled): def set_schauzeichen(self, enabled):
gpio.output(self.__pinconfig.pin_schauzeichen, 1 if enabled else 0) gpio.output(self.__pinconfig.pin_schauzeichen, 1 if enabled else 0)
if __name__ == '__main__': if __name__ == '__main__':
gpio.setmode(gpio.BOARD) gpio.setmode(gpio.BOARD)
pinconfig = FeApPinConfiguration() pinconfig = FeApPinConfiguration()

6
configreader.py

@ -19,33 +19,27 @@ class ConfigurationReader(object):
'default_proxy': '' 'default_proxy': ''
} }
def __init__(self): def __init__(self):
self.__cp = ConfigParser.ConfigParser(defaults=ConfigurationReader.DEFAULTS) self.__cp = ConfigParser.ConfigParser(defaults=ConfigurationReader.DEFAULTS)
self.pinconfig = None self.pinconfig = None
self.dialconfig = None self.dialconfig = None
self.phoneconfig = None self.phoneconfig = None
def __get_global_val(self, option): def __get_global_val(self, option):
return self.__cp.get('fetapd', option) return self.__cp.get('fetapd', option)
def __get_global_val_int(self, option): def __get_global_val_int(self, option):
return int(self.__cp.get('fetapd', option)) return int(self.__cp.get('fetapd', option))
def __get_global_val_bool(self, option): def __get_global_val_bool(self, option):
return self.__cp.get('fetapd', option).lower() in ['true', 'yes', '1'] return self.__cp.get('fetapd', option).lower() in ['true', 'yes', '1']
def __get_proxy_val(self, proxyname, option): def __get_proxy_val(self, proxyname, option):
return self.__cp.get('proxy_'+proxyname, option) return self.__cp.get('proxy_'+proxyname, option)
def __get_proxy_val_int(self, proxyname, option): def __get_proxy_val_int(self, proxyname, option):
return self.__cp.getint('proxy_'+proxyname, option) return self.__cp.getint('proxy_'+proxyname, option)
def __read_shortcuts(self): def __read_shortcuts(self):
fname = self.__get_global_val('shortcuts_file') fname = self.__get_global_val('shortcuts_file')
shortcuts = {} shortcuts = {}

38
phoneinterface.py

@ -3,6 +3,7 @@ import time
import threading import threading
import subprocess import subprocess
class PhoneProxyConfiguration(object): class PhoneProxyConfiguration(object):
def __init__(self, name, proxy, identity, username, password, realm, def __init__(self, name, proxy, identity, username, password, realm,
prefix): prefix):
@ -14,6 +15,7 @@ class PhoneProxyConfiguration(object):
self.realm = realm self.realm = realm
self.prefix = prefix self.prefix = prefix
class PhoneConfiguration(object): class PhoneConfiguration(object):
def __init__(self, sound_device, incoming_timeout, linphone_config, def __init__(self, sound_device, incoming_timeout, linphone_config,
default_proxy, proxies, stun_server): default_proxy, proxies, stun_server):
@ -24,6 +26,7 @@ class PhoneConfiguration(object):
self.proxies = proxies self.proxies = proxies
self.stun_server = stun_server self.stun_server = stun_server
class PhoneEvent(object): class PhoneEvent(object):
RegInProgress,\ RegInProgress,\
RegSuccessfull,\ RegSuccessfull,\
@ -41,6 +44,7 @@ class PhoneEvent(object):
if v == val: if v == val:
return k return k
class PhoneInterface(object): class PhoneInterface(object):
def __init__(self, config): def __init__(self, config):
cbs = { cbs = {
@ -56,7 +60,9 @@ class PhoneInterface(object):
# Create and add all proxy configs # Create and add all proxy configs
for p in config.proxies: for p in config.proxies:
ainfo = self.__core.create_auth_info(p.username, p.username, p.password, None, p.realm, None) ainfo = self.__core.create_auth_info(p.username, p.username,
p.password, None, p.realm,
None)
self.__core.add_auth_info(ainfo) self.__core.add_auth_info(ainfo)
pconf = self.__core.create_proxy_config() pconf = self.__core.create_proxy_config()
@ -76,8 +82,11 @@ class PhoneInterface(object):
self.__core.default_proxy_config = pconf self.__core.default_proxy_config = pconf
self.__audioproc = None self.__audioproc = None
aplay = subprocess.Popen(['aplay', '-qD%s' % config.sound_device], stdin=subprocess.PIPE) aplay = subprocess.Popen(['aplay', '-qD%s' % config.sound_device],
self.__ttsproc = subprocess.Popen(['espeak', '-p10', '--stdout'], stdin=subprocess.PIPE, stdout=aplay.stdin) stdin=subprocess.PIPE)
self.__ttsproc = subprocess.Popen(['espeak', '-p10', '--stdout'],
stdin=subprocess.PIPE,
stdout=aplay.stdin)
# Set default parameters overriding the ones from the given config file # Set default parameters overriding the ones from the given config file
self.__core.set_user_agent('FeTAp 615', '0.1') self.__core.set_user_agent('FeTAp 615', '0.1')
@ -178,21 +187,26 @@ class PhoneInterface(object):
def play_dial_tone(self): def play_dial_tone(self):
self.stop_playing() self.stop_playing()
self.__audioproc = subprocess.Popen(['play', '-nq', 'synth', 'sine', '425'], self.__audioproc = subprocess.Popen(
env = {'AUDIODRIVER': 'alsa', ['play', '-nq', 'synth', 'sine', '425'],
'AUDIODEV': self.__config.sound_device}) env={'AUDIODRIVER': 'alsa', 'AUDIODEV': self.__config.sound_device}
)
def play_ringback_tone(self): def play_ringback_tone(self):
self.stop_playing() self.stop_playing()
self.__audioproc = subprocess.Popen(['play', '-nq', 'synth', '1', 'sine', '425', 'pad', '4@1', 'repeat', '1000'], self.__audioproc = subprocess.Popen(
env = {'AUDIODRIVER': 'alsa', ['play', '-nq', 'synth', '1', 'sine', '425', 'pad', '4@1',
'AUDIODEV': self.__config.sound_device}) 'repeat', '1000'],
env={'AUDIODRIVER': 'alsa', 'AUDIODEV': self.__config.sound_device}
)
def play_busy_tone(self): def play_busy_tone(self):
self.stop_playing() self.stop_playing()
self.__audioproc = subprocess.Popen(['play', '-nq', 'synth', '0.48', 'sine', '425', 'pad', '0.48@0.48', 'repeat', '1000'], self.__audioproc = subprocess.Popen(
env = {'AUDIODRIVER': 'alsa', ['play', '-nq', 'synth', '0.48', 'sine', '425', 'pad', '0.48@0.48',
'AUDIODEV': self.__config.sound_device}) 'repeat', '1000'],
env={'AUDIODRIVER': 'alsa', 'AUDIODEV': self.__config.sound_device}
)
def stop_playing(self): def stop_playing(self):
if self.__audioproc is not None: if self.__audioproc is not None:

23
statemachine.py

@ -1,21 +1,23 @@
import threading import threading
import Queue as queue import Queue as queue
class DialConfiguration(object): class DialConfiguration(object):
def __init__(self, dial_timeout, shortcuts, blacklist): def __init__(self, dial_timeout, shortcuts, blacklist):
self.dial_timeout = dial_timeout self.dial_timeout = dial_timeout
self.shortcuts = shortcuts self.shortcuts = shortcuts
self.blacklist = blacklist self.blacklist = blacklist
class IllegalEventError(Exception): class IllegalEventError(Exception):
pass pass
class AbstractState(object):
""" """
An abstract state, needed to define all possible events. An abstract state, needed to define all possible events.
""" """
class AbstractState(object):
def on_registration_in_progress(self): def on_registration_in_progress(self):
raise IllegalEventError() raise IllegalEventError()
@ -59,12 +61,12 @@ class AbstractState(object):
return None return None
class BaseState(AbstractState):
""" """
The basic state that every other state inherits from. It defines default The basic state that every other state inherits from. It defines default
behaviour for some events (overriden if necessary). behaviour for some events (overriden if necessary).
""" """
class BaseState(AbstractState):
def __init__(self, controller): def __init__(self, controller):
self._controller = controller self._controller = controller
@ -101,6 +103,7 @@ class InitState(BaseState):
print('registration in progress') print('registration in progress')
return RegisteringState return RegisteringState
class RegisteringState(BaseState): class RegisteringState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(RegisteringState, self).__init__(controller) super(RegisteringState, self).__init__(controller)
@ -110,6 +113,7 @@ class RegisteringState(BaseState):
self._controller.feap.set_schauzeichen(False) self._controller.feap.set_schauzeichen(False)
return IdleState return IdleState
class IdleState(BaseState): class IdleState(BaseState):
def on_incoming_call(self): def on_incoming_call(self):
print('incomfing call') print('incomfing call')
@ -126,6 +130,7 @@ class IdleState(BaseState):
print('gabel up') print('gabel up')
return DialingState return DialingState
class SchelltState(BaseState): class SchelltState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(SchelltState, self).__init__(controller) super(SchelltState, self).__init__(controller)
@ -140,6 +145,7 @@ class SchelltState(BaseState):
def on_call_ended(self): def on_call_ended(self):
return IdleState return IdleState
class AcceptingState(BaseState): class AcceptingState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(AcceptingState, self).__init__(controller) super(AcceptingState, self).__init__(controller)
@ -148,6 +154,7 @@ class AcceptingState(BaseState):
def on_call_accepted(self): def on_call_accepted(self):
return CallRunningState return CallRunningState
class CallTerminatingState(BaseState): class CallTerminatingState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(CallTerminatingState, self).__init__(controller) super(CallTerminatingState, self).__init__(controller)
@ -159,10 +166,12 @@ class CallTerminatingState(BaseState):
def on_call_accepted(self): def on_call_accepted(self):
return None return None
class ForgottenState(BaseState): class ForgottenState(BaseState):
def on_gabelschalter_down(self): def on_gabelschalter_down(self):
return IdleState return IdleState
class BusyBeepingState(BaseState): class BusyBeepingState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(BusyBeepingState, self).__init__(controller) super(BusyBeepingState, self).__init__(controller)
@ -177,6 +186,7 @@ class BusyBeepingState(BaseState):
def on_gabelschalter_down(self): def on_gabelschalter_down(self):
return IdleState return IdleState
class CallRunningState(BaseState): class CallRunningState(BaseState):
def on_gabelschalter_down(self): def on_gabelschalter_down(self):
return CallTerminatingState return CallTerminatingState
@ -184,6 +194,7 @@ class CallRunningState(BaseState):
def on_call_ended(self): def on_call_ended(self):
return BusyBeepingState return BusyBeepingState
class WecktState(BaseState): class WecktState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(WecktState, self).__init__(controller) super(WecktState, self).__init__(controller)
@ -201,6 +212,7 @@ class WecktState(BaseState):
def on_call_accepted(self): def on_call_accepted(self):
return CallRunningState return CallRunningState
class ConnectingState(BaseState): class ConnectingState(BaseState):
def on_gabelschalter_down(self): def on_gabelschalter_down(self):
return CallTerminatingState return CallTerminatingState
@ -218,6 +230,7 @@ class ConnectingState(BaseState):
def on_call_ended(self): def on_call_ended(self):
return BusyBeepingState return BusyBeepingState
class DialingState(BaseState): class DialingState(BaseState):
def __init__(self, controller): def __init__(self, controller):
super(DialingState, self).__init__(controller) super(DialingState, self).__init__(controller)
@ -244,7 +257,8 @@ class DialingState(BaseState):
self._controller.phone.stop_playing() self._controller.phone.stop_playing()
self.__number += str(num) self.__number += str(num)
self._controller.abort_timeout() self._controller.abort_timeout()
self._controller.set_timeout(self._controller.dialconfig.dial_timeout * 1000) self._controller.set_timeout(self._controller.dialconfig.dial_timeout
* 1000)
self._controller.phone.read_text(str(num)) self._controller.phone.read_text(str(num))
def on_timeout(self): def on_timeout(self):
@ -300,7 +314,8 @@ class StateMachineController(object):
self.__evqueue.put((evname, evargs, evkwargs)) self.__evqueue.put((evname, evargs, evkwargs))
def set_timeout(self, timeout): def set_timeout(self, timeout):
self.__timeout = threading.Timer(timeout/1000, self.queue_event, args=['timeout']) self.__timeout = threading.Timer(timeout/1000,
self.queue_event, args=['timeout'])
self.__timeout.start() self.__timeout.start()
def abort_timeout(self): def abort_timeout(self):

206
statemachinetest.py

@ -1,206 +0,0 @@
import threading
import Queue as queue
class IllegalEventError(Exception):
pass
class AbstractState(object):
def __init__(self, controller):
pass
def on_registration_in_progress(self):
raise IllegalEventError()
def on_registration_successful(self):
raise IllegalEventError()
def on_gabelschalter_up(self):
raise IllegalEventError()
def on_gabelschalter_down(self):
raise IllegalEventError()
def on_incoming_call(self):
raise IllegalEventError()
def on_call_ended(self):
raise IllegalEventError()
def on_call_accepted(self):
raise IllegalEventError()
def on_call_ringing(self):
raise IllegalEventError()
def on_nummernschalter_input(self, num):
raise IllegalEventError()
def on_timeout(self):
raise IllegalEventError()
class InitState(AbstractState):
def on_registration_in_progress(self):
print('registration in progress')
return RegisteringState
class RegisteringState(AbstractState):
def on_registration_successful(self):
print('registration successfull')
return IdleState
class IdleState(AbstractState):
def on_incoming_call(self):
print('incomfing call')
def on_gabelschalter_up(self):
print('gabel up')
return DialingState
def on_gabelschalter_down(self):
pass
def on_nummernschalter_input(self, x):
pass
class SchelltState(AbstractState):
def on_gabelschalter_up(self):
return AcceptingState
def on_call_ended(self):
return IdleState
class AcceptingState(AbstractState):
def on_call_accepted(self):
return CallRunningState
class CallTerminatingState(AbstractState):
def on_call_ended(self):
return IdleState
def on_call_accepted(self):
return None
class ForgottenState(AbstractState):
def on_gabelschalter_down(self):
return IdleState
class BusyBeepingState(AbstractState):
def on_timeout(self):
return ForgottenState
def on_gabelschalter_down(self):
return IdleState
class CallRunningState(AbstractState):
def on_gabelschalter_down(self):
return CallTerminatingState
def on_call_ended(self):
return BusyBeepingState
class WecktState(AbstractState):
def on_gabelschalter_down(self):
return CallTerminatingState
def on_call_ended(self):
return BusyBeepingState
def on_call_accepted(self):
return CallRunningState
class ConnectingState(AbstractState):
def on_gabelschalter_down(self):
return CallTerminatingState
def on_call_ringing(self):
return WecktState
class DialingState(AbstractState):
def on_gabelschalter_down(self):
return IdleState
def on_nummernschalter_input(self, num):
print('nummernschalter: %d' % (num))
def on_timeout(self):
return ConnectingState
class TelefonapparatUserInterface(object):
def __init__(self):
pass
def add_gabelschalter_callback(self, cb):
pass
def add_nummernschalter_callback(self, cb):
pass
def set_wecker(self, enabled):
pass
def set_schauzeichen(self, enabled):
pass
class StateMachineController(object):
def __init__(self):
self.__state = InitState(self)
self.__running = True
self.__evqueue = queue.Queue()
self.__evthread = threading.Thread(target=self.__event_dispatcher)
self.__evthread.start()
def __event_dispatcher(self):
while self.__running:
(evname, evargs, evkwargs) = self.__evqueue.get()
if not evname:
return
print('!!! event: %s' % (evname))
handler = getattr(self.__state, 'on_%s' % (evname))
try:
newstate = handler(*evargs, **evkwargs)
except IllegalEventError:
print('illegal event occured!!!!!!!!!!!!!!!!!!!!')
if not newstate:
continue
oldstate = self.__state.__class__
print('%s -> %s' % (oldstate.__name__, newstate.__name__))
self.__state = newstate(self)
def queue_event(self, evname, *evargs, **evkwargs):
if not hasattr(AbstractState, 'on_%s' % (evname)):
raise ValueError('Illegal event name: %s' % (evname))
self.__evqueue.put((evname, evargs, evkwargs))
def stop(self, hard=False):
if hard:
self.__running = False
self.__evqueue.put((None, None, None))
if __name__ == '__main__':
c = StateMachineController()
c.queue_event('registration_in_progress')
c.queue_event('registration_successful')
c.queue_event('gabelschalter_up')
c.queue_event('nummernschalter_input', 4)
c.queue_event('nummernschalter_input', 2)
#c.queue_event('gabelschalter_down')
#c.queue_event('call_accepted')
c.queue_event('timeout')
c.queue_event('call_ringing')
#c.queue_event('gabelschalter_down')
c.queue_event('call_accepted')
c.queue_event('call_ended')
c.queue_event('timeout')
c.queue_event('gabelschalter_down')
c.stop()
Loading…
Cancel
Save