Merge branch 'pylinphone' of https://git.blinkenbunt.org/LUG-Saar/fetapi into pylinphone

This commit is contained in:
Fr3deric 2020-12-28 20:09:29 +00:00
commit d50a691252
2 changed files with 51 additions and 65 deletions

View file

@ -74,6 +74,15 @@ if __name__ == '__main__':
feap = FeApUserInterface(cfg.pinconfig) feap = FeApUserInterface(cfg.pinconfig)
controller = statemachine.StateMachineController(phone, feap, cfg.dialconfig) controller = statemachine.StateMachineController(phone, feap, cfg.dialconfig)
# TODO: Use real events from daemon
controller.queue_event('registration_in_progress')
controller.queue_event('registration_successful')
feap.add_gabelschalter_callback(gabelschalter_cb)
feap.add_nummernschalter_active_callback(nummernschalter_active_cb)
feap.add_nummernschalter_done_callback(nummernschalter_done_cb)
phone.add_event_cb(phone_cb)
phone.start() phone.start()
try: try:
while True: while True:

View file

@ -1,8 +1,7 @@
import linphone
import time import time
import threading import threading
import subprocess import subprocess
from pylinphone import LinphoneCommunicationSocket from pylinphone.pylinphone import LinphoneCommunicationSocket
class PhoneProxyConfiguration(object): class PhoneProxyConfiguration(object):
@ -48,23 +47,19 @@ class PhoneEvent(object):
class PhoneInterface(object): class PhoneInterface(object):
def __init__(self, config): def __init__(self, config):
cbs = {
'global_state_changed': self.__global_state_changed,
'registration_state_changed': self.__registration_state_changed,
'call_state_changed': self.__call_state_changed
}
self.__event_cbs = [] self.__event_cbs = []
self.__config = config self.__config = config
self.__core = LinphoneCommunicationSocket("/tmp/lpdaemon") self.__core = LinphoneCommunicationSocket("/var/tmp/debian-sid/tmp/linphone")
self.__core.onLinphoneCallIncomingReceived = self.on_LinphoneCallIncomingReceived
self.__core.onLinphoneCallOutgoingRinging = self.on_LinphoneCallOutgoingRinging
self.__core.onLinphoneCallConnected = self.on_LinphoneCallConnected
self.__core.onLinphoneCallEnd = self.on_LinphoneCallEnd
# 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, aid = self.__core.register(p.identity, p.proxy, p.password, p.username) # sip:XXXX@hg.eventphone.de, hg.eventphone.de, MySecretPassword, XXXX
p.password, None, p.realm,
None)
aid = self.__core.register(p.username, p.proxy_address, p.password, p.username) # sip:XXXX@hg.eventphone.de, hg.eventphone.de, MySecretPassword, XXXX
self.__audioproc = None self.__audioproc = None
aplay = subprocess.Popen(['aplay', '-qD%s' % config.sound_device], aplay = subprocess.Popen(['aplay', '-qD%s' % config.sound_device],
@ -86,52 +81,23 @@ class PhoneInterface(object):
#self.__core.video_capture_enabled = False #self.__core.video_capture_enabled = False
#self.__core.video_display_enabled = False #self.__core.video_display_enabled = False
def __global_state_changed(self, core, state, msg):
print('Global state changed:', state, msg)
# TODO: Do we need events emitted here?
pass
def __registration_state_changed(self, core, proxyconf, state, msg): def run_callbacks(self, evt):
print('Registration state changed:', proxyconf, state, msg) print(PhoneEvent.string(evt))
evt = None for cb in self.__event_cbs:
if state == linphone.RegistrationState.Progress: cb(evt)
evt = PhoneEvent.RegInProgress
elif state == linphone.RegistrationState.Ok:
evt = PhoneEvent.RegSuccessfull
elif state == linphone.RegistrationState.None:
evt = PhoneEvent.RegLost
if evt is not None: def on_LinphoneCallIncomingReceived(self, event):
for cb in self.__event_cbs: self.run_callbacks(PhoneEvent.CallIncoming)
cb(evt)
else:
print('Unhandled registration state:', linphone.RegistrationState.string(state))
def __call_state_changed(self, core, call, state, msg): def on_LinphoneCallOutgoingRinging(self, event):
print('Call state changed:', call, state, msg) self.run_callbacks(PhoneEvent.CallRinging)
evt = None
if state == linphone.CallState.IncomingReceived:
evt = PhoneEvent.CallIncoming
elif state == linphone.CallState.OutgoingRinging:
evt = PhoneEvent.CallRinging
elif state == linphone.CallState.Connected:
evt = PhoneEvent.CallAccepted
elif state == linphone.CallState.End:
evt = PhoneEvent.CallEnded
elif state == linphone.CallState.Error:
error = call.error_info.reason
if error == linphone.Reason.Busy:
evt = PhoneEvent.CallBusy
elif error == linphone.Reason.NotFound:
evt = PhoneEvent.CallInvalidNumber
else:
evt = PhoneEvent.CallEnded
if evt is not None: def on_LinphoneCallConnected(self, event):
for cb in self.__event_cbs: self.run_callbacks(PhoneEvent.CallAccepted)
cb(evt)
else: def on_LinphoneCallEnd(self, event):
print('Unhandled call state:', linphone.CallState.string(state)) self.run_callbacks(PhoneEvent.CallEnded)
def __pollthread(self): def __pollthread(self):
while self.__running: while self.__running:
@ -153,23 +119,32 @@ class PhoneInterface(object):
self.__event_cbs.append(cb) self.__event_cbs.append(cb)
def call(self, number): def call(self, number):
if '@' not in number and self.__core.default_proxy_config is None: if '@' not in number:
# Try to resolve prefix proxy = None
default_name = self.__config.default_proxy
for p in self.__config.proxies: for p in self.__config.proxies:
if number.startswith(p.prefix): if p.name == default_name:
number = number[len(p.prefix):] proxy = p
number += '@' + p.realm
break break
self.__core.invite(number) if proxy is None:
# Try to resolve prefix
for p in self.__config.proxies:
if number.startswith(p.prefix):
number = number[len(p.prefix):]
proxy = p
break
if proxy is not None:
number += '@' + proxy.realm
self.__core.call(number)
def accept_call(self): def accept_call(self):
self.__core.accept_call(self.__core.current_call) self.__core.answer()
def decline_call(self): def decline_call(self):
self.__core.decline_call(self.__core.current_call, linphone.Reason.Busy) self.__core.decline_call(self.__core.current_call)
def end_call(self): def end_call(self):
self.__core.terminate_call(self.__core.current_call) self.__core.terminate()
def play_dial_tone(self): def play_dial_tone(self):
self.stop_playing() self.stop_playing()
@ -203,7 +178,9 @@ class PhoneInterface(object):
self.__ttsproc.stdin.flush() self.__ttsproc.stdin.flush()
def get_remote_number(self): def get_remote_number(self):
return self.__core.current_call_remote_address.username # FIXME
#return self.__core.current_call_remote_address.username
return '0000'
if __name__ == '__main__': if __name__ == '__main__':
def event_cb(evt): def event_cb(evt):