/*
 * DSS.1 module definitions
 *
 * Copyright (C) 1996 Universidade de Lisboa
 *
 * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
 *
 * This software may be used and distributed according to the terms of
 * the GNU General Public License, incorporated herein by reference.
 */

#ifndef EDSS1_H
#define EDSS1_H

/* ISDN states */

#define ST_NULL      0
#define ST_CALL_INIT 1    /* Call initiated */
#define ST_OVER_SEND 2    /* Overlap sending - Requests More Info 4 call */
#define ST_CALL_PROC 3    /* Call Proceeding */
#define ST_CALL_DELV 4
#define ST_CALL_PRES 6    /* Call Present - Received CONN.IND */
#define ST_CALL_RECV 7    /* Alerting sent */
#define ST_CONN_REQ  8    /* Answered - waiting 4 CONN.CONF */
#define ST_INCM_PROC 9
#define ST_ACTIVE    10
#define ST_DISC_REQ  11
#define ST_DISC_IND  12
#define ST_SUSP_REQ  15
#define ST_RESM_REQ  17
#define ST_RELS_REQ  19
#define ST_OVER_RECV 25

#define ST_ACTIVE_SELP 26 /* Select protocol on B-Channel */
#define ST_ACTIVE_ACTV 27 /* Activate B-channel protocol  */

#define MAX_STATE ST_ACTIVE_ACTV

#define EV_NULL               0
#define EV_USR_SETUP_REQ      1
#define EV_USR_SETUP_RESP     2
#define EV_USR_PROCED_REQ     3
#define EV_USR_RELEASE_REQ    4
#define EV_USR_REJECT_REQ     4

#define EV_NET_SETUP          16
#define EV_NET_CALL_PROC      17
#define EV_NET_SETUP_ACK      18
#define EV_NET_CONN           19
#define EV_NET_CONN_ACK       20

#define EV_NET_SELP_RESP      21
#define EV_NET_ACTV_RESP      22

#define EV_NET_DISC           23
#define EV_NET_RELEASE        24
#define EV_NET_RELEASE_COMP   25

#define EV_TIMER              26
#define EV_ERROR              32

/*
 *  Cause values
 *  only the ones we use
 */

#define CAUSE_NORMAL          0x10U
#define CAUSE_NOCHAN          0x22U

struct callb_data {
	unsigned short type;
	union {
		struct ConnInfo {
			char *CalledPN;
			char *CallingPN;
		} setup;
		unsigned short cause;
	} data;
};

struct fsm_entry {
	unsigned short init;
	unsigned short final;
	unsigned short event;
	void (*callb)(struct pcbit_dev *, struct pcbit_chan *, struct callb_data*);
};

struct fsm_timer_entry {
	unsigned short init;
	unsigned long timeout;          /* in seconds */
};

extern const char * const isdn_state_table[];

void pcbit_fsm_event(struct pcbit_dev *, struct pcbit_chan *,
		     unsigned short event, struct callb_data *);
char *strisdnevent(ushort ev);

#endif
