diff options
author | Harald Welte <laforge@gnumonks.org> | 2015-12-01 20:17:45 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2015-12-01 20:18:27 +0100 |
commit | 0679cd4b97cc7e5a40e31b2a195b29dbf81412ed (patch) | |
tree | 39bfd74991201a3edb53330eb4f6f0a529864bcc /gsm_call_fsm.py | |
parent | 3d66bfbeeeeacd7e6974785484f1f3ec06b1b73c (diff) |
port mncc_test2 and gsm_call_fsm to pykka Actor framework
Diffstat (limited to 'gsm_call_fsm.py')
-rw-r--r-- | gsm_call_fsm.py | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/gsm_call_fsm.py b/gsm_call_fsm.py index d67e097..91aa6d4 100644 --- a/gsm_call_fsm.py +++ b/gsm_call_fsm.py @@ -7,34 +7,35 @@ import pykka from fysom import Fysom from mncc_sock import mncc_msg, mncc_number -class GsmCallFsm(object): +class GsmCallFsm(pykka.ThreadingActor): last_callref = 0 - def get_next_callref(self): + def _get_next_callref(self): GsmCallFsm.last_callref = GsmCallFsm.last_callref + 1 return GsmCallFsm.last_callref; - def printstatechange(self, e): + def _printstatechange(self, e): print 'GsmCallFsm(%s): event: %s, src: %s, dst: %s' % (self.name, e.event, e.src, e.dst) - def onmncc_setup_req(self, e): + def _onmncc_setup_req(self, e): msg = mncc_msg(msg_type = mncc.MNCC_SETUP_REQ, callref = self.callref, fields = mncc.MNCC_F_CALLED | mncc.MNCC_F_CALLING, calling = mncc_number(self.calling), called = mncc_number(self.called)) - self.mncc.send(msg) + self.mncc_ref.tell({'type': 'send', 'msg': msg}) print 'GsmCallFsm(%s): mncc_setup_req event: %s, src: %s, dst: %s' % (self.name, e.event, e.src, e.dst) - def onmncc_setup_cnf(self, e): + def _onmncc_setup_cnf(self, e): # send MNCC_SETUP_COMPL_REQ to MNCC interface, causing # CC-CONNECT-ACK to be sent to MS msg = mncc_msg(msg_type = mncc.MNCC_SETUP_COMPL_REQ) - self.mncc.send(msg) + self.mncc_ref.tell({'send', msg}) - def __init__(self, name, mncc): + def __init__(self, name, mncc_ref): + super(GsmCallFsm, self).__init__() self.name = name - self.mncc = mncc; - self.callref = self.get_next_callref() + self.mncc_ref = mncc_ref; + self.callref = self._get_next_callref() self.fsm = Fysom(initial = 'NULL', events = [ # MT call setup @@ -77,11 +78,11 @@ class GsmCallFsm(object): ('mncc_rel_cnf', 'RELEASE_REQUEST', 'NULL') ], - callbacks = [('onmncc_setup_req', self.onmncc_setup_req), - ('onmncc_setup_cnf', self.onmncc_setup_cnf), + callbacks = [('onmncc_setup_req', self._onmncc_setup_req), + ('onmncc_setup_cnf', self._onmncc_setup_cnf), ], ) - self.fsm.onchangestate = self.printstatechange + self.fsm.onchangestate = self._printstatechange def start_mt_call(self, calling, called): self.calling = calling @@ -89,50 +90,59 @@ class GsmCallFsm(object): self.fsm.mncc_setup_req() # MT call - def do_mncc_rel_ind(self, mncc_msg): + def _do_mncc_rel_ind(self, mncc_msg): self.fsm.mncc_rel_ind(mncc_msg) - def do_mncc_call_conf_ind(self, mncc_msg): + def _do_mncc_call_conf_ind(self, mncc_msg): self.fsm.mncc_call_conf_ind(mncc_msg) - def do_mncc_alert_ind(self, mncc_msg): + def _do_mncc_alert_ind(self, mncc_msg): self.fsm.mncc_allert_ind(mncc_msg) - def do_mncc_setup_cnf(self, mncc_msg): + def _do_mncc_setup_cnf(self, mncc_msg): self.fsm.mncc_setup_cnf(mncc_msg) # MO call - def do_mncc_setup_ind(self, mncc_msg): + def _do_mncc_setup_ind(self, mncc_msg): self.fsm.mncc_setup_ind(mncc_msg) - def do_mncc_setup_compl_ind(self, mncc_msg): + def _do_mncc_setup_compl_ind(self, mncc_msg): self.fsm.mncc_setup_compl_ind(mncc_msg) # Misc - def do_mncc_disc_ind(self, mncc_msg): + def _do_mncc_disc_ind(self, mncc_msg): self.fsm.mncc_disc_ind(mncc_msg) - def do_mncc_rel_ind(self, mncc_msg): + def _do_mncc_rel_ind(self, mncc_msg): self.fsm.mncc_rel_ind(mncc_msg) - def do_mncc_rel_cnf(self, mncc_msg): + def _do_mncc_rel_cnf(self, mncc_msg): self.fsm.mncc_rel_cnf(mncc_msg) - func_by_type = { + _func_by_type = { # MT call - mncc.MNCC_REL_IND: do_mncc_rel_ind, - mncc.MNCC_CALL_CONF_IND: do_mncc_call_conf_ind, - mncc.MNCC_ALERT_IND: do_mncc_alert_ind, - mncc.MNCC_SETUP_CNF: do_mncc_setup_cnf, + mncc.MNCC_REL_IND: _do_mncc_rel_ind, + mncc.MNCC_CALL_CONF_IND: _do_mncc_call_conf_ind, + mncc.MNCC_ALERT_IND: _do_mncc_alert_ind, + mncc.MNCC_SETUP_CNF: _do_mncc_setup_cnf, # MO call - mncc.MNCC_SETUP_IND: do_mncc_setup_ind, - mncc.MNCC_SETUP_COMPL_IND: do_mncc_setup_compl_ind, + mncc.MNCC_SETUP_IND: _do_mncc_setup_ind, + mncc.MNCC_SETUP_COMPL_IND: _do_mncc_setup_compl_ind, # misc - mncc.MNCC_DISC_IND: do_mncc_disc_ind, - mncc.MNCC_REL_IND: do_mncc_rel_ind, - mncc.MNCC_REL_CNF: do_mncc_rel_cnf, + mncc.MNCC_DISC_IND: _do_mncc_disc_ind, + mncc.MNCC_REL_IND: _do_mncc_rel_ind, + mncc.MNCC_REL_CNF: _do_mncc_rel_cnf, } - def lookup_method(self, mncc_msg_type): - return self.func_by_type[mncc_msg_type] + def _lookup_method(self, mncc_msg_type): + return self._func_by_type[mncc_msg_type] - def handle_mncc(self, mncc_msg): + def _handle_mncc(self, mncc_msg): if mncc_msg.callref != self.callref: raise Exception('mncc', 'Callref not for this GsmCallFsm') - self.lookup_method(mncc_msg.msg_type)(self, mncc_msg) + self._lookup_method(mncc_msg.msg_type)(self, mncc_msg) + + # pykka Actor message receiver + def on_receive(self, message): + if message['type'] == 'mncc': + msg = message['msg'] + if msg.callref == self.callref: + return self._handle_mncc(msg) + else: + raise Exception('mncc', 'Unknown message %s' % message) |