File: sig_telephone.h

package info (click to toggle)
faumachine 20180503-4
  • links: PTS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 61,272 kB
  • sloc: ansic: 272,290; makefile: 6,199; asm: 4,251; sh: 3,022; perl: 886; xml: 563; pascal: 311; lex: 214; vhdl: 204
file content (130 lines) | stat: -rw-r--r-- 3,549 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Copyright (C) 2004-2009 FAUmachine Team <info@faumachine.org>.
 * This program is free software. You can redistribute it and/or modify it
 * under the terms of the GNU General Public License, either version 2 of
 * the License, or (at your option) any later version. See COPYING.
 */

#ifndef __SIG_TELEPHONE_H_INCLUDED
#define __SIG_TELEPHONE_H_INCLUDED

#include <inttypes.h>
#include <stdio.h>

#include "sig_gen.h"

/**
 * protocol for telephone line.
 */

/** possible message kinds */
enum sig_telephone_protocol {
	SIG_TELE_DIAL, 		  /**< dial a number */
	SIG_TELE_CONNECT,	  /**< connected with peer */
	SIG_TELE_INVALID_NUMBER,  /**< number invalid */
	SIG_TELE_HANGUP,	  /**< terminate a connection */
	SIG_TELE_LIFT,		  /**< "lift the receiver" */
	SIG_TELE_BUSY,		  /**< line is busy or peer has hung up */
	SIG_TELE_DIALTONE,	  /**< line is usable (dialtone) */
	SIG_TELE_RING,		  /**< incoming call */
	SIG_TELE_DATA		  /**< Modem-DATA-packet */
};

/** callbacks for telephone signal */
struct sig_telephone_funcs {

	/** will be called, if data get's recieved through
	 *  telephone signal.
	 *  @param s instance.
	 *  @param data received byte of data
	 */
	void (*recv_data)(void *s, uint8_t data);

	/** will be called, if a control message is receieved through
         *  telephone signal.
	 *  @param s instance.
	 *  @param event event that occured.
	 */
	void (*recv_ctrl)(void *s, enum sig_telephone_protocol event);

	/** will be called, if a number was dialed. Only the telephone-
	 *  exchange will be interested in this callback.
	 *  @param s instance.
	 *  @param number number that was dialed.
	 */
	void (*recv_dial)(void *s, uint32_t number);
};

/** structure with callbacks. */
struct sig_telephone {
	/** magic number */
	enum sig_gen_type type;
	/** members participating on one signal */
	struct {
		/** object data */
		void *s;
		/** registered callbacks */
		const struct sig_telephone_funcs *f;
	} member[10];
	/** number of members */
	unsigned int nmembers;
};

struct sig_telephone_merge {
	struct sig_telephone *s0;
	struct sig_telephone *s1;
};

/** send data to other participants.
 *  @param b sig_telephone object
 *  @param s sender object
 *  @param data one byte of data to send.
 */
extern void
sig_telephone_send_data(const struct sig_telephone* b, void *s, uint8_t data);


/** send a control packet to other participants.
 *  @param b sig_telephone object
 *  @param s sender object
 *  @param proto kind of control message.
 */
extern void
sig_telephone_send_ctrl(const struct sig_telephone *b, void *s, 
			enum sig_telephone_protocol proto);


/** dial a number.
 *  @param b sig_telephone object.
 *  @param s sender object.
 *  @param number number to dial.
 */
extern void
sig_telephone_dial(const struct sig_telephone *b, void *s, uint32_t number);


/** connect to telephone signal
 *  @param b signal object.
 *  @param s sender object.
 *  @param f callback functions.
 */
extern void
sig_telephone_connect(struct sig_telephone *b, void *s,
		const struct sig_telephone_funcs *f);

extern struct sig_telephone_merge *
sig_telephone_merge(struct sig_telephone *s0, struct sig_telephone *s1);
extern void
sig_telephone_split(struct sig_telephone_merge *m);

extern struct sig_telephone *
sig_telephone_create(const char *name);
extern void
sig_telephone_destroy(struct sig_telephone *sig);

extern void
sig_telephone_suspend(struct sig_telephone *b, FILE *fSig);
extern void
sig_telephone_resume(struct sig_telephone *b, FILE *fSig);

#endif /* __SIG_TELEPHONE_H_INCLUDED */