mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2026-01-07 00:52:30 +08:00
Compare commits
2494 Commits
3.11.1
...
new_dectmn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5d06d65f5 | ||
|
|
d9d03436eb | ||
|
|
5537b3ad37 | ||
|
|
898b42cb8a | ||
|
|
e6086c918f | ||
|
|
5200d7a3f9 | ||
|
|
7e454443b2 | ||
|
|
c5fc40069a | ||
|
|
87ebd9a601 | ||
|
|
a3d0ce3c67 | ||
|
|
819461dc5b | ||
|
|
f532bac520 | ||
|
|
a6269fa0d4 | ||
|
|
b743353ba1 | ||
|
|
e0ae025ff1 | ||
|
|
da55bf9b46 | ||
|
|
fefe1b1b20 | ||
|
|
dcd22a03c5 | ||
|
|
4aa7bcb4ec | ||
|
|
263a5ab611 | ||
|
|
7bf24c37ce | ||
|
|
0eeeeff94b | ||
|
|
949c386359 | ||
|
|
da14aefe20 | ||
|
|
8ce8d7cf84 | ||
|
|
a564e55cfc | ||
|
|
1574a35631 | ||
|
|
530cca802a | ||
|
|
d7f6c6a9f7 | ||
|
|
1416a64348 | ||
|
|
611d6bcee9 | ||
|
|
8dba98e282 | ||
|
|
febad86760 | ||
|
|
a56f8d7be9 | ||
|
|
5ea8207cef | ||
|
|
1dfba64bde | ||
|
|
bcbc7999cd | ||
|
|
5c78b83ac8 | ||
|
|
ef8c6eb8c9 | ||
|
|
7e7867becf | ||
|
|
a03a91f858 | ||
|
|
370d03eaf6 | ||
|
|
e142514135 | ||
|
|
7e19d3550a | ||
|
|
b0cc223750 | ||
|
|
bf8c210f3b | ||
|
|
493d8b05cd | ||
|
|
13b5958852 | ||
|
|
02ff58d9c2 | ||
|
|
59dc9afe0f | ||
|
|
70f9fc7854 | ||
|
|
da43c27174 | ||
|
|
82b06b2365 | ||
|
|
ad64108ada | ||
|
|
9108ff44bc | ||
|
|
0915525fd0 | ||
|
|
958ff29190 | ||
|
|
cc32f540d4 | ||
|
|
b2823a6b1d | ||
|
|
d3d0584056 | ||
|
|
8372c9c7ad | ||
|
|
faa39d1d15 | ||
|
|
e0b38245e1 | ||
|
|
f40d078a3b | ||
|
|
87cf33663c | ||
|
|
99e5dd1443 | ||
|
|
7f53336a83 | ||
|
|
32479eab89 | ||
|
|
7e607d8e09 | ||
|
|
7528a4a11f | ||
|
|
77b306d598 | ||
|
|
575a88afdd | ||
|
|
6741df8952 | ||
|
|
60f9815721 | ||
|
|
4cab43e30d | ||
|
|
342bec0b25 | ||
|
|
3942b33e1e | ||
|
|
3c3608e87c | ||
|
|
aaf0029500 | ||
|
|
7b80bcf104 | ||
|
|
f419a955f6 | ||
|
|
d644ce7be6 | ||
|
|
887ff49b95 | ||
|
|
9c6533f45f | ||
|
|
08f903e2c1 | ||
|
|
833837cea1 | ||
|
|
dabf83ea1d | ||
|
|
0e6146f105 | ||
|
|
220a4efbf7 | ||
|
|
e5d8d81019 | ||
|
|
70442e891f | ||
|
|
ec021d54f5 | ||
|
|
421e633094 | ||
|
|
068308f052 | ||
|
|
8809a7aba7 | ||
|
|
7575dccbc0 | ||
|
|
871831fdac | ||
|
|
db41d298c3 | ||
|
|
ad372152d5 | ||
|
|
926648b090 | ||
|
|
240bdc5bb8 | ||
|
|
45e0b4f2ed | ||
|
|
332a90d087 | ||
|
|
09937f540a | ||
|
|
af8f27ef65 | ||
|
|
8a799f183b | ||
|
|
2dbf38c06c | ||
|
|
b1fcc12599 | ||
|
|
9041f616e7 | ||
|
|
dc14b18428 | ||
|
|
e41f973953 | ||
|
|
9889814f0b | ||
|
|
2922f211f7 | ||
|
|
22dd43c79e | ||
|
|
478c34d48f | ||
|
|
49f46ef075 | ||
|
|
03dc0ebb72 | ||
|
|
fa44657557 | ||
|
|
42a3ed939a | ||
|
|
6e35356954 | ||
|
|
7978a656a7 | ||
|
|
17322c3cba | ||
|
|
890b627139 | ||
|
|
0ad28b756b | ||
|
|
309c26f4b0 | ||
|
|
df4e11ae30 | ||
|
|
9de4a18a20 | ||
|
|
bfcc877a6a | ||
|
|
d9527a5a1a | ||
|
|
e707922d29 | ||
|
|
cfc2e6d9eb | ||
|
|
0ec3e0eae8 | ||
|
|
38c4c7ded0 | ||
|
|
24a82ab61c | ||
|
|
5977ec807c | ||
|
|
90c5c5c52c | ||
|
|
f7cb4c8aac | ||
|
|
07cbf0938e | ||
|
|
a31bb99c30 | ||
|
|
80e3d89d9a | ||
|
|
d26eaf0ef0 | ||
|
|
e437fc821e | ||
|
|
c86d16daf9 | ||
|
|
a91b41d70a | ||
|
|
847b27c879 | ||
|
|
89fe5115f0 | ||
|
|
aba88e359d | ||
|
|
84b594e9bf | ||
|
|
e3dd402d4e | ||
|
|
a06ffa00ce | ||
|
|
c3c5d4ff8b | ||
|
|
bb996c64df | ||
|
|
adbb8b70c1 | ||
|
|
34b3478d77 | ||
|
|
181dd5039e | ||
|
|
10e83915c7 | ||
|
|
59e0b78e84 | ||
|
|
c1e7c8f103 | ||
|
|
de9a7c447d | ||
|
|
8cbcc039d7 | ||
|
|
044dd31be4 | ||
|
|
48b286031a | ||
|
|
ee3dceb433 | ||
|
|
aa1353f08e | ||
|
|
682497f68c | ||
|
|
bfb98073c1 | ||
|
|
a8960be7b5 | ||
|
|
6255b9b2df | ||
|
|
4e11dda2c0 | ||
|
|
c898217717 | ||
|
|
4d2358aa2a | ||
|
|
d3fb4ec562 | ||
|
|
b06ca2b5e5 | ||
|
|
30928e5eb9 | ||
|
|
c75d639a69 | ||
|
|
0bb19c25f7 | ||
|
|
64a826896d | ||
|
|
eee9c7a70c | ||
|
|
0c0e9f15f2 | ||
|
|
48ab39fa31 | ||
|
|
6914c0548f | ||
|
|
ffe74261d9 | ||
|
|
1b5630c67e | ||
|
|
2bf5014aeb | ||
|
|
279a583d23 | ||
|
|
0a0cad9715 | ||
|
|
74618b9377 | ||
|
|
5ff2854490 | ||
|
|
7ae3a29d08 | ||
|
|
68e4189d05 | ||
|
|
c0f7c0ecf1 | ||
|
|
825f1ff76d | ||
|
|
7fa1bf30c1 | ||
|
|
ee3e6d5975 | ||
|
|
96d0a3fba8 | ||
|
|
7b158a918a | ||
|
|
6bad87c47f | ||
|
|
c73ae26618 | ||
|
|
d73a60a4f3 | ||
|
|
0c52946965 | ||
|
|
e89485f19c | ||
|
|
bfb73ba4b5 | ||
|
|
b3e19722b7 | ||
|
|
908ef455c2 | ||
|
|
950687c88b | ||
|
|
5675ff87de | ||
|
|
ae0213ce8c | ||
|
|
a45957e872 | ||
|
|
2c67b66e15 | ||
|
|
bf5b932a93 | ||
|
|
3f6c55a86d | ||
|
|
133c45e91d | ||
|
|
fce1fa2eae | ||
|
|
986fc5ea78 | ||
|
|
95e887087f | ||
|
|
0082d26141 | ||
|
|
2306b1e76f | ||
|
|
7b432d88f8 | ||
|
|
c56aed73d4 | ||
|
|
af719df40c | ||
|
|
2d25beb3ab | ||
|
|
ba561afb24 | ||
|
|
4f8906c1f7 | ||
|
|
42c7aafb93 | ||
|
|
6c1b78b69d | ||
|
|
1eade44fe6 | ||
|
|
834522d107 | ||
|
|
cc65e6ce52 | ||
|
|
b2061f27e0 | ||
|
|
cc26f7bbe9 | ||
|
|
6841172f75 | ||
|
|
8fd7232ea2 | ||
|
|
4d7ac5941e | ||
|
|
2bd9e1ac13 | ||
|
|
766379c8e4 | ||
|
|
dd8edbec71 | ||
|
|
a0bfac1658 | ||
|
|
ec68c58bb7 | ||
|
|
701a77b6b3 | ||
|
|
18e94a6b47 | ||
|
|
514a85703c | ||
|
|
e72ef7290b | ||
|
|
428a1791ed | ||
|
|
43bd7d872f | ||
|
|
1fd62bbfa2 | ||
|
|
08c542cf6f | ||
|
|
098f3340b1 | ||
|
|
d43113a471 | ||
|
|
597fadf578 | ||
|
|
d45959b3da | ||
|
|
8952a6eca8 | ||
|
|
c5df7e08a1 | ||
|
|
a2c6430caa | ||
|
|
e364957074 | ||
|
|
a14e72e26f | ||
|
|
fc38f16aa5 | ||
|
|
ebf1f8fd39 | ||
|
|
005d53ff14 | ||
|
|
a585061b6c | ||
|
|
c945f19c3c | ||
|
|
9566dbfb8e | ||
|
|
120785335c | ||
|
|
f87a160b98 | ||
|
|
bf6342472a | ||
|
|
36e9c3a3d7 | ||
|
|
3c79856802 | ||
|
|
e29ab21280 | ||
|
|
c2b993b494 | ||
|
|
fbc5226978 | ||
|
|
3d5a5d4697 | ||
|
|
0be99d1bc0 | ||
|
|
053bfa1442 | ||
|
|
0346ce9285 | ||
|
|
ae3b959cbf | ||
|
|
2e10c5845e | ||
|
|
83bb965d81 | ||
|
|
a80cff151d | ||
|
|
76a5df9115 | ||
|
|
e63d9f0445 | ||
|
|
0432b27f39 | ||
|
|
dcae4a36ea | ||
|
|
3dc00d7c04 | ||
|
|
12a7fb224d | ||
|
|
dfd2d75021 | ||
|
|
0bc504232a | ||
|
|
6d5bb86e58 | ||
|
|
ff47df64b8 | ||
|
|
b1f86fdc3b | ||
|
|
a0a457cd35 | ||
|
|
0c5f03d50c | ||
|
|
4c124ccd4e | ||
|
|
321eb8c8e4 | ||
|
|
776dc46d49 | ||
|
|
dcfbd0349a | ||
|
|
ed5d4e572d | ||
|
|
22429269e2 | ||
|
|
eee0fcf3db | ||
|
|
9f6f39a094 | ||
|
|
0e0bbb2339 | ||
|
|
36ded309bc | ||
|
|
182b08fcbf | ||
|
|
17fef094df | ||
|
|
bcdbb5dae8 | ||
|
|
f1be5f4ee4 | ||
|
|
33eeedcdd7 | ||
|
|
5e41b8c3bc | ||
|
|
4652ec7399 | ||
|
|
7cccc5d048 | ||
|
|
4843a8e9ff | ||
|
|
a67aedda72 | ||
|
|
d5a7db3a91 | ||
|
|
45190fb2fd | ||
|
|
c8a8cda534 | ||
|
|
64e0a86b77 | ||
|
|
123e2df9fa | ||
|
|
61d9885cd5 | ||
|
|
733cb365ee | ||
|
|
aeba764008 | ||
|
|
d0350ee279 | ||
|
|
00b6800c2f | ||
|
|
ea0079eec8 | ||
|
|
b72d3a45b3 | ||
|
|
d71c6382d5 | ||
|
|
ef4570dd83 | ||
|
|
56273668d6 | ||
|
|
413c86b854 | ||
|
|
53d9ff537d | ||
|
|
024d1bf061 | ||
|
|
cb5d38eb86 | ||
|
|
9108848387 | ||
|
|
81fb5ff455 | ||
|
|
5d16d75162 | ||
|
|
da5b719e6d | ||
|
|
3baa8f3157 | ||
|
|
27610a0305 | ||
|
|
3ef6f4b04c | ||
|
|
0bea0f9635 | ||
|
|
8ee10eb149 | ||
|
|
1a36a1d22a | ||
|
|
4b11d665ff | ||
|
|
ab710068a6 | ||
|
|
9ceec5cc0b | ||
|
|
9161d99082 | ||
|
|
fa76f6f32c | ||
|
|
c37934cb69 | ||
|
|
53a52bc455 | ||
|
|
7f58e5409d | ||
|
|
ccad65dd89 | ||
|
|
e5b8c6f46b | ||
|
|
7ec727e994 | ||
|
|
52313cdaa8 | ||
|
|
da18a10782 | ||
|
|
0ae10079fb | ||
|
|
0e22b3d267 | ||
|
|
895cfbc4f0 | ||
|
|
85cf73c66b | ||
|
|
e8ddd67747 | ||
|
|
60396bad6d | ||
|
|
568098ee0b | ||
|
|
868fece089 | ||
|
|
e0cb0e7a07 | ||
|
|
49f9faa58c | ||
|
|
30245d6dec | ||
|
|
8df424c249 | ||
|
|
e732109ef2 | ||
|
|
0e64d6f262 | ||
|
|
57816f3353 | ||
|
|
0cb4e026c7 | ||
|
|
25a6e81181 | ||
|
|
352e54af58 | ||
|
|
f5b4e71927 | ||
|
|
37dae0ee6f | ||
|
|
045dd954fa | ||
|
|
ecde3a89eb | ||
|
|
7e5b693624 | ||
|
|
7bbbfb150c | ||
|
|
317f4118e1 | ||
|
|
a819c14f7d | ||
|
|
f4b98bd8e9 | ||
|
|
1eeb09bfa2 | ||
|
|
3e67053e9d | ||
|
|
3630dd5fc1 | ||
|
|
29d72d64d6 | ||
|
|
19e3f822e7 | ||
|
|
87969bddae | ||
|
|
1f6dc0d9fb | ||
|
|
c92d47953e | ||
|
|
e4221b84f0 | ||
|
|
593da2e6f8 | ||
|
|
d882e35820 | ||
|
|
89e0a6ba35 | ||
|
|
0c69245845 | ||
|
|
a3265ea7f7 | ||
|
|
155df35229 | ||
|
|
b477f767f3 | ||
|
|
883023b588 | ||
|
|
96322d2a2c | ||
|
|
ff72d4e88b | ||
|
|
4f5a1ad365 | ||
|
|
56f93e1eab | ||
|
|
57e2a69575 | ||
|
|
c7f037fdd7 | ||
|
|
ea87bfe337 | ||
|
|
df93ed2d3c | ||
|
|
de03c6149c | ||
|
|
92480328ac | ||
|
|
02404d5f22 | ||
|
|
bd65c9a666 | ||
|
|
ec443bbb91 | ||
|
|
0292918ef4 | ||
|
|
947d72ae96 | ||
|
|
fb195d9456 | ||
|
|
aa6ff005ea | ||
|
|
a404289e69 | ||
|
|
ccb5d3108a | ||
|
|
ed23fc33b4 | ||
|
|
c1dbba3545 | ||
|
|
ab7cf3e44a | ||
|
|
2afe82e86b | ||
|
|
cd4733efa9 | ||
|
|
123dcd9d87 | ||
|
|
fa2f34ef58 | ||
|
|
f099a39137 | ||
|
|
011e469c8a | ||
|
|
f085b5552f | ||
|
|
434f0f79a5 | ||
|
|
59206bb37f | ||
|
|
b7d7b2a382 | ||
|
|
d7564ddf36 | ||
|
|
e2f238a155 | ||
|
|
0fe4491394 | ||
|
|
c471e4b465 | ||
|
|
8436c5e39a | ||
|
|
d4d7cb9ed0 | ||
|
|
a72d39cac8 | ||
|
|
ccf5343e62 | ||
|
|
28a125cc5b | ||
|
|
abc791f516 | ||
|
|
e599097a22 | ||
|
|
71ee9e3311 | ||
|
|
d7936fd7d1 | ||
|
|
70fb4a6442 | ||
|
|
0e21fc2475 | ||
|
|
4d5f387738 | ||
|
|
78bab83bed | ||
|
|
9745a16694 | ||
|
|
158f1d94a6 | ||
|
|
bdb29afd54 | ||
|
|
57d179ed01 | ||
|
|
2c18313c13 | ||
|
|
61d80f6cc5 | ||
|
|
5ddc513d5d | ||
|
|
5e4549e413 | ||
|
|
dc36c83866 | ||
|
|
5eeef917e6 | ||
|
|
ea5535f374 | ||
|
|
696b4b063a | ||
|
|
8660069566 | ||
|
|
44943fdea7 | ||
|
|
70cacfbe71 | ||
|
|
6aa2fe7749 | ||
|
|
a01a3be0d1 | ||
|
|
f52528f806 | ||
|
|
bcce414686 | ||
|
|
579757f4d9 | ||
|
|
81841777b9 | ||
|
|
392e014872 | ||
|
|
5557c69ec4 | ||
|
|
614a8556d9 | ||
|
|
db110b74e7 | ||
|
|
533a7d68eb | ||
|
|
79f7343cb4 | ||
|
|
61c11e2520 | ||
|
|
b91bf2fa67 | ||
|
|
720e45c20e | ||
|
|
08230823d5 | ||
|
|
52614cee38 | ||
|
|
e648f237eb | ||
|
|
3cc9a2d72e | ||
|
|
332b6ce7b6 | ||
|
|
6aa3467f29 | ||
|
|
644f9b68eb | ||
|
|
5b6e76e51c | ||
|
|
4ffaeace88 | ||
|
|
8814788e9f | ||
|
|
c8355daac5 | ||
|
|
fec9e5486c | ||
|
|
e860576802 | ||
|
|
d20f43a756 | ||
|
|
de730bc4f0 | ||
|
|
ce6946ca9b | ||
|
|
e73efef313 | ||
|
|
0bdd4644e5 | ||
|
|
a2932315c3 | ||
|
|
af7a636751 | ||
|
|
a7c83c46cf | ||
|
|
64cb92e9e9 | ||
|
|
2972baa68b | ||
|
|
3a1b07e868 | ||
|
|
f34d0abc6b | ||
|
|
6ad4df7ea0 | ||
|
|
d44433ed59 | ||
|
|
e4a4b44719 | ||
|
|
a5c2af7a95 | ||
|
|
0543036ebd | ||
|
|
b2b6c19e74 | ||
|
|
c3ecfabfc6 | ||
|
|
a2c3063520 | ||
|
|
c2c28d0cea | ||
|
|
0940898f7b | ||
|
|
ea29e6bce0 | ||
|
|
bd54ff5c52 | ||
|
|
11330760dd | ||
|
|
7e82a361b5 | ||
|
|
8c55345f85 | ||
|
|
c29a46aeee | ||
|
|
946b5b3932 | ||
|
|
c80f64db82 | ||
|
|
b4d2e92cb6 | ||
|
|
2f91b5e726 | ||
|
|
aa0fc5a7ed | ||
|
|
b4e1f18cc5 | ||
|
|
8d43795c34 | ||
|
|
8e957a6c69 | ||
|
|
db1db9da8d | ||
|
|
301d3a0cd6 | ||
|
|
39093e4b1a | ||
|
|
a58467cad0 | ||
|
|
0a3dc9f316 | ||
|
|
47a15eb231 | ||
|
|
a6b66929e4 | ||
|
|
9b1a3ebc71 | ||
|
|
87ec25c82c | ||
|
|
8153cf8d74 | ||
|
|
766096cba4 | ||
|
|
dd00b7eb2e | ||
|
|
a60fa6797a | ||
|
|
0f31287335 | ||
|
|
5dcde335dd | ||
|
|
29f49ff674 | ||
|
|
9ddbbdfe17 | ||
|
|
b23f81f3ba | ||
|
|
5b5addb7fc | ||
|
|
1e9e7be709 | ||
|
|
bce138d52e | ||
|
|
7de0b7e20d | ||
|
|
376ddd4a12 | ||
|
|
b6399da95b | ||
|
|
295ee80a1a | ||
|
|
ac71c9e85f | ||
|
|
d0fc0ffc43 | ||
|
|
cee4575f63 | ||
|
|
4f1ad101bc | ||
|
|
9386ec4bc2 | ||
|
|
84af00e784 | ||
|
|
cc2d40a912 | ||
|
|
21b4c960a3 | ||
|
|
89df7ce409 | ||
|
|
97fd03d966 | ||
|
|
bdfb498fb6 | ||
|
|
b61bc3cd02 | ||
|
|
6223a63efe | ||
|
|
74df3bbd25 | ||
|
|
4afaeddbda | ||
|
|
c552774826 | ||
|
|
1335405ccc | ||
|
|
871a3c3907 | ||
|
|
8815e230ed | ||
|
|
0bf21c30c6 | ||
|
|
e6edca3137 | ||
|
|
7247a2d0d4 | ||
|
|
0f62b3f2be | ||
|
|
6f2a9d0fd4 | ||
|
|
2910b13325 | ||
|
|
4d89930dae | ||
|
|
c5568cc3a8 | ||
|
|
d145893c54 | ||
|
|
7efa7dc06b | ||
|
|
dcc3b5090f | ||
|
|
2771475f57 | ||
|
|
7993de3335 | ||
|
|
387b9fcfef | ||
|
|
456bca5cbb | ||
|
|
10337ed433 | ||
|
|
cab7f065f3 | ||
|
|
e877a0c949 | ||
|
|
20ce9c5f65 | ||
|
|
fc01428650 | ||
|
|
18008a9ec9 | ||
|
|
51180ef90d | ||
|
|
3df32e7860 | ||
|
|
bb51885313 | ||
|
|
89b623b415 | ||
|
|
061d5c0eef | ||
|
|
75869b899c | ||
|
|
ea19916cc4 | ||
|
|
d416df6f86 | ||
|
|
72c59bc2ad | ||
|
|
5f2b3a3f9b | ||
|
|
cb504ababe | ||
|
|
ab44d2383e | ||
|
|
30d72f1683 | ||
|
|
45b8a62027 | ||
|
|
c476a8ec75 | ||
|
|
4a3d6e0331 | ||
|
|
a947dae5f3 | ||
|
|
b219be48eb | ||
|
|
87fc510726 | ||
|
|
4929ebc503 | ||
|
|
88af9763a0 | ||
|
|
34343d4824 | ||
|
|
708a417086 | ||
|
|
e8ba4a8a14 | ||
|
|
b2523c14b6 | ||
|
|
2677dd57de | ||
|
|
df919ded0c | ||
|
|
343ed3993b | ||
|
|
41b934575e | ||
|
|
579fd3bf07 | ||
|
|
ee30bacc15 | ||
|
|
06bad4b9c4 | ||
|
|
04a08815e7 | ||
|
|
8397922ecd | ||
|
|
4de8c13136 | ||
|
|
b9b81709af | ||
|
|
b4c7eb1a3e | ||
|
|
6706e94bc2 | ||
|
|
44c870e1bb | ||
|
|
4f5c7623d2 | ||
|
|
5ca4ee678b | ||
|
|
ebb112f264 | ||
|
|
b30aca1b27 | ||
|
|
5d7af4f3c3 | ||
|
|
e5204b2fdc | ||
|
|
ed855b6921 | ||
|
|
052823c0fd | ||
|
|
e5f389aab6 | ||
|
|
6bf2135bbc | ||
|
|
dcc58ea25a | ||
|
|
8644eb21ab | ||
|
|
170a1f6ad8 | ||
|
|
362b54c642 | ||
|
|
d9e28aa3ca | ||
|
|
a942e21040 | ||
|
|
49dd5d8e31 | ||
|
|
86757e41a3 | ||
|
|
3f86658c46 | ||
|
|
7fa87aca9d | ||
|
|
5259cc9edb | ||
|
|
b39000ea58 | ||
|
|
001d494afd | ||
|
|
3befafcbc1 | ||
|
|
597d866204 | ||
|
|
568b6785d3 | ||
|
|
3a7975bd9b | ||
|
|
e54251dc24 | ||
|
|
ec2b9e76c4 | ||
|
|
d8b65da11f | ||
|
|
3f124c31f0 | ||
|
|
b376a0b16a | ||
|
|
42c0e1ecc8 | ||
|
|
cdce816fd2 | ||
|
|
a49951ad7e | ||
|
|
887cef9b37 | ||
|
|
3ccdcb4140 | ||
|
|
0a80afc550 | ||
|
|
c5c4a6dcbe | ||
|
|
6f5e41bb76 | ||
|
|
20937718f1 | ||
|
|
f7b13cf973 | ||
|
|
946b7a453c | ||
|
|
fcf102b9d2 | ||
|
|
6355eb4b9e | ||
|
|
315d7b44f9 | ||
|
|
6c342e930d | ||
|
|
624e67df4b | ||
|
|
8f2694b035 | ||
|
|
776baa7c95 | ||
|
|
baff3cf6c7 | ||
|
|
a5e007a3b6 | ||
|
|
23b88839a0 | ||
|
|
ddc1933862 | ||
|
|
50e836e3e7 | ||
|
|
e3f7ad9156 | ||
|
|
73d9e5a6f1 | ||
|
|
73124c3d37 | ||
|
|
be2a34fcb4 | ||
|
|
a3f8d33711 | ||
|
|
a500724e17 | ||
|
|
ab4b8f3373 | ||
|
|
bc0452e56d | ||
|
|
da92efc708 | ||
|
|
ba98d3e7aa | ||
|
|
019a02fa7f | ||
|
|
42d496107e | ||
|
|
549378ecbd | ||
|
|
c0bef6ce70 | ||
|
|
97853638bf | ||
|
|
a968641bd1 | ||
|
|
e7c8c56819 | ||
|
|
f4b1bf345c | ||
|
|
6d212ecea3 | ||
|
|
444a5a0c82 | ||
|
|
b2fce09a7f | ||
|
|
6fe9ad271e | ||
|
|
7677e51aeb | ||
|
|
9724913f14 | ||
|
|
99925c9360 | ||
|
|
621ca1c23a | ||
|
|
316e7d1d47 | ||
|
|
8ebe2c7f5a | ||
|
|
0b4be48bf3 | ||
|
|
f680ff2229 | ||
|
|
60034eab91 | ||
|
|
6d539c17a7 | ||
|
|
2c06bbeaf0 | ||
|
|
d36147601b | ||
|
|
cb3c2d4b0e | ||
|
|
e11950b9a1 | ||
|
|
901c2df5cf | ||
|
|
504621b64b | ||
|
|
916ac0eea7 | ||
|
|
d7859ebe06 | ||
|
|
c96e9c170a | ||
|
|
9cb726d649 | ||
|
|
c3bb2895dc | ||
|
|
f9f19d1e0c | ||
|
|
df03c86b1d | ||
|
|
72aba70aaf | ||
|
|
09e20e451a | ||
|
|
743a9fb0ac | ||
|
|
605d816076 | ||
|
|
7319e7d6aa | ||
|
|
e89954c0c0 | ||
|
|
dcc6644b6e | ||
|
|
26a5a54673 | ||
|
|
a5d00e28d6 | ||
|
|
d5ab22bcbf | ||
|
|
31f5f9b017 | ||
|
|
055489fb21 | ||
|
|
3b09d142d9 | ||
|
|
96909bca38 | ||
|
|
31b38d98ec | ||
|
|
f18405e303 | ||
|
|
6973cf5f63 | ||
|
|
b9c5aaa012 | ||
|
|
a4c5bde955 | ||
|
|
66ed795149 | ||
|
|
9268a2960e | ||
|
|
ee9f652942 | ||
|
|
100b91d3d5 | ||
|
|
e58a80228d | ||
|
|
9f21e1568a | ||
|
|
71f340a122 | ||
|
|
6d9ecd06bf | ||
|
|
3e8e332696 | ||
|
|
414f3b72cd | ||
|
|
575793bd53 | ||
|
|
625caee84e | ||
|
|
eb7e99ea18 | ||
|
|
b50516bc99 | ||
|
|
819d0afed8 | ||
|
|
8467c584cb | ||
|
|
7cf77df7e5 | ||
|
|
edb29ae7a7 | ||
|
|
2cb1b84329 | ||
|
|
b3755be235 | ||
|
|
6fd4d4a461 | ||
|
|
b16525aa3b | ||
|
|
d6d609ae30 | ||
|
|
89d19b3904 | ||
|
|
5206bb33d1 | ||
|
|
4933b63783 | ||
|
|
c408f954d3 | ||
|
|
66ff95a2b0 | ||
|
|
8526a8d2de | ||
|
|
7bec58715e | ||
|
|
ac1153e9bb | ||
|
|
663a785048 | ||
|
|
e6aa002493 | ||
|
|
df39d6948c | ||
|
|
e1f420ef99 | ||
|
|
f55913599a | ||
|
|
d35680fb5d | ||
|
|
cbcd6876ff | ||
|
|
5dd670bd2e | ||
|
|
20daaf0f46 | ||
|
|
2ebb6d0930 | ||
|
|
ca4e0b2997 | ||
|
|
1e4f3b47cb | ||
|
|
66964d0ebc | ||
|
|
005ed196d5 | ||
|
|
07eacc8fb4 | ||
|
|
b97d527d07 | ||
|
|
0055fc9150 | ||
|
|
285c541f08 | ||
|
|
dfee9563e0 | ||
|
|
a6525fd8f4 | ||
|
|
c62e301431 | ||
|
|
89cb5e1b25 | ||
|
|
faac31760d | ||
|
|
c775b02470 | ||
|
|
1d83535e85 | ||
|
|
34035e3e01 | ||
|
|
193719d4a9 | ||
|
|
7b65761c4b | ||
|
|
c19b8f618d | ||
|
|
484e9a8789 | ||
|
|
08be96216a | ||
|
|
1d2203e1c3 | ||
|
|
86ca6b3835 | ||
|
|
4b37729c45 | ||
|
|
6f6d09ac3d | ||
|
|
85a4b5b163 | ||
|
|
9389b60a2a | ||
|
|
ac364ff42d | ||
|
|
f8f54a79ff | ||
|
|
b285dc2746 | ||
|
|
d3a3b2cb7f | ||
|
|
623071bfb3 | ||
|
|
c67f2f0212 | ||
|
|
7bf30f7332 | ||
|
|
f3d98c64e9 | ||
|
|
04453ff6fd | ||
|
|
16a97216ab | ||
|
|
3e413b9276 | ||
|
|
5de11e18af | ||
|
|
9fdc173034 | ||
|
|
6b147af435 | ||
|
|
cd7bff0998 | ||
|
|
eca9e3208f | ||
|
|
170cc15016 | ||
|
|
772c9641e1 | ||
|
|
7e2cc957b9 | ||
|
|
d51bd6a098 | ||
|
|
3a70037e8b | ||
|
|
457a56f7a0 | ||
|
|
7a6482c873 | ||
|
|
047e004f92 | ||
|
|
f9ff2b2ff3 | ||
|
|
3956bfc9bb | ||
|
|
1088a23e25 | ||
|
|
a2776279f0 | ||
|
|
3af4857d4a | ||
|
|
48a82996c8 | ||
|
|
fd16e6dc81 | ||
|
|
859c3cb259 | ||
|
|
721b9c6ef9 | ||
|
|
d5f4e280d2 | ||
|
|
dcff8ad7f1 | ||
|
|
1bb235d521 | ||
|
|
2fc15825d7 | ||
|
|
862cf3ffa3 | ||
|
|
c36e798c15 | ||
|
|
5770660ee7 | ||
|
|
e21f7385fb | ||
|
|
90c56d83d8 | ||
|
|
faa4397094 | ||
|
|
3c06e57779 | ||
|
|
dcaec2e717 | ||
|
|
cd097820bc | ||
|
|
e7eebce5cd | ||
|
|
1549268047 | ||
|
|
fb704d7b0d | ||
|
|
b2e60d696f | ||
|
|
a4b6d27172 | ||
|
|
c94bcdd579 | ||
|
|
314d432420 | ||
|
|
01ce0fd65f | ||
|
|
81927b8b20 | ||
|
|
d40d5139b3 | ||
|
|
2c42ca1377 | ||
|
|
e39cbf8f5e | ||
|
|
0c3b6e72f6 | ||
|
|
60505fba27 | ||
|
|
42e5f56ecb | ||
|
|
b57ad750ba | ||
|
|
b6b35d4584 | ||
|
|
3e52019dea | ||
|
|
fc3a0f8169 | ||
|
|
0d7435a926 | ||
|
|
ba6a36b6f1 | ||
|
|
ea4992c8b9 | ||
|
|
e882dd0320 | ||
|
|
0822323784 | ||
|
|
5776cee5f6 | ||
|
|
b4c01123db | ||
|
|
bcf34ec28a | ||
|
|
320a49da86 | ||
|
|
9c92e02f70 | ||
|
|
5f99b07a08 | ||
|
|
b5878cbe60 | ||
|
|
a3f87cbc04 | ||
|
|
92a770ee3e | ||
|
|
2dcb3a6360 | ||
|
|
abd919b06e | ||
|
|
08f2370477 | ||
|
|
a9415b745c | ||
|
|
01ddeaf4d7 | ||
|
|
7271ea30d6 | ||
|
|
43e6374c89 | ||
|
|
80dafc80ea | ||
|
|
85d12dec82 | ||
|
|
f3cf9cd7e1 | ||
|
|
11c81b7cc0 | ||
|
|
3a5af746ef | ||
|
|
261e890771 | ||
|
|
b6fabaaec4 | ||
|
|
c3363f01ab | ||
|
|
6051f2bed9 | ||
|
|
75fa4cd2c9 | ||
|
|
1254fec036 | ||
|
|
21f4faebee | ||
|
|
04cacf422e | ||
|
|
b051d4f1b3 | ||
|
|
668175520c | ||
|
|
947da034bb | ||
|
|
a9b3b78a13 | ||
|
|
9af1d10122 | ||
|
|
e6cd75747f | ||
|
|
13def2aa05 | ||
|
|
cb72509bae | ||
|
|
f501a209f5 | ||
|
|
685ee1e939 | ||
|
|
a90191a6ef | ||
|
|
63c53a497f | ||
|
|
1930d8bb89 | ||
|
|
94ad6902f7 | ||
|
|
829275bc4a | ||
|
|
a7a16746f5 | ||
|
|
dbfc56ac98 | ||
|
|
244f439694 | ||
|
|
a76446c04b | ||
|
|
8f7fa57b11 | ||
|
|
0c738b9916 | ||
|
|
c43bbe523d | ||
|
|
3fb53303e0 | ||
|
|
5b2a92cf14 | ||
|
|
165faa23dc | ||
|
|
6aec80f56c | ||
|
|
b175340397 | ||
|
|
7e3387355f | ||
|
|
608dfd532a | ||
|
|
1302bbc4c6 | ||
|
|
ecaff0dded | ||
|
|
2b5df064c6 | ||
|
|
1f63f66552 | ||
|
|
6f0834b9d6 | ||
|
|
b3f42cb5de | ||
|
|
019f9b00af | ||
|
|
ecb736ed74 | ||
|
|
197ff5f72c | ||
|
|
12d3af63f3 | ||
|
|
c3e1ef09ca | ||
|
|
9c39cdd505 | ||
|
|
16e1cab74f | ||
|
|
c6ea75f608 | ||
|
|
a0c216ea89 | ||
|
|
4340b515af | ||
|
|
ef0f38499a | ||
|
|
47d2fb3113 | ||
|
|
b73e7c4a44 | ||
|
|
3642db5f04 | ||
|
|
fd9f43bcd0 | ||
|
|
c0637c052f | ||
|
|
72a3a64383 | ||
|
|
4787082fa2 | ||
|
|
bbcb34cae5 | ||
|
|
44164d950b | ||
|
|
5a4c07278c | ||
|
|
6aa6d01cd2 | ||
|
|
ec395b1bbb | ||
|
|
5a3b12f451 | ||
|
|
950365bd83 | ||
|
|
e80d88905f | ||
|
|
6840306713 | ||
|
|
8947f5f18e | ||
|
|
a41b0855ad | ||
|
|
d81a56b25e | ||
|
|
f26517974c | ||
|
|
9bad2df974 | ||
|
|
d2fd76637b | ||
|
|
8b7376900b | ||
|
|
9986b920ae | ||
|
|
dad0ba6ba2 | ||
|
|
d4269143f6 | ||
|
|
69c9ae7ca1 | ||
|
|
da9efb447d | ||
|
|
5219a70614 | ||
|
|
ca1854f058 | ||
|
|
79a038f283 | ||
|
|
d6890613f4 | ||
|
|
c6c5364e5c | ||
|
|
bf4985ce65 | ||
|
|
5c857e41a8 | ||
|
|
85c92f04f3 | ||
|
|
b36f5ef953 | ||
|
|
c789b4707f | ||
|
|
4e09f48505 | ||
|
|
87e70ef5d2 | ||
|
|
89c54abec6 | ||
|
|
bca0c5779b | ||
|
|
81245bc471 | ||
|
|
74259b0f9b | ||
|
|
3f7e6e8112 | ||
|
|
0e2e9bd7e0 | ||
|
|
71afb05602 | ||
|
|
fb6ffdb483 | ||
|
|
05c3d1131e | ||
|
|
93c3e1beab | ||
|
|
7cfe3d36f2 | ||
|
|
d1cf6136e1 | ||
|
|
b9e537afdf | ||
|
|
62cb3bac48 | ||
|
|
492ec4ba0b | ||
|
|
e5c8ff6b69 | ||
|
|
62aa40ceea | ||
|
|
2e01bf6bb6 | ||
|
|
000f56e96d | ||
|
|
6dc5b1361b | ||
|
|
9cfe56a4dd | ||
|
|
b9057e4503 | ||
|
|
517b5beb7f | ||
|
|
e970f337e6 | ||
|
|
6e7f5acd4e | ||
|
|
bcb6a76472 | ||
|
|
061bbbeb2a | ||
|
|
501fbb83c9 | ||
|
|
6ca5a756fd | ||
|
|
c4649c0435 | ||
|
|
7d7dddbded | ||
|
|
f6ab509b13 | ||
|
|
33400e8177 | ||
|
|
f6e0245c40 | ||
|
|
21460d7c51 | ||
|
|
31675b540f | ||
|
|
1706a785da | ||
|
|
bf621a4371 | ||
|
|
a0ae93e039 | ||
|
|
51c4e9e98f | ||
|
|
4cd02f8b51 | ||
|
|
402d945997 | ||
|
|
e1da091a9b | ||
|
|
b72f301a8c | ||
|
|
f07e50fea1 | ||
|
|
5137bc73ef | ||
|
|
111db0229b | ||
|
|
f52b0f7f47 | ||
|
|
574c540048 | ||
|
|
5f3e4e40ae | ||
|
|
1b89309647 | ||
|
|
31d05b1c7e | ||
|
|
b2a75c32a7 | ||
|
|
541162b96f | ||
|
|
841a87a27d | ||
|
|
d432a47f61 | ||
|
|
bd6cf5a52c | ||
|
|
e52a6b797e | ||
|
|
ef1243d0c9 | ||
|
|
8309923834 | ||
|
|
47a0e7b5ec | ||
|
|
5eb6db9f51 | ||
|
|
3c651896ca | ||
|
|
4f6710713b | ||
|
|
92d3b9da23 | ||
|
|
3a68d867b9 | ||
|
|
d5497e822b | ||
|
|
018a16c326 | ||
|
|
f97a4d659d | ||
|
|
7c54303f04 | ||
|
|
913305f708 | ||
|
|
08d54cde12 | ||
|
|
90a23e70d7 | ||
|
|
a46343f75c | ||
|
|
dc3a3654c4 | ||
|
|
2439d9c403 | ||
|
|
5d3f91dcbd | ||
|
|
552e12722d | ||
|
|
2fc4646ada | ||
|
|
f01d3b6700 | ||
|
|
a197b9331e | ||
|
|
267da1e64e | ||
|
|
8ddb4d534b | ||
|
|
67083bb239 | ||
|
|
c6738cb0ad | ||
|
|
3af26d6f84 | ||
|
|
aecd02af65 | ||
|
|
ab558792a0 | ||
|
|
8f0df36664 | ||
|
|
a626c678c5 | ||
|
|
da5a5476e1 | ||
|
|
dd9dff7810 | ||
|
|
7b0e391f98 | ||
|
|
fa8094da2c | ||
|
|
7d202f64b0 | ||
|
|
b7b48d7815 | ||
|
|
6a483badac | ||
|
|
8756e51e1f | ||
|
|
338ed66325 | ||
|
|
7907ca2725 | ||
|
|
2481be3c17 | ||
|
|
922509742f | ||
|
|
12eeaab14f | ||
|
|
5ddd8d9565 | ||
|
|
1612137a98 | ||
|
|
72d7f0fcf8 | ||
|
|
60742c42b3 | ||
|
|
4acd35f27e | ||
|
|
a20c24b2e1 | ||
|
|
1c0ec3b441 | ||
|
|
195993ad4c | ||
|
|
a1cf420672 | ||
|
|
a65cd95ebe | ||
|
|
2b355ac6ed | ||
|
|
0d36a03130 | ||
|
|
a92b3b6c70 | ||
|
|
2ae73ef3b9 | ||
|
|
581377431c | ||
|
|
ad027d5ed6 | ||
|
|
9573b64759 | ||
|
|
7222f366dd | ||
|
|
a54562e035 | ||
|
|
747e201f4c | ||
|
|
866ff67c27 | ||
|
|
b895b5f1b5 | ||
|
|
f09ecd8a78 | ||
|
|
2ac91191f6 | ||
|
|
f29d2b89e2 | ||
|
|
86847b3435 | ||
|
|
6979da23ea | ||
|
|
22b307a967 | ||
|
|
40ab082d84 | ||
|
|
d6b3059ca9 | ||
|
|
93b80cf4e9 | ||
|
|
0085626e8e | ||
|
|
e132128e13 | ||
|
|
83ad72d797 | ||
|
|
52749424b6 | ||
|
|
1a4f39918d | ||
|
|
e8c7708afb | ||
|
|
d0249844c8 | ||
|
|
37de921473 | ||
|
|
42b4fd7e44 | ||
|
|
20500dcafb | ||
|
|
4678f529cb | ||
|
|
40240bda8d | ||
|
|
3a39529bef | ||
|
|
fa145a60f3 | ||
|
|
754e42f0d4 | ||
|
|
107c6bf7fe | ||
|
|
757f4ad4c4 | ||
|
|
a4d250c91d | ||
|
|
1bd31876ce | ||
|
|
420c5f2b7f | ||
|
|
19f41d4896 | ||
|
|
a450ee83c5 | ||
|
|
e3eedf90e8 | ||
|
|
e4e6ab960f | ||
|
|
4a45764a5c | ||
|
|
933b98aec2 | ||
|
|
ccdcbf2dfc | ||
|
|
c5e4078895 | ||
|
|
2bd55602cd | ||
|
|
c39b1bfacb | ||
|
|
48c6fea60a | ||
|
|
bfa91bad06 | ||
|
|
234d1356b3 | ||
|
|
561083d810 | ||
|
|
ebbf818206 | ||
|
|
7c653918f3 | ||
|
|
ba336baf46 | ||
|
|
e2c49a8945 | ||
|
|
38a1faae48 | ||
|
|
d4b4304ea7 | ||
|
|
f7069dc1f3 | ||
|
|
372032a114 | ||
|
|
a73500f662 | ||
|
|
32d990e0c4 | ||
|
|
c382d4b1c1 | ||
|
|
da63d95232 | ||
|
|
63ca2e0541 | ||
|
|
bfa3126cbc | ||
|
|
53c23dfe00 | ||
|
|
a072e89040 | ||
|
|
5c6221667c | ||
|
|
fd1add50ef | ||
|
|
953c96f188 | ||
|
|
ad25cf23a5 | ||
|
|
6bef590bdd | ||
|
|
92a29a7736 | ||
|
|
e41ae36a70 | ||
|
|
833cbec9f9 | ||
|
|
5d36e88aae | ||
|
|
8302a83136 | ||
|
|
99b61a5333 | ||
|
|
80e6d7c72c | ||
|
|
6d0a673c40 | ||
|
|
a2bfb5601f | ||
|
|
8f67b8f58e | ||
|
|
0147c91077 | ||
|
|
062c53a3a7 | ||
|
|
c29883ef18 | ||
|
|
a938f1203b | ||
|
|
a8cb27534b | ||
|
|
8cad1c6049 | ||
|
|
5e6279c872 | ||
|
|
e4c6906c49 | ||
|
|
7c86637d86 | ||
|
|
e118dcfb72 | ||
|
|
ce775713f6 | ||
|
|
1325fa1b23 | ||
|
|
ae520f39fb | ||
|
|
c8ba32bc7d | ||
|
|
2c2d91ae60 | ||
|
|
50f9b66210 | ||
|
|
26489affbb | ||
|
|
20f667b163 | ||
|
|
147d00ea48 | ||
|
|
7a0e6613b6 | ||
|
|
b480ca039c | ||
|
|
af11c1b407 | ||
|
|
2448ca936d | ||
|
|
ce95010582 | ||
|
|
6b51f62caf | ||
|
|
d804ac28b9 | ||
|
|
5ff1045b54 | ||
|
|
b9ce500c0c | ||
|
|
eda0d3a3f6 | ||
|
|
11eb21aa1f | ||
|
|
56b2db5817 | ||
|
|
14d6d0eaa4 | ||
|
|
a2aa796cda | ||
|
|
8469ce20e5 | ||
|
|
c6bce18981 | ||
|
|
7564ef08d6 | ||
|
|
72fa3e9b3c | ||
|
|
9139217694 | ||
|
|
714b7ade2f | ||
|
|
1561d7b6b4 | ||
|
|
342616a451 | ||
|
|
ae91292604 | ||
|
|
5115b71ce8 | ||
|
|
2a4c5a1c56 | ||
|
|
5f937eb6ea | ||
|
|
8078dff380 | ||
|
|
7a57ddef4b | ||
|
|
73cae5d93a | ||
|
|
c9cf69ee54 | ||
|
|
fbde005657 | ||
|
|
d5422a20b3 | ||
|
|
51c167adf6 | ||
|
|
0acbd692b8 | ||
|
|
d2c3004c63 | ||
|
|
541e0cff50 | ||
|
|
4f9223dab7 | ||
|
|
b020676abb | ||
|
|
351965e397 | ||
|
|
2187c6cadd | ||
|
|
27800f2100 | ||
|
|
4fa352c5fc | ||
|
|
8a83899eba | ||
|
|
d228f8dbe0 | ||
|
|
57bd744aba | ||
|
|
8353c17ea6 | ||
|
|
6641a075ea | ||
|
|
a0be24b379 | ||
|
|
38916c8bfd | ||
|
|
bc2ad87997 | ||
|
|
c3e18ae04c | ||
|
|
48b47727fa | ||
|
|
52353475f4 | ||
|
|
5e91f9d69c | ||
|
|
765ba5632a | ||
|
|
4e9836fa17 | ||
|
|
c2776532c5 | ||
|
|
ebd13be2c5 | ||
|
|
28b3715da2 | ||
|
|
e0792ad185 | ||
|
|
227f258789 | ||
|
|
2830ec29b6 | ||
|
|
d18fd1cd4a | ||
|
|
7c8634e948 | ||
|
|
dafde17b4f | ||
|
|
7571abd272 | ||
|
|
78c861801e | ||
|
|
fa8fd97000 | ||
|
|
bd1c686c18 | ||
|
|
96f2b96c29 | ||
|
|
2c440cdfa8 | ||
|
|
5a1de62955 | ||
|
|
89ec592e51 | ||
|
|
253865d22f | ||
|
|
b1bd71033e | ||
|
|
032b27503d | ||
|
|
d4ab62bfcb | ||
|
|
2898a64249 | ||
|
|
7c81da0c41 | ||
|
|
d0d9387c85 | ||
|
|
af9cfe3e93 | ||
|
|
6b0f82b322 | ||
|
|
fec4dc0535 | ||
|
|
e48ebfad92 | ||
|
|
0876536e9a | ||
|
|
318ad1776b | ||
|
|
7916ea3bd4 | ||
|
|
2e12e27c49 | ||
|
|
4befcc49ee | ||
|
|
8b5e6820ea | ||
|
|
8d27db3d09 | ||
|
|
6e5cabc67b | ||
|
|
4a8598aeee | ||
|
|
01d73e7642 | ||
|
|
a7f37954b9 | ||
|
|
c0e7e9ad57 | ||
|
|
06fcbb6060 | ||
|
|
8819f589d4 | ||
|
|
47200eb0fa | ||
|
|
56fab86483 | ||
|
|
fa2f9de5d7 | ||
|
|
4372f2b307 | ||
|
|
9bc25990ab | ||
|
|
83d5e75695 | ||
|
|
f1757d70f7 | ||
|
|
a71f0184e1 | ||
|
|
1ab6bb017a | ||
|
|
1457c5c9f8 | ||
|
|
7befbac499 | ||
|
|
1fcc834cd3 | ||
|
|
d0e17bf396 | ||
|
|
3729431a8c | ||
|
|
4f0ff76d64 | ||
|
|
3873129a8b | ||
|
|
1bacdc2674 | ||
|
|
10b621fd3d | ||
|
|
e2abb169ee | ||
|
|
ee650fb957 | ||
|
|
4d143d5ef4 | ||
|
|
e5059e353c | ||
|
|
75cad8fc20 | ||
|
|
1da7077174 | ||
|
|
9f20352d24 | ||
|
|
09dd775333 | ||
|
|
cf696ffeb7 | ||
|
|
ce95cd7d81 | ||
|
|
0d65ac18e1 | ||
|
|
3afb3554e8 | ||
|
|
7331e90d2b | ||
|
|
82ce3554fc | ||
|
|
3455c72cc3 | ||
|
|
01f9a10dd1 | ||
|
|
8615067f19 | ||
|
|
41a5d95de9 | ||
|
|
3daae59284 | ||
|
|
39805c2691 | ||
|
|
8c18af64cc | ||
|
|
8f98094d15 | ||
|
|
4f67105dfc | ||
|
|
7e364527f7 | ||
|
|
6011f9bb49 | ||
|
|
497967b693 | ||
|
|
7fdc3201c1 | ||
|
|
950cab82b6 | ||
|
|
92e9c9eb74 | ||
|
|
b80196822f | ||
|
|
b355f5e8f8 | ||
|
|
1c7838d256 | ||
|
|
5aac2cf484 | ||
|
|
cf912cc3fa | ||
|
|
6b419252d1 | ||
|
|
65158e8ec1 | ||
|
|
c1b3629448 | ||
|
|
01e0a25d3f | ||
|
|
de7c7b2f96 | ||
|
|
719bbcba8c | ||
|
|
cd7fb325fb | ||
|
|
2983cdabfc | ||
|
|
04e2675604 | ||
|
|
bf4ba7269c | ||
|
|
e2897f2d83 | ||
|
|
e6caf05501 | ||
|
|
8f9b75b6c5 | ||
|
|
4b04adb789 | ||
|
|
cfb0962150 | ||
|
|
319cb50c59 | ||
|
|
c3acd8cc63 | ||
|
|
49a3984859 | ||
|
|
15e9ad716a | ||
|
|
2222549327 | ||
|
|
1761a014c4 | ||
|
|
1f83a9634f | ||
|
|
274b9cbd68 | ||
|
|
c5a3077cdb | ||
|
|
19bce6b31e | ||
|
|
da41d31b72 | ||
|
|
cd9dcad8f7 | ||
|
|
e90e81a8b2 | ||
|
|
0803c60bab | ||
|
|
1b2053c29a | ||
|
|
e006e0d7d3 | ||
|
|
d86336c526 | ||
|
|
a2e5b4b79e | ||
|
|
040dbf65a5 | ||
|
|
d1162b7a7d | ||
|
|
c9dfb08a40 | ||
|
|
694eb258d2 | ||
|
|
88291c196a | ||
|
|
5260f1ecfb | ||
|
|
54e25d9c59 | ||
|
|
a5b1435576 | ||
|
|
f7cae08993 | ||
|
|
18ca4cc0e0 | ||
|
|
c6f2b57122 | ||
|
|
2e0e871d51 | ||
|
|
d145686f74 | ||
|
|
5af81c786f | ||
|
|
79976db976 | ||
|
|
2bffd0242b | ||
|
|
b5d073a39f | ||
|
|
5af440548c | ||
|
|
ec69c2d171 | ||
|
|
3d1cd95e77 | ||
|
|
8a13c2c46e | ||
|
|
da757a75c3 | ||
|
|
77350790c1 | ||
|
|
16d7e6a4ca | ||
|
|
30624667c5 | ||
|
|
e6eb52dcfc | ||
|
|
05b5d4854d | ||
|
|
1dfbcb34ca | ||
|
|
bc01bbd544 | ||
|
|
db075d462e | ||
|
|
e4c6547dda | ||
|
|
138eb0c9ed | ||
|
|
14a704d729 | ||
|
|
cb328d2c93 | ||
|
|
59f16554c8 | ||
|
|
4d0dd5634b | ||
|
|
688f9aa686 | ||
|
|
66da522ebb | ||
|
|
7ba08eb358 | ||
|
|
be85d93ba5 | ||
|
|
8989b900f1 | ||
|
|
3d5171e521 | ||
|
|
d43ad99dc9 | ||
|
|
d03f4237df | ||
|
|
dd87a6e58e | ||
|
|
f732cfcd9c | ||
|
|
a8d2e32d39 | ||
|
|
6d552297a4 | ||
|
|
9b417492e7 | ||
|
|
7b655abf2d | ||
|
|
4f286840ef | ||
|
|
c6038a269c | ||
|
|
695095763d | ||
|
|
dcb7abeba0 | ||
|
|
e9f9f7e196 | ||
|
|
0bc58c3fb2 | ||
|
|
054ae9686f | ||
|
|
b5975b6dab | ||
|
|
004093329e | ||
|
|
1f1a2931ca | ||
|
|
e465e76dd9 | ||
|
|
7ba9214992 | ||
|
|
ffaaa4dbee | ||
|
|
ff0c71a41e | ||
|
|
440bb0dacb | ||
|
|
87e9ebb0d3 | ||
|
|
6b49a934b9 | ||
|
|
372e1c8276 | ||
|
|
803f139c8c | ||
|
|
564838aa9f | ||
|
|
2c8288402d | ||
|
|
49bdb20677 | ||
|
|
cc46c0c1e3 | ||
|
|
d88afaa730 | ||
|
|
c3cd3a303c | ||
|
|
b561f4be59 | ||
|
|
9e28a21d73 | ||
|
|
596c769a32 | ||
|
|
ecfd027e95 | ||
|
|
7ad68bc2c2 | ||
|
|
195e819f19 | ||
|
|
f836adcb50 | ||
|
|
ff0dc5b95a | ||
|
|
73329e7d71 | ||
|
|
6ee5fd0dc8 | ||
|
|
ac59ef0a8a | ||
|
|
78fec47b65 | ||
|
|
e3551c5cf2 | ||
|
|
3ebd61b2b8 | ||
|
|
42b8547e81 | ||
|
|
24aaae9814 | ||
|
|
3666863bc5 | ||
|
|
a41267e62e | ||
|
|
2b207f1830 | ||
|
|
89afdc3012 | ||
|
|
ad0a6d2024 | ||
|
|
3764835d54 | ||
|
|
3e1492f581 | ||
|
|
31b281e524 | ||
|
|
c3c90e78d1 | ||
|
|
313e8dc921 | ||
|
|
51f702eee8 | ||
|
|
2a41c9ccd8 | ||
|
|
8363a9d567 | ||
|
|
3c074bee82 | ||
|
|
d3d8768535 | ||
|
|
d0d08c3bc2 | ||
|
|
4d707bec3b | ||
|
|
83fc458691 | ||
|
|
1b31a9b2e3 | ||
|
|
33d3ccc0ed | ||
|
|
b93863a6bf | ||
|
|
e2be3611c7 | ||
|
|
7b7521dae6 | ||
|
|
6af169f7c1 | ||
|
|
e2489faf7d | ||
|
|
35ab5d6f1e | ||
|
|
2119bdf506 | ||
|
|
1c1cfe9377 | ||
|
|
9184f6089f | ||
|
|
69252528e2 | ||
|
|
ea5ba348cf | ||
|
|
099dd58d31 | ||
|
|
0243be7d25 | ||
|
|
1b4493d749 | ||
|
|
8543ec9de1 | ||
|
|
2371996afa | ||
|
|
d4aa675a7a | ||
|
|
1eff197fda | ||
|
|
dc9e0d8e5e | ||
|
|
6f243629f1 | ||
|
|
933591bcc6 | ||
|
|
3839bc5e91 | ||
|
|
ae81707a09 | ||
|
|
902791f940 | ||
|
|
09a99c4500 | ||
|
|
88ffe4f4f7 | ||
|
|
9359bacfce | ||
|
|
d133acfa62 | ||
|
|
235ed8111a | ||
|
|
44a6239d1a | ||
|
|
6f01d2ddec | ||
|
|
f9d0b4192c | ||
|
|
3fe5c42fab | ||
|
|
31e91d4b79 | ||
|
|
5008ffc6ff | ||
|
|
29c4ae9114 | ||
|
|
6fdf6ea816 | ||
|
|
3cf26558df | ||
|
|
8df30d7d16 | ||
|
|
8f5720f5d4 | ||
|
|
fac188e2a1 | ||
|
|
ab29985231 | ||
|
|
0176f77da7 | ||
|
|
c324db6b3a | ||
|
|
5af7fbaef1 | ||
|
|
1904fce7f0 | ||
|
|
c662cb800c | ||
|
|
db69b85a44 | ||
|
|
ea242c4152 | ||
|
|
72470fb669 | ||
|
|
9b25b48eb5 | ||
|
|
6c85dbdf82 | ||
|
|
bf9a6cfbbe | ||
|
|
905d8c3876 | ||
|
|
16b0d830e0 | ||
|
|
aedc40a688 | ||
|
|
de5ce5200a | ||
|
|
9b904cb60e | ||
|
|
07ac6e3944 | ||
|
|
1e0a33f94b | ||
|
|
950ef5db5f | ||
|
|
f8d9b81bd8 | ||
|
|
22987c2002 | ||
|
|
61a0d748c5 | ||
|
|
21215a266c | ||
|
|
85b70ccab8 | ||
|
|
4e9fb2d798 | ||
|
|
3ca325dfec | ||
|
|
49f20de98d | ||
|
|
8a57b4919d | ||
|
|
4cf87d31c4 | ||
|
|
e1be039861 | ||
|
|
1f7018969b | ||
|
|
1d94473d81 | ||
|
|
6f7628d51b | ||
|
|
54b170cae6 | ||
|
|
bfe328734b | ||
|
|
7e696ef816 | ||
|
|
57b2e7d657 | ||
|
|
1ed9f8bee4 | ||
|
|
801f286ea5 | ||
|
|
75a44fc397 | ||
|
|
9d501b2185 | ||
|
|
08c0aae9a5 | ||
|
|
45dd7acb3d | ||
|
|
2d561d5f4a | ||
|
|
78196d9d1e | ||
|
|
b46a240711 | ||
|
|
dfb4e5ba86 | ||
|
|
d9936eb807 | ||
|
|
59e7e0e273 | ||
|
|
8349283fcc | ||
|
|
a09e05f356 | ||
|
|
8f5315532b | ||
|
|
aab1311df9 | ||
|
|
205c3e04ff | ||
|
|
f5c49c8a6e | ||
|
|
b6bb626f2b | ||
|
|
c574df203d | ||
|
|
697f71b9a9 | ||
|
|
dec6ee1fcb | ||
|
|
bf7b0f322a | ||
|
|
eba462998f | ||
|
|
a6ac6ad76d | ||
|
|
082a0160a2 | ||
|
|
cb965fd0a3 | ||
|
|
d9ed6113f3 | ||
|
|
b517470c4a | ||
|
|
6b73d03a3c | ||
|
|
4c491044b6 | ||
|
|
8febdc5117 | ||
|
|
e379b9bbf6 | ||
|
|
57bab15116 | ||
|
|
336285d438 | ||
|
|
951d37b3ff | ||
|
|
69137bfded | ||
|
|
05b545c2c5 | ||
|
|
62b39e68a4 | ||
|
|
1a38055019 | ||
|
|
8ca2803e92 | ||
|
|
86dd2c0994 | ||
|
|
167dfe751c | ||
|
|
b3e142ee35 | ||
|
|
eec691dbeb | ||
|
|
7483d42f14 | ||
|
|
79efb93c70 | ||
|
|
1d78413c74 | ||
|
|
a9754642bd | ||
|
|
c75d29f5e3 | ||
|
|
ae9188df9b | ||
|
|
79ff914720 | ||
|
|
82df3da1b0 | ||
|
|
97ae62b7e6 | ||
|
|
fef8f7118a | ||
|
|
95bc6100aa | ||
|
|
8c89627626 | ||
|
|
736e91655f | ||
|
|
d15520516a | ||
|
|
55465fd4a6 | ||
|
|
a1e16a3b2e | ||
|
|
d84783f886 | ||
|
|
33af5c4df3 | ||
|
|
f06747ebeb | ||
|
|
41565403d4 | ||
|
|
0ddbe68676 | ||
|
|
bbb3f94335 | ||
|
|
108e0e3bf5 | ||
|
|
1f48ceec47 | ||
|
|
485477a368 | ||
|
|
0a5a30e17c | ||
|
|
28eeb8fd3c | ||
|
|
165538cc11 | ||
|
|
1d882b99aa | ||
|
|
8bb09e6767 | ||
|
|
f80cf53231 | ||
|
|
c271d2fea6 | ||
|
|
f2285030f9 | ||
|
|
072c2dc4ab | ||
|
|
6e0521962e | ||
|
|
252f960651 | ||
|
|
271c4a9a7a | ||
|
|
292fc18311 | ||
|
|
8efd6f5207 | ||
|
|
be23fd6dc4 | ||
|
|
a538965656 | ||
|
|
62e6e41b86 | ||
|
|
398ebb5025 | ||
|
|
3b1fd5d4b5 | ||
|
|
2e769a153c | ||
|
|
04e772ce31 | ||
|
|
2608ceb6f7 | ||
|
|
dae658ecef | ||
|
|
445e56309a | ||
|
|
b472992872 | ||
|
|
568e9fb3e3 | ||
|
|
ad553e8e22 | ||
|
|
93ec60c75c | ||
|
|
91fe77784e | ||
|
|
f52e3a6d43 | ||
|
|
ad4bdf1cbe | ||
|
|
112bcd7856 | ||
|
|
cdaa3de08e | ||
|
|
7d9442cbb2 | ||
|
|
c0b299231d | ||
|
|
19f6370294 | ||
|
|
57cc779ebe | ||
|
|
4db612a708 | ||
|
|
3030e697b4 | ||
|
|
41d8969cb5 | ||
|
|
68a0b57b89 | ||
|
|
dc1b5991ca | ||
|
|
220d50e5a6 | ||
|
|
dca064ff86 | ||
|
|
1e0ca02fd3 | ||
|
|
a415627888 | ||
|
|
b59819d1c7 | ||
|
|
2c8aa1b16e | ||
|
|
ed56e666ec | ||
|
|
31972f6962 | ||
|
|
9124826b25 | ||
|
|
e9011a695d | ||
|
|
eb827af331 | ||
|
|
2adaa3ecf3 | ||
|
|
2ca35674da | ||
|
|
76cb04904f | ||
|
|
7ecbecc9a8 | ||
|
|
9d18af368d | ||
|
|
2cfea5f582 | ||
|
|
6ed3ae9458 | ||
|
|
b708797e87 | ||
|
|
214c9b7e2a | ||
|
|
6c2c23924d | ||
|
|
45034ef8a6 | ||
|
|
cedf4806e4 | ||
|
|
e773632860 | ||
|
|
72344b29b0 | ||
|
|
6694e1975b | ||
|
|
2f600a6b58 | ||
|
|
aaa473edbf | ||
|
|
7b1a960d5b | ||
|
|
336c2b2aa2 | ||
|
|
5664619289 | ||
|
|
af0debb6a9 | ||
|
|
19466fa4a4 | ||
|
|
5ea9066e73 | ||
|
|
55e39205dc | ||
|
|
ad652de055 | ||
|
|
56a8f5967d | ||
|
|
4ee2668013 | ||
|
|
1c0896dd7b | ||
|
|
dcc55d8564 | ||
|
|
b15782bd07 | ||
|
|
358b1b0af0 | ||
|
|
b84dfd06ee | ||
|
|
3c6042c0f8 | ||
|
|
afea9fc91f | ||
|
|
7cf104cdd3 | ||
|
|
7c84202d60 | ||
|
|
255bb23bcd | ||
|
|
094db5b7fa | ||
|
|
7da065dd79 | ||
|
|
5b12b73fa3 | ||
|
|
d01308ac9e | ||
|
|
7420bfc587 | ||
|
|
f9896c5776 | ||
|
|
17d502dd91 | ||
|
|
992c628bff | ||
|
|
54214a0918 | ||
|
|
432945e380 | ||
|
|
b118f84ea0 | ||
|
|
f0b3e6e381 | ||
|
|
1fd40c307c | ||
|
|
7d32052950 | ||
|
|
64a0bdd03e | ||
|
|
8b20543e99 | ||
|
|
563b810fec | ||
|
|
10e699a0c7 | ||
|
|
25fcc515f6 | ||
|
|
163edf5ed9 | ||
|
|
8e9851b3c8 | ||
|
|
575d32246f | ||
|
|
901f0dbf46 | ||
|
|
c72b6a0500 | ||
|
|
3129030838 | ||
|
|
460e72f094 | ||
|
|
c9c362b9a9 | ||
|
|
b1e9a4a1e3 | ||
|
|
faadbfe4a3 | ||
|
|
47d918b144 | ||
|
|
26611cec75 | ||
|
|
bdc4c121ab | ||
|
|
dc181b0b75 | ||
|
|
93ae51f1ba | ||
|
|
7b08997009 | ||
|
|
70339816f7 | ||
|
|
65b3688812 | ||
|
|
37173bd7fb | ||
|
|
c46f5444b0 | ||
|
|
a6e56c42a5 | ||
|
|
30e927e3db | ||
|
|
c62103efe3 | ||
|
|
2c26232aac | ||
|
|
c369409661 | ||
|
|
038f1d361f | ||
|
|
4f2891ae1e | ||
|
|
b1f98201c1 | ||
|
|
c5bb141696 | ||
|
|
55b1dc6a1a | ||
|
|
287f3b8c83 | ||
|
|
09fca1ca7e | ||
|
|
7b0eb9bd81 | ||
|
|
f6b03204dc | ||
|
|
24f0a5e516 | ||
|
|
cae2fdb421 | ||
|
|
a2ae74a9d6 | ||
|
|
d08ce1dfdb | ||
|
|
0e5beb085a | ||
|
|
43e9bd1e6f | ||
|
|
1897ed4494 | ||
|
|
48c474c99d | ||
|
|
6f4916fa7b | ||
|
|
aa4205e868 | ||
|
|
febbc8c2ae | ||
|
|
722b97d207 | ||
|
|
35aa491288 | ||
|
|
84896fcc28 | ||
|
|
e35d1ca5ef | ||
|
|
e2469be380 | ||
|
|
050187987f | ||
|
|
e39fc84722 | ||
|
|
22b9d0f698 | ||
|
|
0bbcc75b1e | ||
|
|
ca1d9f7fb8 | ||
|
|
4ccb48f659 | ||
|
|
c1e9e80a3f | ||
|
|
c3daa7416b | ||
|
|
aa36791efd | ||
|
|
231c76c874 | ||
|
|
66e669c06a | ||
|
|
b44ec76bd0 | ||
|
|
6113095ba9 | ||
|
|
3475bc4aba | ||
|
|
ae406ee1eb | ||
|
|
c2b14d454a | ||
|
|
6cb9f9d176 | ||
|
|
55ece86d76 | ||
|
|
cd46d8ea1d | ||
|
|
37de7ba685 | ||
|
|
a92fe417f0 | ||
|
|
1cbef1d6a5 | ||
|
|
384e1cd2cd | ||
|
|
ba59bd78ae | ||
|
|
99a3589c77 | ||
|
|
9096e0a8c2 | ||
|
|
bd9637b8f5 | ||
|
|
2d36c5935d | ||
|
|
2ac79b3ae8 | ||
|
|
b03bcefc7d | ||
|
|
0971e2a150 | ||
|
|
17e555938f | ||
|
|
e8896b88d0 | ||
|
|
5f85d28d3f | ||
|
|
73d75255a9 | ||
|
|
916fc33f07 | ||
|
|
694a37df39 | ||
|
|
49fa404295 | ||
|
|
250253ae92 | ||
|
|
776a5bb53a | ||
|
|
23fdec1d3e | ||
|
|
1b1dfc2f9c | ||
|
|
dbd1279239 | ||
|
|
4cd231b7e2 | ||
|
|
d39c16248f | ||
|
|
8f36765f5b | ||
|
|
4040bbc39d | ||
|
|
634219efc8 | ||
|
|
e7be0ba557 | ||
|
|
9b82fd92d2 | ||
|
|
7cbfc3ccae | ||
|
|
a0b58dfde6 | ||
|
|
e34472afd3 | ||
|
|
1ac87df83f | ||
|
|
b16e181651 | ||
|
|
5f57a90aee | ||
|
|
d0c84e2ab3 | ||
|
|
960b7a262a | ||
|
|
761841b937 | ||
|
|
68dcd628ef | ||
|
|
d36120f54a | ||
|
|
aba88af339 | ||
|
|
0d477445df | ||
|
|
8262dbb7ff | ||
|
|
1c71f37716 | ||
|
|
1279e795f2 | ||
|
|
339b7338bc | ||
|
|
d76c4802c5 | ||
|
|
2e1eb9e479 | ||
|
|
9fec422d26 | ||
|
|
71062ef692 | ||
|
|
9f14fa0abd | ||
|
|
daaaaf7d14 | ||
|
|
c90ab17d11 | ||
|
|
3c7fd028dd | ||
|
|
d3a2490192 | ||
|
|
05ea98d3e7 | ||
|
|
37ae7ef4aa | ||
|
|
96ea4ba32d | ||
|
|
7a76c4bf69 | ||
|
|
f0b8f9d819 | ||
|
|
4ecedd7a08 | ||
|
|
916e6496ba | ||
|
|
83a9779cf8 | ||
|
|
d91c6aeafb | ||
|
|
16fe48bee8 | ||
|
|
642124b863 | ||
|
|
ecd82c9b55 | ||
|
|
3d5f9a5485 | ||
|
|
db55cfc74a | ||
|
|
53a484ddc5 | ||
|
|
f64186bb36 | ||
|
|
fbea8f365d | ||
|
|
5ceb1037a2 | ||
|
|
1fb2725c84 | ||
|
|
880bed3b68 | ||
|
|
b34e652054 | ||
|
|
d1fbaaf35b | ||
|
|
97bf327405 | ||
|
|
5b39bed1eb | ||
|
|
4501e63431 | ||
|
|
ac6fe3705e | ||
|
|
8f5f80a54e | ||
|
|
6ea457812e | ||
|
|
f4cb6f3d54 | ||
|
|
70299670e4 | ||
|
|
61de98d363 | ||
|
|
6be2c24b30 | ||
|
|
767c4891e6 | ||
|
|
b447102151 | ||
|
|
97e3a03f37 | ||
|
|
f433222d9f | ||
|
|
b5376237af | ||
|
|
969571f77a | ||
|
|
4bfaf07b98 | ||
|
|
50f93caf65 | ||
|
|
8e075dd746 | ||
|
|
0929485a45 | ||
|
|
e6c4ac12d4 | ||
|
|
6d865ed960 | ||
|
|
296696a586 | ||
|
|
31d25714bf | ||
|
|
b29f8a9406 | ||
|
|
7dd5cf1864 | ||
|
|
c7b863e916 | ||
|
|
74df26fb32 | ||
|
|
44e10992bf | ||
|
|
1e5d155104 | ||
|
|
3fd5294345 | ||
|
|
357ef23c0d | ||
|
|
b3810ba716 | ||
|
|
5f729b9eea | ||
|
|
2f8768beaa | ||
|
|
2bef8c073c | ||
|
|
3f80217975 | ||
|
|
b38c7fda35 | ||
|
|
486112e022 | ||
|
|
0d6a3fca83 | ||
|
|
74c70ba559 | ||
|
|
1dccf9f8bf | ||
|
|
bbcaeda58d | ||
|
|
3419b149b8 | ||
|
|
9986a37299 | ||
|
|
6d7fe87ed3 | ||
|
|
7fcbcd3930 | ||
|
|
31f43a3194 | ||
|
|
554c997dd8 | ||
|
|
31d8c188df | ||
|
|
27ac0cd984 | ||
|
|
74a9f4c75c | ||
|
|
33cb713044 | ||
|
|
4736212345 | ||
|
|
88f38cf541 | ||
|
|
ad4b3de384 | ||
|
|
96066cef33 | ||
|
|
b14f889f5c | ||
|
|
bff3095937 | ||
|
|
83c4c884bc | ||
|
|
319f388fdd | ||
|
|
cf2810fcc5 | ||
|
|
c75dfd3d92 | ||
|
|
1d999b07c3 | ||
|
|
181912ea63 | ||
|
|
4e632bf465 | ||
|
|
f7a365c830 | ||
|
|
c5d233a715 | ||
|
|
85ac5095c4 | ||
|
|
17e27eb287 | ||
|
|
5f24238648 | ||
|
|
47c87cffa0 | ||
|
|
5ff16a4c44 | ||
|
|
bbd6575748 | ||
|
|
543baa4e04 | ||
|
|
ea2abe2723 | ||
|
|
e593c613f2 | ||
|
|
a4a906c8b3 | ||
|
|
564ca842cb | ||
|
|
2551545d74 | ||
|
|
e22453b3e7 | ||
|
|
e9054920b6 | ||
|
|
8bb705d288 | ||
|
|
5bdb01b7cc | ||
|
|
16b8c61c33 | ||
|
|
d1e6c73990 | ||
|
|
bd0d992cf9 | ||
|
|
f054fe34c1 | ||
|
|
dc8c7fbdcc | ||
|
|
2b0bd17bf9 | ||
|
|
a462f37629 | ||
|
|
003b48f7e6 | ||
|
|
63b17c6178 | ||
|
|
7a0d7f14f0 | ||
|
|
4dfc123151 | ||
|
|
9f9d2d9360 | ||
|
|
e4cb7a93cd | ||
|
|
85b0ba1605 | ||
|
|
2f40567ff4 | ||
|
|
af1b66a3b7 | ||
|
|
dcbb63a9ae | ||
|
|
3793d0b229 | ||
|
|
b5e9360d52 | ||
|
|
aada21cc2b | ||
|
|
c4019ccfd9 | ||
|
|
9c5236ac27 | ||
|
|
09fdb5cefa | ||
|
|
3634b50514 | ||
|
|
0bc8affb30 | ||
|
|
3bb9e81912 | ||
|
|
d692ab5920 | ||
|
|
1e1dc5ec35 | ||
|
|
d3f72c9edd | ||
|
|
ce2ff74d79 | ||
|
|
d187b85f13 | ||
|
|
883086ac48 | ||
|
|
b59db80b22 | ||
|
|
3170329911 | ||
|
|
a1fadeb5d4 | ||
|
|
77e04ec08b | ||
|
|
5666ca7c65 | ||
|
|
019d6c3a00 | ||
|
|
cf5327b44c | ||
|
|
27edf8ced1 | ||
|
|
5f2cd6d185 | ||
|
|
a3db17ba4d | ||
|
|
d24ab904fd | ||
|
|
2742edd708 | ||
|
|
feae7c47f8 | ||
|
|
4114221ec2 | ||
|
|
2c89c33e2a | ||
|
|
cfbb84ef57 | ||
|
|
77d8c53c77 | ||
|
|
1f9ba0a4fd | ||
|
|
bc96e7a362 | ||
|
|
f21680f92b | ||
|
|
38ef180037 | ||
|
|
6d37d875fb | ||
|
|
73c1f62267 | ||
|
|
12f33631de | ||
|
|
66bd741b2d | ||
|
|
a89ab65148 | ||
|
|
ab9093bda1 | ||
|
|
b23a509d3d | ||
|
|
563ab6b9ff | ||
|
|
59699b0305 | ||
|
|
9cc93b9942 | ||
|
|
904bddc982 | ||
|
|
faf327efea | ||
|
|
dcb010903d | ||
|
|
c442ed85e7 | ||
|
|
2f0ad0bb2a | ||
|
|
e39081a494 | ||
|
|
ac21f3c757 | ||
|
|
060ba67030 | ||
|
|
1cbe737ca8 | ||
|
|
5a8f5e841c | ||
|
|
60dae510cc | ||
|
|
dd22d60889 | ||
|
|
92328805fd | ||
|
|
5dd4c869a5 | ||
|
|
6477c4df36 | ||
|
|
b01acbc03f | ||
|
|
61fbbfe3d8 | ||
|
|
96aa7c4cab | ||
|
|
267a7a1be1 | ||
|
|
8a356767ba | ||
|
|
9e573f4823 | ||
|
|
284d3f41a0 | ||
|
|
0f6832b2e5 | ||
|
|
ec98087c13 | ||
|
|
07f9b4f21b | ||
|
|
07be960d6f | ||
|
|
2b6bf58e12 | ||
|
|
e0d7c59065 | ||
|
|
2be51e0e3d | ||
|
|
4e7993931c | ||
|
|
eb8db8b9e3 | ||
|
|
5b6c96ccec | ||
|
|
cc9c65fd33 | ||
|
|
7ee675aa5c | ||
|
|
33f59b8fe7 | ||
|
|
498a53e080 | ||
|
|
82f0e36033 | ||
|
|
4c4c8dc576 | ||
|
|
0ad032158b | ||
|
|
1e957aeabf | ||
|
|
0a9e81aee6 | ||
|
|
db6f345542 | ||
|
|
85629b2009 | ||
|
|
a0c0cad5ee | ||
|
|
23203274e1 | ||
|
|
ca0e860aad | ||
|
|
f2701fc6c1 | ||
|
|
42a8ce1819 | ||
|
|
041b6ee88f | ||
|
|
9cfa0c0ce9 | ||
|
|
f09e3ea1e5 | ||
|
|
a57fa2b48e | ||
|
|
0493459fc2 | ||
|
|
d30348fb43 | ||
|
|
636648a34f | ||
|
|
5dc5355632 | ||
|
|
76f2740a29 | ||
|
|
7a6dc0eb84 | ||
|
|
5f75567e4b | ||
|
|
42a8a0c073 | ||
|
|
c40ed94c31 | ||
|
|
783880f6e8 | ||
|
|
35b77f688d | ||
|
|
d32c9061ef | ||
|
|
38b76deb5e | ||
|
|
d62d6167cb | ||
|
|
df6596d7d5 | ||
|
|
799c1c5aa3 | ||
|
|
97d0f55d16 | ||
|
|
cd8af291b1 | ||
|
|
6526877731 | ||
|
|
05eb2b020d | ||
|
|
6a6d30cd77 | ||
|
|
ef8f558dd4 | ||
|
|
f93d57d7f9 | ||
|
|
9fec27da40 | ||
|
|
a64ff3c8a7 | ||
|
|
0c178377f6 | ||
|
|
28825b6078 | ||
|
|
991927899d | ||
|
|
541715b927 | ||
|
|
54df72b3cc | ||
|
|
1570a91c9c | ||
|
|
509d9dfca8 | ||
|
|
bd6352dfcb | ||
|
|
0d9c49ac5e | ||
|
|
8b0263ed90 | ||
|
|
05490cbfc2 | ||
|
|
ac773f5bc3 | ||
|
|
6e64075198 | ||
|
|
8b211d1fa9 | ||
|
|
a224f4ccd8 | ||
|
|
8bd23fa7e1 | ||
|
|
3252f728d8 | ||
|
|
c11422844c | ||
|
|
273ba35ae8 | ||
|
|
64259f47bb | ||
|
|
0133c2f23e | ||
|
|
3292b0e782 | ||
|
|
4f78d16f9a | ||
|
|
dc23894ad1 | ||
|
|
22c139da7b | ||
|
|
9af7c41588 | ||
|
|
9948080efe | ||
|
|
170264bc5d | ||
|
|
5373a52046 | ||
|
|
4e26e587b4 | ||
|
|
529dad8737 | ||
|
|
9df7cab0b4 | ||
|
|
cf1a476161 | ||
|
|
fa7a3e02eb | ||
|
|
fe23056560 | ||
|
|
7b1f241dda | ||
|
|
53ba69c31a | ||
|
|
889a681b57 | ||
|
|
8239f1d6ec | ||
|
|
0899b8c4ab | ||
|
|
53985c2411 | ||
|
|
a90ba2106c | ||
|
|
e21dbcb787 | ||
|
|
f61a0528f1 | ||
|
|
a6ed988d81 | ||
|
|
9162bd9515 | ||
|
|
e29a0c8b55 | ||
|
|
57cd21ac6f | ||
|
|
73ecd33a20 | ||
|
|
9456c26510 | ||
|
|
ab9ec9002b | ||
|
|
7afb317d39 | ||
|
|
688df72baa | ||
|
|
d000b5e27b | ||
|
|
3287ffb8d0 | ||
|
|
6e150e61fe | ||
|
|
40510c4d74 | ||
|
|
de73749392 | ||
|
|
7f0409a57a | ||
|
|
79a8179842 | ||
|
|
a537a7e3f3 | ||
|
|
16a037f596 | ||
|
|
8a7ebb7354 | ||
|
|
43750b3ac6 | ||
|
|
67cb7c766d | ||
|
|
cd378fd709 | ||
|
|
8d281e2060 | ||
|
|
910cda2b26 | ||
|
|
b7dd3bf6ad | ||
|
|
60980ab5a0 | ||
|
|
c1b5bb5e7a | ||
|
|
8ecc76b8d6 | ||
|
|
bb6b71445c | ||
|
|
b1ee0e5e43 | ||
|
|
8a7c1d05b4 | ||
|
|
26f704b4d2 | ||
|
|
555ee900cb | ||
|
|
64c24f263d | ||
|
|
e3386e918f | ||
|
|
d7f5399107 | ||
|
|
e98cbe3873 | ||
|
|
f0e4f6a835 | ||
|
|
6afd37f4d1 | ||
|
|
9d249ca9ef | ||
|
|
b44a150c97 | ||
|
|
8e5040c66a | ||
|
|
4eefa9129a | ||
|
|
5c267b8d63 | ||
|
|
159449d6fe | ||
|
|
1efd84e640 | ||
|
|
d41add13ac | ||
|
|
e9cfdefff4 | ||
|
|
6a685d0806 | ||
|
|
cd7b729f54 | ||
|
|
d8f01e711e | ||
|
|
9189f9d140 | ||
|
|
519be9e690 | ||
|
|
32398552f4 | ||
|
|
94995450c1 | ||
|
|
69f4f58cbd | ||
|
|
3a4ec3b3c0 | ||
|
|
5d88a8b6d1 | ||
|
|
62797342b9 | ||
|
|
acc3be969d | ||
|
|
62d773656c | ||
|
|
e023750469 | ||
|
|
610011e141 | ||
|
|
5583da3e36 | ||
|
|
0729f895e9 | ||
|
|
5626fa7cfd | ||
|
|
ce51bfebef | ||
|
|
850a4981bc | ||
|
|
583cf0e706 | ||
|
|
4735181dca | ||
|
|
dbdbc2b7f8 | ||
|
|
c70ba67607 | ||
|
|
98175e38c4 | ||
|
|
c0bf1be7c1 | ||
|
|
48195b582f | ||
|
|
da4d852b6e | ||
|
|
c730387f5c | ||
|
|
8bc349b6ef | ||
|
|
dde575f5ea | ||
|
|
cedf5fb32b | ||
|
|
2f45a2dc44 | ||
|
|
9fd2bfd613 | ||
|
|
e04a8f0f98 | ||
|
|
ab34a5ba66 | ||
|
|
5c312b3d84 | ||
|
|
425bbafd83 | ||
|
|
92e23a0bfc | ||
|
|
34472e7e46 | ||
|
|
c9e26055b6 | ||
|
|
6d38f1ed82 | ||
|
|
162f0d444f | ||
|
|
cbd72e53d6 | ||
|
|
3b8f38808d | ||
|
|
863eb435a4 | ||
|
|
e50f074740 | ||
|
|
9c3e1dfc4b | ||
|
|
4b717763af | ||
|
|
d765337e57 | ||
|
|
e81fd8d0aa | ||
|
|
9d0d899f53 | ||
|
|
4ece106cf4 | ||
|
|
7e2645e9a4 | ||
|
|
9e2b2866ef | ||
|
|
0a4ddf27e3 | ||
|
|
e4b24fda80 | ||
|
|
526051018f | ||
|
|
13e2f6a252 | ||
|
|
53398998c2 | ||
|
|
364b8483df | ||
|
|
32573cfa8e | ||
|
|
ff051a6aab | ||
|
|
885baef845 | ||
|
|
e9d413e2db | ||
|
|
962a09c08e | ||
|
|
985d5a9ea2 | ||
|
|
0e52c823a6 | ||
|
|
e4f25fa7f0 | ||
|
|
0552dde787 | ||
|
|
58201949fc | ||
|
|
9b1c5e2b64 | ||
|
|
6bdfa81b7e | ||
|
|
e73bba2ae0 | ||
|
|
68cc112732 | ||
|
|
724ee411fc | ||
|
|
05ee1c51ad | ||
|
|
5bdb0e354f | ||
|
|
9fc86cf55b | ||
|
|
75cd1bdaa7 | ||
|
|
b9e558a817 | ||
|
|
72d4a7f61f | ||
|
|
d87d1f01eb | ||
|
|
456c48dde8 | ||
|
|
d44d9e80b9 | ||
|
|
0da93b1d4a | ||
|
|
f8336fba61 | ||
|
|
342b63160d | ||
|
|
23f15ddae5 | ||
|
|
4726ae7734 | ||
|
|
c15bf421ba | ||
|
|
379c263b65 | ||
|
|
9ab6046850 | ||
|
|
313f540db8 | ||
|
|
3821a7a131 | ||
|
|
84e2181672 | ||
|
|
b91fff1f9a | ||
|
|
807f378a1f | ||
|
|
5c91fa5e79 | ||
|
|
7a185a0809 | ||
|
|
cb8bb9c127 | ||
|
|
d949cb5228 | ||
|
|
e733774cd3 | ||
|
|
b7a547c1d6 | ||
|
|
5e860a4734 | ||
|
|
22b070d1d2 | ||
|
|
576e7e56ad | ||
|
|
503c9cff2c | ||
|
|
b1c4ae9cae | ||
|
|
be45e11453 | ||
|
|
0ad3a95b30 | ||
|
|
136dcee43f | ||
|
|
26d0f4da51 | ||
|
|
1d995b4f8a | ||
|
|
410dffcdd8 | ||
|
|
b7a8105b18 | ||
|
|
23577050b5 | ||
|
|
3d148c515c | ||
|
|
c5426947c8 | ||
|
|
9ba824122c | ||
|
|
fbba796f43 | ||
|
|
fafa596b11 | ||
|
|
aae94da9ec | ||
|
|
a11361c916 | ||
|
|
4ad5c16568 | ||
|
|
f15adb5d45 | ||
|
|
8009e2a4c5 | ||
|
|
ce571123d2 | ||
|
|
e86df8d3a2 | ||
|
|
198a69e0c5 | ||
|
|
8001a7f348 | ||
|
|
2480972e46 | ||
|
|
16d6b52429 | ||
|
|
aa9381d962 | ||
|
|
caaec622bb | ||
|
|
8163932184 | ||
|
|
60cef7b8d8 | ||
|
|
b89cc55127 | ||
|
|
70afc90bb0 | ||
|
|
caefdb79d0 | ||
|
|
d7af74ee3d | ||
|
|
1456ae089a | ||
|
|
21c8dde43f | ||
|
|
e67829d4f9 | ||
|
|
81d9ac07f4 | ||
|
|
23949ba4e6 | ||
|
|
fbd369320c | ||
|
|
623466d5c6 | ||
|
|
a8865fbd99 | ||
|
|
cfd7968c30 | ||
|
|
551f3a6a64 | ||
|
|
183f52a0e4 | ||
|
|
96e66fc839 | ||
|
|
44bda23f36 | ||
|
|
64ba407746 | ||
|
|
fb648dbec9 | ||
|
|
4ce6f49284 | ||
|
|
93b6ece77d | ||
|
|
af9e90e33d | ||
|
|
86cccc5764 | ||
|
|
2d057b39a9 | ||
|
|
a3ce1a1abd | ||
|
|
c8453cd936 | ||
|
|
ef9a83ad33 | ||
|
|
f7539ded45 | ||
|
|
929fb89e7f | ||
|
|
c5259c5870 | ||
|
|
12bd3ec5fd | ||
|
|
666137f847 | ||
|
|
48aa469b80 | ||
|
|
6e5c6ba219 | ||
|
|
862c526c56 | ||
|
|
abe25ff03a | ||
|
|
94a11e9a37 | ||
|
|
ad5021eea4 | ||
|
|
fd03db48c1 | ||
|
|
3c0826ca5c | ||
|
|
8762fa4f4e | ||
|
|
83dad53f2c | ||
|
|
d6a6350e62 | ||
|
|
3fb9756e42 | ||
|
|
8d3eebb0c1 | ||
|
|
d28dbd9b75 | ||
|
|
267d65174c | ||
|
|
abbfb77248 | ||
|
|
e288d7ec0c | ||
|
|
7f33ffbdac | ||
|
|
7fc6da3a66 | ||
|
|
a814d37e2b | ||
|
|
0710672275 | ||
|
|
3d2301cdb0 | ||
|
|
cd8244fb2a | ||
|
|
fd480290f5 | ||
|
|
7e6052573e | ||
|
|
9b659fb859 | ||
|
|
15314c65d5 | ||
|
|
4fedd34f95 | ||
|
|
f88eebb055 | ||
|
|
cefefb9a63 | ||
|
|
7e38593c3f | ||
|
|
0579b0ec60 | ||
|
|
7f14aca755 | ||
|
|
e396bd8531 | ||
|
|
0549986c77 | ||
|
|
34f58ad7f9 | ||
|
|
16fbba701c | ||
|
|
2635873bcc | ||
|
|
9c191f7f89 | ||
|
|
c7ea8cc974 | ||
|
|
ee3cd87e7e | ||
|
|
9463e7b24b | ||
|
|
e13aebbd89 | ||
|
|
e8f8ef22a9 | ||
|
|
0a8359a0de | ||
|
|
99f12a833b | ||
|
|
8d0c18d2d0 | ||
|
|
f0bfe70674 | ||
|
|
dd83d4d139 | ||
|
|
d53c2eb937 | ||
|
|
b56f049445 | ||
|
|
1e69e5495f | ||
|
|
d3047b2299 | ||
|
|
608f2eae88 | ||
|
|
2848efba56 | ||
|
|
1cd109e79b | ||
|
|
09c23507d0 | ||
|
|
5617a44086 | ||
|
|
d0be333511 | ||
|
|
636939542f | ||
|
|
91da14a8ed | ||
|
|
d9acfdd38b | ||
|
|
38e35002ea | ||
|
|
7f125f35b8 | ||
|
|
d04b16d9ab | ||
|
|
84700c3018 | ||
|
|
53a6368118 | ||
|
|
bdf696d273 | ||
|
|
2899e65f79 | ||
|
|
319e5b5949 | ||
|
|
999dd67304 | ||
|
|
4f428b93c5 | ||
|
|
256cb6c412 | ||
|
|
142b6b781d | ||
|
|
605272926a | ||
|
|
843df9e6cd | ||
|
|
9413e41fc3 | ||
|
|
2cecdb25a1 | ||
|
|
becc1bb576 | ||
|
|
6cb0d69c54 | ||
|
|
427482f60d | ||
|
|
06115ccd07 | ||
|
|
abff7287ec | ||
|
|
affb441247 | ||
|
|
8164948f92 | ||
|
|
66711b8542 | ||
|
|
d54cacb3fb | ||
|
|
d5bd6b32e2 | ||
|
|
1495b55d8e | ||
|
|
e81f07831e | ||
|
|
50dab305c9 |
@@ -1,31 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=4g-support
|
||||
PKG_VERSION:=1.0.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/4g-support
|
||||
CATEGORY:=Network
|
||||
TITLE:=4G Network Setup Tools
|
||||
endef
|
||||
|
||||
define Package/4g-support/description
|
||||
4g-support contains necessary tools to setup 4G WAN connection
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
$(CP) ./files/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/4g-support/install
|
||||
$(CP) ./files/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,4g-support))
|
||||
@@ -1,62 +0,0 @@
|
||||
opengt
|
||||
set com 115200n81
|
||||
set comecho off
|
||||
set senddelay 0.05
|
||||
waitquiet 1 0.2
|
||||
|
||||
:start
|
||||
if $env("USE_DISCONNECT")="1" goto disconnect
|
||||
send "AT^^NDISDUP=1,1,\""
|
||||
send $env("USE_APN")
|
||||
|
||||
if $env("USE_AUTHTYPE")="-1" goto noauth
|
||||
else goto auth
|
||||
|
||||
:noauth
|
||||
send "\"^m"
|
||||
goto result
|
||||
|
||||
:auth
|
||||
send "\",\""
|
||||
send $env("USE_USERID")
|
||||
send "\",\""
|
||||
send $env("USE_PASSWORD")
|
||||
send "\","
|
||||
send $env("USE_AUTHTYPE")
|
||||
send "^m"
|
||||
goto result
|
||||
|
||||
:result
|
||||
waitfor 5 "OK","ERR","ERROR"
|
||||
if % = 0 goto connok
|
||||
if % = 1 goto connerr
|
||||
if % = 2 goto connerr
|
||||
|
||||
:connok
|
||||
print "WWAN connection established.\r\n"
|
||||
goto done
|
||||
|
||||
:connerr
|
||||
print "WWAN error. Connection failed.\r\n"
|
||||
exit 1
|
||||
|
||||
:disconnect
|
||||
send "AT^^NDISDUP=1,0,\""
|
||||
send $env("USE_APN")
|
||||
send "\"^m"
|
||||
|
||||
waitfor 5 "OK","ERR","ERROR"
|
||||
if % = 0 goto disconnok
|
||||
if % = 1 goto disconnerr
|
||||
if % = 2 goto disconnerr
|
||||
|
||||
:disconnok
|
||||
print "WWAN connection disconnected.\r\n"
|
||||
goto done
|
||||
|
||||
:disconnerr
|
||||
print "WWAN disconnection error.\r\n"
|
||||
exit 1
|
||||
|
||||
:done
|
||||
exit 0
|
||||
@@ -1,35 +0,0 @@
|
||||
. /lib/network/config.sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
|
||||
iface_status() {
|
||||
local iface=$1
|
||||
local up
|
||||
json_load "$(ifstatus $iface)"
|
||||
json_get_var up up
|
||||
json_close_object
|
||||
return $up
|
||||
}
|
||||
|
||||
case "$ACTION" in
|
||||
add|register)
|
||||
if [ "${INTERFACE:0:4}" == "wwan" ]; then
|
||||
netname=$(get_network_of "$INTERFACE")
|
||||
for net in $netname; do
|
||||
local service=$(uci -q get network.$net.service)
|
||||
local cnt=0
|
||||
while $(iface_status $net); do
|
||||
ifup $net
|
||||
if [ "$service" == "qmi" ]; then
|
||||
cnt=$(($cnt+1))
|
||||
# quit trying if still not online after three times
|
||||
[ $cnt -eq 3 ] && break
|
||||
sleep 5
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
local usb_dir uVid uPid uMa uPr uSe bConf bNumConfs vendor product mdmtyp netdev comdev cdcdev ttydev interface usbno usbbr
|
||||
|
||||
sanitize() {
|
||||
sed -e 's/[[:space:]]\+$//; s/[[:space:]]\+/_/g' "$@"
|
||||
}
|
||||
|
||||
find_usb_attrs() {
|
||||
usb_dir="/sys/$DEVPATH"
|
||||
[ -f "$usb_dir/idVendor" ] || usb_dir="${usb_dir%/*}"
|
||||
|
||||
uVid=$(cat "$usb_dir/idVendor")
|
||||
uPid=$(cat "$usb_dir/idProduct")
|
||||
uMa=$(sanitize "$usb_dir/manufacturer")
|
||||
uPr=$(sanitize "$usb_dir/product")
|
||||
uSe=$(sanitize "$usb_dir/serial")
|
||||
bNumConfs=$(cat "$usb_dir/bNumConfigurations")
|
||||
bConf=$(cat "$usb_dir/bConfigurationValue")
|
||||
netdev=$(find $usb_dir -name wwan* | awk -F'/' '{print$NF}' | head -2 | tail -1)
|
||||
cdcdev=$(find $usb_dir -name cdc-wdm* | awk -F'/' '{print$NF}' | head -2 | tail -1)
|
||||
ttydev=$(ls $(find $usb_dir -name tty | head -2 | tail -1) | tail -1)
|
||||
interface=$(cat $usb_dir/interface)
|
||||
if [ -n "$cdcdev" ]; then
|
||||
comdev=$cdcdev
|
||||
mdmtyp=$(grep $uVid:$uPid /etc/modemdb | grep 'qmi\|mbim' | awk '{print$2}' | head -1)
|
||||
vendor=$(grep $uVid:$uPid /etc/modemdb | grep 'qmi\|mbim' | awk '{print$3}' | head -1)
|
||||
product=$(grep $uVid:$uPid /etc/modemdb | grep 'qmi\|mbim' | awk '{print$4}' | head -1)
|
||||
else
|
||||
comdev=$ttydev
|
||||
mdmtyp=$(grep $uVid:$uPid /etc/modemdb | grep 'ncm' | awk '{print$2}' | head -1)
|
||||
vendor=$(grep $uVid:$uPid /etc/modemdb | grep 'ncm' | awk '{print$3}' | head -1)
|
||||
product=$(grep $uVid:$uPid /etc/modemdb | grep 'ncm' | awk '{print$4}' | head -1)
|
||||
fi
|
||||
[ -n "$mdmtyp" ] || mdmtyp=$(grep $uVid:$uPid /etc/modemdb | awk '{print$2}' | head -1)
|
||||
[ -n "$vendor" ] || vendor=$(grep $uVid:$uPid /etc/modemdb | awk '{print$3}' | head -1)
|
||||
[ -n "$product" ] || product=$(grep $uVid:$uPid /etc/modemdb | awk '{print$4}' | head -1)
|
||||
}
|
||||
|
||||
convert_to_mbim() {
|
||||
if [ "$mdmtyp" == "mbim" ] && [ "$bNumConfs" == "2" ]; then
|
||||
[ "$bConf" == "2" ] || echo 2 > $usb_dir/bConfigurationValue
|
||||
fi
|
||||
}
|
||||
|
||||
usbno=$(echo $DEVPATH | cut -d'/' -f5)
|
||||
usbbr=$(echo $DEVPATH | cut -d'/' -f7)
|
||||
case "$usbbr" in
|
||||
*:*) usbbr=$(echo $DEVPATH | cut -d'/' -f6) ;;
|
||||
esac
|
||||
|
||||
#devno=$(basename $DEVPATH)
|
||||
|
||||
find_usb_attrs
|
||||
if [ "$ACTION" = add ]; then
|
||||
convert_to_mbim "$uVid:$uPid"
|
||||
if [ -n "$uVid" ] && [ -n "$uPid" ] && [ -n "$mdmtyp" ] && [ -n "$netdev" ] && [ -n "$comdev" ]; then
|
||||
if [ -n "$usbno" ] && [ -n "$usbbr" ]; then
|
||||
sed -i "/$usbno:$usbbr/ d" /var/usbnets
|
||||
echo $usbno:$usbbr $uVid:$uPid $uMa $uPr $netdev $comdev $mdmtyp $vendor $product >> /var/usbnets
|
||||
ubus send hotplug.usb "{'action': 'add', 'devpath': '$DEVPATH', 'manufacturer': '$uMa', 'product': '$uPr', 'serial': '$uSe', 'vendor_id': '$uVid', \
|
||||
'product_id': '$uPid', 'driver_interface': '$interface', 'driver': '$DRIVER', 'devtype': '$DEVTYPE'}"
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$ACTION" = remove ]; then
|
||||
if [ -n "$usbno" ] && [ -n "$usbbr" ]; then
|
||||
sed -i "/$usbno:$usbbr/ d" /var/usbnets
|
||||
ubus send hotplug.usb "{'action': 'remove', 'devpath': '$DEVPATH', 'manufacturer': '$uMa', 'product': '$uPr', 'serial': '$uSe', 'vendor_id': '$uVid', \
|
||||
'product_id': '$uPid', 'driver_interface': '$interface', 'driver': '$DRIVER', 'devtype': '$DEVTYPE'}"
|
||||
fi
|
||||
fi
|
||||
@@ -1,100 +0,0 @@
|
||||
1bbb:011e qmi
|
||||
1a8d:1001 ecm
|
||||
1a8d:100c ecm
|
||||
1a8d:100d ecm
|
||||
16d8:6280 qmi
|
||||
16d8:6803 qmi
|
||||
16d8:6804 qmi
|
||||
16d8:7003 qmi
|
||||
16d8:700a qmi
|
||||
2001:7d01 mbim
|
||||
2001:7d02 mbim
|
||||
2001:7d03 mbim
|
||||
12d1:14ac qmi
|
||||
12d1:140c qmi
|
||||
12d1:1506 qmi Huawei E367/392/398
|
||||
12d1:1506 ncm Huawei E3276
|
||||
12d1:14d2 qmi
|
||||
12d1:1c07 ncm
|
||||
12d1:1436 ecm
|
||||
12d1:14c9 qmi
|
||||
12d1:14db ecm
|
||||
12d1:151d mbim
|
||||
12d1:151e qmi Huawei E353
|
||||
12d1:1c1e ncm
|
||||
12d1:150c qmi
|
||||
12d1:150f qmi
|
||||
12d1:151b qmi
|
||||
12d1:142d ecm
|
||||
12d1:1432 ecm
|
||||
12d1:1c1f ncm
|
||||
12d1:1433 qmi
|
||||
12d1:1465 ecm
|
||||
12d1:14ca qmi
|
||||
12d1:14cf ncm
|
||||
12d1:14bc ecm
|
||||
12d1:14ae ecm
|
||||
12d1:1576 mbim
|
||||
12d1:1577 mbim
|
||||
12d1:1400 mbim
|
||||
12d1:14f7 mbim
|
||||
12d1:1464 qmi
|
||||
12d1:14cb qmi
|
||||
12d1:14cc qmi
|
||||
12d1:14c6 qmi
|
||||
12d1:14fa mbim
|
||||
12d1:1578 mbim
|
||||
12d1:14c8 qmi
|
||||
12d1:14f8 mbim
|
||||
12d1:1575 mbim
|
||||
12d1:1579 mbim
|
||||
12d1:157a mbim
|
||||
12d1:157b mbim
|
||||
12d1:157f mbim
|
||||
12d1:1f16 mbim Vodafone K5150
|
||||
12d1:1404 qmi
|
||||
19f2:1700 ecm
|
||||
1410:b001 qmi
|
||||
1527:1000 ecm
|
||||
0b3c:c005 qmi
|
||||
0f3d:68a2 qmi
|
||||
1199:68a2 qmi SierraWireless M7710
|
||||
1199:68c0 qmi SierraWireless M7304
|
||||
1349:1100 qmi
|
||||
1349:1200 qmi
|
||||
1199:683c qmi
|
||||
2360:2100 qmi
|
||||
2360:2200 qmi
|
||||
2360:2300 qmi
|
||||
2507:0000 qmi
|
||||
19d2:0055 qmi
|
||||
19d2:0052 qmi
|
||||
19d2:0063 qmi
|
||||
19d2:1008 qmi
|
||||
19d2:1010 qmi
|
||||
19d2:2002 qmi
|
||||
19d2:1176 qmi
|
||||
19d2:1023 mbim
|
||||
19d2:0104 qmi
|
||||
19d2:1018 qmi
|
||||
19d2:1032 mbim
|
||||
19d2:1402 qmi
|
||||
19d2:1405 ecm
|
||||
19d2:1426 qmi
|
||||
19d2:0031 qmi
|
||||
19d2:0124 qmi
|
||||
19d2:1254 qmi
|
||||
19d2:0017 qmi
|
||||
19d2:0002 qmi
|
||||
19d2:0121 qmi
|
||||
19d2:1252 qmi
|
||||
19d2:0157 qmi
|
||||
19d2:0167 qmi
|
||||
19d2:0199 qmi
|
||||
19d2:0257 qmi
|
||||
19d2:0326 qmi
|
||||
19d2:0349 ecm
|
||||
19d2:1408 ecm
|
||||
19d2:0284 qmi
|
||||
19d2:0019 qmi
|
||||
19d2:0265 qmi
|
||||
@@ -1,159 +0,0 @@
|
||||
#!/bin/sh
|
||||
INCLUDE_ONLY=1
|
||||
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
|
||||
proto_4g_init_config() {
|
||||
proto_config_add_string "modem"
|
||||
proto_config_add_string "service"
|
||||
proto_config_add_string "comdev"
|
||||
proto_config_add_string "ipaddr"
|
||||
proto_config_add_string "netmask"
|
||||
proto_config_add_string "hostname"
|
||||
proto_config_add_string "clientid"
|
||||
proto_config_add_string "vendorid"
|
||||
proto_config_add_boolean "broadcast"
|
||||
proto_config_add_string "reqopts"
|
||||
proto_config_add_string "apn"
|
||||
proto_config_add_string "username"
|
||||
proto_config_add_string "password"
|
||||
proto_config_add_boolean "lte_apn_use"
|
||||
proto_config_add_string "lte_apn"
|
||||
proto_config_add_string "lte_username"
|
||||
proto_config_add_string "lte_password"
|
||||
proto_config_add_string "pincode"
|
||||
proto_config_add_string "technology"
|
||||
proto_config_add_string "auto"
|
||||
}
|
||||
|
||||
proto_4g_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local ipaddr hostname clientid vendorid broadcast reqopts iface6rd sendopts delegate zone6rd zone
|
||||
json_get_vars ipaddr hostname clientid vendorid broadcast reqopts iface6rd sendopts delegate zone6rd zone
|
||||
|
||||
local opt dhcpopts
|
||||
for opt in $reqopts; do
|
||||
append dhcpopts "-O $opt"
|
||||
done
|
||||
|
||||
for opt in $sendopts; do
|
||||
append dhcpopts "-x $opt"
|
||||
done
|
||||
|
||||
[ "$broadcast" = 1 ] && broadcast="-B" || broadcast=
|
||||
[ -n "$clientid" ] && clientid="-x 0x3d:${clientid//:/}" || clientid="-C"
|
||||
[ -n "$iface6rd" ] && proto_export "IFACE6RD=$iface6rd"
|
||||
[ "$iface6rd" != 0 -a -f /lib/netifd/proto/6rd.sh ] && append dhcpopts "-O 212"
|
||||
[ -n "$zone6rd" ] && proto_export "ZONE6RD=$zone6rd"
|
||||
[ -n "$zone" ] && proto_export "ZONE=$zone"
|
||||
[ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0"
|
||||
|
||||
json_get_var comdev comdev
|
||||
json_get_var apn apn
|
||||
json_get_var service service
|
||||
json_get_var pincode pincode
|
||||
|
||||
|
||||
# if [ -n "$modem" ]; then
|
||||
# service=$(echo $modem | cut -d':' -f1)
|
||||
# comdev=$(echo $modem | cut -d':' -f2)
|
||||
# iface=$(echo $modem | cut -d':' -f3)
|
||||
# fi
|
||||
|
||||
case "$service" in
|
||||
ecm)
|
||||
;;
|
||||
eem)
|
||||
;;
|
||||
mbim)
|
||||
local mbimdev=/dev/$(basename $(ls /sys/class/net/${iface}/device/usb/cdc-wdm* -d))
|
||||
local comdev="${comdev:-$mbimdev}"
|
||||
[ -n "$pincode" ] && {
|
||||
if ! mbimcli -d $comdev --query-pin-state 2>&1 | grep -q "unlocked"; then
|
||||
set -o pipefail
|
||||
if ! mbimcli -d $comdev --enter-pin="${pincode}" 2>&1; then
|
||||
mbimcli -d $comdev --query-pin-state
|
||||
proto_notify_error "$config" PIN_FAILED
|
||||
proto_block_restart "$interface"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
APN="$apn" mbim-network $comdev start
|
||||
;;
|
||||
ncm)
|
||||
[ -n "$pincode" ] && echo $pincode | gcom -d $comdev
|
||||
USE_APN="$apn" gcom -d $comdev -s /etc/gcom/ncmconnection.gcom
|
||||
;;
|
||||
qmi)
|
||||
local qmidev=/dev/$(basename $(ls /sys/class/net/${iface}/device/usb/cdc-wdm* -d))
|
||||
local comdev="${comdev:-$qmidev}"
|
||||
[ -n "$pincode" ] && {
|
||||
if ! qmicli -d $comdev --dms-uim-get-pin-status 2>&1 | grep -q "enabled-verified\|disabled" >/dev/null; then
|
||||
set -o pipefail
|
||||
if ! qmicli -d $comdev --dms-uim-verify-pin="PIN,${pincode}" 2>&1; then
|
||||
qmicli -d $comdev --dms-uim-get-pin-status
|
||||
proto_notify_error "$config" PIN_FAILED
|
||||
proto_block_restart "$interface"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
APN="$apn" qmi-network $comdev start
|
||||
;;
|
||||
esac
|
||||
|
||||
proto_export "INTERFACE=$config"
|
||||
proto_run_command "$config" udhcpc -R \
|
||||
-p /var/run/udhcpc-$iface.pid \
|
||||
-s /lib/netifd/dhcp.script \
|
||||
-f -t 0 -i "$iface" \
|
||||
${ipaddr:+-r $ipaddr} \
|
||||
${hostname:+-H $hostname} \
|
||||
${vendorid:+-V $vendorid} \
|
||||
$clientid $broadcast $dhcpopts
|
||||
}
|
||||
|
||||
proto_4g_teardown() {
|
||||
local interface="$1"
|
||||
local iface="$2"
|
||||
local modem service comdev
|
||||
|
||||
config_load network
|
||||
config_get service $interface service
|
||||
config_get comdev $interface comdev
|
||||
|
||||
# config_get modem $interface modem
|
||||
# if [ -n "$modem" ]; then
|
||||
# service=$(echo $modem | cut -d':' -f1)
|
||||
# comdev=$(echo $modem | cut -d':' -f2)
|
||||
# iface=$(echo $modem | cut -d':' -f3)
|
||||
# fi
|
||||
|
||||
case "$service" in
|
||||
ecm)
|
||||
;;
|
||||
eem)
|
||||
;;
|
||||
mbim)
|
||||
local mbimdev=/dev/$(basename $(ls /sys/class/net/${iface}/device/usb/cdc-wdm* -d))
|
||||
local comdev="${comdev:-$mbimdev}"
|
||||
mbim-network $comdev stop
|
||||
;;
|
||||
ncm)
|
||||
USE_DISCONNECT=1 gcom -d $comdev -s /etc/gcom/ncmconnection.gcom
|
||||
;;
|
||||
qmi)
|
||||
local qmidev=/dev/$(basename $(ls /sys/class/net/${iface}/device/usb/cdc-wdm* -d))
|
||||
local comdev="${comdev:-$qmidev}"
|
||||
qmi-network $comdev stop
|
||||
;;
|
||||
esac
|
||||
proto_kill_command "$interface"
|
||||
}
|
||||
|
||||
add_protocol 4g
|
||||
@@ -1,773 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008-2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=asterisk18-mod
|
||||
PKG_VERSION:=1.8.10.1
|
||||
|
||||
PKG_SOURCE_VERSION:=ee99af0d91a2197529b13075d802ebc37e644e40
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=http://public.inteno.se:/asterisk-1.8.x
|
||||
|
||||
PKG_RELEASE:=$(PKG_SOURCE_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)-$(PKG_RELEASE).tar.gz
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
-include $(INCLUDE_DIR)/ltqtapi.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/asterisk18-mod/Default
|
||||
SUBMENU:=Telephony
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
URL:=http://www.asterisk.org/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod/Default/description
|
||||
Asterisk is a complete PBX in software. It provides all of the features
|
||||
you would expect from a PBX and more. Asterisk does voice over IP in three
|
||||
protocols, and can interoperate with almost all standards-based telephony
|
||||
equipment using relatively inexpensive hardware.
|
||||
endef
|
||||
|
||||
|
||||
define Package/asterisk18-mod
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Complete open source PBX, v1.8x
|
||||
MENU:=1
|
||||
DEPENDS:= +natalie-dect-h +PACKAGE_bcmkernel:bcmkernel +PACKAGE_bcmopen:bcmopen +libopenssl +libncurses +libpopt +libpthread +uci +ubus +zlib @!TARGET_avr32
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-sounds
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Sound files
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-sounds/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package contains sound files for Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-voicemail
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Voicemail support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-voicemail/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package contains voicemail related modules for Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-transfer
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Call transfer support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-transfer/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package contains the call transfer support module for Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-softhangup
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=SoftHangup application
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-softhangup/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package contains the SoftHangup support module for Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-meetme
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=conferencing support
|
||||
DEPENDS:= asterisk18-mod +dahdi-tools-libtonezone +dahdi
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-meetme/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides the MeetMe application driver Conferencing support to
|
||||
Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-iax2
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=IAX support
|
||||
DEPENDS:= asterisk18-mod +asterisk18-res-crypto
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-iax2/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides IAX support to
|
||||
Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-cdr
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=CDR support
|
||||
DEPENDS:= asterisk18-mod +libsqlite3
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-cdr/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides Call Detail Record support to
|
||||
Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-musiconhold
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=MOH support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-musiconhold/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides Music On Hold support to
|
||||
Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-voice
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Voice client/pbx support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-voice/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides Voice Client/pbx support to
|
||||
Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-srtp
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=SRTP support
|
||||
DEPENDS:= asterisk18-mod libsrtp +asterisk18-mod-res-crypto
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-srtp/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides SRTP support to
|
||||
Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-stun
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=STUN support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-queue
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Queue support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-gtalk
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=GTalk support
|
||||
DEPENDS:= asterisk18-mod +libiksemel
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-gtalk/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides the channel chan_gtalk and res_jabber for GTalk
|
||||
support to Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-timing-timerfd
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:= Timerfd Timing Interface
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-timing-pthread
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:= pthread Timing Interface
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-fax
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Generic FAX Resource for FAX technology resource modules
|
||||
DEPENDS:= asterisk18-mod +asterisk18-mod-res-timing-pthread
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-fax-spandsp
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Spandsp T.38 and G.711 FAX Resource
|
||||
DEPENDS:= asterisk18-mod +asterisk18-mod-res-fax +libspandsp
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-mgcp
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=MGCP channel support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-mgcp/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides the channel chan_mgcp support to Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-skinny
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Skinny channel support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-skinny/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides the channel chan_skinny support to Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-brcm
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Broadcom channel support
|
||||
DEPENDS:= asterisk18-mod
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-brcm/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides the channel chan_brcm support to Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-curl
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=CURL support
|
||||
DEPENDS:= asterisk18-mod +libcurl
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-curl/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides CURL
|
||||
support to Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-mysql
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=MySQL support
|
||||
DEPENDS:= asterisk18-mod +PACKAGE_asterisk18-mysql:libmysqlclient
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-mysql/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides MySQL
|
||||
support to Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-lantiq
|
||||
$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=Lantiq TAPI support
|
||||
DEPENDS:= asterisk18-mod $(LTQ_TAPI_DEPENDS)
|
||||
URL:=http://git.nanl.de/?p=asterisk_channel_lantiq.git
|
||||
MAINTAINER:=Mirko Vogt <mirko@openwrt.org>
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-lantiq/description
|
||||
$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides the channel chan_lantiq support to Asterisk.
|
||||
endef
|
||||
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-inotify
|
||||
|
||||
ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mod-app-meetme),)
|
||||
CONFIGURE_ARGS+= \
|
||||
--with-dahdi="$(STAGING_DIR)/usr"
|
||||
else
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-dahdi
|
||||
endif
|
||||
|
||||
ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mod-chan-gtalk),)
|
||||
CONFIGURE_ARGS+= \
|
||||
--with-gnutls="$(STAGING_DIR)/usr" \
|
||||
--with-iksemel="$(STAGING_DIR)/usr"
|
||||
SITE_VARS+= \
|
||||
ac_cv_lib_iksemel_iks_start_sasl=yes \
|
||||
ac_cv_lib_gnutls_gnutls_bye=yes
|
||||
else
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-gnutls \
|
||||
--without-iksemel
|
||||
endif
|
||||
|
||||
ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mod-curl),)
|
||||
CONFIGURE_ARGS+= \
|
||||
--with-curl="$(STAGING_DIR)/usr"
|
||||
else
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-curl
|
||||
endif
|
||||
|
||||
ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mod-mysql),)
|
||||
CONFIGURE_ARGS+= \
|
||||
--with-mysqlclient="$(STAGING_DIR)/usr/bin"
|
||||
else
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-mysqlclient
|
||||
endif
|
||||
|
||||
ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mod-res-fax-spandsp),)
|
||||
CONFIGURE_ARGS+= \
|
||||
--with-spandsp="$(STAGING_DIR)/usr"
|
||||
else
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-spandsp
|
||||
endif
|
||||
|
||||
ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mod-res-srtp),)
|
||||
CONFIGURE_ARGS+= \
|
||||
--with-srtp="$(STAGING_DIR)/usr"
|
||||
else
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-srtp
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_TARGET_IBOARDID),"D301")
|
||||
EXTRA_CFLAGS += -DNTR_SUPPORT
|
||||
endif
|
||||
|
||||
CONFIGURE_ARGS+= \
|
||||
--without-curses \
|
||||
--with-gsm=internal \
|
||||
--without-cap \
|
||||
--without-gtk \
|
||||
--without-gtk2 \
|
||||
--without-isdnnet \
|
||||
--without-kde \
|
||||
--without-misdn \
|
||||
--without-nbs \
|
||||
--with-ncurses="$(STAGING_DIR)/usr" \
|
||||
--without-netsnmp \
|
||||
--without-newt \
|
||||
--without-odbc \
|
||||
--without-ogg \
|
||||
--without-osptk \
|
||||
--with-popt="$(STAGING_DIR)/usr" \
|
||||
--without-pri \
|
||||
--without-qt \
|
||||
--without-radius \
|
||||
--without-sdl \
|
||||
--without-suppserv \
|
||||
--without-tds \
|
||||
--without-termcap \
|
||||
--without-tinfo \
|
||||
--without-vorbis \
|
||||
--without-vpb \
|
||||
--with-z="$(STAGING_DIR)/usr" \
|
||||
--with-sounds-cache="$(DL_DIR)" \
|
||||
--disable-xmldoc
|
||||
|
||||
# I've had strange errors with -fno-caller-saves
|
||||
# in global CFLAGS so revert it. /Ronny
|
||||
EXTRA_CFLAGS+= -O2 -fcaller-saves
|
||||
EXTRA_CFLAGS+= $(TARGET_CPPFLAGS)
|
||||
EXTRA_LDFLAGS+= $(TARGET_LDFLAGS)
|
||||
|
||||
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
ifneq ($(CONFIG_TARGET_lantiq),)
|
||||
$(CP) ./src-lantiq/* $(PKG_BUILD_DIR)/
|
||||
endif
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
-rm $(PKG_BUILD_DIR)/menuselect.makeopts
|
||||
$(call Build/Configure/Default,,$(SITE_VARS))
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C "$(PKG_BUILD_DIR)" \
|
||||
include/asterisk/version.h \
|
||||
include/asterisk/buildopts.h defaults.h \
|
||||
makeopts.embed_rules
|
||||
ASTCFLAGS="$(EXTRA_CFLAGS) -DLOW_MEMORY" \
|
||||
ASTLDFLAGS="$(EXTRA_LDFLAGS)" \
|
||||
$(MAKE) -C "$(PKG_BUILD_DIR)" \
|
||||
ASTVARLIBDIR="/usr/lib/asterisk" \
|
||||
ASTDATADIR="/usr/lib/asterisk" \
|
||||
ASTKEYDIR="/usr/lib/asterisk" \
|
||||
ASTDBDIR="/usr/lib/asterisk" \
|
||||
NOISY_BUILD="1" \
|
||||
DEBUG="" \
|
||||
OPTIMIZE="" \
|
||||
DESTDIR="$(PKG_INSTALL_DIR)" \
|
||||
all install samples
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(INSTALL_DIR) $(1)/usr/include/asterisk-1.8/include/asterisk/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk-1.8/include/asterisk/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/asterisk-1.8/include/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod/conffiles
|
||||
/etc/asterisk/asterisk.conf
|
||||
/etc/asterisk/modules.conf
|
||||
/etc/asterisk/extensions.conf
|
||||
/etc/asterisk/sip.conf
|
||||
/etc/asterisk/sip_notify.conf
|
||||
/etc/asterisk/features.conf
|
||||
/etc/asterisk/indications.conf
|
||||
/etc/asterisk/logger.conf
|
||||
/etc/asterisk/manager.conf
|
||||
/etc/asterisk/rtp.conf
|
||||
/etc/default/asterisk
|
||||
/etc/init.d/asterisk
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk/ssl
|
||||
for f in asterisk extensions features \
|
||||
indications logger manager modules \
|
||||
sip sip_notify rtp; do \
|
||||
$(CP) $(PKG_INSTALL_DIR)/etc/asterisk/$$$$f.conf $(1)/etc/asterisk/ ; \
|
||||
done
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
for f in app_dial app_echo app_playback app_macro \
|
||||
chan_sip res_rtp_asterisk res_rtp_multicast \
|
||||
codec_ulaw codec_gsm \
|
||||
format_gsm format_pcm format_wav format_wav_gsm \
|
||||
pbx_config \
|
||||
func_strings func_timeout func_callerid func_logic; do \
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/$$$$f.so $(1)/usr/lib/asterisk/modules/ ; \
|
||||
done
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/asterisk $(1)/usr/sbin/
|
||||
$(INSTALL_DIR) $(1)/etc/default
|
||||
$(INSTALL_DATA) ./files/asterisk.default $(1)/etc/default/asterisk
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_BIN) ./files/asterisk.init $(1)/etc/init.d/asterisk
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
|
||||
$(INSTALL_BIN) ./files/asterisk.hotplug $(1)/etc/hotplug.d/iface/80-asterisk
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-sounds/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/
|
||||
rm -f $(1)/usr/lib/asterisk/sounds/vm-*
|
||||
rm -f $(1)/usr/lib/asterisk/sounds/conf-*
|
||||
endef
|
||||
|
||||
|
||||
define Package/asterisk18-mod-voicemail/conffiles
|
||||
/etc/asterisk/voicemail.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-voicemail/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/voicemail.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*voicemail.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_adsi.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_smdi.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/vm-*.gsm $(1)/usr/lib/asterisk/sounds/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-meetme/conffiles
|
||||
/etc/asterisk/meetme.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-meetme/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/meetme.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_meetme.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
|
||||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/conf-*.gsm $(1)/usr/lib/asterisk/sounds/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-iax2/conffiles
|
||||
/etc/asterisk/iax.conf
|
||||
/etc/asterisk/iaxprov.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-cdr/conffiles
|
||||
/etc/asterisk/cdr.conf
|
||||
/etc/asterisk/cdr_custom.conf
|
||||
/etc/asterisk/cdr_manager.conf
|
||||
/etc/asterisk/cdr_odbc.conf
|
||||
/etc/asterisk/cdr_pgsql.conf
|
||||
/etc/asterisk/cdr_tds.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-musiconhold/conffiles
|
||||
/etc/asterisk/musiconhold.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-iax2/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/iax.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/iaxprov.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_iax2.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-cdr/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/cdr*.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*cdr*.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-musiconhold/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/musiconhold.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_musiconhold.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-voice/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_voice.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-gtalk/conffiles
|
||||
/etc/asterisk/gtalk.conf
|
||||
/etc/asterisk/jabber.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-gtalk/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/gtalk.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/jabber.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_gtalk.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_jabber.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-timing-timerfd/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_timing_timerfd.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-timing-pthread/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_timing_pthread.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-fax/conffiles
|
||||
/etc/asterisk/res_fax.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-fax/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/res_fax.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_fax.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-fax-spandsp/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_fax_spandsp.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-mgcp/conffiles
|
||||
/etc/asterisk/mgcp.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-mgcp/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/mgcp.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_mgcp.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-skinny/conffiles
|
||||
/etc/asterisk/skinny.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-skinny/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/skinny.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_skinny.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-brcm/conffiles
|
||||
/etc/asterisk/brcm.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-brcm/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/brcm.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_brcm.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-curl/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/func_curl.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_curl.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-transfer/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_transfer.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-softhangup/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_softhangup.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-mysql/conffiles
|
||||
/etc/asterisk/app_mysql.conf
|
||||
/etc/asterisk/res_config_mysql.conf
|
||||
/etc/asterisk/cdr_mysql.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-mysql/install
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/app_mysql.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/res_config_mysql.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/cdr_mysql.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_mysql.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/cdr_mysql.so $(1)/usr/lib/asterisk/modules/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_config_mysql.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-lantiq/conffiles
|
||||
/etc/asterisk/lantiq.conf
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-chan-lantiq/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_DIR) $(1)/etc/asterisk
|
||||
$(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/lantiq.conf $(1)/etc/asterisk/
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_lantiq.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-srtp/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_srtp.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-res-stun/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_stun_monitor.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-app-queue/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_queue.so $(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
define Buildasterisk18-modModuleTemplate
|
||||
|
||||
define Package/asterisk18-mod-$(subst _,-,$(1))
|
||||
$$(call Package/asterisk18-mod/Default)
|
||||
TITLE:=$(2) support
|
||||
DEPENDS:= asterisk18-mod $(4)
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-$(subst _,-,$(1))/description
|
||||
$$(call Package/asterisk18-mod/Default/description)
|
||||
This package provides support $(3) in Asterisk.
|
||||
endef
|
||||
|
||||
define Package/asterisk18-mod-$(subst _,-,$(1))/install
|
||||
$(INSTALL_DIR) $$(1)/usr/lib/asterisk/modules
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/$(1).so $$(1)/usr/lib/asterisk/modules/
|
||||
endef
|
||||
|
||||
$$(eval $$(call BuildPackage,asterisk18-mod-$(subst _,-,$(1))))
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,asterisk18-mod))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-voicemail))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-sounds))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-app-meetme))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-app-transfer))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-app-softhangup))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-chan-iax2))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-cdr))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-musiconhold))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-voice))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-chan-gtalk))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-fax))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-fax-spandsp))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-timing-timerfd))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-timing-pthread))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-chan-mgcp))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-chan-skinny))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-chan-brcm))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-curl))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-mysql))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-chan-lantiq))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-srtp))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-res-stun))
|
||||
$(eval $(call BuildPackage,asterisk18-mod-app-queue))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_authenticate,Authenticate,support for executing arbitrary authenticate commands))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_chanisavail,Channel availability check,support for checking if a channel is available))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_chanspy,Channel listen in,support for listening in on any channel))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_directed_pickup,Directed call pickup,support for directed call pickup))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_exec,Exec application,support for application execution))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail system))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_readexten,Extension to variable,a trivial application to read an extension into a variable))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_read,Variable read,a trivial application to read a variable))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_sayunixtime,Say Unix time,an application to say Unix time))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_sms,SMS,SMS support (ETSI ES 201 912 protocol 1)))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_stack,Stack applications, stack applications Gosub Return etc., +asterisk18-res-agi))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_system,System exec,support for executing system commands))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_talkdetect,File playback with audio detect,for file playback with audio detect))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_waituntil,Sleep,support sleeping until the given epoch))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_while,While loop,a while loop implementation))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,chan_agent,Agents proxy channel, an implementation of agents proxy channel))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,chan_local,Local proxy channel, an implementation of local proxy channel))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_alaw,Signed linear to alaw translation,translation between signed linear and alaw codecs))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_ulaw,Signed linear to ulaw translation,translation between signed linear and ulaw codecs))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_a_mu,Alaw to ulaw translation,translation between alaw and ulaw codecs))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_g722,G.722,a high bit rate 48/56/64Kbps ITU standard codec))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_ilbc,iLBC,internet Low Bitrate Codec))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,codec_gsm,GSM,GSM codec))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,format_g726,G.726,support for headerless G.726 16/24/32/40kbps data format))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,format_g729,G.729,support for raw headerless G729 data))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,format_sln,Raw slinear format,support for raw slinear format))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,format_sln16,Raw slinear 16 format,support for Raw slinear 16 format))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_db,Database interaction,functions for interaction with the database))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_devstate,Blinky lights control,functions for manually controlled blinky lights))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_vmcount,vmcount dialplan,a vmcount dialplan function))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_global,Global variable,global variable dialplan functions))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_shell,Shell,support for shell execution))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,pbx_ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,res_ael_share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,pbx_spool,Call Spool,outgoing call spool support))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,res_agi,Asterisk Gateway Interface,support for the Asterisk Gateway Interface extension))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,res_crypto,Provide Crypto,Cryptographic Signature capability))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_setcallerid,Set callerid,support for setting callerid))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_verbose,Verbose logging,Verbose logging application))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_channel,Channel info,Channel info dialplan function))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_blacklist,Blacklist on callerid,looking up the callerid number and see if it is blacklisted))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_originate,Originate a call,originating an outbound call and connecting it to a specified extension or application))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_uri,URI encoding and decoding,Encodes and decodes URI-safe strings))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_disa,Direct Inward System Access,Direct Inward System Access))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_senddtmf,Send DTMF digits,Sends arbitrary DTMF digits))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,func_cut,CUT function,CUT function))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,res_clioriginate,Calls via CLI,Originate calls via the CLI))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_mixmonitor,Record a call and mix the audio,record a call and mix the audio during the recording))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_playtones,Playtones application,play a tone list))
|
||||
$(eval $(call Buildasterisk18-modModuleTemplate,app_record,Record sound file,to record a sound file))
|
||||
@@ -1,4 +0,0 @@
|
||||
## startup options for /etc/init.d/asterisk
|
||||
|
||||
ENABLE_ASTERISK="yes"
|
||||
OPTIONS=""
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ "$ACTION" = ifup ] || exit 0
|
||||
|
||||
config_load voice_client
|
||||
config_get bindintf SIP bindintf
|
||||
|
||||
[ "$INTERFACE" == "$bindintf" ] || exit 0
|
||||
|
||||
. /lib/functions/network.sh
|
||||
|
||||
if [ -n "$bindintf" ]; then
|
||||
network_get_ipaddr bindaddr "$bindintf"
|
||||
bindaddr="${bindaddr:-0.0.0.0}"
|
||||
sed -i "s/bindaddr=.*/bindaddr=$bindaddr/g" /etc/asterisk/sip.conf
|
||||
[ -e /var/run/asterisk/asterisk.ctl ] && /etc/init.d/asterisk reload
|
||||
fi
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=98
|
||||
STOP=10
|
||||
|
||||
. /usr/share/libubox/jshn.sh
|
||||
. /lib/functions/network.sh
|
||||
USE_PROCD=1
|
||||
NAME=asterisk
|
||||
PROG=/usr/sbin/asterisk
|
||||
DEFAULT=/etc/default/asterisk
|
||||
CONFDIR=/etc/asterisk
|
||||
|
||||
init_asterisk() {
|
||||
[ -f $DEFAULT ] && . $DEFAULT
|
||||
[ -d /var/run/asterisk ] || mkdir -p /var/run/asterisk
|
||||
[ -d /var/log/asterisk ] || mkdir -p /var/log/asterisk
|
||||
[ -d /var/spool/asterisk ] || mkdir -p /var/spool/asterisk
|
||||
|
||||
# does the board have a fxs relay?
|
||||
local fxsRelayGpio=$(db -q get hw.board.fxsRelayGpio)
|
||||
if [ "$fxsRelayGpio" != "" ]; then
|
||||
/sbin/brcm_fw_tool set -x $fxsRelayGpio -p 1
|
||||
fi
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger voice_client
|
||||
}
|
||||
|
||||
start_service() {
|
||||
init_asterisk
|
||||
|
||||
procd_open_instance
|
||||
procd_set_param command "$PROG" -f
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
# service_start /usr/sbin/asterisk
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
asterisk -rx "config reload $CONFDIR/sip.conf"
|
||||
sleep 1
|
||||
asterisk -rx "core reload"
|
||||
asterisk -rx "dialplan reload"
|
||||
asterisk -rx "brcm reload"
|
||||
}
|
||||
|
||||
restart() {
|
||||
reload
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
service_stop /usr/sbin/asterisk
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
#
|
||||
# Copyright (C) 2016 inteno
|
||||
# Copyright (C) 2019 iopsys Software Solutions AB. All rights reserved.
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# version 2 as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
@@ -14,12 +21,15 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_VERSION:=f614cba983d827d5185c60a6a5a35530621d44d2
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=git@private.inteno.se:ated
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/mediatek/ated.git
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
# support parallel build
|
||||
#PKG_BUILD_PARALLEL:=1
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@ PKG_MD5SUM:=b72c17870bfab2fd791b1f6de4d79f9e
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=none
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/$(PKG_NAME)
|
||||
|
||||
19
bbf/Config_bbfdm.in
Normal file
19
bbf/Config_bbfdm.in
Normal file
@@ -0,0 +1,19 @@
|
||||
if PACKAGE_libbbfdm
|
||||
|
||||
config LIBBBFDM_VENDOR_PREFIX
|
||||
string "Vendor Prefix"
|
||||
default "X_IOPSYS_EU_"
|
||||
|
||||
config BBF_TR181
|
||||
bool "Compile with tr181 device features"
|
||||
default y
|
||||
|
||||
config BBF_TR104
|
||||
bool "Compile with tr104 voice features"
|
||||
default y
|
||||
|
||||
config BBF_TR143
|
||||
bool "Compile with tr143 diagnostics features"
|
||||
default y
|
||||
|
||||
endif
|
||||
119
bbf/Makefile
Normal file
119
bbf/Makefile
Normal file
@@ -0,0 +1,119 @@
|
||||
#
|
||||
# Copyright (C) 2019 IOPSYS
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libbbfdm
|
||||
PKG_VERSION:=3.2.8
|
||||
PKG_FIXUP:=autoreconf
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bbf.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=8c25b2ff8728a0c184404ab45c4d6b3c340ed52d
|
||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=LGPL-2.1
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/libbbf_api
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=Library for libbbfdm API
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c
|
||||
endef
|
||||
|
||||
define Package/libbbfdm
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=Library for broadband-forum data model
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libtrace +libbbf_api +libopenssl +libmbedtls
|
||||
endef
|
||||
|
||||
define Package/libbbfdm/config
|
||||
source "$(SOURCE)/Config_bbfdm.in"
|
||||
endef
|
||||
|
||||
define Package/libbbf_api/description
|
||||
Library contains the API(UCI, UBUS, JSON, CLI and Browse) of libbbfdm
|
||||
endef
|
||||
|
||||
define Package/libbbfdm/description
|
||||
Library contains the data model tree. It includes TR181, TR104 and TR143 data models
|
||||
endef
|
||||
|
||||
USE_LOCAL=$(shell ls ./src/ 2>/dev/null >/dev/null && echo 1)
|
||||
ifneq ($(USE_LOCAL),)
|
||||
define Build/Prepare
|
||||
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += -DCUSTOM_PREFIX=\\\"$(CONFIG_LIBBBFDM_VENDOR_PREFIX)\\\"
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-D_GNU_SOURCE -D_AADJ
|
||||
|
||||
ifeq ($(CONFIG_BBF_TR181),y)
|
||||
CONFIGURE_ARGS += \
|
||||
--enable-tr181
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BBF_TR104),y)
|
||||
CONFIGURE_ARGS += \
|
||||
--enable-tr104
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BBF_TR143),y)
|
||||
CONFIGURE_ARGS += \
|
||||
--enable-tr143
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PACKAGE_libopenssl),y)
|
||||
CONFIGURE_ARGS += \
|
||||
--enable-libopenssl
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PACKAGE_libmbedtls),y)
|
||||
CONFIGURE_ARGS += \
|
||||
--enable-libmbedtls
|
||||
endif
|
||||
|
||||
define Package/libbbf_api/install
|
||||
$(INSTALL_DIR) $(1)/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbf_api.so* $(1)/lib/
|
||||
endef
|
||||
|
||||
define Package/libbbfdm/install
|
||||
$(INSTALL_DIR) $(1)/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbfdm.so* $(1)/lib/
|
||||
$(INSTALL_DIR) $(1)/usr/share/bbfdm
|
||||
$(CP) $(PKG_BUILD_DIR)/scripts/functions $(1)/usr/share/bbfdm
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||
endef
|
||||
|
||||
define Package/libbbfdm/prerm
|
||||
#!/bin/sh
|
||||
rm -rf /etc/bbfdm/*
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
$(INSTALL_DIR) $(1)/usr/include/libbbfdm
|
||||
$(INSTALL_DIR) $(1)/usr/include/libbbf_api
|
||||
$(CP) $(PKG_BUILD_DIR)/*.h $(1)/usr/include/libbbfdm/
|
||||
$(CP) $(PKG_BUILD_DIR)/libbbf_api/*.h $(1)/usr/include/libbbf_api/
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbfdm.{a,so*} $(1)/usr/lib/
|
||||
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbf_api.{a,so*} $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libbbf_api))
|
||||
$(eval $(call BuildPackage,libbbfdm))
|
||||
42
bbk_cli/Makefile
Normal file
42
bbk_cli/Makefile
Normal file
@@ -0,0 +1,42 @@
|
||||
#
|
||||
# Copright (C) 2018 The Internet Foundation In Sweden
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bbk_cli
|
||||
PKG_SOURCE_VERSION:=7b810a696c78b746185c11282bdbe3fb7f8c5d4b
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/dotse/bbk.git
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/bbk_cli
|
||||
CATEGORY:=Utilities
|
||||
DEPENDS:=+libpthread +libstdcpp
|
||||
TITLE:=Bredbandskollen CLI - A bandwidth measurement tool
|
||||
endef
|
||||
|
||||
define Package/bbk_cli/description
|
||||
To measure connection speed in an environment that is missing a web browser,
|
||||
for example, in a server, you can use our command line interface bbk_cli,
|
||||
which is available for some of the most common operating systems.
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR)/src/cli CROSS_COMPILE="$(TARGET_CROSS)"
|
||||
endef
|
||||
|
||||
define Package/bbk_cli/install
|
||||
$(INSTALL_DIR) $(1)/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/cli/cli $(1)/sbin/bbk_cli
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,bbk_cli))
|
||||
25
bbk_cli/patches/0001-add-openwrt-cross-compile-support.patch
Normal file
25
bbk_cli/patches/0001-add-openwrt-cross-compile-support.patch
Normal file
@@ -0,0 +1,25 @@
|
||||
diff --git a/src/framework/engine.h b/src/framework/engine.h
|
||||
index 57a48ad..9e1bc36 100644
|
||||
--- a/src/framework/engine.h
|
||||
+++ b/src/framework/engine.h
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
+#include <sys/select.h>
|
||||
|
||||
#include "logger.h"
|
||||
|
||||
diff --git a/src/framework/mk.inc b/src/framework/mk.inc
|
||||
index 793e211..13275be 100644
|
||||
--- a/src/framework/mk.inc
|
||||
+++ b/src/framework/mk.inc
|
||||
@@ -7,7 +7,7 @@ OS:=$(shell uname)
|
||||
CXXFLAGS += -O2 -W -Wall -I$(DIRLEVEL)
|
||||
|
||||
ifeq ($(OS),Linux)
|
||||
-CXX = g++
|
||||
+CXX = $(CROSS_COMPILE)g++
|
||||
endif
|
||||
|
||||
ifeq ($(OS),Darwin)
|
||||
@@ -18,6 +18,9 @@ PKG_SOURCE_VERSION:=3ab81137cafe25c2ca4bc3a5f322a63646f9ce8d
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=none
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/bootchart2
|
||||
|
||||
44
bulkdata/Makefile
Executable file
44
bulkdata/Makefile
Executable file
@@ -0,0 +1,44 @@
|
||||
#
|
||||
# Copyright (C) 2020 iopsys Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bulkdata
|
||||
PKG_VERSION:=1.0.0
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/$(PKG_NAME)
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=BBF BulkData Collection
|
||||
DEPENDS:=+libubus +libuci +libubox +libjson-c +libcurl +curl +libblobmsg-json +libbbfdm +libbbf_api
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/description
|
||||
BBF BulkData Collection
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-D_GNU_SOURCE
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bulkdatad $(1)/usr/sbin/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/*.so $(1)/usr/lib/bbfdm
|
||||
$(CP) ./files/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
43
bulkdata/files/etc/config/bulkdata
Normal file
43
bulkdata/files/etc/config/bulkdata
Normal file
@@ -0,0 +1,43 @@
|
||||
|
||||
config bulkdata 'bulkdata'
|
||||
option enable '0'
|
||||
#Log levels: Critical=0, Warning=1, Notice=2, Info=3, Debug=4
|
||||
option log_level '3'
|
||||
|
||||
config profile
|
||||
option profile_id '1'
|
||||
option enable '0'
|
||||
option name ''
|
||||
option nbre_of_retained_failed_reports '0'
|
||||
option protocol 'http'
|
||||
option encoding_type ''
|
||||
option reporting_interval '86400'
|
||||
option time_reference '0'
|
||||
option csv_encoding_field_separator ','
|
||||
option csv_encoding_row_separator ' '
|
||||
option csv_encoding_escape_character '"'
|
||||
option csv_encoding_report_format 'column'
|
||||
option csv_encoding_row_time_stamp 'unix'
|
||||
option json_encoding_report_format 'objecthierarchy'
|
||||
option json_encoding_report_time_stamp 'unix'
|
||||
option http_url ''
|
||||
option http_username ''
|
||||
option http_password ''
|
||||
option http_compression 'none'
|
||||
option http_method 'post'
|
||||
option http_use_date_header '1'
|
||||
option http_retry_enable '0'
|
||||
option http_retry_minimum_wait_interval '5'
|
||||
option http_retry_interval_multiplier '2000'
|
||||
option http_persist_across_reboot '0'
|
||||
|
||||
config profile_parameter
|
||||
option profile_id '1'
|
||||
option name ''
|
||||
option reference ''
|
||||
|
||||
config profile_http_request_uri_parameter
|
||||
option profile_id '1'
|
||||
option name ''
|
||||
option reference ''
|
||||
|
||||
34
bulkdata/files/etc/init.d/bulkdatad
Executable file
34
bulkdata/files/etc/init.d/bulkdatad
Executable file
@@ -0,0 +1,34 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Bulkdata Software
|
||||
# Copyright (C) 2020 iopsys Software Solutions AB
|
||||
# Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
USE_PROCD=1
|
||||
PROG="/usr/sbin/bulkdatad"
|
||||
|
||||
start_service() {
|
||||
local bulkdata_enable=`uci -q get bulkdata.bulkdata.enable`
|
||||
if [ "$bulkdata_enable" = "1" ]; then
|
||||
procd_open_instance
|
||||
procd_set_param command "$PROG"
|
||||
procd_set_param respawn "3" "7" "0"
|
||||
procd_close_instance
|
||||
fi
|
||||
}
|
||||
|
||||
boot() {
|
||||
start
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger bulkdata
|
||||
}
|
||||
23
bulkdata/src/Makefile
Normal file
23
bulkdata/src/Makefile
Normal file
@@ -0,0 +1,23 @@
|
||||
PROG = bulkdatad
|
||||
LIB = libbulkdata.so
|
||||
|
||||
PROG_OBJS = bulkdata.o common.o config.o http.o log.o report.o times.o buci.o
|
||||
LIB_OBJS = datamodel.o
|
||||
|
||||
PROG_CFLAGS = $(CFLAGS) -Wall -Werror -fPIC
|
||||
PROG_LDFLAGS = $(LDFLAGS) -lubus -luci -lubox -ljson-c -lcurl -lblobmsg_json -lbbfdm -lbbf_api
|
||||
LIB_LDFLAGS = $(LDFLAGS) -lbbf_api
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(PROG_CFLAGS) $(FPIC) -c -o $@ $<
|
||||
|
||||
all: $(PROG) $(LIB)
|
||||
|
||||
$(PROG): $(PROG_OBJS)
|
||||
$(CC) $(PROG_CFLAGS) -o $@ $^ $(PROG_LDFLAGS)
|
||||
|
||||
$(LIB): $(LIB_OBJS)
|
||||
$(CC) $(PROG_CFLAGS) $(LIB_LDFLAGS) -shared -o $@ $^
|
||||
|
||||
clean:
|
||||
rm -f *.o $(PROG) $(LIB)
|
||||
265
bulkdata/src/buci.c
Normal file
265
bulkdata/src/buci.c
Normal file
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <strings.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "buci.h"
|
||||
|
||||
struct uci_context *uci_ctx = NULL;
|
||||
|
||||
int buci_init(void)
|
||||
{
|
||||
uci_ctx = uci_alloc_context();
|
||||
if (!uci_ctx) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buci_fini(void)
|
||||
{
|
||||
if (uci_ctx) {
|
||||
uci_free_context(uci_ctx);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool buci_validate_section(const char *str)
|
||||
{
|
||||
if (!*str)
|
||||
return false;
|
||||
|
||||
for (; *str; str++) {
|
||||
unsigned char c = *str;
|
||||
|
||||
if (isalnum(c) || c == '_')
|
||||
continue;
|
||||
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static int buci_init_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *package, char *section, char *option, char *value)
|
||||
{
|
||||
memset(ptr, 0, sizeof(struct uci_ptr));
|
||||
|
||||
/* value */
|
||||
if (value) {
|
||||
ptr->value = value;
|
||||
}
|
||||
ptr->package = package;
|
||||
if (!ptr->package)
|
||||
goto error;
|
||||
|
||||
ptr->section = section;
|
||||
if (!ptr->section) {
|
||||
ptr->target = UCI_TYPE_PACKAGE;
|
||||
goto lastval;
|
||||
}
|
||||
|
||||
ptr->option = option;
|
||||
if (!ptr->option) {
|
||||
ptr->target = UCI_TYPE_SECTION;
|
||||
goto lastval;
|
||||
} else {
|
||||
ptr->target = UCI_TYPE_OPTION;
|
||||
}
|
||||
|
||||
lastval:
|
||||
if (ptr->section && !buci_validate_section(ptr->section))
|
||||
ptr->flags |= UCI_LOOKUP_EXTENDED;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct uci_section *buci_walk_section(char *package, char *section_type, struct uci_section *prev_section)
|
||||
{
|
||||
struct uci_ptr ptr;
|
||||
struct uci_element *e;
|
||||
struct uci_section *next_section;
|
||||
|
||||
if (section_type == NULL) {
|
||||
if (prev_section) {
|
||||
e = &prev_section->e;
|
||||
if (e->list.next == &prev_section->package->sections)
|
||||
return NULL;
|
||||
e = container_of(e->list.next, struct uci_element, list);
|
||||
next_section = uci_to_section(e);
|
||||
return next_section;
|
||||
}
|
||||
else {
|
||||
if (buci_init_ptr(uci_ctx, &ptr, package, NULL, NULL, NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
if (uci_lookup_ptr(uci_ctx, &ptr, NULL, true) != UCI_OK) {
|
||||
return NULL;
|
||||
}
|
||||
if (ptr.p->sections.next == &ptr.p->sections)
|
||||
return NULL;
|
||||
e = container_of(ptr.p->sections.next, struct uci_element, list);
|
||||
next_section = uci_to_section(e);
|
||||
|
||||
return next_section;
|
||||
}
|
||||
}
|
||||
else {
|
||||
struct uci_list *ul, *shead = NULL;
|
||||
|
||||
if (prev_section) {
|
||||
ul = &prev_section->e.list;
|
||||
shead = &prev_section->package->sections;
|
||||
}
|
||||
else {
|
||||
if (buci_init_ptr(uci_ctx, &ptr, package, NULL, NULL, NULL)) {
|
||||
return NULL;
|
||||
}
|
||||
if (uci_lookup_ptr(uci_ctx, &ptr, NULL, true) != UCI_OK) {
|
||||
return NULL;
|
||||
}
|
||||
ul = &ptr.p->sections;
|
||||
shead = &ptr.p->sections;
|
||||
}
|
||||
while (ul->next != shead) {
|
||||
e = container_of(ul->next, struct uci_element, list);
|
||||
next_section = uci_to_section(e);
|
||||
if (strcmp(next_section->type, section_type) == 0)
|
||||
return next_section;
|
||||
ul = ul->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void buci_print_list(struct uci_list *uh, char **val, char *delimiter)
|
||||
{
|
||||
struct uci_element *e;
|
||||
static char buffer[512];
|
||||
char *buf = buffer;
|
||||
*buf = '\0';
|
||||
|
||||
uci_foreach_element(uh, e) {
|
||||
if (*buf) {
|
||||
strcat(buf, delimiter);
|
||||
strcat(buf, e->name);
|
||||
}
|
||||
else {
|
||||
strcpy(buf, e->name);
|
||||
}
|
||||
}
|
||||
*val = buf;
|
||||
}
|
||||
|
||||
struct uci_element *buci_lookup_list(struct uci_list *list, const char *name)
|
||||
{
|
||||
struct uci_element *e;
|
||||
|
||||
uci_foreach_element(list, e) {
|
||||
if (!strcmp(e->name, name))
|
||||
return e;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int uci_lookup_ptr_bysection(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_section *section, char *option, char *value)
|
||||
{
|
||||
struct uci_element *e;
|
||||
memset(ptr, 0, sizeof(struct uci_ptr));
|
||||
|
||||
ptr->package = section->package->e.name;
|
||||
ptr->section = section->e.name;
|
||||
ptr->option = option;
|
||||
ptr->value = value;
|
||||
ptr->flags |= UCI_LOOKUP_DONE;
|
||||
|
||||
ptr->p = section->package;
|
||||
ptr->s = section;
|
||||
|
||||
if (ptr->option) {
|
||||
e = buci_lookup_list(&ptr->s->options, ptr->option);
|
||||
if (!e)
|
||||
return UCI_OK;
|
||||
ptr->o = uci_to_option(e);
|
||||
ptr->last = e;
|
||||
ptr->target = UCI_TYPE_OPTION;
|
||||
}
|
||||
else {
|
||||
ptr->last = &ptr->s->e;
|
||||
ptr->target = UCI_TYPE_SECTION;
|
||||
}
|
||||
|
||||
ptr->flags |= UCI_LOOKUP_COMPLETE;
|
||||
|
||||
return UCI_OK;
|
||||
}
|
||||
|
||||
char *buci_get_value_bysection(struct uci_section *section, char *option)
|
||||
{
|
||||
struct uci_ptr ptr;
|
||||
char *val = "";
|
||||
|
||||
if (uci_lookup_ptr_bysection(uci_ctx, &ptr, section, option, NULL) != UCI_OK) {
|
||||
return val;
|
||||
}
|
||||
|
||||
if (!ptr.o)
|
||||
return val;
|
||||
|
||||
if(ptr.o->type == UCI_TYPE_LIST) {
|
||||
buci_print_list(&ptr.o->v.list, &val, " ");
|
||||
return val;
|
||||
}
|
||||
|
||||
if (ptr.o->v.string)
|
||||
return ptr.o->v.string;
|
||||
else
|
||||
return val;
|
||||
}
|
||||
|
||||
char *buci_get_value(char *package, char *section, char *option)
|
||||
{
|
||||
struct uci_ptr ptr;
|
||||
char *val = "";
|
||||
|
||||
if (!section || !option)
|
||||
return val;
|
||||
|
||||
if (buci_init_ptr(uci_ctx, &ptr, package, section, option, NULL)) {
|
||||
return val;
|
||||
}
|
||||
if (uci_lookup_ptr(uci_ctx, &ptr, NULL, true) != UCI_OK) {
|
||||
return val;
|
||||
}
|
||||
|
||||
if (!ptr.o)
|
||||
return val;
|
||||
|
||||
if(ptr.o->type == UCI_TYPE_LIST) {
|
||||
buci_print_list(&ptr.o->v.list, &val, " ");
|
||||
return val;
|
||||
}
|
||||
|
||||
if (ptr.o->v.string)
|
||||
return ptr.o->v.string;
|
||||
else
|
||||
return val;
|
||||
}
|
||||
31
bulkdata/src/buci.h
Normal file
31
bulkdata/src/buci.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __BUCI_H
|
||||
#define __BUCI_H
|
||||
|
||||
#include <uci.h>
|
||||
|
||||
int buci_init(void);
|
||||
int buci_fini(void);
|
||||
struct uci_section *buci_walk_section(char *package, char *section_type, struct uci_section *prev_section);
|
||||
void buci_print_list(struct uci_list *uh, char **val, char *delimiter);
|
||||
struct uci_element *buci_lookup_list(struct uci_list *list, const char *name);
|
||||
int uci_lookup_ptr_bysection(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_section *section, char *option, char *value);
|
||||
char *buci_get_value_bysection(struct uci_section *section, char *option);
|
||||
char *buci_get_value(char *package, char *section, char *option);
|
||||
|
||||
#define buci_foreach_section(package, section_type, section) \
|
||||
for (section = buci_walk_section(package, section_type, NULL); \
|
||||
section != NULL; \
|
||||
section = buci_walk_section(package, section_type, section))
|
||||
|
||||
#endif //__BUCI_H
|
||||
144
bulkdata/src/bulkdata.c
Normal file
144
bulkdata/src/bulkdata.c
Normal file
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <libubox/uloop.h>
|
||||
|
||||
#include "http.h"
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "common.h"
|
||||
#include "report.h"
|
||||
#include "times.h"
|
||||
#include "bulkdata.h"
|
||||
|
||||
struct bulkdata bulkdata_main = {0};
|
||||
int profiles_number = 0;
|
||||
|
||||
void bulkdata_profile_cb(struct uloop_timeout *timeout);
|
||||
|
||||
int get_retry_period(int min)
|
||||
{
|
||||
srand(time(NULL));
|
||||
return rand()%min + min;
|
||||
}
|
||||
|
||||
static void bulkdata_run_profiles(struct bulkdata *bulkdata)
|
||||
{
|
||||
unsigned int next_period;
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < profiles_number; i++) {
|
||||
bulkdata->profile[i].utimer.cb = bulkdata_profile_cb;
|
||||
LIST_HEAD(failedreports);
|
||||
bulkdata->profile[i].failed_reports = &failedreports;
|
||||
next_period = get_next_period(bulkdata->profile[i].time_reference, bulkdata->profile[i].reporting_interval);
|
||||
bulkdata_log(SINFO, "The session of profile_id %d will be start in %d sec", bulkdata->profile[i].profile_id, next_period);
|
||||
uloop_timeout_set(&bulkdata->profile[i].utimer, next_period * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
int http_send_report(struct profile *profile, char *report)
|
||||
{
|
||||
char *msg_in = NULL;
|
||||
int http_code;
|
||||
|
||||
http_client_init(profile);
|
||||
bulkdata_log(SINFO, "Send the report of profile_id %d to Bulkdata Collector", profile->profile_id);
|
||||
http_code = http_send_message(profile, report, strlen(report), &msg_in);
|
||||
http_client_exit();
|
||||
return http_code;
|
||||
}
|
||||
|
||||
void bulkdata_profile_cb(struct uloop_timeout *timeout)
|
||||
{
|
||||
struct profile *profile;
|
||||
unsigned int http_code, retry_period;
|
||||
char *report = NULL;
|
||||
|
||||
profile = container_of(timeout, struct profile, utimer);
|
||||
time_t now = time(NULL);
|
||||
|
||||
bulkdata_log(SINFO, "New session of profile_id %d started", profile->profile_id);
|
||||
if(profile->retry_count == 0 || profile->next_retry > now || !profile->http_retry_enable) //Perdiodic execution
|
||||
create_encoding_bulkdata_report(profile, &report);
|
||||
else
|
||||
create_failed_report(profile, &report);
|
||||
|
||||
bulkdata_log(SDEBUG, "The content of the profile_id report %d is :\n==========\n%s\n==========\n", profile->profile_id, report);
|
||||
http_code= http_send_report(profile, report);
|
||||
if(http_code != 200){
|
||||
if(profile->retry_count == 0 || profile->next_retry > now || !profile->http_retry_enable) { //Perdiodic execution
|
||||
retry_period = get_retry_period(profile->http_retry_minimum_wait_interval);
|
||||
profile->next_period = now + profile->reporting_interval;
|
||||
profile->next_retry = now + retry_period;
|
||||
profile->retry_count = 1;
|
||||
profile->min_retry = profile->http_retry_minimum_wait_interval * 2;
|
||||
if((profile->next_retry < profile->next_period) && profile->http_retry_enable) {
|
||||
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, retry_period);
|
||||
uloop_timeout_set(timeout, 1000 * retry_period);
|
||||
}
|
||||
else {
|
||||
bulkdata_log(SINFO, "Start New session of profile_id %d in %d sec", profile->profile_id, profile->reporting_interval);
|
||||
uloop_timeout_set(timeout, 1000 * profile->reporting_interval);
|
||||
}
|
||||
} else { //Retry execution
|
||||
retry_period= get_retry_period(profile->min_retry);
|
||||
profile->min_retry*=2;
|
||||
profile->next_retry+=retry_period;
|
||||
profile->retry_count++;
|
||||
if(profile->next_retry < profile->next_period) {
|
||||
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, retry_period);
|
||||
uloop_timeout_set(timeout, 1000 * retry_period);
|
||||
}
|
||||
else {
|
||||
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, (profile->next_period-profile->next_retry+retry_period));
|
||||
uloop_timeout_set(timeout, 1000 * (profile->next_period-profile->next_retry+retry_period));
|
||||
}
|
||||
}
|
||||
if(profile->new_report){
|
||||
bulkdata_add_failed_report(profile, profile->new_report);
|
||||
FREE(profile->new_report);
|
||||
}
|
||||
FREE(report);
|
||||
} else {
|
||||
if(profile->retry_count == 0 || profile->next_retry > now || !profile->http_retry_enable) {
|
||||
bulkdata_log(SINFO, "Start New session of profile_id %d in %d sec", profile->profile_id, profile->reporting_interval);
|
||||
uloop_timeout_set(timeout, 1000 * profile->reporting_interval);
|
||||
}
|
||||
else {
|
||||
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, (profile->next_period-profile->next_retry));
|
||||
uloop_timeout_set(timeout, 1000 * (profile->next_period-profile->next_retry));
|
||||
}
|
||||
FREE(profile->new_report);
|
||||
FREE(report);
|
||||
empty_failed_reports_list(profile);
|
||||
profile->retry_count= 0;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
struct bulkdata *bulkdata = &bulkdata_main;
|
||||
if (bulkdata_config_init(bulkdata) == -1)
|
||||
return -1;
|
||||
bulkdata_log(SINFO, "Start bulkdatad daemon");
|
||||
|
||||
uloop_init();
|
||||
bulkdata_run_profiles(bulkdata);
|
||||
uloop_run();
|
||||
uloop_done();
|
||||
|
||||
bulkdata_config_fini(bulkdata);
|
||||
bulkdata_log(SINFO, "Stop bulkdatad daemon");
|
||||
return 0;
|
||||
}
|
||||
18
bulkdata/src/bulkdata.h
Normal file
18
bulkdata/src/bulkdata.h
Normal file
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __BULKDATA_H
|
||||
#define __BULKDATA_H
|
||||
|
||||
extern struct bulkdata bulkdata_main;
|
||||
extern int profiles_number;
|
||||
|
||||
#endif /* __BULKDATA_H */
|
||||
105
bulkdata/src/bulkdata.md
Normal file
105
bulkdata/src/bulkdata.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# README #
|
||||
|
||||
bulkdatad is an implementation of The HTTP bulk data collection mechanism which is an extended feature of CPE and other agents implementing TR-069(CWMP) or TR-369(USP), defined by the Broadband Forum. It provides a means by which an Auto-Configuration Server (ACS), or USP Controller, can configure an agent to periodically send a JSON or CSV formatted set of Device information to an HTTP server running a data collection application.
|
||||
|
||||
## Configuration File ##
|
||||
|
||||
The bulkdatad UCI configuration is located in **'/etc/config/bulkdata'**, and contains 4 sections: **bulkdata**, **profile**, **profile\_parameter** and **profile\_http\_request\_uri\_parameter**.
|
||||
|
||||
```
|
||||
config bulkdata 'bulkdata'
|
||||
option enable '0'
|
||||
option log_level '3'
|
||||
|
||||
config profile
|
||||
option profile_id '1'
|
||||
option enable '0'
|
||||
option csv_encoding_row_time_stamp 'unix'
|
||||
option json_encoding_report_time_stamp 'unix'
|
||||
option http_retry_minimum_wait_interval '5'
|
||||
option http_retry_interval_multiplier '2000'
|
||||
|
||||
config profile_parameter
|
||||
option profile_id '1'
|
||||
option name ''
|
||||
option reference ''
|
||||
|
||||
config profile_http_request_uri_parameter
|
||||
option profile_id '1'
|
||||
option name ''
|
||||
option reference ''
|
||||
```
|
||||
|
||||
### bulkdata section ###
|
||||
|
||||
It defines **bulkdata configuration**: enable and log\_level.
|
||||
|
||||
| Name | Type | Description |
|
||||
| ----------- | ------- | ----------------------------------------------------------------------------------------------- |
|
||||
| `enable` | boolean | Enables the BulkData feature if set to **1**. |
|
||||
| `log_level` | integer | Specifies the log type to use, by default **'INFO'**. The possible types are **'EMERG', 'ALERT', 'CRITIC' ,'ERROR', 'WARNING', 'NOTICE', 'INFO' and 'DEBUG'**. |
|
||||
|
||||
### profile section ###
|
||||
|
||||
It defines **the profile section configuration**: enable, name,... The possible options for **profile** section are listed below:
|
||||
|
||||
| Name | Type | Description |
|
||||
| ---------------------------------- | ------- | ---------------------------------------------- |
|
||||
| `profile_id` | integer | The profile id to use. |
|
||||
| `enable` | boolean | If set to **1**, enables the bulkdata profile. |
|
||||
| `name` | string | The name of the profile. |
|
||||
| `nbre_of_retained_failed_reports` | integer | The number of failed reports to be retained and transmitted at the end of the current reporting interval. |
|
||||
| `protocol` | string | The protocol used for the collection profile. |
|
||||
| `encoding_type` | string | The encoding type used for the collection profile. |
|
||||
| `reporting_interval` | integer | The reporting interval in seconds. |
|
||||
| `time_reference` | integer | The time reference to determine when the profile will be transmitted to the ACS collector. |
|
||||
| `csv_encoding_field_separator` | string | The field separator to use when encoding CSV data. |
|
||||
| `csv_encoding_row_separator` | string | The row separator to use when encoding CSV data. |
|
||||
| `csv_encoding_escape_character` | string | The escape character to use when encoding CSV data. |
|
||||
| `csv_encoding_report_format` | string | Describes how reports will be formatted. Two possible formats are supported: **'ParameterPerRow' and 'ParameterPerColumn'**. |
|
||||
| `csv_encoding_row_time_stamp` | string | The format of the timestamp to use for data inserted into the row. The row time stamp supported are **'Unix-Epoch', 'ISO-8601' and 'None'**. |
|
||||
| `json_encoding_report_format` | string | Describes the report format. The supported report formats are **'ObjectHierarchy' and 'NameValuePair'**. |
|
||||
| `json_encoding_report_time_stamp` | string | The format of the timestamp to use for the JSON Object named "CollectionTime". The supported timestamp are **'Unix-Epoch', 'ISO-8601' and 'None'**. |
|
||||
| `http_url` | string | The URL of the collection server. |
|
||||
| `http_username` | string | The username of the collection server. |
|
||||
| `http_password` | string | The password of the collection server. |
|
||||
| `http_compression` | string | The HTTP Compression mechanism used by the collection server. The supported compression mechanism are **'GZIP', 'Compress' and 'Deflate'**. |
|
||||
| `http_method` | string | The HTTP method used by the collection server. Two methods are supported: **'POST' and 'PUT'**. |
|
||||
| `http_use_date_header` | boolean | If set to **1**, the CPE encodes the HTTP Date Header. |
|
||||
| `http_retry_enable` | boolean | If set to **1**, the CPE retries unsuccessful attempts to transfer data. |
|
||||
| `http_retry_minimum_wait_interval` | integer | The data transfer retry wait interval. |
|
||||
| `http_retry_interval_multiplier` | integer | The retry interval multiplier. |
|
||||
| `http_persist_across_reboot` | boolean | If set to **1**, failed data transfers must be persisted across reboots. |
|
||||
|
||||
### profile_parameter section ###
|
||||
|
||||
It defines **the profile\_parameter section configuration**: profile\_id, name, reference.
|
||||
|
||||
| Name | Type | Description |
|
||||
| ------------ | ------- | --------------------------------------- |
|
||||
| `profile_id` | integer | The id of the used profile. |
|
||||
| `name` | string | The name of the profile parameter. |
|
||||
| `reference` | string | The reference of the profile parameter. |
|
||||
|
||||
### profile_http_request_uri_parameter section ###
|
||||
|
||||
It defines **the profile\_http\_request\_uri\_parameter section configuration**: profile\_id, name, reference.
|
||||
|
||||
| Name | Type | Description |
|
||||
| ------------ | ------- | --------------------------------------- |
|
||||
| `profile_id` | integer | The id of the used profile. |
|
||||
| `name` | string | The name of the Request-URI parameter. |
|
||||
| `reference` | string | The reference of the profile parameter. |
|
||||
|
||||
## Dependencies ##
|
||||
|
||||
To successfully build bulkdatad, the following libraries are needed:
|
||||
|
||||
| Dependency | Link | License |
|
||||
| ----------- | ------------------------------------------- | -------------- |
|
||||
| libuci | https://git.openwrt.org/project/uci.git | LGPL 2.1 |
|
||||
| libubox | https://git.openwrt.org/project/libubox.git | BSD |
|
||||
| libjson-c | https://s3.amazonaws.com/json-c_releases | MIT |
|
||||
| libcurl | https://dl.uxnr.de/mirror/curl | MIT |
|
||||
| libbbfdm | https://dev.iopsys.eu/iopsys/bbf.git | LGPL 2.1 |
|
||||
|
||||
450
bulkdata/src/common.c
Normal file
450
bulkdata/src/common.c
Normal file
@@ -0,0 +1,450 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
static pathnode *head = NULL;
|
||||
static pathnode *temphead = NULL;
|
||||
|
||||
int bulkdata_dm_ctx_init(struct dmctx *ctx)
|
||||
{
|
||||
struct bulkdata *bulkdata = &bulkdata_main;
|
||||
dm_ctx_init(ctx, bulkdata->instance_mode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bulkdata_dm_ctx_clean(struct dmctx *ctx)
|
||||
{
|
||||
dm_ctx_clean(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char **str_split(const char* str, const char* delim, size_t* numtokens)
|
||||
{
|
||||
char *s = strdup(str);
|
||||
size_t tokens_alloc = 1;
|
||||
size_t tokens_used = 0;
|
||||
char **tokens = calloc(tokens_alloc, sizeof(char*));
|
||||
char *token, *strtok_ctx;
|
||||
for (token = strtok_r(s, delim, &strtok_ctx); token != NULL; token = strtok_r(NULL, delim, &strtok_ctx)) {
|
||||
if (tokens_used == tokens_alloc) {
|
||||
tokens_alloc *= 2;
|
||||
tokens = realloc(tokens, tokens_alloc * sizeof(char*));
|
||||
}
|
||||
tokens[tokens_used++] = strdup(token);
|
||||
}
|
||||
// cleanup
|
||||
if (tokens_used == 0) {
|
||||
FREE(tokens);
|
||||
} else {
|
||||
tokens = realloc(tokens, tokens_used * sizeof(char*));
|
||||
}
|
||||
*numtokens = tokens_used;
|
||||
FREE(s);
|
||||
return tokens;
|
||||
}
|
||||
|
||||
static bool bulkdata_match(const char *string, const char *pattern)
|
||||
{
|
||||
regex_t re;
|
||||
if (regcomp(&re, pattern, REG_EXTENDED) != 0) return 0;
|
||||
int status = regexec(&re, string, 0, NULL, 0);
|
||||
regfree(&re);
|
||||
if (status != 0) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_res_required(char *str, int *start, int *len)
|
||||
{
|
||||
char temp_char[NAME_MAX] = {'\0'};
|
||||
|
||||
if (bulkdata_match(str, GLOB_CHAR)) {
|
||||
int s_len = strlen(str);
|
||||
int b_len = s_len, p_len = s_len;
|
||||
|
||||
char *star = strchr(str, '*');
|
||||
if(star)
|
||||
s_len = star - str;
|
||||
*start = MIN(MIN(s_len, p_len), b_len);
|
||||
if (*start == s_len)
|
||||
*len = 1;
|
||||
|
||||
strncpy(temp_char, str+*start, *len);
|
||||
|
||||
if (bulkdata_match(temp_char, "[*+]+"))
|
||||
return true;
|
||||
}
|
||||
*start = strlen(str);
|
||||
return false;
|
||||
}
|
||||
|
||||
static void insert(char *data, bool active)
|
||||
{
|
||||
pathnode *link = (pathnode*) calloc(1, sizeof(pathnode));
|
||||
if(!link) {
|
||||
return;
|
||||
}
|
||||
|
||||
link->ref_path = data;
|
||||
|
||||
if(active) {
|
||||
link->next = head;
|
||||
head = link;
|
||||
} else {
|
||||
link->next = temphead;
|
||||
temphead = link;
|
||||
}
|
||||
}
|
||||
|
||||
static void swap_heads(void)
|
||||
{
|
||||
pathnode *temp = head;
|
||||
head = temphead;
|
||||
temphead = temp;
|
||||
}
|
||||
|
||||
static void deleteList(void)
|
||||
{
|
||||
pathnode *ptr = head, *temp;
|
||||
while(ptr != NULL) {
|
||||
temp = ptr;
|
||||
free(ptr->ref_path);
|
||||
if(ptr->next != NULL) {
|
||||
ptr = ptr->next;
|
||||
} else {
|
||||
ptr = NULL;
|
||||
}
|
||||
free(temp);
|
||||
}
|
||||
head = NULL;
|
||||
swap_heads();
|
||||
}
|
||||
|
||||
void bulkdata_add_data_to_list(struct list_head *dup_list, char *name, char *value, char *type)
|
||||
{
|
||||
struct resultsnode *link;
|
||||
link = calloc(1, sizeof(struct resultsnode));
|
||||
list_add_tail(&link->list, dup_list);
|
||||
link->name = strdup(name);
|
||||
link->data = strdup(value);
|
||||
link->type = strdup(type);
|
||||
}
|
||||
|
||||
void bulkdata_delete_data_from_list(struct resultsnode *link)
|
||||
{
|
||||
list_del(&link->list);
|
||||
FREE(link->name);
|
||||
FREE(link->data);
|
||||
FREE(link->type);
|
||||
FREE(link);
|
||||
}
|
||||
|
||||
void bulkdata_free_data_from_list(struct list_head *dup_list)
|
||||
{
|
||||
struct resultsnode *link;
|
||||
while (dup_list->next != dup_list) {
|
||||
link = list_entry(dup_list->next, struct resultsnode, list);
|
||||
bulkdata_delete_data_from_list(link);
|
||||
}
|
||||
}
|
||||
|
||||
static bool bulkdata_get(int operation, char *path, struct dmctx *dm_ctx)
|
||||
{
|
||||
int fault = 0;
|
||||
|
||||
switch(operation) {
|
||||
case CMD_GET_NAME:
|
||||
fault = dm_entry_param_method(dm_ctx, CMD_GET_NAME, path, "true", NULL);
|
||||
break;
|
||||
case CMD_GET_VALUE:
|
||||
fault = dm_entry_param_method(dm_ctx, CMD_GET_VALUE, path, NULL, NULL);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dm_ctx->list_fault_param.next != &dm_ctx->list_fault_param) {
|
||||
return false;
|
||||
}
|
||||
if (fault) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
char *bulkdata_get_value_param(char *path)
|
||||
{
|
||||
struct dmctx ctx = {0};
|
||||
struct dm_parameter *n;
|
||||
char *value = NULL;
|
||||
|
||||
bulkdata_dm_ctx_init(&ctx);
|
||||
if(bulkdata_get(CMD_GET_VALUE, path, &ctx)) {
|
||||
list_for_each_entry(n, &ctx.list_parameter, list) {
|
||||
value = strdup(n->data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
bulkdata_dm_ctx_clean(&ctx);
|
||||
return value;
|
||||
}
|
||||
|
||||
void bulkdata_get_value(char *path, struct list_head *list)
|
||||
{
|
||||
struct dmctx ctx = {0};
|
||||
struct dm_parameter *n;
|
||||
|
||||
bulkdata_dm_ctx_init(&ctx);
|
||||
if(bulkdata_get(CMD_GET_VALUE, path, &ctx)) {
|
||||
list_for_each_entry(n, &ctx.list_parameter, list) {
|
||||
bulkdata_add_data_to_list(list, n->name, n->data, n->type);
|
||||
}
|
||||
}
|
||||
bulkdata_dm_ctx_clean(&ctx);
|
||||
}
|
||||
|
||||
bool bulkdata_get_name(char *path)
|
||||
{
|
||||
struct dmctx ctx = {0};
|
||||
struct dm_parameter *n;
|
||||
bool ret = false;
|
||||
|
||||
bulkdata_dm_ctx_init(&ctx);
|
||||
if(bulkdata_get(CMD_GET_NAME, path, &ctx)) {
|
||||
list_for_each_entry(n, &ctx.list_parameter, list) {
|
||||
insert(strdup(n->name), false);
|
||||
}
|
||||
ret = true;
|
||||
}
|
||||
bulkdata_dm_ctx_clean(&ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void fill_node_path(void)
|
||||
{
|
||||
pathnode *p=head;
|
||||
while(p!=NULL) {
|
||||
bulkdata_get_name(p->ref_path);
|
||||
p=p->next;
|
||||
}
|
||||
deleteList();
|
||||
}
|
||||
|
||||
static void bulkdata_filter_results(char *path, int start, int end)
|
||||
{
|
||||
int startpos = start, m_index = 0, m_len = 0;
|
||||
char *pp = path + startpos;
|
||||
char exp[NAME_MAX] = {'\0'};
|
||||
|
||||
if(start >= end) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_res_required(pp, &m_index, &m_len)) {
|
||||
//append rest of the path to the final list
|
||||
if(pp == path ) {
|
||||
insert(strdup(pp), true);
|
||||
return;
|
||||
}
|
||||
|
||||
pathnode *p = head;
|
||||
while(p != NULL) {
|
||||
char name[NAME_MAX] = {'\0'};
|
||||
strcpy(name, p->ref_path);
|
||||
strcat(name, pp);
|
||||
insert(strdup(name), false);
|
||||
p = p->next;
|
||||
}
|
||||
deleteList();
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the string before the match
|
||||
char name[NAME_MAX]={'\0'};
|
||||
strncpy(name, pp, m_index);
|
||||
|
||||
pathnode *p = head;
|
||||
if(p == NULL) {
|
||||
insert(strdup(name), false);
|
||||
}
|
||||
|
||||
while(p != NULL) {
|
||||
char ref_name[NAME_MAX] = {'\0'};
|
||||
sprintf(ref_name, "%s%s", p->ref_path, name);
|
||||
insert(strdup(ref_name), false);
|
||||
p = p->next;
|
||||
}
|
||||
deleteList();
|
||||
|
||||
startpos += m_index;
|
||||
strncpy(exp, pp+m_index, m_len);
|
||||
pp = path + startpos;
|
||||
fill_node_path();
|
||||
startpos += 2;
|
||||
bulkdata_filter_results(path, startpos, end);
|
||||
}
|
||||
|
||||
static void bulkdata_parse_results(struct list_head *list)
|
||||
{
|
||||
pathnode *p = head;
|
||||
while(p != NULL) {
|
||||
bulkdata_get_value(p->ref_path, list);
|
||||
p = p->next;
|
||||
}
|
||||
deleteList();
|
||||
}
|
||||
|
||||
void bulkdata_get_value_results(char *path, struct list_head *list)
|
||||
{
|
||||
bulkdata_filter_results(path, 0, strlen(path));
|
||||
bulkdata_parse_results(list);
|
||||
}
|
||||
|
||||
char *create_request_url(struct profile *profile)
|
||||
{
|
||||
int i = 0, http_uri_number = profile->profile_http_request_uri_parameter_number;
|
||||
char *value, *uri_param = NULL, *uri_tmp = NULL, *http_url = NULL;
|
||||
|
||||
for (i = 0; i < http_uri_number; i++)
|
||||
{
|
||||
if((profile->profile_http_uri_parameter[i].reference == NULL) || (profile->profile_http_uri_parameter[i].name == NULL))
|
||||
continue;
|
||||
value = bulkdata_get_value_param(profile->profile_http_uri_parameter[i].reference);
|
||||
if(!uri_param) {
|
||||
asprintf(&uri_param, "&%s=%s", profile->profile_http_uri_parameter[i].name, value);
|
||||
free(value);
|
||||
}
|
||||
else {
|
||||
uri_tmp = strdup(uri_param);
|
||||
free(uri_param);
|
||||
asprintf(&uri_param, "%s&%s=%s", uri_tmp, profile->profile_http_uri_parameter[i].name, value);
|
||||
free(value);
|
||||
free(uri_tmp);
|
||||
}
|
||||
}
|
||||
if(uri_param) {
|
||||
asprintf(&http_url, "%s%s", profile->http_url, uri_param);
|
||||
free(uri_param);
|
||||
} else {
|
||||
asprintf(&http_url, "%s", profile->http_url);
|
||||
}
|
||||
return http_url;
|
||||
}
|
||||
|
||||
char *get_bulkdata_profile_parameter_name(char *paramref, char *paramname, char *param)
|
||||
{
|
||||
char **paramarr, *idx1 = NULL, *idx2 = NULL, *res = NULL, *instance = NULL, *tmp = NULL, *retparam = NULL, *s = NULL;
|
||||
int i, j = 0;
|
||||
size_t length;
|
||||
|
||||
if(paramname == NULL || strlen(paramname) <= 0)
|
||||
return strdup(param);
|
||||
paramarr = str_split(paramref, "*", &length);
|
||||
res = strdup(paramname);
|
||||
for(i = 0; i < length; i++) {
|
||||
if(i == length - 1)
|
||||
break;
|
||||
j++;
|
||||
idx1 = strstr(param, paramarr[i]);
|
||||
idx2 = strstr(param, paramarr[i+1]);
|
||||
instance = (char*)calloc(idx2 - idx1 - strlen(paramarr[i]) + 1, sizeof(char));
|
||||
memcpy(instance, idx1 + strlen(paramarr[i]), idx2 - idx1 - strlen(paramarr[i]));
|
||||
tmp = strdup(res);
|
||||
FREE(res);
|
||||
asprintf(&res, "%s.%s", tmp, instance);
|
||||
FREE(tmp);
|
||||
FREE(instance);
|
||||
}
|
||||
if ((s = strstr(param,paramarr[j]) ) != NULL && strlen(s) == strlen(paramarr[j]))
|
||||
asprintf(&retparam, "%s", res);
|
||||
else
|
||||
asprintf(&retparam, "%s.%s", res, strstr(param, paramarr[j]) + strlen(paramarr[j]));
|
||||
|
||||
FREE(res);
|
||||
for(int k = 0; k < length; k++)
|
||||
FREE(paramarr[k]);
|
||||
FREE(paramarr);
|
||||
|
||||
return retparam;
|
||||
}
|
||||
|
||||
void append_string_to_string(char *strappend, char **target)
|
||||
{
|
||||
char *tmp = NULL;
|
||||
|
||||
if(strappend == NULL || strlen(strappend) <= 0)
|
||||
return;
|
||||
if(*target == NULL || strlen(*target) <= 0) {
|
||||
*target = strdup(strappend);
|
||||
return;
|
||||
} else {
|
||||
tmp = strdup(*target);
|
||||
FREE(*target);
|
||||
}
|
||||
asprintf(target, "%s%s", tmp, strappend);
|
||||
FREE(tmp);
|
||||
}
|
||||
|
||||
void bulkdata_add_failed_report(struct profile *profile, char *freport)
|
||||
{
|
||||
struct failed_reports *report, *retreport, *rtmp;
|
||||
|
||||
if(profile->nbre_failed_reports < profile->nbre_of_retained_failed_reports || profile->nbre_of_retained_failed_reports < 0) {
|
||||
profile->nbre_failed_reports++;
|
||||
} else {
|
||||
list_for_each_entry_safe(retreport, rtmp, profile->failed_reports, list) {
|
||||
bulkdata_delete_failed_report(retreport);
|
||||
break;
|
||||
}
|
||||
}
|
||||
report = calloc(1, sizeof(struct failed_reports));
|
||||
list_add_tail(&report->list, profile->failed_reports);
|
||||
report->freport= strdup(freport);
|
||||
}
|
||||
|
||||
void bulkdata_delete_failed_report(struct failed_reports *report)
|
||||
{
|
||||
if(report != NULL) {
|
||||
list_del(&report->list);
|
||||
FREE(report->freport);
|
||||
FREE(report);
|
||||
}
|
||||
}
|
||||
|
||||
struct failed_reports* empty_failed_reports_list(struct profile *profile)
|
||||
{
|
||||
struct failed_reports *report, *rtmp;
|
||||
|
||||
if(list_empty(profile->failed_reports))
|
||||
return NULL;
|
||||
list_for_each_entry_safe(report, rtmp, profile->failed_reports, list) {
|
||||
list_del(&report->list);
|
||||
FREE(report->freport);
|
||||
FREE(report);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void add_failed_reports_to_report_csv(struct profile *profile, char **report, int isnext)
|
||||
{
|
||||
struct failed_reports *retreport = NULL;
|
||||
int j = 0;
|
||||
|
||||
if(list_empty(profile->failed_reports))
|
||||
return;
|
||||
list_for_each_entry(retreport, profile->failed_reports, list) {
|
||||
if(!j && isnext) {
|
||||
j = 1;
|
||||
continue;
|
||||
}
|
||||
append_string_to_string(retreport->freport, report);
|
||||
}
|
||||
}
|
||||
69
bulkdata/src/common.h
Normal file
69
bulkdata/src/common.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __COMMON_H
|
||||
#define __COMMON_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <regex.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <libubox/blobmsg.h>
|
||||
#include <libubox/blobmsg_json.h>
|
||||
#include <libubox/utils.h>
|
||||
#include <libubus.h>
|
||||
|
||||
#include <libbbfdm/dmentry.h>
|
||||
#include <libbbfdm/dmbbfcommon.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "bulkdata.h"
|
||||
|
||||
typedef struct pathnode {
|
||||
char *ref_path;
|
||||
struct pathnode *next;
|
||||
} pathnode;
|
||||
|
||||
typedef struct resultsnode {
|
||||
struct list_head list;
|
||||
char *name;
|
||||
char *data;
|
||||
char *type;
|
||||
} resultsnode;
|
||||
|
||||
struct failed_reports {
|
||||
struct list_head list;
|
||||
char *freport;
|
||||
};
|
||||
|
||||
#define GLOB_CHAR "[[+*]+"
|
||||
|
||||
int bulkdata_dm_ctx_init(struct dmctx *ctx);
|
||||
int bulkdata_dm_ctx_clean(struct dmctx *ctx);
|
||||
|
||||
char *bulkdata_get_value_param(char *path);
|
||||
void bulkdata_get_value(char *path, struct list_head *list);
|
||||
|
||||
void bulkdata_free_data_from_list(struct list_head *dup_list);
|
||||
void bulkdata_get_value_results(char *path, struct list_head *list);
|
||||
char *create_request_url(struct profile *profile);
|
||||
char *get_bulkdata_profile_parameter_name(char *paramref, char *paramname, char *param);
|
||||
void append_string_to_string(char *strappend, char **target);
|
||||
void bulkdata_add_failed_report(struct profile *profile, char *freport);
|
||||
void bulkdata_delete_failed_report(struct failed_reports *report);
|
||||
|
||||
struct failed_reports *empty_failed_reports_list(struct profile *profile);
|
||||
void add_failed_reports_to_report_csv(struct profile *profile, char **report, int isnext);
|
||||
|
||||
#endif //__COMMON_H
|
||||
523
bulkdata/src/config.c
Normal file
523
bulkdata/src/config.c
Normal file
@@ -0,0 +1,523 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <strings.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "config.h"
|
||||
#include "buci.h"
|
||||
#include "common.h"
|
||||
#include "bulkdata.h"
|
||||
|
||||
int get_log_level_config(struct bulkdata *bulkdata)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
buci_init();
|
||||
value = buci_get_value("bulkdata", "bulkdata", "log_level");
|
||||
if(value != NULL && *value != '\0')
|
||||
bulkdata->log_level = atoi(value);
|
||||
else
|
||||
bulkdata->log_level = DEFAULT_LOGLEVEL;
|
||||
bulkdata_log(SDEBUG,"Log Level of Bulkdata is : %d", bulkdata->log_level);
|
||||
buci_fini();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_amd_version_config(struct bulkdata *bulkdata)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
buci_init();
|
||||
value = buci_get_value("cwmp", "cpe", "amd_version");
|
||||
if(value != NULL && *value != '\0')
|
||||
bulkdata->amd_version = atoi(value);
|
||||
else
|
||||
bulkdata->amd_version = DEFAULT_AMD_VERSION;
|
||||
bulkdata_log(SDEBUG,"CWMP Amendment Version is : %d", bulkdata->amd_version);
|
||||
buci_fini();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_instance_mode_config(struct bulkdata *bulkdata)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
buci_init();
|
||||
value = buci_get_value("cwmp", "cpe", "instance_mode");
|
||||
if(value != NULL && *value != '\0') {
|
||||
if(!strcmp(value, "InstanceNumber"))
|
||||
bulkdata->instance_mode = INSTANCE_MODE_NUMBER;
|
||||
else
|
||||
bulkdata->instance_mode = INSTANCE_MODE_ALIAS;
|
||||
}
|
||||
else
|
||||
bulkdata->instance_mode = DEFAULT_INSTANCE_MODE;
|
||||
bulkdata_log(SDEBUG,"CWMP Instance Mode is : %d", bulkdata->instance_mode);
|
||||
buci_fini();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_device_id_config(struct bulkdata *bulkdata)
|
||||
{
|
||||
struct dmctx dmctx = {0};
|
||||
|
||||
bulkdata_dm_ctx_init(&dmctx);
|
||||
bulkdata->device_id.manufacturer_oui = bulkdata_get_value_param("Device.DeviceInfo.ManufacturerOUI");
|
||||
bulkdata->device_id.product_class = bulkdata_get_value_param("Device.DeviceInfo.ProductClass");
|
||||
bulkdata->device_id.serial_number = bulkdata_get_value_param("Device.DeviceInfo.SerialNumber");
|
||||
bulkdata_dm_ctx_clean(&dmctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int load_profile_config(struct bulkdata *bulkdata, struct uci_section *s, int i)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
value = buci_get_value_bysection(s, "profile_id");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].profile_id = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The profile_id of profile_id %d is : %d", i, bulkdata->profile[i].profile_id);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "nbre_of_retained_failed_reports");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].nbre_of_retained_failed_reports = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The nombre of retained failed reports of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].nbre_of_retained_failed_reports);
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "protocol");
|
||||
if(value != NULL && *value != '\0' && strcasecmp(value, "http")==0) {
|
||||
bulkdata->profile[i].protocol = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The protocol of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].protocol);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "encoding_type");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].encoding_type = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The encoding type of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].encoding_type);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "reporting_interval");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].reporting_interval = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The reporting interval of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].reporting_interval);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "time_reference");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].time_reference = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The time reference of profile_id %d is : %ld", bulkdata->profile[i].profile_id, bulkdata->profile[i].time_reference);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "csv_encoding_field_separator");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].csv_encoding_field_separator = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The csv encoding field separator of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_field_separator);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "csv_encoding_row_separator");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].csv_encoding_row_separator = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The csv encoding row separator of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_row_separator);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "csv_encoding_escape_character");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].csv_encoding_escape_character = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The csv encoding escape character of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_escape_character);
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "csv_encoding_report_format");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].csv_encoding_report_format = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The csv encoding report format of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_report_format);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "csv_encoding_row_time_stamp");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].csv_encoding_row_time_stamp = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The csv encoding row time stamp of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_row_time_stamp);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "json_encoding_report_format");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].json_encoding_report_format = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The json encoding report format of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].json_encoding_report_format);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "json_encoding_report_time_stamp");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].json_encoding_report_time_stamp = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The json encoding report time stamp of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].json_encoding_report_time_stamp);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "http_url");
|
||||
if(value != NULL && *value != '\0') {
|
||||
char *url = NULL;
|
||||
asprintf(&url, "%s?oui=%s&pc=%s&sn=%s", value, bulkdata->device_id.manufacturer_oui, bulkdata->device_id.serial_number, bulkdata->device_id.serial_number);
|
||||
bulkdata->profile[i].http_url = strdup(url);
|
||||
free(url);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP url of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_url);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "http_username");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_username = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP username of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_username);
|
||||
} else {
|
||||
bulkdata->profile[i].http_username = NULL;
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "http_password");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_password = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP password of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_password);
|
||||
} else {
|
||||
bulkdata->profile[i].http_password = NULL;
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "http_compression");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_compression = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP compression of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_compression);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "http_method");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_method = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP method of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_method);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "http_use_date_header");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_use_date_header = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP use date header of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_use_date_header);
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "http_retry_enable");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_retry_enable = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP retry enable of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_retry_enable);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "http_retry_minimum_wait_interval");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_retry_minimum_wait_interval = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP retry minimum wait interval of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_retry_minimum_wait_interval);
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "http_retry_interval_multiplier");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_retry_interval_multiplier = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP retry interval multiplier of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_retry_interval_multiplier);
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "http_persist_across_reboot");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_persist_across_reboot = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP persist across reboot of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_persist_across_reboot);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "http_ssl_capath");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_ssl_capath = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP ssl capath of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_ssl_capath);
|
||||
} else {
|
||||
bulkdata->profile[i].http_ssl_capath = NULL;
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "http_insecure_enable");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].http_insecure_enable = atoi(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP insecure enable of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_insecure_enable);
|
||||
}
|
||||
|
||||
bulkdata->profile[i].retry_count = 0;
|
||||
bulkdata->profile[i].nbre_failed_reports = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_profiles_enable(struct bulkdata *bulkdata)
|
||||
{
|
||||
struct uci_section *s;
|
||||
char *enable;
|
||||
int i = 0, nbr_profiles = 0;
|
||||
|
||||
buci_init();
|
||||
|
||||
buci_foreach_section("bulkdata", "profile", s) {
|
||||
enable = buci_get_value_bysection(s, "enable");
|
||||
if(strcmp(enable, "1") == 0) {
|
||||
nbr_profiles++;
|
||||
}
|
||||
}
|
||||
|
||||
if(nbr_profiles != 0)
|
||||
bulkdata->profile = calloc(2, sizeof(struct profile));
|
||||
|
||||
buci_foreach_section("bulkdata", "profile", s) {
|
||||
enable = buci_get_value_bysection(s, "enable");
|
||||
if(strcmp(enable, "1") == 0) {
|
||||
if(load_profile_config(bulkdata, s, i) == -1) {
|
||||
bulkdata_log(SCRIT,"Not able to start bulkdata: some required bulkdata configurations in profile must be set");
|
||||
return -1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
profiles_number = nbr_profiles;
|
||||
|
||||
buci_fini();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int load_profile_parameter_config(struct bulkdata *bulkdata, struct uci_section *s, int i, int j)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
value = buci_get_value_bysection(s, "name");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].profile_parameter[j].name = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The parameter name %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_parameter[j].name);
|
||||
} else {
|
||||
bulkdata->profile[i].profile_parameter[j].name = NULL;
|
||||
}
|
||||
|
||||
value = buci_get_value_bysection(s, "reference");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].profile_parameter[j].reference = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The parameter reference %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_parameter[j].reference);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_profiles_parameters(struct bulkdata *bulkdata)
|
||||
{
|
||||
struct uci_section *s;
|
||||
char *profile_id;
|
||||
int i, j, nbr_profile_parameters;
|
||||
|
||||
buci_init();
|
||||
|
||||
for (i = 0; i < profiles_number; i++) {
|
||||
j = 0;
|
||||
nbr_profile_parameters = 0;
|
||||
buci_foreach_section("bulkdata", "profile_parameter", s) {
|
||||
profile_id = buci_get_value_bysection(s, "profile_id");
|
||||
if(bulkdata->profile[i].profile_id != atoi(profile_id))
|
||||
continue;
|
||||
nbr_profile_parameters++;
|
||||
if(nbr_profile_parameters == 1) {
|
||||
bulkdata->profile[i].profile_parameter = calloc(1, sizeof(struct profile_parameter));
|
||||
} else {
|
||||
bulkdata->profile[i].profile_parameter = realloc(bulkdata->profile[i].profile_parameter, nbr_profile_parameters * sizeof(struct profile_parameter));
|
||||
}
|
||||
if(load_profile_parameter_config(bulkdata, s, i, j) == -1) {
|
||||
bulkdata_log(SCRIT,"Not able to start bulkdata: some required bulkdata configurations in profile_parameter must be set");
|
||||
return -1;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
bulkdata->profile[i].profile_parameter_number = nbr_profile_parameters;
|
||||
}
|
||||
|
||||
buci_fini();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int load_profile_http_request_uri_parameter_config(struct bulkdata *bulkdata, struct uci_section *s, int i, int j)
|
||||
{
|
||||
char *value = NULL;
|
||||
|
||||
value = buci_get_value_bysection(s, "name");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].profile_http_uri_parameter[j].name = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP resuest URI parameter name %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_http_uri_parameter[j].name);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
value = buci_get_value_bysection(s, "reference");
|
||||
if(value != NULL && *value != '\0') {
|
||||
bulkdata->profile[i].profile_http_uri_parameter[j].reference = strdup(value);
|
||||
value = NULL;
|
||||
bulkdata_log(SDEBUG,"The HTTP resuest URI parameter reference %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_http_uri_parameter[j].reference);
|
||||
} else
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_profile_http_request_uri_parameter(struct bulkdata *bulkdata)
|
||||
{
|
||||
struct uci_section *s;
|
||||
char *profile_id;
|
||||
int i, j, nbr_profile_http_request_uri_parameter;
|
||||
|
||||
buci_init();
|
||||
|
||||
for (i = 0; i < profiles_number; i++) {
|
||||
j = 0;
|
||||
nbr_profile_http_request_uri_parameter = 0;
|
||||
buci_foreach_section("bulkdata", "profile_http_request_uri_parameter", s) {
|
||||
profile_id = buci_get_value_bysection(s, "profile_id");
|
||||
if(bulkdata->profile[i].profile_id != atoi(profile_id))
|
||||
continue;
|
||||
nbr_profile_http_request_uri_parameter++;
|
||||
if(nbr_profile_http_request_uri_parameter == 1) {
|
||||
bulkdata->profile[i].profile_http_uri_parameter = calloc(1, sizeof(struct profile_http_request_uri_parameter));
|
||||
} else {
|
||||
bulkdata->profile[i].profile_http_uri_parameter = realloc(bulkdata->profile[i].profile_http_uri_parameter, nbr_profile_http_request_uri_parameter * sizeof(struct profile_http_request_uri_parameter));
|
||||
}
|
||||
if(load_profile_http_request_uri_parameter_config(bulkdata, s, i, j)== -1) {
|
||||
bulkdata_log(SCRIT,"Not able to start bulkdata: some required bulkdata configurations in profile_http_request_uri_parameter must be set");
|
||||
return -1;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
bulkdata->profile[i].profile_http_request_uri_parameter_number = nbr_profile_http_request_uri_parameter;
|
||||
}
|
||||
|
||||
buci_fini();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bulkdata_config_init(struct bulkdata *bulkdata)
|
||||
{
|
||||
get_log_level_config(bulkdata);
|
||||
get_amd_version_config(bulkdata);
|
||||
get_instance_mode_config(bulkdata);
|
||||
get_device_id_config(bulkdata);
|
||||
if (get_profiles_enable(bulkdata) == -1)
|
||||
return -1;
|
||||
if (get_profiles_parameters(bulkdata) == -1)
|
||||
return -1;
|
||||
if (get_profile_http_request_uri_parameter(bulkdata) == -1)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_device_id_config(struct bulkdata *bulkdata)
|
||||
{
|
||||
FREE(bulkdata->device_id.manufacturer_oui);
|
||||
FREE(bulkdata->device_id.product_class);
|
||||
FREE(bulkdata->device_id.serial_number);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_profiles_enable(struct bulkdata *bulkdata)
|
||||
{
|
||||
for(int i = 0; i < profiles_number; i++) {
|
||||
FREE(bulkdata->profile[i].protocol);
|
||||
FREE(bulkdata->profile[i].encoding_type);
|
||||
FREE(bulkdata->profile[i].csv_encoding_field_separator);
|
||||
FREE(bulkdata->profile[i].csv_encoding_row_separator);
|
||||
FREE(bulkdata->profile[i].csv_encoding_escape_character);
|
||||
FREE(bulkdata->profile[i].csv_encoding_report_format);
|
||||
FREE(bulkdata->profile[i].csv_encoding_row_time_stamp);
|
||||
FREE(bulkdata->profile[i].json_encoding_report_format);
|
||||
FREE(bulkdata->profile[i].json_encoding_report_time_stamp);
|
||||
FREE(bulkdata->profile[i].http_url);
|
||||
FREE(bulkdata->profile[i].http_username);
|
||||
FREE(bulkdata->profile[i].http_password);
|
||||
FREE(bulkdata->profile[i].http_compression);
|
||||
FREE(bulkdata->profile[i].http_method);
|
||||
FREE(bulkdata->profile[i].http_ssl_capath);
|
||||
}
|
||||
FREE(bulkdata->profile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_profiles_parameters(struct bulkdata *bulkdata)
|
||||
{
|
||||
for(int i = 0; i < profiles_number; i++) {
|
||||
for(int j = 0; j < bulkdata->profile[i].profile_parameter_number; j++) {
|
||||
FREE(bulkdata->profile[i].profile_parameter[j].name);
|
||||
FREE(bulkdata->profile[i].profile_parameter[j].reference);
|
||||
}
|
||||
FREE(bulkdata->profile[i].profile_parameter);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int free_profile_http_request_uri_parameter(struct bulkdata *bulkdata)
|
||||
{
|
||||
for(int i = 0; i < profiles_number; i++) {
|
||||
for(int j = 0; j < bulkdata->profile[i].profile_http_request_uri_parameter_number; j++) {
|
||||
FREE(bulkdata->profile[i].profile_http_uri_parameter[j].name);
|
||||
FREE(bulkdata->profile[i].profile_http_uri_parameter[j].reference);
|
||||
}
|
||||
FREE(bulkdata->profile[i].profile_http_uri_parameter);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bulkdata_config_fini(struct bulkdata *bulkdata)
|
||||
{
|
||||
free_device_id_config(bulkdata);
|
||||
free_profiles_parameters(bulkdata);
|
||||
free_profile_http_request_uri_parameter(bulkdata);
|
||||
free_profiles_enable(bulkdata);
|
||||
return 0;
|
||||
}
|
||||
103
bulkdata/src/config.h
Normal file
103
bulkdata/src/config.h
Normal file
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <time.h>
|
||||
#include <libubox/uloop.h>
|
||||
|
||||
#define DEFAULT_AMD_VERSION 2
|
||||
#define DEFAULT_INSTANCE_MODE 0
|
||||
|
||||
typedef struct device_id {
|
||||
char *manufacturer_oui;
|
||||
char *product_class;
|
||||
char *serial_number;
|
||||
} device_id;
|
||||
|
||||
typedef struct profile_parameter {
|
||||
int profile_id;
|
||||
char *name;
|
||||
char *reference;
|
||||
} profile_parameter;
|
||||
|
||||
typedef struct profile_http_request_uri_parameter {
|
||||
int profile_id;
|
||||
char *name;
|
||||
char *reference;
|
||||
} profile_http_request_uri_parameter;
|
||||
|
||||
typedef struct profile {
|
||||
struct uloop_timeout utimer;
|
||||
int profile_id;
|
||||
int nbre_of_retained_failed_reports;
|
||||
int nbre_failed_reports;
|
||||
int reporting_interval;
|
||||
int profile_parameter_number;
|
||||
int profile_http_request_uri_parameter_number;
|
||||
int http_retry_minimum_wait_interval;
|
||||
int http_retry_interval_multiplier;
|
||||
int min_retry;
|
||||
int retry_count;
|
||||
char *protocol;
|
||||
char *encoding_type;
|
||||
char *csv_encoding_field_separator;
|
||||
char *csv_encoding_row_separator;
|
||||
char *csv_encoding_escape_character;
|
||||
char *csv_encoding_report_format;
|
||||
char *csv_encoding_row_time_stamp;
|
||||
char *json_encoding_report_format;
|
||||
char *json_encoding_report_time_stamp;
|
||||
char *http_url;
|
||||
char *http_username;
|
||||
char *http_password;
|
||||
char *http_compression;
|
||||
char *http_method;
|
||||
char *http_ssl_capath;
|
||||
char *new_report;
|
||||
time_t time_reference;
|
||||
time_t next_retry;
|
||||
time_t next_period;
|
||||
bool http_persist_across_reboot;
|
||||
bool http_insecure_enable;
|
||||
bool enable;
|
||||
bool http_use_date_header;
|
||||
bool http_retry_enable;
|
||||
struct profile_parameter *profile_parameter;
|
||||
struct profile_http_request_uri_parameter *profile_http_uri_parameter;
|
||||
struct list_head *failed_reports;
|
||||
} profile;
|
||||
|
||||
typedef struct bulkdata {
|
||||
struct device_id device_id;
|
||||
struct profile *profile;
|
||||
int log_level;
|
||||
int amd_version;
|
||||
unsigned int instance_mode;
|
||||
} bulkdata;
|
||||
|
||||
int bulkdata_config_init(struct bulkdata *bulkdata);
|
||||
int bulkdata_config_fini(struct bulkdata *bulkdata);
|
||||
|
||||
#ifndef FREE
|
||||
#define FREE(x) do { if(x) {free(x); x = NULL;} } while (0)
|
||||
#endif
|
||||
|
||||
#endif //__CONFIG_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1293
bulkdata/src/datamodel.c
Normal file
1293
bulkdata/src/datamodel.c
Normal file
File diff suppressed because it is too large
Load Diff
29
bulkdata/src/datamodel.h
Normal file
29
bulkdata/src/datamodel.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#ifndef _BULKDATA_H_
|
||||
#define _BULKDATA_H_
|
||||
|
||||
#include <libbbf_api/dmcommon.h>
|
||||
|
||||
extern DMOBJ tDeviceBulkDataObj[];
|
||||
extern DMOBJ tBulkDataObj[];
|
||||
extern DMLEAF tBulkDataParams[];
|
||||
extern DMOBJ tBulkDataProfileObj[];
|
||||
extern DMLEAF tBulkDataProfileParams[];
|
||||
extern DMLEAF tBulkDataProfileParameterParams[];
|
||||
extern DMLEAF tBulkDataProfileCSVEncodingParams[];
|
||||
extern DMLEAF tBulkDataProfileJSONEncodingParams[];
|
||||
extern DMOBJ tBulkDataProfileHTTPObj[];
|
||||
extern DMLEAF tBulkDataProfileHTTPParams[];
|
||||
extern DMLEAF tBulkDataProfileHTTPRequestURIParameterParams[];
|
||||
|
||||
#endif //__BULKDATA_H_
|
||||
|
||||
196
bulkdata/src/http.c
Normal file
196
bulkdata/src/http.c
Normal file
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include "http.h"
|
||||
|
||||
static struct http_client http_c;
|
||||
static CURL *curl;
|
||||
|
||||
int http_client_init(struct profile *profile)
|
||||
{
|
||||
char *url = create_request_url(profile);
|
||||
if(url) {
|
||||
asprintf(&http_c.url, "%s", url);
|
||||
free(url);
|
||||
}
|
||||
bulkdata_log(SINFO, "ACS url: %s", http_c.url);
|
||||
|
||||
curl_global_init(CURL_GLOBAL_SSL);
|
||||
curl = curl_easy_init();
|
||||
if (!curl) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void http_client_exit(void)
|
||||
{
|
||||
FREE(http_c.url);
|
||||
|
||||
if (http_c.header_list) {
|
||||
curl_slist_free_all(http_c.header_list);
|
||||
http_c.header_list = NULL;
|
||||
}
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
curl_global_cleanup();
|
||||
|
||||
}
|
||||
|
||||
static size_t http_get_response(void *buffer, size_t size, size_t rxed, char **msg_in)
|
||||
{
|
||||
char *c;
|
||||
|
||||
if (asprintf(&c, "%s%.*s", *msg_in, (int) (size * rxed), (char *)buffer) == -1) {
|
||||
FREE(*msg_in);
|
||||
return -1;
|
||||
}
|
||||
|
||||
free(*msg_in);
|
||||
*msg_in = c;
|
||||
|
||||
return size * rxed;
|
||||
}
|
||||
|
||||
int http_send_message(struct profile *profile, char *msg_out, int msg_out_len, char **msg_in)
|
||||
{
|
||||
CURLcode res;
|
||||
long http_code = 0;
|
||||
char errbuf[CURL_ERROR_SIZE];
|
||||
|
||||
http_c.header_list = NULL;
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "User-Agent: iopsys-bulkdata");
|
||||
if (!http_c.header_list) return -1;
|
||||
|
||||
if (profile->http_use_date_header) {
|
||||
if (bulkdata_get_time() != NULL) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, bulkdata_get_time());
|
||||
if (!http_c.header_list) return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(profile->encoding_type, "json") == 0) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Type: application/json; charset=\"utf-8\"");
|
||||
if (!http_c.header_list) return -1;
|
||||
|
||||
if(strcmp (profile->json_encoding_report_format, "objecthierarchy") == 0) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"ObjectHierarchy\"");
|
||||
if (!http_c.header_list) return -1;
|
||||
} else if(strcmp(profile->json_encoding_report_format, "namevaluepair") == 0) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"NameValuePair\"");
|
||||
if (!http_c.header_list) return -1;
|
||||
}
|
||||
} else if(strcmp(profile->encoding_type, "csv") == 0) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Type: text/csv; charset=\"utf-8\"");
|
||||
if (!http_c.header_list) return -1;
|
||||
|
||||
if(strcmp (profile->csv_encoding_report_format, "row") == 0) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"ParameterPerRow\"");
|
||||
if (!http_c.header_list) return -1;
|
||||
} else if(strcmp (profile->csv_encoding_report_format, "column") == 0) {
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"ParameterPerColumn\"");
|
||||
if (!http_c.header_list) return -1;
|
||||
}
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, http_c.url);
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, profile->http_username);
|
||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, profile->http_password);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_TIMEOUT);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HTTP_TIMEOUT);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
|
||||
|
||||
if(strcasecmp(profile->http_compression, "gzip") == 0) {
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: gzip");
|
||||
} else if(strcasecmp(profile->http_compression, "compress") == 0) {
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "compress");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: compress");
|
||||
} else if(strcasecmp(profile->http_compression, "deflate") == 0) {
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "deflate");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: deflate");
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_c.header_list);
|
||||
if(strcasecmp(profile->http_method, "put") == 0)
|
||||
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);
|
||||
if (msg_out)
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) msg_out_len);
|
||||
else
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_response);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, msg_in);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
|
||||
|
||||
if (profile->http_ssl_capath)
|
||||
curl_easy_setopt(curl, CURLOPT_CAPATH, profile->http_ssl_capath);
|
||||
if (profile->http_insecure_enable) {
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
}
|
||||
*msg_in = (char *) calloc (1, sizeof(char));
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(res != CURLE_OK) {
|
||||
size_t len = strlen(errbuf);
|
||||
if(len) {
|
||||
if (errbuf[len - 1] == '\n') errbuf[len - 1] = '\0';
|
||||
bulkdata_log(SCRIT, "libcurl: (%d) %s", res, errbuf);
|
||||
} else {
|
||||
bulkdata_log(SCRIT, "libcurl: (%d) %s", res, curl_easy_strerror(res));
|
||||
}
|
||||
}
|
||||
|
||||
if (!strlen(*msg_in))
|
||||
FREE(*msg_in);
|
||||
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||
if(http_code == 200)
|
||||
bulkdata_log(SINFO, "Receive HTTP 200 OK from Bulkdata Collector");
|
||||
else if(http_code == 401)
|
||||
bulkdata_log(SINFO, "Receive HTTP 401 Unauthorized from Bulkdata Collector");
|
||||
else if(http_code == 204)
|
||||
bulkdata_log(SINFO, "Receive HTTP 204 No Content from Bulkdata Collector");
|
||||
else
|
||||
bulkdata_log(SINFO, "Receive HTTP %d from Bulkdata Collector", http_code);
|
||||
|
||||
if(http_code == 415)
|
||||
{
|
||||
strcpy(profile->http_compression, "None");
|
||||
goto error;
|
||||
}
|
||||
if (http_code != 200 && http_code != 204)
|
||||
goto error;
|
||||
|
||||
curl_easy_reset(curl);
|
||||
if (http_c.header_list) {
|
||||
curl_slist_free_all(http_c.header_list);
|
||||
http_c.header_list = NULL;
|
||||
}
|
||||
|
||||
if (res) goto error;
|
||||
|
||||
return http_code;
|
||||
|
||||
error:
|
||||
FREE(*msg_in);
|
||||
if (http_c.header_list) {
|
||||
curl_slist_free_all(http_c.header_list);
|
||||
http_c.header_list = NULL;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
37
bulkdata/src/http.h
Normal file
37
bulkdata/src/http.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __HTTP_H
|
||||
#define __HTTP_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <curl/curl.h>
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "times.h"
|
||||
#include "common.h"
|
||||
|
||||
#define HTTP_TIMEOUT 30
|
||||
|
||||
struct http_client
|
||||
{
|
||||
struct curl_slist *header_list;
|
||||
char *url;
|
||||
};
|
||||
|
||||
int http_client_init(struct profile *profile);
|
||||
void http_client_exit(void);
|
||||
int http_send_message(struct profile *profile, char *msg_out, int msg_out_len, char **msg_in);
|
||||
|
||||
#endif //__HTTP_H
|
||||
57
bulkdata/src/log.c
Normal file
57
bulkdata/src/log.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <syslog.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "bulkdata.h"
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
|
||||
static const int log_syslogmap[] = {
|
||||
[SCRIT] = LOG_CRIT,
|
||||
[SWARNING] = LOG_WARNING,
|
||||
[SNOTICE] = LOG_NOTICE,
|
||||
[SINFO] = LOG_INFO,
|
||||
[SDEBUG] = LOG_DEBUG
|
||||
};
|
||||
|
||||
static const char* log_str[] = {
|
||||
[SCRIT] = "CRITICAL",
|
||||
[SWARNING] = "WARNING",
|
||||
[SNOTICE] = "NOTICE",
|
||||
[SINFO] = "INFO",
|
||||
[SDEBUG] = "DEBUG"
|
||||
};
|
||||
|
||||
void bulkdata_log(int priority, const char *format, ...)
|
||||
{
|
||||
va_list vl;
|
||||
|
||||
if (priority <= bulkdata_main.log_level) {
|
||||
time_t t = time(NULL);
|
||||
struct tm tm = *localtime(&t);
|
||||
va_start(vl, format);
|
||||
printf("%d-%02d-%02d %02d:%02d:%02d [bulkdata] %s - ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, log_str[priority]);
|
||||
vprintf(format, vl);
|
||||
va_end(vl);
|
||||
printf("\n");
|
||||
|
||||
openlog("bulkdata", 0, LOG_DAEMON);
|
||||
va_start(vl, format);
|
||||
vsyslog(log_syslogmap[priority], format, vl);
|
||||
va_end(vl);
|
||||
closelog();
|
||||
}
|
||||
}
|
||||
28
bulkdata/src/log.h
Normal file
28
bulkdata/src/log.h
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LOG_H
|
||||
#define __LOG_H
|
||||
|
||||
#define DEFAULT_LOGLEVEL SINFO
|
||||
|
||||
enum bulkdata_log_level_enum {
|
||||
SCRIT,
|
||||
SWARNING,
|
||||
SNOTICE,
|
||||
SINFO,
|
||||
SDEBUG,
|
||||
__MAX_SLOG
|
||||
};
|
||||
|
||||
void bulkdata_log(int priority, const char *format, ...);
|
||||
|
||||
#endif //__LOG_H
|
||||
336
bulkdata/src/report.c
Normal file
336
bulkdata/src/report.c
Normal file
@@ -0,0 +1,336 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "report.h"
|
||||
|
||||
static void add_new_json_obj(json_object *json_obj, char *name, char *data, char *type)
|
||||
{
|
||||
json_object *jobj;
|
||||
if(strstr(type, "unsignedInt") || strstr(type, "int") || strstr(type, "long"))
|
||||
jobj = json_object_new_int64(atoi(data));
|
||||
else if(strstr(type, "bool"))
|
||||
jobj = json_object_new_boolean(atoi(data));
|
||||
else
|
||||
jobj = json_object_new_string(data);
|
||||
|
||||
json_object_object_add(json_obj, name, jobj);
|
||||
}
|
||||
|
||||
static void create_json_bulkdata_report_object_hierarchy(struct profile *profile, char **report)
|
||||
{
|
||||
struct json_object *json_obj, *json_obj1, *json_obj2;
|
||||
struct resultsnode *p;
|
||||
int i, j, profile_param_number = profile->profile_parameter_number;
|
||||
char *param_name, *result, *pch, *pchr, *collection_time = NULL;
|
||||
char buf[1024] = {0};
|
||||
|
||||
json_obj = json_object_new_object();
|
||||
get_time_stamp(profile->json_encoding_report_time_stamp, &collection_time);
|
||||
if(collection_time) {
|
||||
if(strcmp(profile->json_encoding_report_time_stamp, "iso8601") == 0)
|
||||
json_object_object_add(json_obj, "CollectionTime", json_object_new_string(collection_time));
|
||||
else
|
||||
json_object_object_add(json_obj, "CollectionTime", json_object_new_int64(atoi(collection_time)));
|
||||
free(collection_time);
|
||||
}
|
||||
json_obj2 = json_obj;
|
||||
for (i = 0; i < profile_param_number; i++) {
|
||||
LIST_HEAD(results_list);
|
||||
bulkdata_get_value_results(profile->profile_parameter[i].reference, &results_list);
|
||||
list_for_each_entry(p, &results_list, list) {
|
||||
char *argv[128] = {0};
|
||||
j = 0;
|
||||
param_name = get_bulkdata_profile_parameter_name(profile->profile_parameter[i].reference, profile->profile_parameter[i].name, p->name);
|
||||
strcpy(buf, param_name);
|
||||
for (pch = strtok_r(buf, ".", &pchr); pch != NULL; pch = strtok_r(NULL, ".", &pchr)) {
|
||||
argv[j] = pch;
|
||||
json_obj1 = (json_object *)bbf_api_dmjson_select_obj(json_obj, argv);
|
||||
if (json_obj1)
|
||||
json_obj2 = json_obj1;
|
||||
else {
|
||||
if (pchr != NULL && *pchr != '\0') {
|
||||
json_object *new_obj = json_object_new_object();
|
||||
json_object_object_add(json_obj2, pch, new_obj);
|
||||
json_obj2 = new_obj;
|
||||
}
|
||||
else
|
||||
add_new_json_obj(json_obj2, pch, p->data, p->type);
|
||||
}
|
||||
j++;
|
||||
}
|
||||
}
|
||||
bulkdata_free_data_from_list(&results_list);
|
||||
FREE(param_name);
|
||||
}
|
||||
result = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||
*report = strdup(result);
|
||||
json_object_put(json_obj);
|
||||
}
|
||||
|
||||
static void create_json_bulkdata_report_name_value_pair(struct profile *profile, char **report)
|
||||
{
|
||||
struct json_object *json_obj;
|
||||
struct resultsnode *p;
|
||||
char *param_name, *result, *collection_time = NULL;
|
||||
int i = 0, profile_param_number = profile->profile_parameter_number;
|
||||
|
||||
json_obj = json_object_new_object();
|
||||
get_time_stamp(profile->json_encoding_report_time_stamp, &collection_time);
|
||||
if(collection_time) {
|
||||
if(strcmp(profile->json_encoding_report_time_stamp, "iso8601") == 0)
|
||||
json_object_object_add(json_obj, "CollectionTime", json_object_new_string(collection_time));
|
||||
else
|
||||
json_object_object_add(json_obj, "CollectionTime", json_object_new_int64(atoi(collection_time)));
|
||||
free(collection_time);
|
||||
}
|
||||
for (i = 0; i < profile_param_number; i++) {
|
||||
LIST_HEAD(results_list);
|
||||
bulkdata_get_value_results(profile->profile_parameter[i].reference, &results_list);
|
||||
list_for_each_entry(p, &results_list, list) {
|
||||
param_name = get_bulkdata_profile_parameter_name(profile->profile_parameter[i].reference, profile->profile_parameter[i].name, p->name);
|
||||
add_new_json_obj(json_obj, param_name, p->data, p->type);
|
||||
FREE(param_name);
|
||||
}
|
||||
bulkdata_free_data_from_list(&results_list);
|
||||
}
|
||||
result = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||
*report = strdup(result);
|
||||
json_object_put(json_obj);
|
||||
}
|
||||
|
||||
static void add_failed_reports_to_report_json(struct profile *profile, char *new_report, char **report, int isnext)
|
||||
{
|
||||
json_object *json_obj, *json_array, *json_string;
|
||||
struct failed_reports *retreport = NULL;
|
||||
char *msgout = NULL;
|
||||
int j = 0;
|
||||
|
||||
json_obj = json_object_new_object();
|
||||
json_array = json_object_new_array();
|
||||
json_object_object_add(json_obj,"Report", json_array);
|
||||
|
||||
if(list_empty(profile->failed_reports))
|
||||
goto new_report;
|
||||
|
||||
list_for_each_entry(retreport, profile->failed_reports, list) {
|
||||
if(!j && isnext) {
|
||||
j = 1;
|
||||
continue;
|
||||
}
|
||||
json_string = json_tokener_parse(retreport->freport);
|
||||
json_object_array_add(json_array, json_string);
|
||||
}
|
||||
|
||||
new_report :
|
||||
if(new_report) {
|
||||
json_string = json_tokener_parse(new_report);
|
||||
json_object_array_add(json_array, json_string);
|
||||
}
|
||||
|
||||
msgout = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||
*report = strdup(msgout);
|
||||
json_object_put(json_obj);
|
||||
}
|
||||
|
||||
static void create_report_json(char *new_report, char **report)
|
||||
{
|
||||
json_object *json_obj, *json_array, *json_string;
|
||||
char *msgout = NULL;
|
||||
|
||||
json_obj = json_object_new_object();
|
||||
json_array = json_object_new_array();
|
||||
json_object_object_add(json_obj,"Report", json_array);
|
||||
|
||||
if(new_report) {
|
||||
json_string = json_tokener_parse(new_report);
|
||||
json_object_array_add(json_array, json_string);
|
||||
}
|
||||
|
||||
msgout = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||
*report = strdup(msgout);
|
||||
json_object_put(json_obj);
|
||||
}
|
||||
|
||||
int create_json_bulkdata_report(struct profile *profile, char **report)
|
||||
{
|
||||
/*
|
||||
* create json msg of current report
|
||||
* parse failed reports list and add it to the report
|
||||
* then add new report to the report
|
||||
*/
|
||||
char *msgout;
|
||||
|
||||
profile->new_report = NULL;
|
||||
if(strcmp(profile->json_encoding_report_format, "objecthierarchy") == 0) {
|
||||
create_json_bulkdata_report_object_hierarchy(profile, &msgout);
|
||||
} else if(strcmp(profile->json_encoding_report_format, "namevaluepair") == 0) {
|
||||
create_json_bulkdata_report_name_value_pair(profile, &msgout);
|
||||
}
|
||||
|
||||
if(profile->nbre_of_retained_failed_reports != 0) {
|
||||
if(profile->nbre_failed_reports >= profile->nbre_of_retained_failed_reports && profile->nbre_of_retained_failed_reports > 0)
|
||||
add_failed_reports_to_report_json(profile, msgout, report, 1);
|
||||
else
|
||||
add_failed_reports_to_report_json(profile, msgout, report, 0);
|
||||
} else {
|
||||
create_report_json(msgout, report);
|
||||
}
|
||||
|
||||
append_string_to_string(msgout, &profile->new_report);
|
||||
FREE(msgout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int create_csv_bulkdata_report(struct profile *profile, char **report)
|
||||
{
|
||||
/*
|
||||
* create csv msg of current report
|
||||
* parse failed reports list and add it to the report
|
||||
*/
|
||||
int i;
|
||||
struct resultsnode *p;
|
||||
char *str1 = NULL, *str2 = NULL, *str = NULL, *paramprofilename, *timestamp = NULL, *type = NULL, rowseparator = '\0', separator = '\0';
|
||||
|
||||
if(strcmp(profile->csv_encoding_row_separator, " ") == 0)
|
||||
rowseparator = '\n';
|
||||
else if(strcmp(profile->csv_encoding_row_separator, " ") == 0)
|
||||
rowseparator = '\r';
|
||||
|
||||
if(profile->csv_encoding_field_separator)
|
||||
separator = profile->csv_encoding_field_separator[0];
|
||||
|
||||
get_time_stamp(profile->csv_encoding_row_time_stamp, ×tamp);
|
||||
/*
|
||||
* Create header ReportTimestamp,ParameterName,ParameterValue,ParameterType in case of ParameterPerRow
|
||||
*/
|
||||
if(strcmp(profile->csv_encoding_report_format, "row") == 0) {
|
||||
if(timestamp == NULL)
|
||||
asprintf(&str, "ParameterName%cParameterValue%cParameterType%c", separator, separator, rowseparator);
|
||||
else
|
||||
asprintf(&str, "ReportTimestamp%cParameterName%cParameterValue%cParameterType%c", separator, separator, separator, rowseparator);
|
||||
append_string_to_string(str, report);
|
||||
FREE(str);
|
||||
if(profile->nbre_of_retained_failed_reports != 0) {
|
||||
if(profile->nbre_failed_reports >= profile->nbre_of_retained_failed_reports && profile->nbre_of_retained_failed_reports > 0)
|
||||
add_failed_reports_to_report_csv(profile, report, 1);
|
||||
else
|
||||
add_failed_reports_to_report_csv(profile, report, 0);
|
||||
}
|
||||
}
|
||||
if(strcmp(profile->csv_encoding_report_format, "column") == 0 && timestamp != NULL) {
|
||||
if(profile->nbre_of_retained_failed_reports != 0) {
|
||||
if(profile->nbre_failed_reports >= profile->nbre_of_retained_failed_reports && profile->nbre_of_retained_failed_reports > 0)
|
||||
add_failed_reports_to_report_csv(profile, report, 1);
|
||||
else
|
||||
add_failed_reports_to_report_csv(profile, report, 0);
|
||||
}
|
||||
append_string_to_string("ReportTimestamp", &str1);
|
||||
append_string_to_string(timestamp, &str2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add New reports
|
||||
*/
|
||||
profile->new_report = NULL;
|
||||
for(i = 0; i < profile->profile_parameter_number; i++) {
|
||||
LIST_HEAD(results_list);
|
||||
bulkdata_get_value_results(profile->profile_parameter[i].reference, &results_list);
|
||||
list_for_each_entry(p, &results_list, list) {
|
||||
paramprofilename = get_bulkdata_profile_parameter_name(profile->profile_parameter[i].reference, profile->profile_parameter[i].name, p->name);
|
||||
if(strcmp(profile->csv_encoding_report_format, "row") == 0) {
|
||||
type = strstr(p->type, ":");
|
||||
if(timestamp == NULL)
|
||||
asprintf(&str, "%s%c%s%c%s%c", paramprofilename, separator, p->data, separator, type+1, rowseparator);
|
||||
else
|
||||
asprintf(&str, "%s%c%s%c%s%c%s%c", timestamp, separator, paramprofilename, separator, p->data, separator, type+1, rowseparator);
|
||||
append_string_to_string(str, report);
|
||||
append_string_to_string(str, &profile->new_report);
|
||||
FREE(str);
|
||||
} else if(strcmp(profile->csv_encoding_report_format, "column") == 0) {
|
||||
if(str1 == NULL || strlen(str1) <= 0)
|
||||
asprintf(&str, "%s", paramprofilename);
|
||||
else
|
||||
asprintf(&str, "%c%s", separator, paramprofilename);
|
||||
append_string_to_string(str, &str1);
|
||||
FREE(str);
|
||||
if(str2 == NULL || strlen(str2) <= 0)
|
||||
asprintf(&str, "%s", p->data);
|
||||
else
|
||||
asprintf(&str, "%c%s", separator, p->data);
|
||||
append_string_to_string(str, &str2);
|
||||
FREE(str);
|
||||
}
|
||||
FREE(paramprofilename);
|
||||
}
|
||||
bulkdata_free_data_from_list(&results_list);
|
||||
}
|
||||
if(strcmp(profile->csv_encoding_report_format, "column") == 0) {
|
||||
asprintf(&str, "%c", rowseparator);
|
||||
append_string_to_string(str, &str1);
|
||||
append_string_to_string(str, &str2);
|
||||
append_string_to_string(str1, report);
|
||||
append_string_to_string(str2, report);
|
||||
append_string_to_string(str1, &profile->new_report);
|
||||
append_string_to_string(str2, &profile->new_report);
|
||||
}
|
||||
FREE(str);
|
||||
FREE(str1);
|
||||
FREE(str2);
|
||||
FREE(timestamp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void create_json_failed_report(struct profile *profile, char **report)
|
||||
{
|
||||
add_failed_reports_to_report_json(profile, NULL, report, 0);
|
||||
}
|
||||
|
||||
static void create_csv_failed_report(struct profile *profile, char **report)
|
||||
{
|
||||
char rowseparator = '\0', separator = '\0', *timestamp = NULL;
|
||||
|
||||
if(strcmp(profile->csv_encoding_row_separator, " ") == 0) {
|
||||
rowseparator = '\n';
|
||||
} else if(strcmp(profile->csv_encoding_row_separator, " ") == 0) {
|
||||
rowseparator = '\r';
|
||||
}
|
||||
|
||||
if(profile->csv_encoding_field_separator)
|
||||
separator = profile->csv_encoding_field_separator[0];
|
||||
|
||||
get_time_stamp(profile->csv_encoding_row_time_stamp, ×tamp);
|
||||
if(strcmp(profile->csv_encoding_report_format, "row") == 0) {
|
||||
if(timestamp == NULL)
|
||||
asprintf(report, "ParameterName%cParameterValue%cParameterType%c", separator, separator, rowseparator);
|
||||
else
|
||||
asprintf(report, "ReportTimestamp%cParameterName%cParameterValue%cParameterType%c", separator, separator, separator, rowseparator);
|
||||
}
|
||||
add_failed_reports_to_report_csv(profile, report, 0);
|
||||
}
|
||||
|
||||
void create_encoding_bulkdata_report(struct profile *profile, char **report)
|
||||
{
|
||||
if(strcasecmp(profile->encoding_type, "json") == 0) {
|
||||
create_json_bulkdata_report(profile, report);
|
||||
} else if(strcasecmp(profile->encoding_type, "csv") == 0) {
|
||||
create_csv_bulkdata_report(profile, report);
|
||||
}
|
||||
}
|
||||
|
||||
void create_failed_report(struct profile *profile, char **report)
|
||||
{
|
||||
if(strcasecmp(profile->encoding_type, "json") == 0) {
|
||||
create_json_failed_report(profile, report);
|
||||
} else if(strcasecmp(profile->encoding_type, "csv") == 0) {
|
||||
create_csv_failed_report(profile, report);
|
||||
}
|
||||
}
|
||||
24
bulkdata/src/report.h
Normal file
24
bulkdata/src/report.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __REPORT_H_
|
||||
#define __REPORT_H_
|
||||
|
||||
#include <json-c/json.h>
|
||||
#include "common.h"
|
||||
#include "times.h"
|
||||
#include "config.h"
|
||||
|
||||
void create_encoding_bulkdata_report(struct profile *profile, char **report);
|
||||
void create_failed_report(struct profile *profile, char **report);
|
||||
|
||||
#endif /* __REPORT_H_ */
|
||||
62
bulkdata/src/times.c
Normal file
62
bulkdata/src/times.c
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "times.h"
|
||||
|
||||
const char *bulkdata_get_time(void)
|
||||
{
|
||||
static char local_time[64];
|
||||
|
||||
time_t t_time = time(NULL);
|
||||
struct tm *t_tm = localtime(&t_time);
|
||||
if (t_tm == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strftime(local_time, sizeof(local_time),"Date: %a, %d %b %Y %X%z GMT", t_tm) == 0)
|
||||
return NULL;
|
||||
|
||||
return local_time;
|
||||
}
|
||||
|
||||
void get_time_stamp(const char *format, char **timestamp)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
|
||||
if (strcmp(format, "unix") == 0) {
|
||||
asprintf(timestamp, "%ld", now);
|
||||
} else if (strcmp(format, "iso8601") == 0) {
|
||||
char buf[32] = {0};
|
||||
struct tm *ts = localtime(&now);
|
||||
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%Z", ts);
|
||||
asprintf(timestamp, "%s", buf);
|
||||
} else
|
||||
timestamp = NULL;
|
||||
}
|
||||
|
||||
unsigned int get_next_period(time_t time_reference, int reporting_interval)
|
||||
{
|
||||
unsigned int next_period;
|
||||
time_t now = time(NULL);
|
||||
|
||||
if (now > time_reference)
|
||||
next_period = reporting_interval - ((now - time_reference) % reporting_interval);
|
||||
else
|
||||
next_period = (time_reference - now) % reporting_interval;
|
||||
|
||||
if (next_period == 0)
|
||||
next_period = reporting_interval;
|
||||
|
||||
return next_period;
|
||||
}
|
||||
19
bulkdata/src/times.h
Normal file
19
bulkdata/src/times.h
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __TIMES_H
|
||||
#define __TIMES_H
|
||||
|
||||
const char *bulkdata_get_time(void);
|
||||
void get_time_stamp(const char *format, char **timestamp);
|
||||
unsigned int get_next_period(time_t time_reference, int reporting_interval);
|
||||
|
||||
#endif /* __TIMES_H */
|
||||
@@ -1,9 +1,19 @@
|
||||
#
|
||||
# Copyright (C) 2018 iopsys Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=catv
|
||||
PKG_RELEASE:=1
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=none
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/catv
|
||||
|
||||
Binary file not shown.
@@ -1,7 +1,4 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
#
|
||||
# Copyright (C) 2015 inteno.org
|
||||
#
|
||||
|
||||
START=71
|
||||
USE_PROCD=1
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
#
|
||||
# Copyright (C) 2019 iopsys Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=crashlog
|
||||
PKG_VERSION:=1.0.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=none
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
||||
@@ -4,16 +4,15 @@ START=99
|
||||
|
||||
send_log()
|
||||
{
|
||||
nr=$(db get hw.board.serialNumber)
|
||||
hw=$(db get hw.board.hardware)
|
||||
hwv=$(db get hw.board.hardwareVersion)
|
||||
bid=$(db get hw.board.boardId)
|
||||
nr=$(db get hw.board.serial_number)
|
||||
hw=$(db get hw.board.model_name)
|
||||
fam=$(db get hw.board.iopVerFam)
|
||||
sw=$(db get hw.board.iopVersion)
|
||||
server=$(/sbin/uci get system.crashlog.server)
|
||||
|
||||
while true
|
||||
do
|
||||
scp -S /usr/sbin/logssh /proc/last_kmsg log@${server}:log/${bid}_${hwv}_${hw}_${sw}_${nr}
|
||||
scp -S /usr/sbin/logssh /proc/last_kmsg log@${server}:log/${fam}_${hw}_${sw}_${nr}
|
||||
if [ $? == 0 ]
|
||||
then
|
||||
break;
|
||||
@@ -28,7 +27,7 @@ fill_in_default()
|
||||
/sbin/uci add system log
|
||||
/sbin/uci rename system.@log[-1]=crashlog
|
||||
/sbin/uci set system.crashlog.enable=no
|
||||
/sbin/uci set system.crashlog.server="crash.inteno.se"
|
||||
/sbin/uci set system.crashlog.server="crashlog.iopsys.eu"
|
||||
/sbin/uci commit
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ fill_in_default()
|
||||
/sbin/uci add system log
|
||||
/sbin/uci rename system.@log[-1]=corelog
|
||||
/sbin/uci set system.corelog.enable=no
|
||||
/sbin/uci set system.corelog.server="crash.inteno.se"
|
||||
/sbin/uci set system.corelog.server="corelog.iopsys.eu"
|
||||
/sbin/uci commit
|
||||
}
|
||||
|
||||
@@ -50,12 +50,11 @@ cat >$TMP_CORE
|
||||
# more memory to work with. normally this would do nothing.
|
||||
cat >/dev/null
|
||||
|
||||
nr=$(db get hw.board.serialNumber)
|
||||
hw=$(db get hw.board.hardware)
|
||||
hwv=$(db get hw.board.hardwareVersion)
|
||||
bid=$(db get hw.board.boardId)
|
||||
nr=$(db get hw.board.serial_number)
|
||||
hw=$(db get hw.board.model_name)
|
||||
fam=$(hw.board.iopVerFam)
|
||||
sw=$(db get hw.board.iopVersion)
|
||||
|
||||
scp -S /usr/sbin/logssh $TMP_CORE log@${server}:log/core_${1}_${2}_${bid}_${hwv}_${hw}_${sw}_${nr}
|
||||
scp -S /usr/sbin/logssh $TMP_CORE log@${server}:log/core_${1}_${2}_${fam}_${hw}_${sw}_${nr}
|
||||
rm $TMP_CORE
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ What we need is the public key for the clients.
|
||||
For dropbear "dropbearkey -y -f files/etc/dropbear/logid" will generate the public key.
|
||||
|
||||
----------
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwn9RaDAzxW1dTmIhXgFBnpi1lhj8xhYpCVQiPxxdk9IEmH8zjo4y9j3sPkqKOlRnkwjpZIpLEKBnpQTwVIMCU/AG7nDJX3OH9RfS9mLJQLfFL8HyGCyqDezFWldbyovhJZvdUeK4tAXJWv2W3OVHiz2L8IlncBgP/E9DJElsyhhQHsM96UE6tBkXsvXkoDbMSYXFcLbgiUwBKfmM2BF/aPDL45iznGur7/2j9v95PwJ0gtMu9jjNRq+pXCXhTh3bsnczm0MpZC1aiRc9nJAeGIMmhrf15E4jBKgTnrstzJxGVAdajKeR954KcNsS33cS2Wmui2YjmPbBXjqf1frzJ log@inteno
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwn9RaDAzxW1dTmIhXgFBnpi1lhj8xhYpCVQiPxxdk9IEmH8zjo4y9j3sPkqKOlRnkwjpZIpLEKBnpQTwVIMCU/AG7nDJX3OH9RfS9mLJQLfFL8HyGCyqDezFWldbyovhJZvdUeK4tAXJWv2W3OVHiz2L8IlncBgP/E9DJElsyhhQHsM96UE6tBkXsvXkoDbMSYXFcLbgiUwBKfmM2BF/aPDL45iznGur7/2j9v95PwJ0gtMu9jjNRq+pXCXhTh3bsnczm0MpZC1aiRc9nJAeGIMmhrf15E4jBKgTnrstzJxGVAdajKeR954KcNsS33cS2Wmui2YjmPbBXjqf1frzJ log@iopsys
|
||||
----------
|
||||
|
||||
The public key should be just one line. Add that line to the
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
#
|
||||
# Copyright (C) 2006-2010 OpenWrt.org
|
||||
# Copyright (C) 2020 IOPSYS Software Solutions AB
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.0.23
|
||||
PKG_SOURCE_URL:=http://public.inteno.se:/dectmngr
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=90aff0da98c626d58201c14c34b3b3a64878ceee
|
||||
PKG_NAME:=dectmngr
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.0
|
||||
|
||||
LOCAL_DEV=1
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=2c8990fd5275d469e8ab6c7a99e17fe0a56052ea
|
||||
endif
|
||||
|
||||
LDFLAGS+= \
|
||||
-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
|
||||
-Wl,-rpath-link=$(STAGING_DIR)/lib
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
RSTRIP:=true
|
||||
export BUILD_DIR
|
||||
@@ -25,42 +26,40 @@ export BUILD_DIR
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/dectmngr
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Broadcom endpoint test application
|
||||
URL:=
|
||||
DEPENDS:= +libevent2 +libjson +natalie-dect-h bcmkernel
|
||||
define Package/$(PKG_NAME)
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=DECT Manager
|
||||
DEPENDS:= +libubox +ubus +libpicoevent
|
||||
endef
|
||||
|
||||
define Package/dectmngr/description
|
||||
Dect proxy, manager and tools
|
||||
define Package/$(PKG_NAME)/description
|
||||
DECT manager is a daemon that provides UBUS RPC objects and sends UBUS events for communication with the DECT chip.
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
$(CP) -r src/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/dectmngr/install
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(INSTALL_DIR) $(1)/sbin
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/dect
|
||||
$(INSTALL_DIR) $(1)/etc/init.d/
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS+="-Wall"
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(1)/etc/dect/
|
||||
$(INSTALL_DIR) $(1)/etc/config/
|
||||
$(INSTALL_DIR) $(1)/etc/init.d/
|
||||
|
||||
cp $(PKG_BUILD_DIR)/dectmngr $(1)/usr/bin/
|
||||
cp $(PKG_BUILD_DIR)/atohx $(1)/usr/bin/
|
||||
cp $(PKG_BUILD_DIR)/dectproxy $(1)/usr/bin/
|
||||
cp $(PKG_BUILD_DIR)/dectdbgd $(1)/usr/bin/
|
||||
cp $(PKG_BUILD_DIR)/dect $(1)/usr/bin/
|
||||
cp $(PKG_BUILD_DIR)/dectcalib $(1)/usr/bin/
|
||||
cp $(PKG_BUILD_DIR)/dect_testmode $(1)/usr/bin/
|
||||
cp files/etc/init.d/* $(1)/etc/init.d/
|
||||
cp files/etc/hotplug.d/dect/* $(1)/etc/hotplug.d/dect/
|
||||
cp files/etc/dect/* $(1)/etc/dect/
|
||||
cp files/etc/config/* $(1)/etc/config/
|
||||
cp files/sbin/dectreg $(1)/sbin/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/app/dectmngr $(1)/usr/sbin/
|
||||
$(STRIP) $(1)/usr/sbin/dectmngr
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/app/libdect.so $(1)/usr/lib/
|
||||
$(STRIP) $(1)/usr/lib/libdect.so
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,dectmngr))
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.bin
Executable file
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.bin
Executable file
Binary file not shown.
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.elf
Executable file
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.elf
Executable file
Binary file not shown.
2515
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.lst
Executable file
2515
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.lst
Executable file
File diff suppressed because it is too large
Load Diff
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.ITCM
Executable file
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.ITCM
Executable file
Binary file not shown.
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.ITCM_L
Executable file
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.ITCM_L
Executable file
Binary file not shown.
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.bin
Executable file
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.bin
Executable file
Binary file not shown.
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.elf
Executable file
BIN
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.elf
Executable file
Binary file not shown.
36
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.info
Executable file
36
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.info
Executable file
File diff suppressed because one or more lines are too long
19754
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.lst
Executable file
19754
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.lst
Executable file
File diff suppressed because it is too large
Load Diff
4
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.md5
Executable file
4
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.md5
Executable file
@@ -0,0 +1,4 @@
|
||||
9c5962fc5bdef309d15cf76dd2678297 out4/Images/PRODUCT_IOPSYS/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.ITCM
|
||||
17d4a7e4021c6089104c28c228245df2 out4/Images/PRODUCT_IOPSYS/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.ITCM_L
|
||||
d32e2a3dd05f4d1933eac77cfff091ba out4/Images/PRODUCT_IOPSYS/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.bin
|
||||
477bfa4e91914db4c0078b31a6cdf208 out4/Images/PRODUCT_IOPSYS/DCX81_fw_c/MOD/USB/DCX81_MOD_USB.BOOTLOADER.bin
|
||||
1
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB_EEPROM_MD5_SIG.md5
Executable file
1
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB_EEPROM_MD5_SIG.md5
Executable file
@@ -0,0 +1 @@
|
||||
{0xee,0xb7,0x3c,0x8f,0x44,0xe1,0xad,0x87,0x53,0xc8,0x57,0x4e,0x08,0x6d,0x87,0x9f}
|
||||
984
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB_EEPROM_Map.htm
Executable file
984
dectmngr/files/DCX81_fw_c/MOD/USB/DCX81_MOD_USB_EEPROM_Map.htm
Executable file
@@ -0,0 +1,984 @@
|
||||
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<title>EEPROM map </title>
|
||||
|
||||
<style>
|
||||
|
||||
<!--
|
||||
|
||||
th {
|
||||
|
||||
font-size: 12px;
|
||||
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
|
||||
font-style: bold;
|
||||
|
||||
}
|
||||
|
||||
td {
|
||||
|
||||
font-size: 10px;
|
||||
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
|
||||
}
|
||||
|
||||
body {
|
||||
|
||||
background-color: #FFFFFF;
|
||||
|
||||
}
|
||||
|
||||
-->
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>EEPROM map bsd02eep.h-GIT</h1>
|
||||
|
||||
|
||||
<table border="2" cellspacing="2" width="100%" rules="both" align="center" style=" font-size: 10px;
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
background-color: #C9FFDA;
|
||||
border-collapse: collapse;
|
||||
border: 5px solid white">
|
||||
<tbody>
|
||||
<tr style=" font-size: 12px;
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-style: bold;
|
||||
background-color: #78FF95"><td>Name</td><td align="center">Offset</td><td>Comment</td><td width="100">Default</td></tr>
|
||||
<tr><td>SD02_RESERVED1[4]</td><td align="center">0(0x0)</td><td> L4 RESERVED1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_RESERVED2[5]</td><td align="center">4(0x4)</td><td> L5 RESERVED2 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_GFSK[10]</td><td align="center">9(0x9)</td><td> L10 </td><td width="100">0x80,0x80,0x80,0x80,0x80,
|
||||
|
||||
0x80,0x80,0x80,0x80,0x80,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PREAM_NORMAL</td><td align="center">19(0x13)</td><td> L1 </td><td width="100">0x65,
|
||||
</td></tr>
|
||||
<tr><td>SD02_TEST_FLAGS</td><td align="center">20(0x14)</td><td> L1 If set: bit 0: BMP Driver Recover disabled
|
||||
bit 1: Watchdog not enabled
|
||||
bit 3: disable activity led </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_EMC_MODEL[3]</td><td align="center">21(0x15)</td><td> L3 EMC number and model, transfered in MODEL_ID IE </td><td width="100">0x0F,0xEB,0x02,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVREF</td><td align="center">24(0x18)</td><td> L1 </td><td width="100">0x1F,
|
||||
</td></tr>
|
||||
<tr><td>SD02_TEST_MODE</td><td align="center">25(0x19)</td><td> L1 Enter TBR6/10 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RXTUN</td><td align="center">26(0x1A)</td><td> L1 FR </td><td width="100">0x70,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AUXBGPROG</td><td align="center">27(0x1B)</td><td> L1 AUXBGPROG (Bandgap calibration value) </td><td width="100">0x66,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVDDC</td><td align="center">28(0x1C)</td><td> L1 </td><td width="100">0x97,
|
||||
</td></tr>
|
||||
<tr><td>SD02_POWER_CONTROL</td><td align="center">29(0x1D)</td><td> L1 Power Control: nibble usage (0xsw) where s is ARM clock speed and w the number of
|
||||
pflash waitstates.
|
||||
Note: For ICELP, the default ARM clock
|
||||
speed is 64 (96MHz and 4 wait states).
|
||||
Note: For VegaOne s is used as an index to
|
||||
recommended clock settings (see
|
||||
VegaOne_AHB_PLLDIV[16] in file
|
||||
cdr17tim.c).
|
||||
For VegaOne: bit 3 is used to select if flash
|
||||
running in syncrounous (asyncronous = 0
|
||||
syncronous = 1)</td><td width="100">0x2,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WDCT_HOP_CONTROL</td><td align="center">30(0x1E)</td><td> L1 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WDCT_QUAL_CONTROL</td><td align="center">31(0x1F)</td><td> L1 WDCT Quality Control: When the most significant bit of this byte is
|
||||
set to 1, the hop sequence of 19 and frequency
|
||||
substitution can be disabled.</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_US_DECT</td><td align="center">32(0x20)</td><td> L1 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MAX_USABLE_RSSI</td><td align="center">33(0x21)</td><td> L1 </td><td width="100">0x78,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LOWER_RSSI_LIMIT</td><td align="center">34(0x22)</td><td> L1 </td><td width="100">0x50,
|
||||
</td></tr>
|
||||
<tr><td>SD02_V22_VOL_HIGH</td><td align="center">35(0x23)</td><td> L1 V22 Volume Low - Sidetone </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_V22_VOL_LOW</td><td align="center">36(0x24)</td><td> L1 V22 Volume High - Sidetone </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_CID_THRES</td><td align="center">37(0x25)</td><td> L1 CID Threshold</td><td width="100">0x51,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_PATCH[50]</td><td align="center">38(0x26)</td><td> L50 DSP patch area 8 entries, each defines a flexible value for 1
|
||||
DSP parameter.
|
||||
Structure:
|
||||
1st Word: DSP instance (low, high byte)
|
||||
2nd Word: offset (low, high byte)
|
||||
3rd Word: value (low, high byte)</td><td width="100">0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ARM_PATCH[40]</td><td align="center">88(0x58)</td><td> L40: 0=unused ARM patch area (5 entries): 5 X 2 X4 Bytes to modify any 30 bit ARM
|
||||
address location after protocol stack initialisation:
|
||||
1st Word: address (big endian)
|
||||
2nd Word: value (big endian)
|
||||
The 2 MSBits of the address define the
|
||||
write access type:
|
||||
00: Word access (u32)
|
||||
01: Halfword access (u16)
|
||||
10: Byte access (u8) </td><td width="100">0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_CLOCK</td><td align="center">128(0x80)</td><td> L1 </td><td width="100">0x02,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FWROM_BOARDER</td><td align="center">129(0x81)</td><td> L1 </td><td width="100">0x1D,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PORBGCFG</td><td align="center">130(0x82)</td><td> L1 PORBGCFG (POR calibration value) </td><td width="100">0xC0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FPTR</td><td align="center">131(0x83)</td><td> L1 MSB used to enable/disable use of this parameter 0=enable </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FULL_POWER</td><td align="center">132(0x84)</td><td> DTPC Full Power </td><td width="100">0x7F,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LOW_POWER</td><td align="center">133(0x85)</td><td> DTPC Low(medium) Power </td><td width="100">0xC4,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LOWEST_POWER</td><td align="center">134(0x86)</td><td> DTPC Lowest Power</td><td width="100">0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_LSP_ATTEN_RANGE[2]</td><td align="center">135(0x87)</td><td> L2 AEC_lsp_atten_range For all AEC parameters see User Manual
|
||||
Vega-Family ARM DSP RELEASE V7.5
|
||||
(or higher)</td><td width="100">0x00, 0x08,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_NLMS_ERL[2]</td><td align="center">137(0x89)</td><td> L2 </td><td width="100">0x40, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_X_CLIP[2]</td><td align="center">139(0x8B)</td><td> L2 </td><td width="100">0x0F, 0x1F,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_ECHO_RATIO[2]</td><td align="center">141(0x8D)</td><td> L2 </td><td width="100">0x00, 0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_GAMMA_E_HIGH[2]</td><td align="center">143(0x8F)</td><td> L2 </td><td width="100">0xCC, 0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_GAMMA_E_LOW[2]</td><td align="center">145(0x91)</td><td> L2 </td><td width="100">0x80, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_GAMMA_E_DT[2]</td><td align="center">147(0x93)</td><td> L2 </td><td width="100">0x66, 0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_GAMMA_N[2]</td><td align="center">149(0x95)</td><td> L2 </td><td width="100">0x00, 0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_TAIL_ALPHA[2]</td><td align="center">151(0x97)</td><td> L2 </td><td width="100">0x66, 0x66,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_TAIL_PORTION[2]</td><td align="center">153(0x99)</td><td> L2 </td><td width="100">0xD7, 0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_NL_ATTEN[2]</td><td align="center">155(0x9B)</td><td> L2 </td><td width="100">0x00, 0x08,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_DENS_CNI_LEVEL[2]</td><td align="center">157(0x9D)</td><td> L2 </td><td width="100">0x00, 0x20,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_MODE[2]</td><td align="center">159(0x9F)</td><td> L2 </td><td width="100">0xF7, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AEC_ECHO_PATH_DELAY[2]</td><td align="center">161(0xA1)</td><td> L2 </td><td width="100">0x00, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTPC_ENABLE</td><td align="center">163(0xA3)</td><td></td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RSSI_TIMER</td><td align="center">164(0xA4)</td><td></td><td width="100">0x64,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DRPC_RSSI_THRESH</td><td align="center">165(0xA5)</td><td></td><td width="100">0x80,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DRPC_RSSI_CORRECT</td><td align="center">166(0xA6)</td><td></td><td width="100">0x1C,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVR2C_INIT</td><td align="center">167(0xA7)</td><td> L1 </td><td width="100">0x40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FI_TRIG_GPIO</td><td align="center">168(0xA8)</td><td> L1 </td><td width="100">0x0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_SUPPORT_FCC</td><td align="center">169(0xA9)</td><td> L1 </td><td width="100">0x0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_TC_DELAY</td><td align="center">170(0xAA)</td><td> L1 </td><td width="100">0x3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GAP_DELAY</td><td align="center">171(0xAB)</td><td> L1 </td><td width="100">0x8,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GAP_DELAY_FADOFF</td><td align="center">172(0xAC)</td><td> L1 </td><td width="100">0xA,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_TRSSI_DELAY</td><td align="center">173(0xAD)</td><td> L1 </td><td width="100">0x25,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_TRSSI_DELAY_FADOFF</td><td align="center">174(0xAE)</td><td> L1 </td><td width="100">0x13,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_DEVIATION</td><td align="center">175(0xAF)</td><td> L1 </td><td width="100">0x13,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_ATEST</td><td align="center">176(0xB0)</td><td> L1 </td><td width="100">0xF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_DTEST</td><td align="center">177(0xB1)</td><td> L1 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_PA2_COMP</td><td align="center">178(0xB2)</td><td> L1 </td><td width="100">0x3C,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_PA_ON</td><td align="center">179(0xB3)</td><td> L1 </td><td width="100">0x33,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GAIN</td><td align="center">180(0xB4)</td><td> L1 </td><td width="100">0x0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_MLSE</td><td align="center">181(0xB5)</td><td>L1 Bit Meaning 0 MLSE active
|
||||
1 Dynamic MLSE active
|
||||
2 MLSE CLK Polarity
|
||||
3 MLSE deviation 0 – 288, 1 – 360
|
||||
4 4 bit field giving MLSE delay in bits
|
||||
5 If set to 0 – delay defaults to 9
|
||||
6 –
|
||||
7 –
|
||||
</td><td width="100">0x1,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_KCALOVR</td><td align="center">182(0xB6)</td><td>L1 </td><td width="100">0x0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_KCALOVR_LINEAR</td><td align="center">183(0xB7)</td><td>L1 Linear KCAL correction, 4 LSB A factor (KCALOVR_A) 4 MSB B factor (KCALOVR_B)</td><td width="100">0x88,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_BEACON_LP</td><td align="center">184(0xB8)</td><td>L1 Bit0 - Enable. Bit1-7 - Value of power when HS on cradle</td><td width="100">0xC1,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GENERIC_ADD1[2]</td><td align="center">185(0xB9)</td><td> L2 </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GENERIC_ADD2[2]</td><td align="center">187(0xBB)</td><td> L2 </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GENERIC_ADD3[2]</td><td align="center">189(0xBD)</td><td> L2 </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GENERIC_ADD4[2]</td><td align="center">191(0xBF)</td><td> L2 </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APU_GENERIC_CONTROL</td><td align="center">193(0xC1)</td><td>L1 bit [1:0] = control of SD02_RF19APU_GENERIC_ADD1
|
||||
bit [3:2] = control of SD02_RF19APU_GENERIC_ADD2
|
||||
bit [5:4] = control of
|
||||
SD02_RF19APU_GENERIC_ADD3
|
||||
bit [7:6] = control of SD02_RF19APU_GENERIC_ADD4
|
||||
|
||||
for each of the above:
|
||||
if 0 (or 3): use the appropriate register as RF indirect mapping 0~256
|
||||
if 1: use the appropriate register as direct space mapping 0 – 104
|
||||
if 2: use the appropriate register as analog indirect space mapping 0 – 69
|
||||
</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FNR_N_LOW[2]</td><td align="center">194(0xC2)</td><td> L2 FNR SD02_FNR_N_LOW </td><td width="100">0x00,0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FNR_N_HIGH[2]</td><td align="center">196(0xC4)</td><td> L2 FNR SD02_FNR_N_HIGH </td><td width="100">0x40,0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FNR_NR_LIMIT[2]</td><td align="center">198(0xC6)</td><td> L2 FNR SD02_FNR_NR_LIMIT </td><td width="100">0x00,0x28,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FNR_spDETCC[2]</td><td align="center">200(0xC8)</td><td> L2 FNR SD02_FNR_spDETCC </td><td width="100">0x00,0x02,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FNR_Ton_detect[2]</td><td align="center">202(0xCA)</td><td> L2 FNR SD02_FNR_Ton_detect </td><td width="100">0x00,0x06,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_OPTIONS</td><td align="center">204(0xCC)</td><td> L1 - Bit 0-1: Codec preferred (0-G726,1-G727,other reserved)
|
||||
Bit 2: Action in Normal - unused
|
||||
Bit 3: Action in Protected - unused
|
||||
Bit 4: Opt G726 - activate improved - unused
|
||||
Bit 5-6: Mode (0-Auto,1-Normal,2-Protected,3-Reserved) - not relevant in FT
|
||||
Bit 7: Enable/Disable.
|
||||
</td><td width="100">0x81,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_SB_PATT</td><td align="center">205(0xCD)</td><td>L1 - Padding option for SB (i.e. nibble) either 4 bits or 8 bitsfor WB codecs </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_FB_PATT</td><td align="center">206(0xCE)</td><td>L1 - Padding option for FB (i.e. all frame) either 4 bits or 8 bits for WB codecs </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_START_MUTE_NR</td><td align="center">207(0xCF)</td><td>L1 - Number of errors to start full frame mute </td><td width="100">0x1E,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_STOP_MUTE_NR</td><td align="center">208(0xD0)</td><td>L1 - Number of errors to stop full frame mute </td><td width="100">0x0F,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_DECAY[2]</td><td align="center">209(0xD1)</td><td>L2 - First Byte - Decay MSB, Second byte : Decay LSB (in Q12) </td><td width="100">0x0F,
|
||||
|
||||
0xD4,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_SATURATION</td><td align="center">211(0xD3)</td><td>L1 - Saturation value for FB filter </td><td width="100">0x28,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_MSG</td><td align="center">212(0xD4)</td><td>L1 - Nr of Frames before msg mute/unmute </td><td width="100">0x1E,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CONTROL</td><td align="center">213(0xD5)</td><td>L1 - Enable Clock Divider Selection</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CLK_DIV[3]</td><td align="center">214(0xD6)</td><td>L3 - Clock Divider Setting </td><td width="100">0x00,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CLK_SEL[2]</td><td align="center">217(0xD9)</td><td>L2 - Clock Selection </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AHB_PLL_SETTING_LOW[4]</td><td align="center">219(0xDB)</td><td>L4 - AHB PLL LOW Setting </td><td width="100">0x00,0x00,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AHB_PLL_SETTING_MED[4]</td><td align="center">223(0xDF)</td><td>L4 - AHB PLL MED Setting </td><td width="100">0x00,0x00,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AHB_PLL_SETTING_HIGH[4]</td><td align="center">227(0xE3)</td><td>L4 - AHB PLL HIGH Setting </td><td width="100">0x00,0x00,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CP_FEATURES</td><td align="center">231(0xE7)</td><td>L1 - CP features Setting </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CP_CONFIGURATION_OFFSET</td><td align="center">232(0xE8)</td><td>Bit 0: If set, SYPO alignment is offset by 1 slot,Bit 2: Dummy Merge to first traffic</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CP_ULE_FLAGS</td><td align="center">233(0xE9)</td><td> L1 - Phase 1: 0x2, Phase 1.2: 0x6 ,Phase 2: 0xA, Phase 3: 0xE</td><td width="100">0x0A,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DUMMY_BEARER_THRES_ADAPT_THRESH</td><td align="center">234(0xEA)</td><td></td><td width="100">0x58,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RF19APUZ_EXT_LNA</td><td align="center">235(0xEB)</td><td>L1 - CP features Setting </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RFIC_SELECTION</td><td align="center">236(0xEC)</td><td>L1 - CP features Setting </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_UNUSED_210</td><td align="center">237(0xED)</td><td> L1 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PHS_SCAN_PARAM</td><td align="center">238(0xEE)</td><td> JDECT parameters: RSSI threshold for PHS detection. PHS scan every 10 seconds. </td><td width="100">0x0C,
|
||||
</td></tr>
|
||||
<tr><td>SD02_JDECT_LEVEL1_M82</td><td align="center">239(0xEF)</td><td> minus 82 dBm RSSI threshold for Japan regulation </td><td width="100">0x0B,
|
||||
</td></tr>
|
||||
<tr><td>SD02_JDECT_LEVEL2_M62</td><td align="center">240(0xF0)</td><td> minus 62 dBm RSSI threshold for Japan regulation </td><td width="100">0x11,
|
||||
</td></tr>
|
||||
<tr><td>SD02_JDECT_CERTAINTY_PARAM</td><td align="center">241(0xF1)</td><td> PHS detection Certainty parameters.(upper nibble reduces miss detection. lower nibble reduces false alaram) </td><td width="100">0x55,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ULE_DUMMY_TRAF_THRESH</td><td align="center">242(0xF2)</td><td>L1 - Threshold for dummy traffic bearer merge</td><td width="100">0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PWR_ADC_INPUT</td><td align="center">243(0xF3)</td><td> L1 Input source of the Auxiliary A/D </td><td width="100">0x0E,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PWR_POR_INPUT</td><td align="center">244(0xF4)</td><td> L1 Input source of the POR A/D </td><td width="100">0x16,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RES_FACTOR</td><td align="center">245(0xF5)</td><td> L1 Resistor Factor on AUX input </td><td width="100">0x02,
|
||||
</td></tr>
|
||||
<tr><td>SD02_UART_DELAY_TIMER</td><td align="center">246(0xF6)</td><td>L1 - Selects the timer in 10 msec to delay UART</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_V21_VOL_HIGH</td><td align="center">247(0xF7)</td><td>L2 SD02_V21_VOL_HIGH </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_V21_VOL_LOW</td><td align="center">248(0xF8)</td><td>L2 SD02_V21_VOL_LOW </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PRODUCTION_TEST_RSSI_THRESH_DOWNLINK</td><td align="center">249(0xF9)</td><td>L1 SD02_PRODUCTION_TEST_RSSI_THRESH_DOWNLINK </td><td width="100">0x88,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PRODUCTION_TEST_RSSI_THRESH_UPLINK</td><td align="center">250(0xFA)</td><td>L1 SD02_PRODUCTION_TEST_RSSI_THRESH_UPLINK </td><td width="100">0x88,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FIXED_CARRIER_OFFSET</td><td align="center">251(0xFB)</td><td>L1 SD02_FIXED_CARRIER_OFFSET - Bit(0..5) : Carrier to use ,
|
||||
Bit(6) : Enable fixed PM carrier ,
|
||||
Bit(7) : Seta fixed carrier [bit(0..4)] in RF file. When using this option you MUST set PP+FP with the same carrier.
|
||||
</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_TEMP_MEASURE_TIME</td><td align="center">252(0xFC)</td><td>L1 SD02_TEMP_MEASURE_TIME. bit 0-1 temperature measurement period for VCAL. 2 bits for 4 values 0,1,2,3 == 5,1,2,3 minutes. default value == 0
|
||||
</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>FNCA_DRV_UNUSED</td><td align="center">253(0xFD)</td><td> <----------- unused </td><td width="100">0xCC,</td></tr>
|
||||
<tr><td>SD02_SMS_FW_VERSION[6]</td><td align="center">253(0xFD)</td><td> L6 </td><td width="100">0xCC,0x21,0x10,0x20,0x03,0xCC,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMTE_RESOURCES</td><td align="center">259(0x103)</td><td> L1 </td><td width="100">0x11,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_BREAK_SMS_CALL</td><td align="center">260(0x104)</td><td> L1 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SUBADDR_MASK[2]</td><td align="center">261(0x105)</td><td> L2 </td><td width="100">0x00,0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_MIN_BYTES_FREE</td><td align="center">263(0x107)</td><td> L1 </td><td width="100">0x28,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_OFFHOOK</td><td align="center">264(0x108)</td><td> L1 </td><td width="100">0x14,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_ESTABLISH</td><td align="center">265(0x109)</td><td> L1 </td><td width="100">0x14,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_HACK_CODE</td><td align="center">266(0x10A)</td><td> L1 </td><td width="100">0x10,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_TIMER_T2[2]</td><td align="center">267(0x10B)</td><td> L2 </td><td width="100">0x02,0xF8,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_TIMER_T3[2]</td><td align="center">269(0x10D)</td><td> L2 </td><td width="100">0x02,0xEE,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_TIMER_T6[2]</td><td align="center">271(0x10F)</td><td> L2 </td><td width="100">0x00,0x14,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_TIMER_T10</td><td align="center">273(0x111)</td><td> L1 </td><td width="100">0x0A,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_TIMER_T10BIS</td><td align="center">274(0x112)</td><td> L1 </td><td width="100">0x35,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_FSK_FREQ0[2]</td><td align="center">275(0x113)</td><td> L2 </td><td width="100">0x00,0x15,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_FSK_FREQ1[2]</td><td align="center">277(0x115)</td><td> L2 </td><td width="100">0x00,0x0D,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_FSK_CIT_VOL[2]</td><td align="center">279(0x117)</td><td> L2 </td><td width="100">0x13,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_FSK_TIMER_PREAM</td><td align="center">281(0x119)</td><td> L1 </td><td width="100">0x0D,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_PROT_RESP_TYPE</td><td align="center">282(0x11A)</td><td> L1 </td><td width="100">0x80,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_PROT_BEARER_CAP[20]</td><td align="center">283(0x11B)</td><td> L20 </td><td width="100">0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_PROT(k)[42]</td><td align="center">303(0x12F)</td><td> 21 * Nr_of_Protocols. Where 21 is the length of protocol. </td><td width="100">0x80,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0x80,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_SETTINGS</td><td align="center">345(0x159)</td><td> L1 </td><td width="100">0x12,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_VALIDITY_TIME</td><td align="center">346(0x15A)</td><td> L1 </td><td width="100">0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_EMAIL_SEP</td><td align="center">347(0x15B)</td><td> L1 Email Separator</td><td width="100">0x20,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_OPERATOR</td><td align="center">348(0x15C)</td><td> L1 </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_UNUSED[2]</td><td align="center">349(0x15D)</td><td> L2 </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_INC_NUM[8]</td><td align="center">351(0x15F)</td><td> L8 </td><td width="100">0x04,0x21,0x1F,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_OUT_NUM[8]</td><td align="center">359(0x167)</td><td> L8 </td><td width="100">0x42,0x11,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC_EMAIL_NUM[8]</td><td align="center">367(0x16F)</td><td> L8 </td><td width="100">0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_SMSC(i)[90]</td><td align="center">375(0x177)</td><td> SMSC area end SMSC * 30. Where 30 is the length of data for one SMSC </td><td width="100">0x01,
|
||||
|
||||
0x03,
|
||||
|
||||
0x20,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,0x00,
|
||||
|
||||
0x01,0x93,0x01,0x0F,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0x01,0x93,0x01,0x0F,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0x08,0x00,0xF0,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0x01,
|
||||
|
||||
0x03,
|
||||
|
||||
0x20,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,0x00,
|
||||
|
||||
0x20,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0x20,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0x01,
|
||||
|
||||
0x03,
|
||||
|
||||
0x20,
|
||||
|
||||
0x05,
|
||||
|
||||
0x00,0x00,
|
||||
|
||||
0x01,0x90,0x01,0x50,
|
||||
|
||||
0x4F,0xFF,0xFF,0xFF,
|
||||
|
||||
0x01,0x90,0x01,0x50,
|
||||
|
||||
0x4F,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ACV10_VOLUME[2]</td><td align="center">465(0x1D1)</td><td> L2 ACV10 Volume Control for SPK 2 bytes </td><td width="100">0x08,0x00,
|
||||
</td></tr>
|
||||
<tr><td>FNCA_SMS_UNUSED[2]</td><td align="center">467(0x1D3)</td><td> <----------- unused </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_CALL_BARRING[30]</td><td align="center">469(0x1D5)</td><td> L30 call barring data </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_MASTER_PIN[4]</td><td align="center">499(0x1F3)</td><td> L4 master mode pin code, reset value e.g. FF FF 15 90 </td><td width="100">0xFF,0xFF,0x15,0x90,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AC[4]</td><td align="center">503(0x1F7)</td><td> L4 authentication code, e.g. FF FF 15 90</td><td width="100">0xFF,0xFF,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RING_ON_OFF</td><td align="center">507(0x1FB)</td><td> L1 ring on/off enabled </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ULE_AC[4]</td><td align="center">508(0x1FC)</td><td> L4 ULE authentication code, e.g. FF FF 00 00</td><td width="100">0xFF,0xFF,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_EEPROM0_END</td><td align="center">512(0x200)</td><td></td><td width="100"></td></tr>
|
||||
<tr><td>SD02_BOOT_DELAY</td><td align="center">513(0x201)</td><td> L1 Boot up delay in seconds </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_HAN_START_FILE_0[8514]</td><td align="center">514(0x202)</td><td><a href="bhanEepromDefaults.html">HAN EEPROM Block</a> </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_HAN_END_FILE_0</td><td align="center">9028(0x2344)</td><td> HAN EEPROM Block End</td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_IPUI[5]</td><td align="center">9029(0x2345)</td><td> L5 Data: IPUI </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_TPUI[3]</td><td align="center">9034(0x234A)</td><td> L3 Data: TPUI </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_DCK[16]</td><td align="center">9037(0x234D)</td><td> L16 Data: DCK </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_UAK[16]</td><td align="center">9053(0x235D)</td><td> L16 Data: UAK </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_AC[4]</td><td align="center">9069(0x236D)</td><td> L4 Data: authentication code AC </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_UAK_AUTH</td><td align="center">9073(0x2371)</td><td> L1 Data: UAK authorization </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_STATUS</td><td align="center">9074(0x2372)</td><td> L1 Data: status </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_HANDSET_NR</td><td align="center">9075(0x2373)</td><td> L1 Data: handset number </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_DCK_ASSIGNED[2]</td><td align="center">9076(0x2374)</td><td> L1 Data: DCK assigned </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_FEATURES</td><td align="center">9078(0x2376)</td><td> L1 CP Features </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_DEFCK[16]</td><td align="center">9079(0x2377)</td><td> L16 Data: Default Cipher Key </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_DEFCK_ASSIGNED</td><td align="center">9095(0x2387)</td><td> L1 Data: DefCK assigned </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_CCM_CK[16]</td><td align="center">9096(0x2388)</td><td> L16 Data: CCM Key for ULE </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_DLC_OPERATING_MODE</td><td align="center">9112(0x2398)</td><td> L1 ULE DLC operating mode </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_HL_FEATURES</td><td align="center">9113(0x2399)</td><td> L1 ULE HL features </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_RESERVED[4]</td><td align="center">9114(0x239A)</td><td> L4 Reserved for future use </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_NEXT_RX_SEQUENCE_NUMBER[3]</td><td align="center">9118(0x239E)</td><td> L3 RX Sequence number </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_NEXT_TX_SEQUENCE_NUMBER[3]</td><td align="center">9121(0x23A1)</td><td> L3 TX Sequence number </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_OVER_A_FIELD_NEXT_RX_SEQUENCE_NUMBER[3]</td><td align="center">9124(0x23A4)</td><td> L3 RX Sequence number </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_OVER_A_FIELD_NEXT_TX_SEQUENCE_NUMBER</td><td align="center">9127(0x23A7)</td><td> L3 TX Sequence number </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_LEN[13978]</td><td align="center">101(0x65)</td><td> End of first subscribtion </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_ULE_SUB_UNUSED[5]</td><td align="center">14079(0x36FF)</td><td> <----------- unused </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_MD5_SIGNATURE[16]</td><td align="center">14084(0x3704)</td><td> L16 16 bytes of MD5 signature</td><td width="100"></td></tr>
|
||||
<tr><td>SD02_MD5_END</td><td align="center">14100(0x3714)</td><td> L0</td><td width="100"></td></tr>
|
||||
<tr><td>SD02_MD5_UNUSED</td><td align="center">14093(0x370D)</td><td> <----------- unused </td><td width="100"></td></tr>
|
||||
<tr><td>FNCA_MMI_UNUSED[7]</td><td align="center">14093(0x370D)</td><td> <----------- unused </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_LAL</td><td align="center">14100(0x3714)</td><td> L1 </td><td width="100">0x24,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SUB_Y</td><td align="center">14101(0x3715)</td><td> L1 </td><td width="100">0x24,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_CID_MARK_MODE</td><td align="center">14102(0x3716)</td><td> L1 DSP CID start state for mark mode - upper byte (Bits 8-15) </td><td width="100">0x40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_CID_SEIZURE_MODE</td><td align="center">14103(0x3717)</td><td> L1 DSP CID start state for seizure mode - upper byte (Bits 8-15) </td><td width="100">0x40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_THP2_KI[2]</td><td align="center">14104(0x3718)</td><td> L2 DSP THP2 - ki - input scaling factor - Currently unused </td><td width="100">0x10,
|
||||
|
||||
0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_TXV[2]</td><td align="center">14106(0x371A)</td><td> L2 AUDIO TX volume control </td><td width="100">0x23,
|
||||
|
||||
0xBC,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_RXV[2]</td><td align="center">14108(0x371C)</td><td> L2 AUDIO RX volume control </td><td width="100">0x10,
|
||||
|
||||
0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DSP_RLP[2]</td><td align="center">14110(0x371E)</td><td> L2 AUDIO RLP volume control </td><td width="100">0x20,
|
||||
|
||||
0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AFE_AFELGC1</td><td align="center">14112(0x3720)</td><td> L1 AFE gains </td><td width="100">0x23,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AFE_AFEMSGC1_NORMAL</td><td align="center">14113(0x3721)</td><td> L1 AFE gains normal mode </td><td width="100">0x32,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_RING_ON</td><td align="center">14114(0x3722)</td><td> min. DAEV_RING_ON </td><td width="100">2,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_RING_OFF</td><td align="center">14115(0x3723)</td><td> min. DAEV_RING_OFF </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_DTMF_ON</td><td align="center">14116(0x3724)</td><td> min. DAEV_DTMF_ON </td><td width="100">2,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_DTMF_OFF</td><td align="center">14117(0x3725)</td><td> min. DAEV_DTMF_OFF </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CPDS_ON</td><td align="center">14118(0x3726)</td><td> min. DAEV_CPDS_ON </td><td width="100">2,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CPDS_OFF</td><td align="center">14119(0x3727)</td><td> min. DAEV_CPDS_OFF </td><td width="100">2,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CPDB_ON</td><td align="center">14120(0x3728)</td><td> min. DAEV_CPDB_ON </td><td width="100">4,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CPDB_OFF</td><td align="center">14121(0x3729)</td><td> min. DAEV_CPDB_OFF </td><td width="100">4,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_FXD1_ON</td><td align="center">14122(0x372A)</td><td> min. DAEV_FXD1_ON </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_FXD1_OFF</td><td align="center">14123(0x372B)</td><td> min. DAEV_FXD1_OFF </td><td width="100">1,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_FXD2_ON</td><td align="center">14124(0x372C)</td><td> min. DAEV_FXD2_ON </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_FXD2_OFF</td><td align="center">14125(0x372D)</td><td> min. DAEV_FXD2_OFF </td><td width="100">1,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_GTD1_ON</td><td align="center">14126(0x372E)</td><td> min. DAEV_GTD1_ON </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_GTD1_OFF</td><td align="center">14127(0x372F)</td><td> min. DAEV_GTD1_OFF </td><td width="100">1,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CAS_ON</td><td align="center">14128(0x3730)</td><td> min. DAEV_CAS_ON </td><td width="100">2,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CAS_OFF</td><td align="center">14129(0x3731)</td><td> min. DAEV_CAS_OFF </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MIN_CAS_REQUIRED</td><td align="center">14130(0x3732)</td><td> min. DAEV_CAS_REQUIRED </td><td width="100">0x60,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_ON</td><td align="center">14131(0x3733)</td><td> min. DTMF tone on duration </td><td width="100">40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_OFF</td><td align="center">14132(0x3734)</td><td> min. pause after DTMF </td><td width="100">40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DIAL_PAUSE</td><td align="center">14133(0x3735)</td><td> min. dial pause </td><td width="100">125,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_VOL_LOW</td><td align="center">14134(0x3736)</td><td> V6dB low DTMF frequency </td><td width="100">0x40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_VOL_LOW_HIGH</td><td align="center">14135(0x3737)</td><td> V6dB low DTMF frequency high </td><td width="100">0x24,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_VOL_HIGH</td><td align="center">14136(0x3738)</td><td> V6dB high DTMF frequency </td><td width="100">0xB0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_VOL_HIGH_HIGH</td><td align="center">14137(0x3739)</td><td> V6dB high DTMF frequency high </td><td width="100">0x2D,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PULSE_MAKE_LENGTH</td><td align="center">14138(0x373A)</td><td> L1 PSTN:dialPULSE </td><td width="100">40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PULSE_BREAK_LENGTH</td><td align="center">14139(0x373B)</td><td> L1 PSTN:dialPULSE </td><td width="100">60,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PULSE_IDP_LENGTH</td><td align="center">14140(0x373C)</td><td> L1 PSTN:dialPULSE </td><td width="100">80,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LCURRENT_CYCLE</td><td align="center">14141(0x373D)</td><td> L1 PSTN:PCA1070 </td><td width="100">50,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LCURRENT_IDP</td><td align="center">14142(0x373E)</td><td> L1 PSTN:PCA1070 </td><td width="100">32,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PAUSE_LENGTH</td><td align="center">14143(0x373F)</td><td> L1 PSTN/AUDIO:dial</td><td width="100">30,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FLASH_LENGTH</td><td align="center">14144(0x3740)</td><td> L1 PSTN:dial </td><td width="100">10,
|
||||
</td></tr>
|
||||
<tr><td>SD02_EARTH_LENGTH</td><td align="center">14145(0x3741)</td><td> L1 PSTN:dial </td><td width="100">40,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RING_MIN</td><td align="center">14146(0x3742)</td><td> L1 PSTN:ringer </td><td width="100">18,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RING_MAX</td><td align="center">14147(0x3743)</td><td> L1 PSTN:ringer </td><td width="100">50,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RON_DETECT</td><td align="center">14148(0x3744)</td><td> L1 PSTN:ringer </td><td width="100">9,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RON_HOLD</td><td align="center">14149(0x3745)</td><td> L1 PSTN:ringer </td><td width="100">20,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ROFF_DETECT</td><td align="center">14150(0x3746)</td><td> L1 PSTN:ringer </td><td width="100">11,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ROFF_HOLD</td><td align="center">14151(0x3747)</td><td> L1 PSTN:ringer </td><td width="100">25,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LIF_CURR_LO</td><td align="center">14152(0x3748)</td><td> L1 PSTN:l.current </td><td width="100">0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LIF_CURR_HI</td><td align="center">14153(0x3749)</td><td> L1 +1 </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WETTING_TIME</td><td align="center">14154(0x374A)</td><td> L1 Wetting Pulse </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTMF_D_TIME</td><td align="center">14155(0x374B)</td><td> L1 DTMF-D for CAS </td><td width="100">0x23,
|
||||
</td></tr>
|
||||
<tr><td>SD02_STUTTER_CYCLES</td><td align="center">14156(0x374C)</td><td> L1 # of Stutter </td><td width="100">0x0A,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CID_DET_ENBL_TIME</td><td align="center">14157(0x374D)</td><td> L1 CID detection 100ms steps </td><td width="100">38,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FSK_START_TIME</td><td align="center">14158(0x374E)</td><td> L1 CID-2 detection </td><td width="100">0xE0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FSK_OFFHOOK_TIME[2]</td><td align="center">14159(0x374F)</td><td> L2 CID-2 detection </td><td width="100">0xAD,
|
||||
|
||||
0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AFE_AFEMSGC1_HF</td><td align="center">14161(0x3751)</td><td> L1 AFE gains for Handsfree </td><td width="100">0x32,
|
||||
</td></tr>
|
||||
<tr><td>SD02_AFE_AFEMSGC2</td><td align="center">14162(0x3752)</td><td> L1 AFE gains </td><td width="100">0x51,
|
||||
</td></tr>
|
||||
<tr><td>SD02_EAR_VOL_TAB[10]</td><td align="center">14163(0x3753)</td><td> L10 10 volume values for polyphonic ringing (increasing order)</td><td width="100">0x02,0x03,0x04,0x06,0x08,
|
||||
|
||||
0x09,0x0A,0x0B,0x0c,0x0d,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVBC1C_VAL</td><td align="center">14173(0x375D)</td><td> L1 Codec 1 (In base Spk) control </td><td width="100">0xC0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVBC1G_VAL</td><td align="center">14174(0x375E)</td><td> L1 Codec 1 (In base Spk) gain </td><td width="100">0x4F,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVBC1C_VAL_HF</td><td align="center">14175(0x375F)</td><td> L1 Codec 1 (In base Spk) control for HF</td><td width="100">0xC0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVBC1G_VAL_HF</td><td align="center">14176(0x3760)</td><td> L1 Codec 1 (In base Spk) gain for HF</td><td width="100">0x4F,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WBE_ENABLE</td><td align="center">14177(0x3761)</td><td> L1 WBE_FT Enable </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RVDDC_FIX_ENABLE</td><td align="center">14178(0x3762)</td><td> L1 ENABLE/DISABLE Patch for RVDCDC HW bug</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INBAND_TONE_SELECT</td><td align="center">14179(0x3763)</td><td> L1 Select country for inband tone </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DRV_UNUSED</td><td align="center">14180(0x3764)</td><td> <----------- unused </td><td width="100">0xFF,</td></tr>
|
||||
<tr><td>SD02_ALLOC_LINE1[2]</td><td align="center">14180(0x3764)</td><td>handset allocation (see Protocol Interface) bitwise per handset: 1 = handset allocated;
|
||||
(0xFF 0xFF indicates Collective ringing) for
|
||||
each of the next 3 lines</td><td width="100">0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ALLOC_LINE2[2]</td><td align="center">14182(0x3766)</td><td></td><td width="100">0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ALLOC_LINE3[2]</td><td align="center">14184(0x3768)</td><td></td><td width="100">0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_HS_TYPE_CATIQ30</td><td align="center">14186(0x376A)</td><td> Tells HS is CatIQ30 capable implemented for Max 8 HS only </td><td width="100">0x0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WB_TYPE_HSNR[2]</td><td align="center">14187(0x376B)</td><td> PT WB capability storage Note:For CAT-IQ builds user should not modify this location</td><td width="100">0,0,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WB_LINE_TYPE</td><td align="center">14189(0x376D)</td><td> FT Line TYPE storgare(2= G711WB, 1 = WB , 0 =NB) </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_WB_LINE_SUB_TYPE</td><td align="center">14190(0x376E)</td><td> FT WB Line Sub Type ( 0 = G722 WB, 1 = G711 WB) </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DH_MIX_RATIO</td><td align="center">14191(0x376F)</td><td></td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_NEMO_PTS[2]</td><td align="center">14192(0x3770)</td><td> Two Bytes are used</td><td width="100">0xFF,0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SPK_SLOT_TYPE</td><td align="center">14194(0x3772)</td><td> Slot type for SPK phone</td><td width="100">0x02,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MAX_NUM_ACT_CALLS_PT</td><td align="center">14195(0x3773)</td><td> Maximum nmber of active calls of 1 PT.</td><td width="100">0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_NEMO_DISABLED</td><td align="center">14196(0x3774)</td><td> bit 7 is used for permanent NEMo disable </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_HS_TYPE_CATIQ20[2]</td><td align="center">14197(0x3775)</td><td> L2: Two bytes for CAT-iq 2.0 Handset </td><td width="100">0x00,
|
||||
|
||||
0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_FP_CUSTOM_FEATURES</td><td align="center">14199(0x3777)</td><td> Bit-0: INL 0-enable/1-disable, Bit-1: 0-conf,trfr enable/1-conf,trfr disable</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ENCRYPT_STATUS</td><td align="center">14200(0x3778)</td><td> L1: Encryption enable/disable</td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MM_CAPABILITIES[10]</td><td align="center">14201(0x3779)</td><td> L10: MM Capabilities for each Handset.FTEEP_NUM_SUB/SD09_MAX_NUM_SUB is hard coded as 10 </td><td width="100">0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ARBITRARY_TPUI[3]</td><td align="center">14211(0x3783)</td><td> L3 : 3 bytes to store arbitrary TPUI</td><td width="100">0x00,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_HS_TYPE_CATIQ21[2]</td><td align="center">14214(0x3786)</td><td> L2: Two bytes for CAT-iq 2.1 Handset </td><td width="100">0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INTERFERENCE_DETECTION_MEASUREMENT_INTERVAL</td><td align="center">14216(0x3788)</td><td> L1: Interference Detection Measurement Interval </td><td width="100">60,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INTERFERENCE_DETECTION_NOISE_INTERVAL</td><td align="center">14217(0x3789)</td><td> L1: Interference Detection Noise Interval </td><td width="100">30,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INTERFERENCE_DETECTION_CONFIG1</td><td align="center">14218(0x378A)</td><td> L1: Interference Detection config1, bit 0-7: Active Carriers Mask, carriers 1-8 </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INTERFERENCE_DETECTION_CONFIG2</td><td align="center">14219(0x378B)</td><td> L1: Interference Detection config2, bit 0-1: Active Carriers Mask, carriers 9-10; bit7: 1-Enable/0-Disable Interference Detection alg.</td><td width="100">0x83,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INTERFERENCE_DETECTION_TRAFFIC_SLOTS_IN_FRAME</td><td align="center">14220(0x378C)</td><td> L1: Interference Detection Traffic Slots In Frame </td><td width="100">0x03,
|
||||
</td></tr>
|
||||
<tr><td>SD02_INTERFERENCE_DETECTION_INTERFERENCE_LEVEL</td><td align="center">14221(0x378D)</td><td> L1: Interference Detection Interference Level </td><td width="100">0x98,
|
||||
</td></tr>
|
||||
<tr><td>SD02_NEMO_CONTROL</td><td align="center">14222(0x378E)</td><td> L1: MSB enables HM00_NEMO_DUMMY_USE_RSSI_FOR_IF_CHECK, others are for extending NEMO WA bearer time </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>FCAC_HLP_END</td><td align="center">14223(0x378F)</td><td> </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_RINGER_EXPIRY</td><td align="center">14223(0x378F)</td><td> L1 FTMI:X line </td><td width="100">45,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LINE_EXPIRY</td><td align="center">14224(0x3790)</td><td> L1 FTMI:release </td><td width="100">85,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RINGER_MELODY</td><td align="center">14225(0x3791)</td><td> L1 FTMI:ringer </td><td width="100">9,
|
||||
</td></tr>
|
||||
<tr><td>SD02_RINGER_VOLUME</td><td align="center">14226(0x3792)</td><td> L1 FTMI:ringer </td><td width="100">3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DIAL_MODI</td><td align="center">14227(0x3793)</td><td> L1 FTMI:dtmf/reca</td><td width="100">0xD3,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DLT_CTRL</td><td align="center">14228(0x3794)</td><td> L1 FTMI:dialTone </td><td width="100">0x3A,
|
||||
</td></tr>
|
||||
<tr><td>SD02_TONDET_SEL</td><td align="center">14229(0x3795)</td><td> L1 FTMI:ena/disa enable tone detection features: 0x80: DTAS
|
||||
0x40: RPAS
|
||||
0x41: RPASFR
|
||||
0x20: MFCR</td><td width="100">0x80+0x41+0x20,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LRMS_SUPPORT[2]</td><td align="center">14230(0x3796)</td><td> L2 FTMI:LRMS sup. 1 Bit per handset. 1 indicates LMRS support
|
||||
of the according handset.</td><td width="100">0x00, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS1_PLUS_SUPPORT[2]</td><td align="center">14232(0x3798)</td><td> L2 FTMI:SMS1_PLUS sup. 1 Bit per handset. 1 indicates SMS1+ support
|
||||
of the according handset.</td><td width="100">0x00, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_COUNTRY_IDENTIFICATION</td><td align="center">14234(0x379A)</td><td> L1 FTMMS </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_SMS_TP_MR</td><td align="center">14235(0x379B)</td><td> L1 FTMMS </td><td width="100">0xfd,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTAM_RING</td><td align="center">14236(0x379C)</td><td> DTAM: ringtones </td><td width="100">0x5,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PREF_LINE[9]</td><td align="center">14237(0x379D)</td><td> L9 FTMI:ogo line, up to 9 </td><td width="100">0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PRIOR_HS[30]</td><td align="center">14246(0x37A6)</td><td> L2 FTMI:inc line, up to 3 incoming prioritized HS line 1
|
||||
ring count of prior. HS line 1
|
||||
incoming prioritized HS line 2
|
||||
ring count of prior. HS line 2
|
||||
incoming prioritized HS line 3
|
||||
ring count of prior. HS line 3</td><td width="100">0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
|
||||
0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_BLINDCALL_TIM1</td><td align="center">14276(0x37C4)</td><td> Blind call transfer timeout 1 </td><td width="100">0x1E,
|
||||
</td></tr>
|
||||
<tr><td>SD02_BLINDCALL_TIM2</td><td align="center">14277(0x37C5)</td><td> Blind call transfer timeout 2 </td><td width="100">0x1E,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PARKED_TIM</td><td align="center">14278(0x37C6)</td><td> Parked line timeout </td><td width="100">0x3c,
|
||||
</td></tr>
|
||||
<tr><td>SD02_OVERLAP_SEND_TIM</td><td align="center">14279(0x37C7)</td><td> Overlap sending timer </td><td width="100">0x4,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTAM_ENABLE</td><td align="center">14280(0x37C8)</td><td> DTAM: ON/OFF </td><td width="100">0x1,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTAM_ICM_CR</td><td align="center">14281(0x37C9)</td><td> DTAM: codRates ICM </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTAM_OGM_CR</td><td align="center">14282(0x37CA)</td><td> DTAM: codRates OGM </td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DTAM_PILL_CR</td><td align="center">14283(0x37CB)</td><td> DTAM: codRates Pill</td><td width="100">0xFF,
|
||||
</td></tr>
|
||||
<tr><td>SD02_EARVOL</td><td align="center">14284(0x37CC)</td><td> EAR Vol </td><td width="100">0x05,
|
||||
</td></tr>
|
||||
<tr><td>SD02_BS_CALL_SCREENING</td><td align="center">14285(0x37CD)</td><td> L1 Call Screening Enable/disable</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_EMC_COMPLIANT[2]</td><td align="center">14286(0x37CE)</td><td> L2 stores the compliant of PT's i.e. whether EMC is equal </td><td width="100">0x00, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_LU10_RN_UPDATE</td><td align="center">14288(0x37D0)</td><td> L1 Enable/disable update RN=SN+1 </td><td width="100">0x05,
|
||||
</td></tr>
|
||||
<tr><td>SD02_MMI_DECT_SECURITY</td><td align="center">14289(0x37D1)</td><td> L1 DECT SECURITY LEVEL </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_PREFERRED_CODEC</td><td align="center">14290(0x37D2)</td><td> L1 holds the preferred codec for CR </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PAD_OPT_NORMAL</td><td align="center">14291(0x37D3)</td><td> L1 holds the Normal action for CR: 0- nothing 1 - Mute</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_PAD_OPT_PROTECTED</td><td align="center">14292(0x37D4)</td><td> L1 holds the Protected action for CR: 0- nothing 1 - Mute</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CR_ACTION_ADPCM</td><td align="center">14293(0x37D5)</td><td> L1 holds the ADPCM action for 0- nothing 1 - Improved</td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_CLEARANGE_ENABLE</td><td align="center">14294(0x37D6)</td><td> L1 Enable CR feature </td><td width="100">0x01,
|
||||
</td></tr>
|
||||
<tr><td>SD02_REPEATER_TYPE</td><td align="center">14295(0x37D7)</td><td> L1 Hold the Repeater Type GAP,CAT-iq.NEMO </td><td width="100">0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_ULE_MULTICAST_ENC_PARAMS[53]</td><td align="center">14296(0x37D8)</td><td> L48 ULE Multicast enc. parameter: 2x (CCM key, sequence number, Multicast ID) </td><td width="100">0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
0x00,0x00,0x00,
|
||||
|
||||
0xFF,
|
||||
|
||||
0x0,
|
||||
|
||||
0x0,
|
||||
|
||||
0x0, 0x00,
|
||||
</td></tr>
|
||||
<tr><td>SD02_DECT_SETTINGS_OFFSET</td><td align="center">14349(0x380D)</td><td> DECT settings List Offset </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_CLOCK_MASTER</td><td align="center">14349(0x380D)</td><td> L1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_BASE_RESET</td><td align="center">14350(0x380E)</td><td> L1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_FW_VERSION[38]</td><td align="center">14351(0x380F)</td><td> L8 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_EEP_VERSION[38]</td><td align="center">14389(0x3835)</td><td> L8 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_HW_VERSION[38]</td><td align="center">14427(0x385B)</td><td> L8 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_NEW_PIN[4]</td><td align="center">14465(0x3881)</td><td> L4 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_EMISSION_MODE</td><td align="center">14469(0x3885)</td><td> L1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_IP_TYPE</td><td align="center">14470(0x3886)</td><td> L1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_IP_VALUE[17]</td><td align="center">14471(0x3887)</td><td> L17 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_IP_SUBNET_MASK[17]</td><td align="center">14488(0x3898)</td><td> L17 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_IP_GATEWAY[17]</td><td align="center">14505(0x38A9)</td><td> L17 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_IP_DNS_SERVER[17]</td><td align="center">14522(0x38BA)</td><td> L17 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_DSSL_FP_POWER_LEVEL</td><td align="center">14539(0x38CB)</td><td> L1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_LINE_SETTINGS_OFFSET[75]</td><td align="center">14540(0x38CC)</td><td> Line Settings List Offset </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_INL_DATA_OFFSET[375]</td><td align="center">14615(0x3917)</td><td> Internal Name List Offset </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUPTD_LIST_OFFSET[22]</td><td align="center">14990(0x3A8E)</td><td> Supported List Offset</td><td width="100"></td></tr>
|
||||
<tr><td>SD02_BSNAME_LEN</td><td align="center">15012(0x3AA4)</td><td> L1 </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_BSNAME[19]</td><td align="center">15013(0x3AA5)</td><td> L13 Bytes of data MAX </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_IPUI[5]</td><td align="center">15032(0x3AB8)</td><td> L5 Data: IPUI </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_TPUI[3]</td><td align="center">15037(0x3ABD)</td><td> L3 Data: TPUI </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_DCK[16]</td><td align="center">15040(0x3AC0)</td><td> L16 Data: DCK </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_UAK[16]</td><td align="center">15056(0x3AD0)</td><td> L16 Data: UAK </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_AC[4]</td><td align="center">15072(0x3AE0)</td><td> L4 Data: authentication code AC </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_UAK_AUTH</td><td align="center">15076(0x3AE4)</td><td> L1 Data: UAK authorization </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_STATUS</td><td align="center">15077(0x3AE5)</td><td> L1 Data: status </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_HANDSET_NR</td><td align="center">15078(0x3AE6)</td><td> L1 Data: handset number </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_DCK_ASSIGNED</td><td align="center">15079(0x3AE7)</td><td> L1 Data: DCK assigned </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_CK_LEN</td><td align="center">15080(0x3AE8)</td><td> L1 Data: Cipher Key Length </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_FEATURES</td><td align="center">15081(0x3AE9)</td><td> L1 Data: Handset ULE feature support </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_LEN[15032]</td><td align="center">50(0x32)</td><td> End of first subscribtion </td><td width="100"></td></tr>
|
||||
<tr><td>FNCA_SUB(i)[250]</td><td align="center">15082(0x3AEA)</td><td> This place is reserved for the rest of the HS and includes all perameters:SD02_SUB_IPUI-SD02_SUB_DCK_ASSIGNED (40Byte x Number of handsets)</td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_UNUSED[6]</td><td align="center">15332(0x3BE4)</td><td> <----------- unused </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_EX_DEFCK[16]</td><td align="center">15338(0x3BEA)</td><td> L16 Data: Default Cipher Key </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_EX_DEFCK_ASSIGNED</td><td align="center">15354(0x3BFA)</td><td> L1 Data: DefCK assigned </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_EX_LEN[15338]</td><td align="center">17(0x11)</td><td> End of first subscribtion </td><td width="100"></td></tr>
|
||||
<tr><td>FNCA_SUB_EX(i)[85]</td><td align="center">15355(0x3BFB)</td><td> This place is reserved for the rest of the HS and includes all perameters:SD02_SUB_IPUI-SD02_SUB_DCK_ASSIGNED (40Byte x Number of handsets)</td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_EX_UNUSED[4]</td><td align="center">15440(0x3C50)</td><td> <----------- unused </td><td width="100"></td></tr>
|
||||
<tr><td>SD02_SUB_RFPI</td><td align="center">15444(0x3C54)</td><td> L5 RFPI </td><td width="100"></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>EEPROM SIZE = 32768</h3>
|
||||
|
||||
<h6>*All non exists values on default are zero upon EEPROM reset</h6>
|
||||
|
||||
109
dectmngr/files/DCX81_fw_c/MOD/USB/bhanEepromDefaults.html
Executable file
109
dectmngr/files/DCX81_fw_c/MOD/USB/bhanEepromDefaults.html
Executable file
File diff suppressed because one or more lines are too long
1968
dectmngr/files/config/dg400prime-5.3-kernel.config
Normal file
1968
dectmngr/files/config/dg400prime-5.3-kernel.config
Normal file
File diff suppressed because it is too large
Load Diff
6709
dectmngr/files/config/dg400prime-5.3.config
Normal file
6709
dectmngr/files/config/dg400prime-5.3.config
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
||||
config dect 'dect'
|
||||
option 'radio' 'auto'
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,15 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "$ACTION" == "led_blink" ]; then
|
||||
ubus call led.dect set '{"state":"notice"}'
|
||||
fi
|
||||
|
||||
if [ "$ACTION" == "led_on" ]; then
|
||||
ubus call led.dect set '{"state":"ok"}'
|
||||
fi
|
||||
|
||||
if [ "$ACTION" == "led_off" ]; then
|
||||
ubus call led.dect set '{"state":"off"}'
|
||||
fi
|
||||
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=97
|
||||
STOP=10
|
||||
USE_PROCD=1
|
||||
|
||||
DEST=
|
||||
DEFAULT=
|
||||
OPTIONS=""
|
||||
|
||||
|
||||
start_service() {
|
||||
# avoid fp timing problem
|
||||
echo 1 > /proc/sys/kernel/printk_with_interrupt_enabled
|
||||
|
||||
# setup board specific dect parameters
|
||||
cat /proc/nvram/rfpi | tr -d ' ' | atohx > /tmp/rfpi
|
||||
cat /proc/nvram/fixed_emc | tr -d ' ' | atohx > /tmp/fixed_emc
|
||||
cat /proc/nvram/bcm_def_freq | tr -d ' ' | atohx > /tmp/bcm_def_freq
|
||||
DECTANTDIV=`db get hw.board.DectAntennaDiversity`
|
||||
case "$DECTANTDIV" in
|
||||
1|off) echo -ne "\x01" > /tmp/dect_antenna_diversity ;;
|
||||
2) echo -ne "\x02" > /tmp/dect_antenna_diversity ;;
|
||||
*) echo -ne "\x00" > /tmp/dect_antenna_diversity ;;
|
||||
esac
|
||||
|
||||
if [ ! -f /etc/dect/nvs ]; then
|
||||
cp /etc/dect/nvs_default /etc/dect/nvs
|
||||
dd of=/etc/dect/nvs if=/tmp/rfpi conv=notrunc bs=1 seek=0
|
||||
dd of=/etc/dect/nvs if=/tmp/fixed_emc conv=notrunc bs=1 seek=10
|
||||
dd of=/etc/dect/nvs if=/tmp/bcm_def_freq conv=notrunc bs=1 seek=6
|
||||
dd of=/etc/dect/nvs if=/tmp/dect_antenna_diversity conv=notrunc bs=1 seek=32
|
||||
fsync /etc/dect/nvs
|
||||
fi
|
||||
|
||||
# init dectproxy
|
||||
dectproxy > /dev/null 2>&1 &
|
||||
dectmngr > /tmp/dectmngr 2>&1 &
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
killall -9 dectproxy
|
||||
killall -9 dectmngr
|
||||
}
|
||||
|
||||
restart_service() {
|
||||
echo "restarting dect"
|
||||
killall dectmngr
|
||||
dectmngr > /tmp/dectmngr 2>&1 &
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
# reload config
|
||||
dect -c
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger dect
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script is likely not used. Just exit with
|
||||
# an error and see if someone screems... If not,
|
||||
# we can delete this file.
|
||||
exit 1
|
||||
|
||||
|
||||
[ -f /var/dectisregistering ] || {
|
||||
touch /var/dectisregistering 2>/dev/null
|
||||
/usr/bin/dectmngr -r
|
||||
ubus call led.dect set '{"state" : "notice"}'
|
||||
sleep 20
|
||||
rm /var/dectisregistering 2>/dev/null
|
||||
/usr/bin/dectmngr -s
|
||||
ubus call led.dect set '{"state" : "ok"}'
|
||||
}
|
||||
27
dectmngr/files/scripts/load_sound_modules.sh
Executable file
27
dectmngr/files/scripts/load_sound_modules.sh
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOUND_BASE=/lib/modules/$(uname -r)/kernel/sound
|
||||
SOUND_MODULES="$SOUND_BASE/soundcore.ko $SOUND_BASE/core/snd.ko $SOUND_BASE/core/snd-timer.ko"
|
||||
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/core/snd-pcm.ko $SOUND_BASE/core/snd-hwdep.ko"
|
||||
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/core/seq/snd-seq-device.ko"
|
||||
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/core/seq/snd-seq.ko $SOUND_BASE/core/snd-rawmidi.ko "
|
||||
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/usb/snd-usbmidi-lib.ko $SOUND_BASE/usb/snd-usb-audio.ko"
|
||||
|
||||
load_sound_modules() {
|
||||
for mod in $SOUND_MODULES; do
|
||||
insmod $mod
|
||||
done
|
||||
}
|
||||
|
||||
unload_sound_modules() {
|
||||
local modules=
|
||||
|
||||
# reverse the order
|
||||
for mod in $SOUND_MODULES; do
|
||||
modules="$mod $modules"
|
||||
done
|
||||
|
||||
for mod in $modules; do
|
||||
rmmod $mod
|
||||
done
|
||||
}
|
||||
308
dectmngr/src/LICENSE
Normal file
308
dectmngr/src/LICENSE
Normal file
@@ -0,0 +1,308 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
dspg_test_app - DSPG CMBS Host Software Test Application
|
||||
Copyright (C) 2020 iopsys Software Solutions AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
4
dectmngr/src/Makefile
Normal file
4
dectmngr/src/Makefile
Normal file
@@ -0,0 +1,4 @@
|
||||
.PHONY: dectmngr
|
||||
|
||||
dectmngr:
|
||||
$(MAKE) -C app
|
||||
4946
dectmngr/src/app/ListAccess/LASessionMgr.c
Normal file
4946
dectmngr/src/app/ListAccess/LASessionMgr.c
Normal file
File diff suppressed because it is too large
Load Diff
192
dectmngr/src/app/ListAccess/LASessionMgr.h
Normal file
192
dectmngr/src/app/ListAccess/LASessionMgr.h
Normal file
@@ -0,0 +1,192 @@
|
||||
/*************************************************************************************************************
|
||||
*** List Access Session Manager
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
#ifndef __LA_SESSION_MGR_H__
|
||||
#define __LA_SESSION_MGR_H__
|
||||
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include "cmbs_api.h"
|
||||
#include "appcall.h"
|
||||
#include "ListsApp.h"
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
#define LA_SESSION_MGR_MAX_DATA_LEN 2000
|
||||
|
||||
#define LA_INVALID_ENTRY_ID 0xFF
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_LineId;
|
||||
u32 u32_NumOfCallsBefore;
|
||||
u32 u32_NumOfCallsAfter;
|
||||
}stMissedCallNotifAux;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_SMSId;
|
||||
u32 u32_NumOfSMSBefore;
|
||||
u32 u32_NumOfSMSAfter;
|
||||
}stSMSNotifAux;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_LineId;
|
||||
u32 u32_AttachedHandsets;
|
||||
}stLineDiagnosticsNotifAux;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_HsId;
|
||||
u32 u32_SessionId;
|
||||
u32 u32_SaveEntryId;
|
||||
u32 u32_WriteEntryId;
|
||||
|
||||
/* CAT-iq numbering */
|
||||
u32 u32_CATiqListId;
|
||||
u32 u32_CATiqSortField1;
|
||||
u32 u32_CATiqSortField2;
|
||||
|
||||
/* CMBS Application numbering */
|
||||
u32 u32_ListId;
|
||||
u32 u32_SortField1;
|
||||
u32 u32_SortField2;
|
||||
|
||||
/* Buffer for send / receive */
|
||||
u8 pu8_DataBuffer[LA_SESSION_MGR_MAX_DATA_LEN];
|
||||
u16 u16_DataBytesMarker;
|
||||
u16 u16_DataTotalLen;
|
||||
|
||||
/* Auxiliary for Missed Call Notification */
|
||||
stMissedCallNotifAux pst_MissedCallNotifAux[APPCALL_LINEOBJ_MAX];
|
||||
|
||||
/* Auxiliary for deletion of entries - List change notification */
|
||||
u32 pu32_LineIdsOfDeletedEntries[APPCALL_LINEOBJ_MAX];
|
||||
u32 pu32_AttachedHsOfDeletedEntries[APPCALL_LINEOBJ_MAX];
|
||||
u32 u32_LineIdsSize;
|
||||
|
||||
/* Auxiliary for SMSl Notification */
|
||||
stSMSNotifAux pst_SMSNotifAux[APPCALL_LINEOBJ_MAX];
|
||||
|
||||
/* Auxiliary for Line and Diagnostics */
|
||||
stLineDiagnosticsNotifAux st_LineDiagNotifAux;
|
||||
|
||||
/* Auxiliary for Contact number field requested instance */
|
||||
u8 u8_ContactNumReqInst;
|
||||
u8 u8_ContactNumSaveInst;
|
||||
|
||||
/* Auxiliary for Read */
|
||||
u8 u8_ReadInProgress;
|
||||
u8 u8_OverLap;
|
||||
}stLASession;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LA_SESSION_MGR_RC_OK,
|
||||
LA_SESSION_MGR_RC_FAIL,
|
||||
LA_SESSION_MGR_RC_NO_FREE_SESSIONS,
|
||||
LA_SESSION_MGR_RC_UNSUPPORTED_LIST,
|
||||
LA_SESSION_MGR_RC_UNKNOWN_SESSION_ID,
|
||||
LA_SESSION_MGR_RC_NOT_ENOUGH_MEMORY,
|
||||
LA_SESSION_MGR_RC_NOT_ALLOWED,
|
||||
LA_SESSION_MGR_RC_INVALID_START_INDEX,
|
||||
LA_SESSION_MGR_RC_ENTRY_NOT_AVAILABLE
|
||||
|
||||
}LA_SESSION_MGR_RC;
|
||||
|
||||
/*******************************************
|
||||
Globals
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Session Mgr API
|
||||
********************************************/
|
||||
/* Init */
|
||||
LA_SESSION_MGR_RC LASessionMgr_Init(void);
|
||||
|
||||
/* Get Data Buffer */
|
||||
LA_SESSION_MGR_RC LASessionMgr_GetDataBuffer(IN u16 u16_SessionId, OUT u8** ppu8_DataBuffer, OUT u16** ppu16_Marker, OUT u16** ppu16_Len);
|
||||
|
||||
/* Start session */
|
||||
LA_SESSION_MGR_RC LASessionMgr_StartSession(IN u16 u16_SessionId, IN u16 u16_ListId, IN u16 u16_HsId, IN PST_IE_LA_FIELDS pst_SortFields,
|
||||
OUT u16* pu16_CurrNumOfEntries);
|
||||
|
||||
/* End Session */
|
||||
LA_SESSION_MGR_RC LASessionMgr_EndSession(IN u16 u16_SessionId);
|
||||
|
||||
/* Get Supported Fields */
|
||||
LA_SESSION_MGR_RC LASessionMgr_GetSupportedFields(IN u16 u16_SessionId,
|
||||
OUT PST_IE_LA_FIELDS pst_EditableFields, OUT PST_IE_LA_FIELDS pst_NonEditableFields);
|
||||
|
||||
/* Read Entries */
|
||||
LA_SESSION_MGR_RC LASessionMgr_ReadEntries(IN u16 u16_SessionId, INOUT u16* pu16_StartIdx, IN bool bForward, IN E_CMBS_MARK_REQUEST eMark,
|
||||
IN PST_IE_LA_FIELDS pst_RequestedFields, INOUT u16* pu16_NumOfReqEntries,
|
||||
OUT u8 pu8_Data[], INOUT u16* pu16_DataLen);
|
||||
/* Edit Entry */
|
||||
LA_SESSION_MGR_RC LASessionMgr_EditEntry(IN u16 u16_SessionId, IN u32 u32_EntryId,
|
||||
IN PST_IE_LA_FIELDS pst_RequestedFields, OUT u8 pu8_Data[], INOUT u16* pu16_DataLen);
|
||||
|
||||
/* Search Entries */
|
||||
LA_SESSION_MGR_RC LASessionMgr_SearchEntries(IN u16 u16_SessionId, IN E_CMBS_LA_SEARCH_MATCHING eMatch, IN bool bCaseSensitive,
|
||||
IN const char* s_SearchedValue, IN bool bForward, IN E_CMBS_MARK_REQUEST eMark,
|
||||
IN PST_IE_LA_FIELDS pst_RequestedFields, INOUT u16* pu16_NumOfReqEntries,
|
||||
OUT u8 pu8_Data[], INOUT u16* pu16_DataLen, OUT u32* pu32_StartIdx);
|
||||
|
||||
/* Save Entry */
|
||||
u32 LASessionMgr_GetSaveEntryID(IN u16 u16_SessionId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SetSaveEntryID(IN u16 u16_SessionId, IN u32 u32_EntryId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SaveEntry(IN u16 u16_SessionId, OUT u32* pu32_EntryId, OUT u32* pu32_PositionIdx, OUT u32* pu32_TotalNumEntries);
|
||||
|
||||
/* Delete Entry */
|
||||
LA_SESSION_MGR_RC LASessionMgr_DeleteEntry(IN u16 u16_SessionId, IN u16 u16_EntryId, OUT u16* pu16_NumOfEntries);
|
||||
|
||||
/* Delete All Entries */
|
||||
LA_SESSION_MGR_RC LASessionMgr_DeleteAllEntries(IN u16 u16_SessionId);
|
||||
|
||||
/* Send Missed call notification if needed */
|
||||
LA_SESSION_MGR_RC LASessionMgr_SendMissedCallNotification(IN u16 u16_SessionId, IN E_CMBS_MARK_REQUEST eMark);
|
||||
|
||||
/* Send list changed notification if needed */
|
||||
LA_SESSION_MGR_RC LASessionMgr_SendListChangedNotification(IN u16 u16_SessionId, IN u16 u16_EntryId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SendListChangedNotificationOnDelete(IN u16 u16_SessionId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SendSMSNotification(IN u16 u16_SessionId, IN E_CMBS_MARK_REQUEST eMark);
|
||||
|
||||
u8 LASessionMgr_GetReadInProgress(IN u16 u16_SessionId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SetReadInProgress(IN u16 u16_SessionId, IN u8 u8_ReadInProgress);
|
||||
|
||||
u8 LASessionMgr_GetOverLap(IN u16 u16_SessionId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SetOverLap(IN u16 u16_SessionId, IN u8 u8_OverLap);
|
||||
|
||||
/* Write Entry */
|
||||
u32 LASessionMgr_GetWriteEntryID(IN u16 u16_SessionId);
|
||||
LA_SESSION_MGR_RC LASessionMgr_SetWriteEntryID(IN u16 u16_SessionId, IN u32 u32_EntryId);
|
||||
|
||||
/* retrieve entry ID from LineSettingsList */
|
||||
u32 LineSettingsGetEntryIdByLineId(int lineID);
|
||||
|
||||
/* retrieve entry ID from Line and Diagnostic Status List */
|
||||
u32 LineDiagnosticGetEntryIdByLineId(int lineID);
|
||||
|
||||
/* retrieve SMS ID from SMS List */
|
||||
u32 GetSMSIdByEntryId(IN u32 u32_EntryId, IN LIST_TYPE ListType);
|
||||
|
||||
/* retrieve Line ID from SMS List */
|
||||
E_CMBS_RC GetLineIdBySMSId(IN u32 u32_SMSId, OUT u32* pu32_LineId);
|
||||
|
||||
/* retrieve SMS ID from SMS List */
|
||||
E_CMBS_RC GetSMSIdByLineID(IN u32 u32_LineId, OUT u32* pu32_SMSId);
|
||||
|
||||
/* retrieve Contact name from contact list using number */
|
||||
E_CMBS_RC GetContactNameByNumber(IN char * psz_Number, OUT char * psz_Name, OUT char * psz_FName);
|
||||
|
||||
#endif /* __LA_SESSION_MGR_H__ */
|
||||
|
||||
/* End Of File *****************************************************************************************************************************/
|
||||
27
dectmngr/src/app/ListAccess/ListAccess.mak
Executable file
27
dectmngr/src/app/ListAccess/ListAccess.mak
Executable file
@@ -0,0 +1,27 @@
|
||||
ifdef CMBSDIR
|
||||
LISTACCESSBASE:=$(CMBSDIR)/app/ListAccess
|
||||
else
|
||||
LISTACCESSBASE:=$(BASE)/ListAccess
|
||||
endif
|
||||
|
||||
####################################################################
|
||||
# settle includes
|
||||
includes += -I$(LISTACCESSBASE)
|
||||
|
||||
####################################################################
|
||||
# settle objects
|
||||
objects += $(OBJDIR)/sqlite3.o
|
||||
objects += $(OBJDIR)/SQLiteWrapper.o
|
||||
objects += $(OBJDIR)/ListsApp.o
|
||||
objects += $(OBJDIR)/LASessionMgr.o
|
||||
objects += $(OBJDIR)/ListChangeNotif.o
|
||||
|
||||
####################################################################
|
||||
# Libraries
|
||||
ifeq ($(HOST_OS),UNIX)
|
||||
LIBS += -ldl
|
||||
endif
|
||||
|
||||
####################################################################
|
||||
# settle vpath
|
||||
vpath %.c $(LISTACCESSBASE)
|
||||
335
dectmngr/src/app/ListAccess/ListChangeNotif.c
Normal file
335
dectmngr/src/app/ListAccess/ListChangeNotif.c
Normal file
@@ -0,0 +1,335 @@
|
||||
/*************************************************************************************************************
|
||||
*** List Change Notification
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include "ListChangeNotif.h"
|
||||
#include "cfr_mssg.h"
|
||||
#include "appcmbs.h"
|
||||
#include "ListsApp.h"
|
||||
#include "appsrv.h"
|
||||
#include "appfacility.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Globals
|
||||
********************************************/
|
||||
|
||||
static u8 s_u8_AggregateFaciltiy = 0;
|
||||
|
||||
/*******************************************
|
||||
Auxiliary
|
||||
********************************************/
|
||||
|
||||
extern E_CMBS_RC GetLineIdBySMSId(IN u32 u32_SMSId, OUT u32 *pu32_LineId);
|
||||
|
||||
/* ***************** Auxiliary end ***************** */
|
||||
|
||||
/*******************************************
|
||||
List Change Notification API
|
||||
|
||||
u16_HsId may be a single HS ID or all handsets which are attached to the given line (CMBS_ALL_RELEVANT_HS_ID)
|
||||
|
||||
********************************************/
|
||||
|
||||
void ListChangeNotif_MissedCallListChanged(IN u32 u32_LineId, IN bool bNewEntryAdded, IN u16 u16_HsId)
|
||||
{
|
||||
u32 u32_HandsetMask = 0, u32_NumOfRead = 0, u32_NumOfUnread = 0;
|
||||
LIST_RC rc;
|
||||
|
||||
APP_FACILITY_INFO_PRINT("ListChangeNotif_MissedCallListChanged LineID %d u16_HsId %d \n",u32_LineId, u16_HsId);
|
||||
|
||||
rc = List_GetAttachedHs(u32_LineId, &u32_HandsetMask);
|
||||
|
||||
if(rc == LIST_RC_OK)
|
||||
{
|
||||
APP_FACILITY_INFO_PRINT("ListChangeNotif_MissedCallListChanged u32_HandsetMask1 %x \n", u32_HandsetMask);
|
||||
|
||||
// if only one HS has to be notified, mask other handsets:
|
||||
if ( u16_HsId != CMBS_ALL_RELEVANT_HS_ID )
|
||||
{
|
||||
u32_HandsetMask &= (1 << (u16_HsId - 1));
|
||||
}
|
||||
|
||||
APP_FACILITY_INFO_PRINT("ListChangeNotif_MissedCallListChanged u32_HandsetMask2 %x \n", u32_HandsetMask);
|
||||
|
||||
if ( u32_HandsetMask )
|
||||
{
|
||||
List_GetMissedCallsNumOfEntries(u32_LineId, &u32_NumOfUnread, &u32_NumOfRead);
|
||||
app_FacilityMissedCalls(0, (u8)u32_LineId, (u16)u32_NumOfUnread, (u16)u32_HandsetMask, bNewEntryAdded, (u16)(u32_NumOfUnread + u32_NumOfRead));
|
||||
}
|
||||
}
|
||||
else
|
||||
APP_FACILITY_ERROR_PRINT("List_GetAttachedHs failed \n");
|
||||
}
|
||||
|
||||
void ListChangeNotif_ListChanged(IN u32 u32_LineId, IN eLineType tLineType, IN u32 u32_HandsetMask,
|
||||
IN u32 u32_TotalNumOfEntries, IN eLIST_CHANGE_NOTIF_LIST_TYPE tListId)
|
||||
{
|
||||
app_FacilityListChanged(0, tListId, (u8)u32_TotalNumOfEntries, (u16)u32_HandsetMask, (u8)u32_LineId, tLineType);
|
||||
}
|
||||
|
||||
|
||||
void ListChangeNotif_OutgoingCallListChangedEx(IN u32 u32_LineId, IN bool bNewEntryAdded, IN u16 u16_HsId)
|
||||
{
|
||||
u32 u32_HandsetMask = 0, u32_NumOfEntries = 0;
|
||||
LIST_RC rc;
|
||||
ST_APP_FACILITY_LCN_DETAILS st_Details;
|
||||
|
||||
APP_FACILITY_INFO_PRINT("ListChangeNotif_OutgoingCallListChangedEx LineID %d u16_HsId %d \n",u32_LineId, u16_HsId);
|
||||
|
||||
rc = List_GetAttachedHs(u32_LineId, &u32_HandsetMask);
|
||||
|
||||
if(rc == LIST_RC_OK)
|
||||
{
|
||||
APP_FACILITY_INFO_PRINT("ListChangeNotif_OutgoingCallListChangedEx u32_HandsetMask1 %x \n", u32_HandsetMask);
|
||||
|
||||
if ( u32_HandsetMask )
|
||||
{
|
||||
List_GetOutgoingCallsNumOfEntries(u32_LineId, &u32_NumOfEntries);
|
||||
|
||||
st_Details.u8_Count = 1; // one change
|
||||
st_Details.u16_OrgHs = u16_HsId; //HS num from which outgoing call is made
|
||||
st_Details.st_SubDetails[0].u16_Change = 1; //Add
|
||||
st_Details.st_SubDetails[0].u16_EntryId = 1; //last outgoing call will have entry id 1
|
||||
st_Details.st_SubDetails[0].u16_PosIndex = u32_NumOfEntries-1; // considering last outgoing call is added to the end of list.
|
||||
|
||||
app_FacilityListChangedEx(0, LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_CALLS, u32_NumOfEntries,
|
||||
(u16)u32_HandsetMask, u32_LineId, LINE_TYPE_EXTERNAL, &st_Details);
|
||||
}
|
||||
}
|
||||
else
|
||||
APP_FACILITY_ERROR_PRINT("List_GetAttachedHs failed \n");
|
||||
}
|
||||
|
||||
|
||||
void ListChangeNotif_SMSListChanged(IN u32 u32_SMSId, IN u8 ListType, IN u16 u16_HsId)
|
||||
{
|
||||
u32 u32_HandsetMask = 0, u32_TotalNumOfEntries = 0, u32_LineId = 0;
|
||||
eLIST_CHANGE_NOTIF_LIST_TYPE tListId = 0;
|
||||
LIST_RC rc;
|
||||
|
||||
if ( GetLineIdBySMSId(u32_SMSId, &u32_LineId) == CMBS_RC_OK )
|
||||
{
|
||||
if(List_GetAttachedHs(u32_LineId, &u32_HandsetMask) == LIST_RC_OK)
|
||||
{
|
||||
rc = List_GetCount(ListType, &u32_TotalNumOfEntries);
|
||||
|
||||
if ( rc != LIST_RC_OK )
|
||||
APP_FACILITY_ERROR_PRINT("List_GetCount failed!\n");
|
||||
|
||||
if ( u16_HsId != CMBS_ALL_RELEVANT_HS_ID )
|
||||
{
|
||||
u32_HandsetMask &= (1 << (u16_HsId - 1));
|
||||
}
|
||||
switch ((LIST_TYPE)ListType)
|
||||
{
|
||||
case LIST_TYPE_INCOMING_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_SMS; break;
|
||||
case LIST_TYPE_SENT_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_SENT_SMS; break;
|
||||
case LIST_TYPE_OUTGOING_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_SMS; break;
|
||||
case LIST_TYPE_DRAFT_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_DRAFT_SMS; break;
|
||||
default:
|
||||
APP_FACILITY_WARNING_PRINT("Not SMS list, aborting");
|
||||
return;
|
||||
}
|
||||
|
||||
app_FacilityListChanged(0, tListId, (u8)u32_TotalNumOfEntries, (u16)u32_HandsetMask, (u8)u32_LineId, 0);
|
||||
}
|
||||
else
|
||||
APP_FACILITY_ERROR_PRINT("List_GetAttachedHs failed \n");
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_FACILITY_ERROR_PRINT("GetLineIdBySMSId failed!\n");
|
||||
}
|
||||
}
|
||||
|
||||
void ListChangeNotif_IncomingSMSListChanged(IN u32 u32_SMSId, IN u8 u8_SMSType, IN u16 u16_HsId)
|
||||
{
|
||||
u32 u32_NumOfRead, u32_NumOfUnread, u32_HandsetMask, u32_LineId;
|
||||
|
||||
if ( GetLineIdBySMSId(u32_SMSId, &u32_LineId) == CMBS_RC_OK )
|
||||
{
|
||||
if(List_GetAttachedHs(u32_LineId, &u32_HandsetMask) == LIST_RC_OK)
|
||||
{
|
||||
APP_FACILITY_INFO_PRINT("ListChangeNotif_IncomingSMSListChanged \n");
|
||||
if ( u16_HsId != CMBS_ALL_RELEVANT_HS_ID )
|
||||
{
|
||||
u32_HandsetMask &= (1 << (u16_HsId - 1));
|
||||
}
|
||||
List_GetSMSNumOfEntries(u32_SMSId, &u32_NumOfUnread, &u32_NumOfRead);
|
||||
app_FacilitySMSMessageNotification(u8_SMSType, (u16)(u32_NumOfUnread + u32_NumOfRead), (u16)u32_NumOfUnread, u32_HandsetMask);
|
||||
}
|
||||
else
|
||||
APP_FACILITY_ERROR_PRINT("List_GetAttachedHs failed! \n");
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_FACILITY_ERROR_PRINT("GetLineIdBySMSId failed!\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ListChangeNotif_SendListChangeDetails( IN u8 ListType)
|
||||
{
|
||||
LIST_RC rc = LIST_RC_OK;
|
||||
ST_APP_FACILITY_LCN_DETAILS *pst_LcnDetails = NULL;
|
||||
|
||||
if (List_GetListChangeDetails(ListType, &pst_LcnDetails) == LIST_RC_OK)
|
||||
{
|
||||
eLIST_CHANGE_NOTIF_LIST_TYPE tListId = 0;
|
||||
u32 u32_Count;
|
||||
|
||||
switch ((LIST_TYPE)ListType)
|
||||
{
|
||||
case LIST_TYPE_CONTACT_LIST:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_CONTACT_LIST; break;
|
||||
case LIST_TYPE_LINE_SETTINGS_LIST:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_LINE_SETTINGS_LIST; break;
|
||||
case LIST_TYPE_MISSED_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_MISSED_CALLS; break;
|
||||
case LIST_TYPE_OUTGOING_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_CALLS; break;
|
||||
case LIST_TYPE_INCOMING_ACCEPTED_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_ACCEPTED_CALLS; break;
|
||||
case LIST_TYPE_ALL_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_ALL_CALLS; break;
|
||||
case LIST_TYPE_ALL_INCOMING_CALLS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_ALL_INCOMING_CALLS; break;
|
||||
case LIST_TYPE_INCOMING_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_SMS; break;
|
||||
case LIST_TYPE_SENT_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_SENT_SMS; break;
|
||||
case LIST_TYPE_OUTGOING_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_SMS; break;
|
||||
case LIST_TYPE_DRAFT_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_DRAFT_SMS; break;
|
||||
case LIST_TYPE_DTAM_SETTINGS_LIST:
|
||||
case LIST_TYPE_SMS_SETTINGS_LIST:
|
||||
case LIST_TYPE_DTAM_WELCOME_MESSAGE:
|
||||
case LIST_TYPE_LINE_AND_DIAGNOSTIC_STATUS:
|
||||
default :
|
||||
APP_FACILITY_WARNING_PRINT("send list change details, aborting list type %d", ListType);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get Count */
|
||||
rc = List_GetCount(ListType, &u32_Count);
|
||||
if ((rc != LIST_RC_OK) && (pst_LcnDetails == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (ListType >= LIST_TYPE_MISSED_CALLS) && (ListType <= LIST_TYPE_ALL_INCOMING_CALLS) )
|
||||
{
|
||||
app_FacilityListChangedEx (0, tListId, u32_Count, CMBS_ALL_HS_MASK, 0, LINE_TYPE_EXTERNAL, pst_LcnDetails);
|
||||
}
|
||||
else
|
||||
{
|
||||
app_FacilityListChangedEx (0, tListId, u32_Count, CMBS_ALL_HS_MASK, 0, LINE_TYPE_ALL_LINES, pst_LcnDetails);
|
||||
}
|
||||
}
|
||||
|
||||
List_ResetListChangeDetails (ListType);
|
||||
}
|
||||
|
||||
void ListChangeNotif_SendAllListChangeDetails( void )
|
||||
{
|
||||
LIST_TYPE ListType = 0;
|
||||
|
||||
while (ListType < LIST_TYPE_MAX)
|
||||
{
|
||||
ListChangeNotif_SendListChangeDetails(ListType);
|
||||
ListType++;
|
||||
}
|
||||
}
|
||||
|
||||
void ListChangeNotif_SendListChangeDetailsEx( IN u8 ListType, IN u8 u8_LineId, IN u8 u8_LineSubtype)
|
||||
{
|
||||
LIST_RC rc = LIST_RC_OK;
|
||||
ST_APP_FACILITY_LCN_DETAILS *pst_LcnDetails = NULL;
|
||||
|
||||
if (s_u8_AggregateFaciltiy)
|
||||
{
|
||||
/* Send Facility with later */
|
||||
return;
|
||||
}
|
||||
|
||||
if (List_GetListChangeDetails(ListType, &pst_LcnDetails) == LIST_RC_OK)
|
||||
{
|
||||
eLIST_CHANGE_NOTIF_LIST_TYPE tListId = 0;
|
||||
u32 u32_Count;
|
||||
|
||||
switch ((LIST_TYPE)ListType)
|
||||
{
|
||||
case LIST_TYPE_CONTACT_LIST:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_CONTACT_LIST; break;
|
||||
case LIST_TYPE_LINE_SETTINGS_LIST:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_LINE_SETTINGS_LIST; break;
|
||||
case LIST_TYPE_MISSED_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_MISSED_CALLS; break;
|
||||
case LIST_TYPE_OUTGOING_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_CALLS; break;
|
||||
case LIST_TYPE_INCOMING_ACCEPTED_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_ACCEPTED_CALLS; break;
|
||||
case LIST_TYPE_ALL_CALLS :
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_ALL_CALLS; break;
|
||||
case LIST_TYPE_ALL_INCOMING_CALLS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_ALL_INCOMING_CALLS; break;
|
||||
case LIST_TYPE_INCOMING_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_SMS; break;
|
||||
case LIST_TYPE_SENT_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_SENT_SMS; break;
|
||||
case LIST_TYPE_OUTGOING_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_SMS; break;
|
||||
case LIST_TYPE_DRAFT_SMS:
|
||||
tListId = LIST_CHANGE_NOTIF_LIST_TYPE_DRAFT_SMS; break;
|
||||
case LIST_TYPE_DTAM_SETTINGS_LIST:
|
||||
case LIST_TYPE_SMS_SETTINGS_LIST:
|
||||
case LIST_TYPE_DTAM_WELCOME_MESSAGE:
|
||||
case LIST_TYPE_LINE_AND_DIAGNOSTIC_STATUS:
|
||||
default :
|
||||
APP_FACILITY_WARNING_PRINT("send list change details, aborting list type %d", ListType);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get Count */
|
||||
rc = List_GetCount(ListType, &u32_Count);
|
||||
if ((rc != LIST_RC_OK) && (pst_LcnDetails == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
app_FacilityListChangedEx (0, tListId, u32_Count, CMBS_ALL_HS_MASK, u8_LineId, u8_LineSubtype, pst_LcnDetails);
|
||||
}
|
||||
|
||||
List_ResetListChangeDetails (ListType);
|
||||
}
|
||||
|
||||
|
||||
void ListChangeNotif_AggregateListChangeDetails( IN u8 u8_AggregateFaciltiy )
|
||||
{
|
||||
s_u8_AggregateFaciltiy = u8_AggregateFaciltiy;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* End Of File *****************************************************************************************************************************/
|
||||
|
||||
76
dectmngr/src/app/ListAccess/ListChangeNotif.h
Normal file
76
dectmngr/src/app/ListAccess/ListChangeNotif.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/*************************************************************************************************************
|
||||
*** List Change Notification
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
#ifndef __LA_LIST_CHANGE_NOTIF_H__
|
||||
#define __LA_LIST_CHANGE_NOTIF_H__
|
||||
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include "cmbs_api.h"
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
typedef enum
|
||||
{
|
||||
LINE_TYPE_EXTERNAL = 0x00,
|
||||
LINE_TYPE_RELATING_TO = 0x03,
|
||||
LINE_TYPE_ALL_LINES = 0x04
|
||||
} eLineType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_MISSED_CALLS = 1,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_CALLS,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_ACCEPTED_CALLS,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_ALL_CALLS,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_CONTACT_LIST,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_INTERNAL_NAMES_LIST,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_DECT_SETTINGS_LIST,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_LINE_SETTINGS_LIST,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_ALL_INCOMING_CALLS,
|
||||
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_INCOMING_SMS = 12,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_SENT_SMS = 13,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_OUTGOING_SMS = 14,
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_DRAFT_SMS = 15,
|
||||
|
||||
LIST_CHANGE_NOTIF_LIST_TYPE_MAX
|
||||
|
||||
}eLIST_CHANGE_NOTIF_LIST_TYPE;
|
||||
|
||||
/*******************************************
|
||||
Globals
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
List Change Notification API
|
||||
********************************************/
|
||||
void ListChangeNotif_MissedCallListChanged( IN u32 u32_LineId, IN bool bNewEntryAdded, IN u16 u16_HsId );
|
||||
|
||||
void ListChangeNotif_ListChanged( IN u32 u32_LineId, IN eLineType tLineType, IN u32 u32_HandsetMask,
|
||||
IN u32 u32_TotalNumOfEntries, IN eLIST_CHANGE_NOTIF_LIST_TYPE tListId );
|
||||
|
||||
void ListChangeNotif_SMSListChanged(IN u32 u32_SMSId, IN u8 ListType, IN u16 u16_HsId);
|
||||
|
||||
void ListChangeNotif_IncomingSMSListChanged( IN u32 u32_SMSId, IN u8 u8_SMSType, IN u16 u16_HsId );
|
||||
|
||||
void ListChangeNotif_SendListChangeDetails( IN u8 ListType);
|
||||
|
||||
void ListChangeNotif_SendAllListChangeDetails( void );
|
||||
|
||||
void ListChangeNotif_SendListChangeDetailsEx( IN u8 ListType, IN u8 u8_LineId, IN u8 u8_LineSubtype);
|
||||
|
||||
void ListChangeNotif_AggregateListChangeDetails( IN u8 u8_AggregateFaciltiy );
|
||||
|
||||
#endif /* __LA_LIST_CHANGE_NOTIF_H__ */
|
||||
|
||||
/* End Of File *****************************************************************************************************************************/
|
||||
|
||||
4569
dectmngr/src/app/ListAccess/ListsApp.c
Normal file
4569
dectmngr/src/app/ListAccess/ListsApp.c
Normal file
File diff suppressed because it is too large
Load Diff
729
dectmngr/src/app/ListAccess/ListsApp.h
Normal file
729
dectmngr/src/app/ListAccess/ListsApp.h
Normal file
@@ -0,0 +1,729 @@
|
||||
/*************************************************************************************************************
|
||||
*** ListsApp
|
||||
*** An implementation of lists API over SQL database
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
#ifndef __LISTS_APP_H__
|
||||
#define __LISTS_APP_H__
|
||||
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include "cmbs_api.h"
|
||||
#include "SQLiteWrapper.h"
|
||||
#include "cfr_debug.h"
|
||||
#include "appfacility.h"
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
#define LIST_NAME_MAX_LEN 30
|
||||
#define LIST_NUMBER_MAX_LEN 30
|
||||
#define LIST_LINE_ID_NONE 0xFFFF
|
||||
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
typedef enum
|
||||
{
|
||||
MATCH_EXACT,
|
||||
MATCH_RETURN_NEXT_ON_FAIL,
|
||||
MATCH_RETURN_PREV_ON_FAIL
|
||||
}eMatchOption;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LIST_RC_OK = 0,
|
||||
LIST_RC_FAIL,
|
||||
LIST_RC_UNSUPPORTED_LIST,
|
||||
LIST_RC_ARRAY_TOO_SMALL,
|
||||
LIST_RC_UNKNOWN_FIELD,
|
||||
LIST_RC_NO_SORT,
|
||||
LIST_RC_UNSUPPORTED_MATCH_OPTION,
|
||||
LIST_RC_INVALID_START_INDEX,
|
||||
LIST_RC_ENTRY_NOT_AVAILABLE
|
||||
|
||||
}LIST_RC;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LIST_TYPE_CONTACT_LIST,
|
||||
LIST_TYPE_LINE_SETTINGS_LIST,
|
||||
LIST_TYPE_MISSED_CALLS,
|
||||
LIST_TYPE_OUTGOING_CALLS,
|
||||
LIST_TYPE_INCOMING_ACCEPTED_CALLS,
|
||||
LIST_TYPE_ALL_CALLS,
|
||||
LIST_TYPE_ALL_INCOMING_CALLS,
|
||||
LIST_TYPE_LINE_AND_DIAGNOSTIC_STATUS,
|
||||
LIST_TYPE_SMS_SETTINGS_LIST,
|
||||
LIST_TYPE_INCOMING_SMS,
|
||||
LIST_TYPE_SENT_SMS,
|
||||
LIST_TYPE_OUTGOING_SMS,
|
||||
LIST_TYPE_DRAFT_SMS,
|
||||
LIST_TYPE_DTAM_SETTINGS_LIST,
|
||||
LIST_TYPE_DTAM_WELCOME_MESSAGE,
|
||||
|
||||
LIST_TYPE_MAX
|
||||
|
||||
}LIST_TYPE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FIELD_TYPE_CHAR,
|
||||
FIELD_TYPE_INT,
|
||||
FIELD_TYPE_TEXT,
|
||||
|
||||
FIELD_TYPE_MAX
|
||||
|
||||
} FIELD_TYPE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FIELD_ID_INVALID = -1,
|
||||
FIELD_ID_ENTRY_ID,
|
||||
FIELD_ID_LAST_NAME,
|
||||
FIELD_ID_FIRST_NAME,
|
||||
FIELD_ID_CONTACT_NUM_1,
|
||||
FIELD_ID_CONTACT_NUM_1_TYPE,
|
||||
FIELD_ID_CONTACT_NUM_1_OWN,
|
||||
FIELD_ID_CONTACT_NUM_1_DEFAULT,
|
||||
FIELD_ID_CONTACT_NUM_2,
|
||||
FIELD_ID_CONTACT_NUM_2_TYPE,
|
||||
FIELD_ID_CONTACT_NUM_2_OWN,
|
||||
FIELD_ID_CONTACT_NUM_2_DEFAULT,
|
||||
FIELD_ID_CONTACT_NUM_3,
|
||||
FIELD_ID_CONTACT_NUM_3_TYPE,
|
||||
FIELD_ID_CONTACT_NUM_3_OWN,
|
||||
FIELD_ID_CONTACT_NUM_3_DEFAULT,
|
||||
FIELD_ID_ASSOCIATED_MELODY,
|
||||
FIELD_ID_LINE_ID,
|
||||
FIELD_ID_NUMBER,
|
||||
FIELD_ID_DATE_AND_TIME,
|
||||
FIELD_ID_READ_STATUS,
|
||||
FIELD_ID_LINE_NAME,
|
||||
FIELD_ID_NUM_OF_CALLS,
|
||||
FIELD_ID_CALL_TYPE,
|
||||
FIELD_ID_ATTACHED_HANDSETS,
|
||||
FIELD_ID_DIALING_PREFIX,
|
||||
FIELD_ID_FP_MELODY,
|
||||
FIELD_ID_FP_VOLUME,
|
||||
FIELD_ID_BLOCKED_NUMBER,
|
||||
FIELD_ID_MULTIPLE_CALLS_MODE,
|
||||
FIELD_ID_INTRUSION_CALL,
|
||||
FIELD_ID_PERMANENT_CLIR,
|
||||
FIELD_ID_PERMANENT_CLIR_ACTIVATION_CODE,
|
||||
FIELD_ID_PERMANENT_CLIR_DEACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_UNCOND,
|
||||
FIELD_ID_CALL_FWD_UNCOND_ACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_UNCOND_DEACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_UNCOND_TARGET_NUMBER,
|
||||
FIELD_ID_CALL_FWD_NO_ANSWER,
|
||||
FIELD_ID_CALL_FWD_NO_ANSWER_ACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_NO_ANSWER_DEACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_NO_ANSWER_TARGET_NUMBER,
|
||||
FIELD_ID_CALL_FWD_NO_ANSWER_TIMEOUT,
|
||||
FIELD_ID_CALL_FWD_BUSY,
|
||||
FIELD_ID_CALL_FWD_BUSY_ACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_BUSY_DEACTIVATION_CODE,
|
||||
FIELD_ID_CALL_FWD_BUSY_TARGET_NUMBER,
|
||||
FIELD_ID_OK_STATUS,
|
||||
FIELD_ID_LINE_USE_STATUS,
|
||||
FIELD_ID_HS_USE_STATUS,
|
||||
FIELD_ID_CALL_FWD_CFU_STATUS,
|
||||
FIELD_ID_CALL_FWD_CFNA_STATUS,
|
||||
FIELD_ID_CALL_FWD_CFB_STATUS,
|
||||
FIELD_ID_DIAGNOSTIC_ERROR_STATUS,
|
||||
FIELD_ID_DIAGNOSTIC_ERROR_TYPE,
|
||||
FIELD_ID_DIAGNOSTIC_ERROR_NUMBER,
|
||||
FIELD_ID_DTAM_IDENTIFIER,
|
||||
FIELD_ID_DTAM_TYPE,
|
||||
FIELD_ID_DTAM_LOCATION,
|
||||
FIELD_ID_DTAM_NUMBER,
|
||||
FIELD_ID_DTAM_ACTIVATION,
|
||||
FIELD_ID_DTAM_DEFAULT_TIMEOUT,
|
||||
FIELD_ID_DTAM_TIMEOUT,
|
||||
FIELD_ID_DTAM_WEB_LINK,
|
||||
FIELD_ID_DTAM_WELCOME_MSG_PARAMETERS,
|
||||
FIELD_ID_DTAM_POSITION_INDEX,
|
||||
FIELD_ID_DTAM_RECORDED_MSG_NAME,
|
||||
FIELD_ID_DTAM_TIME_DURATION_HOURS,
|
||||
FIELD_ID_DTAM_TIME_DURATION_MINUTES,
|
||||
FIELD_ID_DTAM_TIME_DURATION_SECONDS,
|
||||
FIELD_ID_NAME,
|
||||
FIELD_ID_SMS_IDENTIFIER,
|
||||
FIELD_ID_SMS_ENABLE,
|
||||
FIELD_ID_SMS_MAX_SIZE,
|
||||
FIELD_ID_SMSC_SEND_SERVER,
|
||||
FIELD_ID_SMSC_RECEIVE_SERVER,
|
||||
FIELD_ID_SMS_DELIVERY_REPORT,
|
||||
FIELD_ID_SMS_VALIDITY_PERIOD,
|
||||
FIELD_ID_SMS_CHAR_ALLOWED_ENCODING,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_0,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_1,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_2,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_3,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_4,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_5,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_6,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_7,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_8,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_9,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_10,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_11,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_12,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_13,
|
||||
FIELD_ID_SMS_ALLOWED_ENCODING_14,
|
||||
FIELD_ID_SMS_CHAR_ALLOWED_ENCODING_2,
|
||||
FIELD_ID_SMS_CHAR_ALLOWED_ENCODING_3,
|
||||
FIELD_ID_SMS_CHAR_ALLOWED_ENCODING_4,
|
||||
FIELD_ID_SMS_NETWORK_ENCODING,
|
||||
FIELD_ID_SMS_ENCODING_VARIANT_1,
|
||||
FIELD_ID_SMS_ENCODING_VARIANT_2,
|
||||
FIELD_ID_SMS_SEND_REQUEST,
|
||||
FIELD_ID_SMS_SIZE,
|
||||
FIELD_ID_SMS_CONTENT,
|
||||
FIELD_ID_SMS_TYPE,
|
||||
|
||||
FIELD_ID_MAX
|
||||
|
||||
} FIELD_ID;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char* s_Name;
|
||||
FIELD_TYPE e_Type;
|
||||
bool b_AutoInc;
|
||||
bool b_PrimaryKey;
|
||||
bool b_Mandatory;
|
||||
bool b_Editable;
|
||||
FIELD_ID e_FieldId;
|
||||
}stListField;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NUM_TYPE_FIXED,
|
||||
NUM_TYPE_MOBILE,
|
||||
NUM_TYPE_WORK
|
||||
}eNumberType;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
char sLastName[LIST_NAME_MAX_LEN];
|
||||
char sFirstName[LIST_NAME_MAX_LEN];
|
||||
char sNumber1[LIST_NUMBER_MAX_LEN];
|
||||
char cNumber1Type;
|
||||
bool bNumber1Default;
|
||||
bool bNumber1Own;
|
||||
char sNumber2[LIST_NUMBER_MAX_LEN];
|
||||
char cNumber2Type;
|
||||
bool bNumber2Default;
|
||||
bool bNumber2Own;
|
||||
char sNumber3[LIST_NUMBER_MAX_LEN];
|
||||
char cNumber3Type;
|
||||
bool bNumber3Default;
|
||||
bool bNumber3Own;
|
||||
u32 u32_AssociatedMelody;
|
||||
u32 u32_LineId;
|
||||
|
||||
}stContactListEntry;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CALL_TYPE_MISSED,
|
||||
CALL_TYPE_OUTGOING,
|
||||
CALL_TYPE_INCOMING
|
||||
|
||||
}eCallType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SMS_TYPE_INCOMING,
|
||||
SMS_TYPE_OUTGOING,
|
||||
SMS_TYPE_DRAFT,
|
||||
SMS_TYPE_SENT
|
||||
}eSMSType;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
char sNumber[LIST_NUMBER_MAX_LEN];
|
||||
time_t t_DateAndTime;
|
||||
bool bRead;
|
||||
char sLineName[LIST_NAME_MAX_LEN]; /* Stored in LineSettingsList */
|
||||
u32 u32_LineId;
|
||||
u32 u32_NumOfCalls;
|
||||
char cCallType;
|
||||
char sLastName[LIST_NAME_MAX_LEN]; /* stored in ContactList */
|
||||
char sFirstName[LIST_NAME_MAX_LEN]; /* stored in ContactList */
|
||||
|
||||
}stCallsListEntry;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
char sLineName[LIST_NAME_MAX_LEN];
|
||||
u32 u32_LineId;
|
||||
u32 u32_AttachedHsMask;
|
||||
char sDialPrefix[LIST_NUMBER_MAX_LEN];
|
||||
u32 u32_FPMelody;
|
||||
u32 u32_FPVolume;
|
||||
char sBlockedNumber[LIST_NUMBER_MAX_LEN];
|
||||
bool bMultiCalls;
|
||||
bool bIntrusionCall;
|
||||
bool bPermanentCLIR;
|
||||
char sPermanentCLIRActCode[LIST_NUMBER_MAX_LEN];
|
||||
char sPermanentCLIRDeactCode[LIST_NUMBER_MAX_LEN];
|
||||
bool bCallFwdUncond;
|
||||
char sCallFwdUncondActCode[LIST_NUMBER_MAX_LEN];
|
||||
char sCallFwdUncondDeactCode[LIST_NUMBER_MAX_LEN];
|
||||
char sCallFwdUncondNum[LIST_NUMBER_MAX_LEN];
|
||||
bool bCallFwdNoAns;
|
||||
char sCallFwdNoAnsActCode[LIST_NUMBER_MAX_LEN];
|
||||
char sCallFwdNoAnsDeactCode[LIST_NUMBER_MAX_LEN];
|
||||
char sCallFwdNoAnsNum[LIST_NUMBER_MAX_LEN];
|
||||
u32 u32_CallFwdNoAnsTimeout;
|
||||
bool bCallFwdBusy;
|
||||
char sCallFwdBusyActCode[LIST_NUMBER_MAX_LEN];
|
||||
char sCallFwdBusyDeactCode[LIST_NUMBER_MAX_LEN];
|
||||
char sCallFwdBusyNum[LIST_NUMBER_MAX_LEN];
|
||||
|
||||
}stLineSettingsListEntry;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
u32 u32_LineId;
|
||||
u32 u32_OKStatus;
|
||||
u32 u32_LineUseStatus;
|
||||
u32 u32_HSUseStatus;
|
||||
bool b_CallFwdUncondStatus;
|
||||
bool b_CallFwdNoAnswerStatus;
|
||||
bool b_CallFwdBusyStatus;
|
||||
bool b_DiagnosticErrorStatus;
|
||||
u32 u32_DiagnosticErrorType;
|
||||
u32 u32_DiagnosticErrorNumber;
|
||||
}stLineAndDiagnosticListEntry;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
u32 u32_LineId;
|
||||
u32 u32_DTAMIdentifier;
|
||||
bool b_DTAMType;
|
||||
bool b_DTAMLocation;
|
||||
char sDTAMNumber[LIST_NUMBER_MAX_LEN];
|
||||
bool b_DTAMActivation;
|
||||
bool b_DTAMDefaultTimeout;
|
||||
u32 u32_DTAMTimeout;
|
||||
char sDTAMWebLink[LIST_NUMBER_MAX_LEN];
|
||||
u32 u32_WelcomeMsgParams;
|
||||
}stDTAMSettingsListEntry;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
u32 u32_DTAMIdentifier;
|
||||
bool b_DTAMType;
|
||||
bool b_DTAMLocation;
|
||||
u32 u32_PositionIdx;
|
||||
char sRecordedMsgName[LIST_NAME_MAX_LEN];
|
||||
u32 u32_TimeDurationHours;
|
||||
u32 u32_TimeDurationMinutes;
|
||||
u32 u32_TimeDurationSeconds;
|
||||
}stDTAMWelcomeMessageListEntry;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
u32 u32_SMSServiseId;
|
||||
u32 u32_LineId;
|
||||
bool b_EnableSMS;
|
||||
u32 u32_SMSMaxSize;
|
||||
char sSMSCSendServer[LIST_NUMBER_MAX_LEN];
|
||||
char sSMSCReceiveServer[LIST_NUMBER_MAX_LEN];
|
||||
bool b_SMSDeliveryReport;
|
||||
u32 u32_SMSValidityPeriod;
|
||||
u32 u32_LengthOfAllowedEncoding_1;
|
||||
u32 u32_SMSCharacterEncodingValue_1;
|
||||
u32 u32_AllowedEncoding_0;
|
||||
u32 u32_AllowedEncoding_1;
|
||||
u32 u32_AllowedEncoding_2;
|
||||
u32 u32_AllowedEncoding_3;
|
||||
u32 u32_AllowedEncoding_4;
|
||||
u32 u32_AllowedEncoding_5;
|
||||
u32 u32_AllowedEncoding_6;
|
||||
u32 u32_AllowedEncoding_7;
|
||||
u32 u32_AllowedEncoding_8;
|
||||
u32 u32_AllowedEncoding_9;
|
||||
u32 u32_AllowedEncoding_10;
|
||||
u32 u32_AllowedEncoding_11;
|
||||
u32 u32_AllowedEncoding_12;
|
||||
u32 u32_AllowedEncoding_13;
|
||||
u32 u32_AllowedEncoding_14;
|
||||
u32 u32_LengthOfAllowedEncoding_2;
|
||||
u32 u32_SMSCharacterEncodingValue_2;
|
||||
u32 u32_LengthOfAllowedEncoding_3;
|
||||
u32 u32_SMSCharacterEncodingValue_3;
|
||||
u32 u32_LengthOfAllowedEncoding_4;
|
||||
u32 u32_SMSCharacterEncodingValue_4;
|
||||
}stSMSSettingsListEntry;
|
||||
|
||||
#define LIST_MAX_SMS_SIZE 100
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_EntryId;
|
||||
char sNumber[LIST_NUMBER_MAX_LEN];
|
||||
char sName[LIST_NUMBER_MAX_LEN];
|
||||
time_t t_DateAndTime;
|
||||
bool b_Read;
|
||||
bool b_SendRequest;
|
||||
u32 u32_SMSServiseId;
|
||||
u32 u32_NetworkSideEncoding;
|
||||
u32 u32_EncVariant_1;
|
||||
u32 u32_EncVariant_2;
|
||||
u32 u32_SMSSize;
|
||||
char sSMSContent[LIST_MAX_SMS_SIZE];
|
||||
char cSMSType;
|
||||
}stSMSListEntry;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool b_Default; //0x0
|
||||
bool b_Turkish; //0x1
|
||||
bool b_Spanish; //0x2
|
||||
bool b_Portuguese; //0x3
|
||||
bool b_Bengali; //0x4
|
||||
bool b_Gujarati; //0x5
|
||||
bool b_Hindi; //0x6
|
||||
bool b_Kannada; //0x7
|
||||
bool b_Malayalam; //0x8
|
||||
bool b_Oriya; //0x9
|
||||
bool b_Punjabi; //0x10
|
||||
bool b_Tamil; //0x11
|
||||
bool b_Telugu; //0x12
|
||||
bool b_Urdu; //0x13
|
||||
bool b_Reserved; //0x14
|
||||
}stAllowedEncodingVariant;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CMBS_SMS_ENC_TYPE_RESERVED,
|
||||
CMBS_SMS_ENC_TYPE_GSM_7_BIT,
|
||||
CMBS_SMS_ENC_TYPE_GSM_8_BIT,
|
||||
CMBS_SMS_ENC_TYPE_UCS_2,
|
||||
CMBS_SMS_ENC_TYPE_UTF_8,
|
||||
|
||||
CMBS_SMS_ENC_TYPE_MAX,
|
||||
}e_SMSCharacterEncodingType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MARK_LEAVE_UNCHANGED,
|
||||
MARK_CLEAR,
|
||||
MARK_SET
|
||||
} eMarkRequest;
|
||||
|
||||
/* Entry Max Size */
|
||||
typedef union
|
||||
{
|
||||
stContactListEntry ContactListEntry;
|
||||
stCallsListEntry CallsListEntry;
|
||||
stLineSettingsListEntry LineSettingsListEntry;
|
||||
stSMSListEntry SMSListEntry;
|
||||
}uEntryTypes;
|
||||
|
||||
#define LIST_ENTRY_MAX_SIZE sizeof(uEntryTypes)
|
||||
|
||||
/*******************************************
|
||||
Globals
|
||||
********************************************/
|
||||
|
||||
|
||||
/*******************************************
|
||||
List API
|
||||
********************************************/
|
||||
/* Initialize Lists Application */
|
||||
LIST_RC List_Init(void);
|
||||
|
||||
/* Destory Lists Application */
|
||||
LIST_RC List_Close(void);
|
||||
|
||||
/* Create List in database */
|
||||
LIST_RC List_CreateList(IN LIST_TYPE ListType);
|
||||
|
||||
/* Get number of entries */
|
||||
LIST_RC List_GetCount(IN LIST_TYPE ListType, OUT u32* pu32_Count);
|
||||
|
||||
/* Get Supported fields */
|
||||
LIST_RC List_GetSupportedFields(IN LIST_TYPE ListType,
|
||||
OUT u32 pu32_EditableFieldsIds[], INOUT u32* pu32_EditableSize, /* Editable Fields */
|
||||
OUT u32 pu32_NonEditableFields[], INOUT u32* pu32_NonEditableSize /* Non-Editable Fields */);
|
||||
|
||||
/* Insert *NEW* Entry
|
||||
|
||||
*NOTE: For calls list, the data base automatically sets the 'call type' field, according to list type*
|
||||
|
||||
Input Arguments:
|
||||
------------------
|
||||
ListType - List to insert entry
|
||||
pv_Entry - pointer to actual entry
|
||||
pu32Fields - Fields used in provided entry (array of Ids)
|
||||
u32_FieldsSize - size of array
|
||||
|
||||
Output Arguments:
|
||||
------------------
|
||||
pu32_EntryId - ID of inserted entry
|
||||
*/
|
||||
LIST_RC List_InsertEntry(IN LIST_TYPE ListType, IN void* pv_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT u32* pu32_EntryId);
|
||||
|
||||
/* Delete a single entry from the database */
|
||||
LIST_RC List_DeleteEntry(IN LIST_TYPE ListType, IN u32 u32_EntryId);
|
||||
|
||||
/* Delete all entries from the database */
|
||||
LIST_RC List_DeleteAllEntries(IN LIST_TYPE ListType);
|
||||
|
||||
/* Update (existing) Entry */
|
||||
LIST_RC List_UpdateEntry(IN LIST_TYPE ListType, IN void* pv_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize, IN u32 u32_EntryId);
|
||||
|
||||
/* Read entries
|
||||
|
||||
Input Arguments:
|
||||
------------------------
|
||||
ListType - requested list
|
||||
pu32_StartIndex - start index in respect to sorting fields
|
||||
bForward - Direction of read
|
||||
eMark - Flag for requesting resetting (or setting) of the 'Read status' field for all read entries
|
||||
pu32Fields - Array of requested fields
|
||||
u32_FieldsSize - size of pu32Fields
|
||||
u32_SortField1 - most significant sort field
|
||||
u32_SortField2 - least significant sort field (use invalid_id if not needed)
|
||||
u32_EntriesSize - number of requested entries
|
||||
|
||||
Output Arguments:
|
||||
------------------------
|
||||
pv_Entries - array of read entries
|
||||
pu32_EntriesSize - size of pv_Entries
|
||||
pu32_StartIndex - the minimum returned entries' indices
|
||||
*/
|
||||
LIST_RC List_ReadEntries(IN LIST_TYPE ListType, INOUT u32* pu32_StartIndex, IN bool bForward, IN eMarkRequest eMark, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
IN u32 u32_SortField1, IN u32 u32_SortField2, OUT void* pv_Entries, INOUT u32* pu32_EntriesSize);
|
||||
|
||||
/* Read entry by ID
|
||||
|
||||
Input Arguments:
|
||||
------------------------
|
||||
ListType - requested list
|
||||
u32_EntryId - Id Of requested entry
|
||||
pu32Fields - Array of requested fields
|
||||
u32_FieldsSize - size of pu32Fields
|
||||
|
||||
Output Arguments:
|
||||
------------------------
|
||||
pv_Entry - pointer to read entry
|
||||
*/
|
||||
LIST_RC List_ReadEntryById(IN LIST_TYPE ListType, IN u32 u32_EntryId, IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entry);
|
||||
|
||||
/* Search entries
|
||||
|
||||
Input Arguments:
|
||||
------------------------
|
||||
ListType - requested list
|
||||
eMatchOption - what to return in case of no exact match (return nothing, return first greater than, return first lesser than)
|
||||
bCaseSensitive - case sensitivity of the search
|
||||
sSearchedVal - the value to search for
|
||||
bForward - Direction of read
|
||||
eMark - Flag for requesting resetting (or setting) of the 'Read status' field for all read entries
|
||||
pu32Fields - Array of requested fields
|
||||
u32_FieldsSize - size of pu32Fields
|
||||
u32_SortField1 - most significant sort field
|
||||
u32_SortField2 - least significant sort field (use invalid_id if not needed)
|
||||
u32_EntriesSize - number of requested entries
|
||||
|
||||
Output Arguments:
|
||||
------------------------
|
||||
pv_Entries - array of read entries
|
||||
pu32_EntriesSize - size of pv_Entries
|
||||
pu32_StartIndex - index of first returned entry
|
||||
*/
|
||||
LIST_RC List_SearchEntries(IN LIST_TYPE ListType, IN eMatchOption eMatching, IN bool bCaseSensitive, IN const char* sSearchedVal,
|
||||
IN bool bForward, IN eMarkRequest eMark, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
IN u32 u32_SortField1, IN u32 u32_SortField2, OUT void* pv_Entries, INOUT u32* pu32_EntriesSize,
|
||||
OUT u32* pu32_StartIndex);
|
||||
|
||||
|
||||
/* Get Entry Index */
|
||||
LIST_RC List_GetEntryIdex(IN LIST_TYPE ListType, IN u32 u32_SortField1, IN u32 u32_SortField2, IN u32 u32_EntryId, OUT u32* pu32_Index);
|
||||
|
||||
/*******************************************
|
||||
Auxiliary
|
||||
********************************************/
|
||||
/* prepare strings of fields and values from the given Entry */
|
||||
LIST_RC List_PrepareContactListEntryForInsert(IN stContactListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
LIST_RC List_PrepareCallsListEntryForInsert(IN LIST_TYPE ListType, IN stCallsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
LIST_RC List_PrepareLineSettingsListEntryForInsert(IN stLineSettingsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
|
||||
LIST_RC List_PrepareLineAndDiagnosticistEntryForInsert(IN stLineAndDiagnosticListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
|
||||
LIST_RC List_PrepareSMSSettingsListEntryForInsert(IN stSMSSettingsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
|
||||
LIST_RC List_PrepareSMSListEntryForInsert(IN LIST_TYPE ListType, IN stSMSListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
|
||||
LIST_RC List_PrepareDTAMSettingsListEntryForInsert(IN stDTAMSettingsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
|
||||
LIST_RC List_PrepareDTAMWelcomeMsgListEntryForInsert(IN stDTAMWelcomeMessageListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT char sValues[], INOUT u32* pu32_ValuesSize);
|
||||
|
||||
LIST_RC List_PrepareContactListEntryForUpdate(IN stContactListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
LIST_RC List_PrepareCallsListEntryForUpdate(IN stCallsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
LIST_RC List_PrepareLineSettingsListEntryForUpdate(IN stLineSettingsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
|
||||
LIST_RC List_PrepareLineAndDiagnosticEntryForUpdate(IN stLineAndDiagnosticListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
|
||||
LIST_RC List_PrepareSMSSettingsListEntryForUpdate(IN stSMSSettingsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
|
||||
LIST_RC List_PrepareSMSListEntryForUpdate(IN stSMSListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
|
||||
LIST_RC List_PrepareDTAMSettingsListEntryForUpdate(IN stDTAMSettingsListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
|
||||
LIST_RC List_PrepareDTAMWelcomeMsgListEntryForUpdate(IN stDTAMWelcomeMessageListEntry* pst_Entry, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize);
|
||||
|
||||
|
||||
/* prepare string with fields names from the given field Ids */
|
||||
LIST_RC List_PrepareFieldsNamesForRead(IN LIST_TYPE ListType, IN u32 pu32Fields[], IN u32 u32_FieldsSize,
|
||||
OUT char sFields[], INOUT u32* pu32_FieldsSize,
|
||||
OUT bool* pb_JoinContactList, OUT bool* pb_JoinLineSettingsList);
|
||||
|
||||
/* Fill Entry */
|
||||
LIST_RC List_FillEntry(IN LIST_TYPE ListType, IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
LIST_RC List_FillContactListEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
LIST_RC List_FillCallsListEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
LIST_RC List_FillLineSettingsEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
|
||||
LIST_RC List_FillLineDiagnosticEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
|
||||
LIST_RC List_FillSMSSettingsListEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
|
||||
LIST_RC List_FillSMSListEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
|
||||
LIST_RC List_FillDTAMSettingsListEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
|
||||
LIST_RC List_FillDTAMWelcomeMsgEntry(IN u32 pu32Fields[], IN u32 u32_FieldsSize, OUT void* pv_Entries, IN u32 u32_EntriesOffset,
|
||||
IN void* pv_SelectHandle, IN PST_COLUMN_MAP pst_Map);
|
||||
|
||||
/* Attached Handsets */
|
||||
LIST_RC List_GetAttachedHs(IN u32 u32_LineId, OUT u32* pu32_AttachedHsMask);
|
||||
|
||||
LIST_RC List_SetAttachedHs(IN u32 u32_LineId, IN u32 u32_AttachedHsMask);
|
||||
|
||||
/* Missed Calls Num Of Read / Unread Entries */
|
||||
LIST_RC List_GetMissedCallsNumOfEntries(IN u32 u32_LineId, OUT u32* pu32_NumOfUnread, OUT u32* pu32_NumOfRead);
|
||||
|
||||
/* Add HS to first line's Attached HS mask */
|
||||
LIST_RC List_AddHsToFirstLine(IN u8 u8_HsNum);
|
||||
|
||||
/* Remove HS from all lines' Attahced HS mask */
|
||||
LIST_RC List_RemoveHsFromAllLines(IN u8 u8_HsNum);
|
||||
|
||||
/* Returns the first line that the input HS is attached to,
|
||||
or the first line in the system if the HS is not attached to any line */
|
||||
LIST_RC List_GetDefaultLine(IN u8 u8_HsNum, OUT u32* pu32_LineId);
|
||||
|
||||
/* returns list of lines the input HS is attached to */
|
||||
LIST_RC List_GetLinesOfHS( IN u8 u8_HsNum, OUT u32 pu32_LineId[], INOUT u32* pu32_LineIdLen );
|
||||
|
||||
/* returns Call Forward Enabled / Diabled for the specified line */
|
||||
LIST_RC List_GetCallForwardMode( IN u32 u32_LineID, OUT u8* pb_CFUncondEn, OUT u8* pb_CFNoAnsEn,OUT u8* pb_CFBusyEn );
|
||||
|
||||
/* adds default Line entry with 5 attached HS */
|
||||
LIST_RC List_AddDefaultLine();
|
||||
|
||||
/* Checks Line Use status, if changed - updates data base and sends notification */
|
||||
bool LineAndDiagnosticListUpdateLineUse(u8 LineId, E_CMBS_LINE_DIAG_STATUS eLineStatus);
|
||||
|
||||
/* Updates HS Use status in data base */
|
||||
LIST_RC LineAndDiagnosticListUpdateHSUse(u8 LineId, u32 u32_HSNum, bool b_InUse);
|
||||
|
||||
/* Updates OK status in data base */
|
||||
LIST_RC LineAndDiagnosticListUpdateOKStatus(u8 LineId, E_CMBS_LINE_DIAG_OK_STATUS e_DiagErrorStatus);
|
||||
|
||||
/* Updates Call Forward status in data base */
|
||||
LIST_RC LineAndDiagnosticListUpdateCallFWD(u8 LineId, FIELD_ID FieldId, bool b_Status);
|
||||
|
||||
/* Updates Diagnostic Error status in data base */
|
||||
LIST_RC LineAndDiagnosticListUpdateDiagnosticErrorStatus(u8 LineId, bool b_Status, E_CMBS_LINE_DIAG_ERROR_TYPE e_ErrorType, u8 u8_ErrorNumber);
|
||||
|
||||
/* Add "system" entry to Line and diagnostic status list */
|
||||
LIST_RC List_AddLineAndDiagnosticSystemEntry();
|
||||
|
||||
/* Clears Line and HS use status fields in line and diagnostic status list entry */
|
||||
LIST_RC List_ClearLineAndDiagnosticSystemEntry();
|
||||
|
||||
/* Return current line use status from line and diagnostic status list */
|
||||
E_CMBS_LINE_DIAG_STATUS LineAndDiagnosticListGetLineUseStatus(u8 LineId);
|
||||
|
||||
/* Return Number of read and unread entries*/
|
||||
LIST_RC List_GetSMSNumOfEntries(IN u32 u32_SMSId, OUT u32 * pu32_NumOfUnread, OUT u32 * pu32_NumOfRead);
|
||||
|
||||
/* Return current HS use status from line and diagnostic status list */
|
||||
u32 LineAndDiagnosticListGetHSUseStatus(u8 LineId);
|
||||
|
||||
LIST_RC List_GetOutgoingCallsNumOfEntries(IN u32 u32_LineId, OUT u32* pu32_NumOfEntries);
|
||||
|
||||
|
||||
/* Set Originating PP for List Change Details */
|
||||
LIST_RC List_SetListChangeOriginatingHandset( IN LIST_TYPE ListType, IN u8 u8_HsNum);
|
||||
|
||||
/* Add List Change Details */
|
||||
LIST_RC List_AddListChangeDetails( IN LIST_TYPE ListType, IN ST_APP_FACILITY_LCN_SUB_DETAILS *pst_LcnSubDetails);
|
||||
|
||||
/* Reset List Change Details for all lists */
|
||||
LIST_RC List_ResetAllListChangeDetails( void );
|
||||
|
||||
/* Reset List Change Details for specific list */
|
||||
LIST_RC List_ResetListChangeDetails( IN LIST_TYPE ListType);
|
||||
|
||||
/* Get List Change Details for specific list */
|
||||
LIST_RC List_GetListChangeDetails( IN LIST_TYPE ListType, OUT ST_APP_FACILITY_LCN_DETAILS **pst_LcnDetails);
|
||||
|
||||
|
||||
#endif /* __LISTS_APP_H__ */
|
||||
|
||||
/* End Of File *****************************************************************************************************************************/
|
||||
|
||||
|
||||
389
dectmngr/src/app/ListAccess/SQLiteWrapper.c
Normal file
389
dectmngr/src/app/ListAccess/SQLiteWrapper.c
Normal file
@@ -0,0 +1,389 @@
|
||||
/*************************************************************************************************************
|
||||
*** SQLiteWrapper
|
||||
*** Clear C interface on top of SQLite 3
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include <stdio.h>
|
||||
#include "SQLiteWrapper.h"
|
||||
#include "cmbs_platf.h"
|
||||
#include "cfr_debug.h"
|
||||
|
||||
#ifdef __linux
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
#define MUTEX g_Database.cs_mutex
|
||||
#define DATABASE(x) g_Database.pDB_DataBase[x]
|
||||
|
||||
/*******************************************
|
||||
Globals
|
||||
********************************************/
|
||||
ST_SQL_DB g_Database;
|
||||
|
||||
|
||||
/*******************************************
|
||||
Interface API
|
||||
********************************************/
|
||||
SQL_RC SQL_InitDatabase(void)
|
||||
{
|
||||
u32 u32_index = 0;
|
||||
|
||||
/* create mutex */
|
||||
CFR_CMBS_INIT_CRITICALSECTION(MUTEX);
|
||||
|
||||
/* init database handles */
|
||||
for (u32_index = 0; u32_index < SQL_MAX_SIMULTANEOUS_DB_ACCESS; ++u32_index)
|
||||
{
|
||||
DATABASE(u32_index) = NULL;
|
||||
}
|
||||
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
SQL_RC SQL_CloseDatabase(void)
|
||||
{
|
||||
u32 u32_index = 0;
|
||||
|
||||
/* close database handles */
|
||||
for (u32_index = 0; u32_index < SQL_MAX_SIMULTANEOUS_DB_ACCESS; ++u32_index)
|
||||
{
|
||||
if(DATABASE(u32_index) != NULL){
|
||||
sqlite3_close(DATABASE(u32_index));
|
||||
DATABASE(u32_index) = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
SQL_RC SQL_GetDatabaseHandle(void** ppv_DBHandle)
|
||||
{
|
||||
u32 u32_rc = 0;
|
||||
u32 u32_index = 0;
|
||||
|
||||
|
||||
/* Enter critical section */
|
||||
CFR_CMBS_ENTER_CRITICALSECTION(MUTEX);
|
||||
|
||||
/* find free handle */
|
||||
for (u32_index = 0; u32_index < SQL_MAX_SIMULTANEOUS_DB_ACCESS; ++u32_index)
|
||||
{
|
||||
if (DATABASE(u32_index) == NULL)
|
||||
{
|
||||
/* found! */
|
||||
|
||||
/* open Database */
|
||||
u32_rc = sqlite3_open(LIST_ACCESS_DB_FILE, &DATABASE(u32_index));
|
||||
|
||||
if (u32_rc)
|
||||
{
|
||||
printf("Can't open database: %s\n", LIST_ACCESS_DB_FILE);
|
||||
sqlite3_close(DATABASE(u32_index));
|
||||
|
||||
/* Leave critical section */
|
||||
CFR_CMBS_LEAVE_CRITICALSECTION(MUTEX);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Leave critical section */
|
||||
*ppv_DBHandle = DATABASE(u32_index);
|
||||
CFR_CMBS_LEAVE_CRITICALSECTION(MUTEX);
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("No more free DB handles\n");
|
||||
|
||||
/* Leave critical section */
|
||||
CFR_CMBS_LEAVE_CRITICALSECTION(MUTEX);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
SQL_RC SQL_ReturnDatabaseHandle(void* pv_DBHandle)
|
||||
{
|
||||
u32 u32_rc = 0;
|
||||
u32 u32_index = 0;
|
||||
|
||||
|
||||
/* Enter critical section */
|
||||
CFR_CMBS_ENTER_CRITICALSECTION(MUTEX);
|
||||
|
||||
/* find the handle */
|
||||
for (u32_index = 0; u32_index < SQL_MAX_SIMULTANEOUS_DB_ACCESS; ++u32_index)
|
||||
{
|
||||
if (DATABASE(u32_index) == pv_DBHandle)
|
||||
{
|
||||
/* found! */
|
||||
|
||||
/* close Database */
|
||||
u32_rc = sqlite3_close(pv_DBHandle);
|
||||
|
||||
if (u32_rc)
|
||||
{
|
||||
printf("Can't close database!\n");
|
||||
|
||||
/* Leave critical section */
|
||||
CFR_CMBS_LEAVE_CRITICALSECTION(MUTEX);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Leave critical section */
|
||||
DATABASE(u32_index) = NULL;
|
||||
CFR_CMBS_LEAVE_CRITICALSECTION(MUTEX);
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("Unknown DB Handle %p\n", pv_DBHandle);
|
||||
|
||||
/* Leave critical section */
|
||||
CFR_CMBS_LEAVE_CRITICALSECTION(MUTEX);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
|
||||
SQL_RC SQL_Execute(void* pv_DBHandle, const char* s_Query)
|
||||
{
|
||||
u32 u32_rc = 0;
|
||||
sqlite3_stmt* pResult_res = NULL;
|
||||
|
||||
/* prepare query */
|
||||
u32_rc = sqlite3_prepare(pv_DBHandle, s_Query, (s32)strlen(s_Query) + 1, &pResult_res, NULL);
|
||||
if (u32_rc != SQLITE_OK)
|
||||
{
|
||||
printf("execute: prepare query failed\n");
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
if (!pResult_res)
|
||||
{
|
||||
printf("execute: query failed\n");
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
/* execute */
|
||||
u32_rc = sqlite3_step(pResult_res);
|
||||
|
||||
/* deallocate statement */
|
||||
sqlite3_finalize(pResult_res);
|
||||
pResult_res = NULL;
|
||||
|
||||
|
||||
/* check result */
|
||||
switch (u32_rc)
|
||||
{
|
||||
case SQLITE_BUSY:
|
||||
printf("execute: database busy\n");
|
||||
return SQL_RC_FAIL;
|
||||
|
||||
case SQLITE_DONE:
|
||||
case SQLITE_ROW:
|
||||
return SQL_RC_OK;
|
||||
|
||||
case SQLITE_ERROR:
|
||||
printf("Error %s\n", sqlite3_errmsg(pv_DBHandle));
|
||||
return SQL_RC_FAIL;
|
||||
|
||||
case SQLITE_MISUSE:
|
||||
printf("execute: database misuse\n");
|
||||
return SQL_RC_FAIL;
|
||||
|
||||
default:
|
||||
printf("execute: unknown result code\n");
|
||||
}
|
||||
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
SQL_RC SQL_Select(void* pv_DBHandle, const char* s_Query, bool b_PrepareMap, PST_COLUMN_MAP pst_pMap, void** ppv_SelectHandle)
|
||||
{
|
||||
u32 u32_rc = 0;
|
||||
sqlite3_stmt* pResult_res = NULL;
|
||||
|
||||
/* prepare query */
|
||||
u32_rc = sqlite3_prepare(pv_DBHandle, s_Query, (s32)strlen(s_Query) + 1, &pResult_res, NULL);
|
||||
if (u32_rc != SQLITE_OK)
|
||||
{
|
||||
printf("get_result: prepare query failed\n");
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
if (pResult_res == NULL)
|
||||
{
|
||||
printf("get_result: query failed\n");
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
*ppv_SelectHandle = pResult_res;
|
||||
|
||||
/* prepare column map (if requested) */
|
||||
if (b_PrepareMap)
|
||||
{
|
||||
u32 u32_index = 0;
|
||||
const char* ps_ColumnName = NULL;
|
||||
|
||||
do
|
||||
{
|
||||
ps_ColumnName = sqlite3_column_name(pResult_res, u32_index);
|
||||
if (ps_ColumnName == NULL)
|
||||
break;
|
||||
|
||||
strcpy(pst_pMap->column_map[u32_index++], ps_ColumnName);
|
||||
} while (TRUE);
|
||||
pst_pMap->u32_NumOfColumns = u32_index;
|
||||
}
|
||||
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
SQL_RC SQL_FetchRow(void* pv_SelectHandle, bool* pb_NextRowAvailable)
|
||||
{
|
||||
u32 u32_rc = 0;
|
||||
|
||||
*pb_NextRowAvailable = FALSE;
|
||||
|
||||
/* execute the query */
|
||||
u32_rc = sqlite3_step(pv_SelectHandle);
|
||||
|
||||
switch (u32_rc)
|
||||
{
|
||||
case SQLITE_ROW:
|
||||
*pb_NextRowAvailable = TRUE;
|
||||
return SQL_RC_OK;
|
||||
|
||||
case SQLITE_BUSY:
|
||||
printf("execute: database busy\n");
|
||||
return SQL_RC_OK;
|
||||
|
||||
case SQLITE_DONE:
|
||||
return SQL_RC_OK;
|
||||
|
||||
case SQLITE_ERROR:
|
||||
printf("General Error\n");
|
||||
return SQL_RC_FAIL;
|
||||
|
||||
case SQLITE_MISUSE:
|
||||
printf("execute: database misuse\n");
|
||||
return SQL_RC_FAIL;
|
||||
|
||||
default:
|
||||
printf("execute: unknown result code\n");
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SQL_RC SQL_ReleaseSelectHandle(void* pv_SelectHandle)
|
||||
{
|
||||
u32 u32_rc = sqlite3_finalize(pv_SelectHandle);
|
||||
if (u32_rc)
|
||||
{
|
||||
printf("Failed releasing select handle\n");
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
}
|
||||
|
||||
s32 GetIdxByName(const char* ps_Name, PST_COLUMN_MAP pst_pMap)
|
||||
{
|
||||
u32 u32_index;
|
||||
|
||||
for (u32_index = 0; u32_index < pst_pMap->u32_NumOfColumns; ++u32_index)
|
||||
{
|
||||
if (strcmp(ps_Name, pst_pMap->column_map[u32_index]) == 0)
|
||||
{
|
||||
/* found */
|
||||
return u32_index;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
SQL_RC SQL_GetStrByIdx(void* pv_SelectHandle, u32 u32_index, const unsigned char** pps_value)
|
||||
{
|
||||
*pps_value = sqlite3_column_text(pv_SelectHandle, u32_index);
|
||||
|
||||
if (*pps_value == NULL)
|
||||
{
|
||||
*pps_value = (const unsigned char*)"";
|
||||
}
|
||||
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
SQL_RC SQL_GetStrByColumnName(void* pv_SelectHandle, const char* ps_ColumnName, PST_COLUMN_MAP pst_pMap, const unsigned char** pps_value)
|
||||
{
|
||||
s32 s32_index = GetIdxByName(ps_ColumnName, pst_pMap);
|
||||
if (s32_index >= 0)
|
||||
{
|
||||
return SQL_GetStrByIdx(pv_SelectHandle, s32_index, pps_value);
|
||||
}
|
||||
|
||||
printf("Column name lookup failure: %s", ps_ColumnName);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
SQL_RC SQL_GetUValByIdx(void* pv_SelectHandle, u32 u32_index, u32* pu32_value)
|
||||
{
|
||||
*pu32_value = sqlite3_column_int(pv_SelectHandle, u32_index);
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
SQL_RC SQL_GetUVal64ByIdx(void* pv_SelectHandle, u32 u32_index, u64* pu64_value)
|
||||
{
|
||||
*pu64_value = sqlite3_column_int64(pv_SelectHandle, u32_index);
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
SQL_RC SQL_GetUValByColumnName(void* pv_SelectHandle, const char* ps_ColumnName, PST_COLUMN_MAP pst_pMap, u32* pu32_value)
|
||||
{
|
||||
s32 s32_index = GetIdxByName(ps_ColumnName, pst_pMap);
|
||||
if (s32_index >= 0)
|
||||
{
|
||||
return SQL_GetUValByIdx(pv_SelectHandle, s32_index, pu32_value);
|
||||
}
|
||||
|
||||
printf("Column name lookup failure: %s", ps_ColumnName);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
SQL_RC SQL_GetUVal64ByColumnName(IN void* pv_SelectHandle, IN const char* ps_ColumnName, IN PST_COLUMN_MAP pst_pMap, OUT u64* pu64_value)
|
||||
{
|
||||
s32 s32_index = GetIdxByName(ps_ColumnName, pst_pMap);
|
||||
if (s32_index >= 0)
|
||||
{
|
||||
return SQL_GetUVal64ByIdx(pv_SelectHandle, s32_index, pu64_value);
|
||||
}
|
||||
|
||||
CFR_DBG_ERROR("Column name lookup failure: %s", ps_ColumnName);
|
||||
return SQL_RC_FAIL;
|
||||
}
|
||||
|
||||
|
||||
SQL_RC SQL_GetIdOfLastInsert(void* pv_DBHandle, u32* pu32_Id)
|
||||
{
|
||||
*pu32_Id = (u32)sqlite3_last_insert_rowid(pv_DBHandle);
|
||||
return SQL_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* End Of File *****************************************************************************************************************************/
|
||||
|
||||
|
||||
|
||||
143
dectmngr/src/app/ListAccess/SQLiteWrapper.h
Normal file
143
dectmngr/src/app/ListAccess/SQLiteWrapper.h
Normal file
@@ -0,0 +1,143 @@
|
||||
/*************************************************************************************************************
|
||||
*** SQLiteWrapper
|
||||
*** Clear C interface on top of SQLite 3
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
#ifndef __SQLITE_WRAPPER_H__
|
||||
#define __SQLITE_WRAPPER_H__
|
||||
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#ifndef WIN32
|
||||
#include <fcntl.h>
|
||||
#else
|
||||
#include "windows.h"
|
||||
#endif
|
||||
|
||||
#include "cmbs_api.h"
|
||||
#include "cfr_mssg.h"
|
||||
#include "sqlite3.h"
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
#ifdef CMBS_HOST_RO_FILE_SYSTEM // read only file system
|
||||
#define LIST_ACCESS_DB_FILE "/tmp/LA_DB"
|
||||
#else
|
||||
#define LIST_ACCESS_DB_FILE "LA_DB"
|
||||
#endif
|
||||
|
||||
#define SQL_MAX_COLUMNS 30
|
||||
#define SQL_MAX_COLUMN_NAME_LEN 40
|
||||
|
||||
#define SQL_MAX_SIMULTANEOUS_DB_ACCESS 5
|
||||
|
||||
#define SQL_QUERY_MAX_LEN 1024
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
typedef struct
|
||||
{
|
||||
CFR_CMBS_CRITICALSECTION cs_mutex;
|
||||
sqlite3* pDB_DataBase[SQL_MAX_SIMULTANEOUS_DB_ACCESS];
|
||||
|
||||
} ST_SQL_DB, * PST_SQL_DB;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char column_map[SQL_MAX_COLUMNS][SQL_MAX_COLUMN_NAME_LEN + 1];
|
||||
u32 u32_NumOfColumns;
|
||||
|
||||
} ST_COLUMN_MAP, * PST_COLUMN_MAP;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SQL_RC_OK = 0,
|
||||
SQL_RC_FAIL = 1
|
||||
|
||||
} SQL_RC;
|
||||
|
||||
|
||||
/*******************************************
|
||||
Interface API
|
||||
********************************************/
|
||||
/* Init DataBase */
|
||||
SQL_RC SQL_InitDatabase(void);
|
||||
|
||||
/* Close DataBase */
|
||||
SQL_RC SQL_CloseDatabase(void);
|
||||
|
||||
/* Get Database Handle */
|
||||
SQL_RC SQL_GetDatabaseHandle(OUT void** ppv_DBHandle);
|
||||
|
||||
/* Return Database Handle */
|
||||
SQL_RC SQL_ReturnDatabaseHandle(IN void* pv_DBHandle);
|
||||
|
||||
/* Send SQL Query */
|
||||
SQL_RC SQL_Execute(IN void* pv_DBHandle, IN const char* s_Query);
|
||||
|
||||
/* SQL Select from a table
|
||||
**
|
||||
** After a call to Select function, the user should call to FetchRow one or more times (depends on how many rows exist
|
||||
** and how many the user wants to read), and finally ReleaseSelectHandle
|
||||
**
|
||||
** Input Args:
|
||||
** -----------------
|
||||
** pv_DBHandle - pointer to DB
|
||||
** s_Query - string SQL query
|
||||
** b_PrepareMap - should a map be prepared
|
||||
** if b_PrepareMap is non-zero,
|
||||
** the function will return a mapping between column index and column name
|
||||
** the map will be returned on pst_pMap - caller should allocate it!
|
||||
**
|
||||
** Output Args
|
||||
** -------------------
|
||||
** pst_pMap - pointer to map object
|
||||
** ppv_SelectHandle - pointer to SelectHandle (to be used on subsequent GetRow calls - user is responsible to call to ReleaseSelectHandle !!!
|
||||
** */
|
||||
SQL_RC SQL_Select(IN void* pv_DBHandle, IN const char* s_Query, IN bool b_PrepareMap, OUT PST_COLUMN_MAP pst_pMap, OUT void** ppv_SelectHandle);
|
||||
|
||||
/* Order the Database to Get The next row, corresponds to the last select query performed
|
||||
Input Arguments
|
||||
--------------------
|
||||
pv_SelectHandle - Handle to the appropriate select query
|
||||
|
||||
Output Argument
|
||||
--------------------
|
||||
b_NextRowAvailable - if non-zero, it means that there is another row, and the user may extract its data from the data base (using getstr, getuvalue,
|
||||
etc. - depends on the data type)
|
||||
*/
|
||||
SQL_RC SQL_FetchRow(IN void* pv_SelectHandle, OUT bool* pb_NextRowAvailable);
|
||||
|
||||
SQL_RC SQL_ReleaseSelectHandle(IN void* pv_SelectHandle);
|
||||
|
||||
/* Get the (string) value in the current row, at the given column index */
|
||||
SQL_RC SQL_GetStrByIdx(IN void* pv_SelectHandle, IN u32 u32_index, OUT const unsigned char** pps_value);
|
||||
|
||||
/* Get the (string) value in the current row, at the given column name */
|
||||
SQL_RC SQL_GetStrByColumnName(IN void* pv_SelectHandle, IN const char* ps_ColumnName, IN PST_COLUMN_MAP pst_pMap, OUT const unsigned char** pps_value);
|
||||
|
||||
/* Get the (unsigned integer) value in the current row, at the given column index */
|
||||
SQL_RC SQL_GetUValByIdx( IN void* pv_SelectHandle, IN u32 u32_index, OUT u32* pu32_value);
|
||||
SQL_RC SQL_GetUVal64ByIdx(IN void* pv_SelectHandle, IN u32 u32_index, OUT u64* pu64_value);
|
||||
|
||||
/* Get the (unsigned integer) value in the current row, at the given column name */
|
||||
SQL_RC SQL_GetUValByColumnName( IN void* pv_SelectHandle, IN const char* ps_ColumnName, IN PST_COLUMN_MAP pst_pMap, OUT u32* pu32_value);
|
||||
SQL_RC SQL_GetUVal64ByColumnName(IN void* pv_SelectHandle, IN const char* ps_ColumnName, IN PST_COLUMN_MAP pst_pMap, OUT u64* pu64_value);
|
||||
|
||||
/* Get the Id of last insert */
|
||||
SQL_RC SQL_GetIdOfLastInsert(IN void* pv_DBHandle, OUT u32* pu32_Id);
|
||||
|
||||
/*******************************************
|
||||
Auxiliary
|
||||
********************************************/
|
||||
/* searches for the given name in the given map, and return index. return -1 when not found */
|
||||
s32 GetIdxByName(IN const char* ps_Name, IN PST_COLUMN_MAP pst_pMap);
|
||||
|
||||
#endif /* __SQLITE_WRAPPER_H__ */
|
||||
|
||||
/* End Of File *****************************************************************************************************************************/
|
||||
|
||||
145295
dectmngr/src/app/ListAccess/sqlite3.c
Normal file
145295
dectmngr/src/app/ListAccess/sqlite3.c
Normal file
File diff suppressed because it is too large
Load Diff
7338
dectmngr/src/app/ListAccess/sqlite3.h
Normal file
7338
dectmngr/src/app/ListAccess/sqlite3.h
Normal file
File diff suppressed because it is too large
Load Diff
295
dectmngr/src/app/Makefile
Normal file
295
dectmngr/src/app/Makefile
Normal file
@@ -0,0 +1,295 @@
|
||||
################################################################################
|
||||
#
|
||||
# Copyright 2010 DSP Group
|
||||
#
|
||||
# Author : Ralf Stein, Dirk Kelbch
|
||||
# Date : 09-Feb-2009
|
||||
#
|
||||
# History
|
||||
# ----------------------------------------------------------------------------
|
||||
# tcmc_asa 19-Apr-2011 13 add TESTDIR and testout
|
||||
#
|
||||
#################################################################################
|
||||
.KEEP_STATE:
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .cpp .h .hpp .asm .s .inc .o .elf .d .dep .def .lex .y .ypp
|
||||
|
||||
libraries :=
|
||||
symfiles :=
|
||||
objects :=
|
||||
linkpath :=
|
||||
|
||||
APPNAME := dectmngr
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
HOST_OS = WIN32
|
||||
ifndef HOST_DLL_SUPPORT
|
||||
HOST_DLL_SUPPORT :=1
|
||||
endif
|
||||
else
|
||||
HOST_OS = UNIX
|
||||
endif
|
||||
|
||||
ifdef SHELL
|
||||
ifeq ($(notdir $(basename $(SHELL))),cmd)
|
||||
### SHELL=cmd.exe
|
||||
RM := del /Q
|
||||
SL := \$(EMPTY)
|
||||
else
|
||||
### SHELL=sh
|
||||
RM := rm -f
|
||||
SL := /
|
||||
endif
|
||||
else
|
||||
RM := del /Q
|
||||
SL := \$(EMPTY)
|
||||
endif
|
||||
# To compile without CURL comment the next line
|
||||
# SUOTA_CURL = true
|
||||
################################################################################
|
||||
#
|
||||
# Directory
|
||||
#
|
||||
# define output,intermediate, object, project and base directory
|
||||
#
|
||||
ifeq ($(BASE),)
|
||||
BASE :=.
|
||||
else
|
||||
CMBSDIR := ..
|
||||
endif
|
||||
PROJDIR := ..
|
||||
TESTDIR :=.
|
||||
|
||||
OUTDIR := $(BASE)
|
||||
OBJDIR := $(BASE)$(SL)obj
|
||||
ifeq ($(LIBDIR),)
|
||||
LIBDIR := $(PROJDIR)$(SL)lib
|
||||
endif
|
||||
|
||||
# To block HAN_SERVER comment next line:
|
||||
HAN_SERVER = true
|
||||
# will compile the han demo + to FB
|
||||
ifeq ($(DVF99),1)
|
||||
|
||||
HAN_SERVER_DEMO_CROSS_COMPILE = true
|
||||
CMBS_COMA = true
|
||||
|
||||
ifndef LIBCOMA
|
||||
LIBCOMA:=../tools/coma/libcoma-api
|
||||
endif
|
||||
|
||||
ifndef LIBMEM
|
||||
LIBMEM:=../comatools/tools/libcmem
|
||||
endif
|
||||
endif
|
||||
|
||||
CMBS_HOST := true
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# C-Option definition
|
||||
#
|
||||
#
|
||||
# -DHAN_SERVER_DEMO_CISCO
|
||||
ifdef HAN_SERVER
|
||||
coptions := -DHAN_SERVER
|
||||
else
|
||||
coptions :=
|
||||
endif
|
||||
|
||||
CMBS_BUF_SIZE := 2560
|
||||
|
||||
# CMBS_BUF_SIZE must be a multiply of 20 (8 * 2.5) because CMBS_PARAM_MAX_LENGTH is CMBS_BUF_SIZE/2.5 and it must be multiply of 8
|
||||
coptions += -DCMBS_API -DDNA_TAG -DCHECKSUM_SUPPORT -D_CONSOLE -DCMBS_BUF_SIZE=$(CMBS_BUF_SIZE) -DCATIQ_2_1 -DSUOTA_SDU_CHOPPING -DSUOTA_APP
|
||||
# New host logging functions(with timestamp and module name) to all cmbs_tcx module to log a file.
|
||||
coptions += -DTCXLOG_FILE
|
||||
|
||||
# this flag wil cause appcmbs.c to use appsuotafileentity instead of appsuotaentity
|
||||
ifeq ($(SUOTA_USE_LOCAL_FILE),1)
|
||||
coptions += -DSUOTA_USE_LOCAL_FILE_ENTITY
|
||||
endif
|
||||
|
||||
# this flag wil cause hanserver.c to use %x in the payload instead of %d but will not effect the FUN_CONVERT
|
||||
ifeq ($(HAN_PROTOCOL_PAYLOAD_AS_HEX),1)
|
||||
coptions += -DHAN_PROTOCOL_PAYLOAD_AS_HEX
|
||||
endif
|
||||
|
||||
# AVS AUDIO APP
|
||||
ifeq ($(AVS_AUDIO_APP),1)
|
||||
coptions += -DAVS_AUDIO_APP
|
||||
ifeq ($(AVS_CALL_RELEASE),1)
|
||||
coptions += -DAVS_CALL_RELEASE
|
||||
ifdef AVS_CALL_RELEASE_TIMEOUT
|
||||
coptions += -DAVS_CALL_RELEASE_TIMEOUT=$(AVS_CALL_RELEASE_TIMEOUT)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
coptions += -DPNCAP
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# include
|
||||
#
|
||||
#
|
||||
includes := -I. -I$(PROJDIR)$(SL)include -I$(PROJDIR)$(SL)cmbs -I$(PROJDIR)$(SL)frame$(SL)osl$(SL)inc
|
||||
includes += -I$(BASE)$(SL)han$(SL)HAN_Client$(SL)src -I$(PROJDIR)$(SL)frame$(SL)osl$(SL)linux
|
||||
includes += -I$(BASE)$(SL)han$(SL)HAN_Server
|
||||
includes += -I$(PROJDIR)$(SL)libdect
|
||||
|
||||
################################################################################
|
||||
objects := $(OBJDIR)/tcx_config.o
|
||||
objects += $(OBJDIR)/tcx_keyb.o
|
||||
objects += $(OBJDIR)/tcx_log.o
|
||||
objects += $(OBJDIR)/tcx_hostlog.o
|
||||
objects += $(OBJDIR)/tcx_eep.o
|
||||
objects += $(OBJDIR)/tcx_util.o
|
||||
objects += $(OBJDIR)/keyb_srv.o
|
||||
objects += $(OBJDIR)/keyb_call.o
|
||||
objects += $(OBJDIR)/keyb_swup.o
|
||||
objects += $(OBJDIR)/keyb_facility.o
|
||||
objects += $(OBJDIR)/keyb_data.o
|
||||
objects += $(OBJDIR)/keyb_suota.o
|
||||
objects += $(OBJDIR)/keyb_han.o
|
||||
objects += $(OBJDIR)/keyb_uledata.o
|
||||
objects += $(OBJDIR)/keyb_rtp.o
|
||||
objects += $(OBJDIR)/cmbs_voipline.o
|
||||
objects += $(OBJDIR)/cmbs_event.o
|
||||
objects += $(OBJDIR)/cmbs_fifo.o
|
||||
objects += $(OBJDIR)/keyb_crashdump.o
|
||||
objects += $(OBJDIR)/inifile.o
|
||||
objects += $(OBJDIR)/appAvsService.o
|
||||
objects += $(OBJDIR)/appVoipService.o
|
||||
objects += $(OBJDIR)/keyb_callrouter.o
|
||||
objects += $(OBJDIR)/ubus.o
|
||||
objects += $(OBJDIR)/dect_common.o
|
||||
objects += $(OBJDIR)/libdect_api.o
|
||||
ifdef AVS_AUDIO_APP
|
||||
objects += $(OBJDIR)/appaudio.o
|
||||
endif
|
||||
ifeq ($(DVF99),1)
|
||||
ifdef CMBS_PLUGIN
|
||||
objects += $(OBJDIR)/cmbs_plugin.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HOST_OS),WIN32)
|
||||
CMBS_LIBNAME := cmbs_host_win32.lib
|
||||
CMBS_LIB := $(LIBDIR)$(SL)$(CMBS_LIBNAME)
|
||||
ifeq ($(HOST_DLL_SUPPORT),1)
|
||||
CMBS_LIB += $(LIBDIR)$(SL)cfr_core.lib
|
||||
endif
|
||||
else
|
||||
CMBS_LIBNAME := cmbs_host_lnx
|
||||
CMBS_LIB := $(LIBDIR)/lib$(CMBS_LIBNAME).a
|
||||
linkpath += -L$(LIBDIR)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# tcx core
|
||||
ifeq ($(TC),XML)
|
||||
include $(CORE)$(SL)tcx$(SL)tcx.mak
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# host cmbs application
|
||||
include $(TESTDIR)$(SL)appcmbs$(SL)happcmbs.mak
|
||||
|
||||
################################################################################
|
||||
# List Access
|
||||
include $(TESTDIR)$(SL)ListAccess$(SL)ListAccess.mak
|
||||
|
||||
################################################################################
|
||||
# framework
|
||||
ifeq ($(HOST_OS),WIN32)
|
||||
include $(PROJDIR)$(SL)frame$(SL)win32$(SL)frame.mak
|
||||
else
|
||||
include $(PROJDIR)/frame/linux/frame.mak
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# CMBS
|
||||
include $(PROJDIR)$(SL)cmbs$(SL)cmbs.mak
|
||||
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
# SUOTA
|
||||
include $(TESTDIR)$(SL)suota$(SL)suota.mak
|
||||
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
# HAN Server
|
||||
ifdef HAN_SERVER
|
||||
include $(TESTDIR)$(SL)han$(SL)HAN_Server$(SL)server.mak
|
||||
endif
|
||||
################################################################################
|
||||
# OSL
|
||||
include $(PROJDIR)$(SL)frame$(SL)osl$(SL)linux$(SL)OSL.mak
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
# PNCAP
|
||||
include $(TESTDIR)$(SL)ext_src$(SL)pncap$(SL)src$(SL)pncap.mak
|
||||
|
||||
################################################################################
|
||||
# rules
|
||||
|
||||
ifeq ($(HOST_OS),WIN32)
|
||||
include win32.mak
|
||||
else
|
||||
include linux.mak
|
||||
endif
|
||||
|
||||
ifdef CMBS_COMA
|
||||
COMA_LIB_DIR:=$(LIBCOMA)/linux
|
||||
|
||||
coptions+= -DCMBS_COMA -DUSE_COMA_SOCK
|
||||
LFLAGS+= -lrt -lcoma -pthread -L $(COMA_LIB_DIR) -L /usr/local/lib
|
||||
ifeq ($(SUOTA_CURL),true)
|
||||
LFLAGS+= -lgcrypt -lgnutls -lgpg-error -ltasn1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(NBS),1)
|
||||
coptions += -DNBS=1
|
||||
endif
|
||||
|
||||
ifdef CMBS_PLUGIN
|
||||
coptions+= -DCMBS_PLUGIN
|
||||
LFLAGS+= -rdynamic -ldl
|
||||
endif
|
||||
|
||||
all: dirs $(OUTDIR)/$(APPNAME) $(OUTDIR)/libdect.so
|
||||
|
||||
dirs: $(OBJDIR) $(LIBDIR)
|
||||
|
||||
$(OBJDIR):
|
||||
mkdir -p $(OBJDIR)
|
||||
|
||||
$(LIBDIR):
|
||||
mkdir -p $(LIBDIR)
|
||||
|
||||
$(CMBS_LIB): $(cfr_objects) $(cmbs_objects)
|
||||
$(ARCHIEVE) $(cfr_objects) $(cmbs_objects)
|
||||
|
||||
$(OBJDIR)/main.o: main.c
|
||||
$(CC) $(CFLAGS) $(includes) $(coptions) -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/tcx_cmbs_lib.o: main.c
|
||||
$(CC) $(CFLAGS) $(includes) $(coptions) -DGEN_LIBDECT -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/libdect_api.o: ../libdect/libdect_api.c
|
||||
$(CC) $(CFLAGS) $(includes) $(coptions) -c -o $@ $<
|
||||
clean:
|
||||
$(RM) -fr $(OBJDIR) $(LIBDIR)
|
||||
|
||||
mframe:
|
||||
$(LINK) -shared -nostartfiles -o libRTPFramePlugin.so mframe_plugin.c cfifo.c rtp_jpeg.c frame_jpeg.c -lrt -lmem -lcoma -lpthread -L$(LIBMEM) -I$(LIBMEM) -I$(LIBCOMA)/inc -I$(LIBCOMA) -DUSE_COMA_SOCK -DCMBS_FRAME_DATA_RT -DCMBS_BUF_SIZE=$(CMBS_BUF_SIZE) -L $(COMA_LIB_DIR) -I$(PROJDIR)$(SL)include -I$(PROJDIR)$(SL)cmbs
|
||||
|
||||
$(OUTDIR)/$(APPNAME): $(CMBS_LIB) $(OBJDIR)/main.o $(objects)
|
||||
$(CC) $(CFLAGS) $(LFLAGS) -o $@ $^ $(LIBS) -L$(PROJDIR)/lib
|
||||
|
||||
$(OUTDIR)/libdect.so: $(CMBS_LIB) $(OBJDIR)/tcx_cmbs_lib.o $(objects)
|
||||
$(CC) $(CFLAGS) $(LFLAGS) -shared -o $@ $^ $(LIBS) -L$(PROJDIR)/lib
|
||||
408
dectmngr/src/app/appcmbs/UDPStorageServer.c
Normal file
408
dectmngr/src/app/appcmbs/UDPStorageServer.c
Normal file
@@ -0,0 +1,408 @@
|
||||
/*************************************************************************************************************
|
||||
*** UDP Storage source
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "UDPStorageServer.h"
|
||||
|
||||
#include "tcx_hostlog.h"
|
||||
#define APP_STORAGE_INFO_PRINT(format, ...) tcx_WriteLog(UDP_STORAGE_MODULE, LOG_LEVEL_INFO, format, ##__VA_ARGS__ )
|
||||
#define APP_STORAGE_TRACE_PRINT(format, ...) tcx_WriteLog(UDP_STORAGE_MODULE, LOG_LEVEL_TRACE, format, ##__VA_ARGS__ )
|
||||
#define APP_STORAGE_WARNING_PRINT(format, ...) tcx_WriteLog(UDP_STORAGE_MODULE, LOG_LEVEL_WARNING, format, ##__VA_ARGS__ )
|
||||
#define APP_STORAGE_ERROR_PRINT(format, ...) tcx_WriteLog(UDP_STORAGE_MODULE, LOG_LEVEL_ERROR, format, ##__VA_ARGS__ )
|
||||
#define APP_STORAGE_RT_PRINT(format, ...) tcx_WriteLog(UDP_STORAGE_MODULE, LOG_LEVEL_REAL_TIME, format, ##__VA_ARGS__ )
|
||||
#define APP_STORAGE_PRINT_DATA(pu8_Buffer, u16_Length) tcx_WriteLogData(UDP_STORAGE_MODULE, LOG_LEVEL_INFO, pu8_Buffer, u16_Length)
|
||||
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
// socket configuration
|
||||
#define STORAGE_SERVER_UDP_PORT 3550
|
||||
|
||||
#define UDP_RX_MSG_MAX_LEN ( 1024 * 9 )
|
||||
#define UDP_TX_MSG_MAX_LEN ( 1024 * 9 )
|
||||
|
||||
#define UDP_PROTOCOL_TOKEN_LEN 25
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
|
||||
|
||||
/*******************************************
|
||||
Locals
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Auxiliary functions
|
||||
********************************************/
|
||||
|
||||
// returns true if the input strings are equal, false otherwise
|
||||
static bool StringCmp(const u8 *pu8_Str1, const char *pu8_Str2, u32 u32_Len)
|
||||
{
|
||||
return (strncmp((const char *)pu8_Str1, pu8_Str2, u32_Len) == 0) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
static s32 FileSize(const char *sFilename)
|
||||
{
|
||||
u32 rc = 0;
|
||||
|
||||
FILE *fp = fopen(sFilename, "r");
|
||||
if ( fp )
|
||||
{
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
rc = ftell(fp);
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR could not open file %s\n", sFilename);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static E_CMBS_RC FileWrite(const char *sFilename, u32 u32_DataLen, const u8 *pu8_Data)
|
||||
{
|
||||
E_CMBS_RC rc = CMBS_RC_ERROR_GENERAL;
|
||||
|
||||
FILE *fp = fopen(sFilename, "w");
|
||||
if ( fp )
|
||||
{
|
||||
if ( fwrite(pu8_Data, sizeof(u8), u32_DataLen, fp) > 0 )
|
||||
{
|
||||
rc = CMBS_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR fwrite failed\n");
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR could not open file %s\n", sFilename);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static E_CMBS_RC FileRead(const char *sFilename, u32 *pu32_DataLen, u8 *pu8_Data)
|
||||
{
|
||||
E_CMBS_RC rc = CMBS_RC_ERROR_GENERAL;
|
||||
s32 s32_Filesize, num_of_bytes_read=0;
|
||||
FILE *fp;
|
||||
|
||||
*pu32_DataLen = 0;
|
||||
|
||||
s32_Filesize = FileSize(sFilename);
|
||||
|
||||
fp = fopen(sFilename, "r");
|
||||
if ( fp && s32_Filesize > 0)
|
||||
{
|
||||
num_of_bytes_read = fread(pu8_Data, sizeof(u8), s32_Filesize, fp);
|
||||
if ( num_of_bytes_read > 0 )
|
||||
{
|
||||
*pu32_DataLen = num_of_bytes_read;
|
||||
rc = CMBS_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR fread failed\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR could not open file %s\n", sFilename);
|
||||
}
|
||||
if(fp)
|
||||
{
|
||||
fclose(fp);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static bool FileExist(const char *sFilename)
|
||||
{
|
||||
bool rc = FALSE;
|
||||
|
||||
FILE *fp = fopen(sFilename, "r");
|
||||
|
||||
if ( fp )
|
||||
{
|
||||
rc = TRUE;
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// handle RX messages
|
||||
static void HandleMsg(const u8 *u8_RxData, u8 *u8_TxData, u32 *pu32_TxLen)
|
||||
{
|
||||
// UDP API definition
|
||||
// ==============
|
||||
// STORE <filename> <length decimal> <data raw binary>
|
||||
// Response: STORE OK <filename> / STORE NOK <filename>
|
||||
//
|
||||
// LOAD <filename>
|
||||
// Response: LOAD OK <filename> <length decimal> <data raw binary> / LOAD NOK <filename>
|
||||
|
||||
char sCmd[UDP_PROTOCOL_TOKEN_LEN], sFilename[UDP_PROTOCOL_TOKEN_LEN];
|
||||
u32 u32_RxPos, u32_Bytes;
|
||||
|
||||
*pu32_TxLen = 0;
|
||||
|
||||
// read command
|
||||
sscanf((const char *)u8_RxData, "%s %n ", sCmd, &u32_Bytes);
|
||||
u32_RxPos = u32_Bytes;
|
||||
|
||||
if ( StringCmp((u8*)sCmd, "STORE", strlen("STORE")) )
|
||||
{
|
||||
u32 u32_DataLen;
|
||||
E_CMBS_RC rc;
|
||||
|
||||
// read filename
|
||||
sscanf((const char *)u8_RxData + u32_RxPos, "%s %n ", sFilename, &u32_Bytes);
|
||||
u32_RxPos += u32_Bytes;
|
||||
|
||||
// read data len
|
||||
sscanf((const char *)u8_RxData + u32_RxPos, "%u %n ", &u32_DataLen, &u32_Bytes);
|
||||
u32_RxPos += u32_Bytes;
|
||||
|
||||
// write to file
|
||||
rc = FileWrite(sFilename, u32_DataLen, u8_RxData + u32_RxPos);
|
||||
|
||||
// write response
|
||||
*pu32_TxLen = sprintf((char*)u8_TxData, "%s", "STORE ");
|
||||
if ( rc == CMBS_RC_OK )
|
||||
{
|
||||
*pu32_TxLen += sprintf((char*)u8_TxData + *pu32_TxLen, "%s", "OK ");
|
||||
}
|
||||
else
|
||||
{
|
||||
*pu32_TxLen += sprintf((char*)u8_TxData + *pu32_TxLen, "%s", "NOK ");
|
||||
}
|
||||
*pu32_TxLen += sprintf((char*)u8_TxData + *pu32_TxLen, "%s", sFilename);
|
||||
}
|
||||
else if ( StringCmp((u8*)sCmd, "LOAD", strlen("LOAD")) )
|
||||
{
|
||||
u32 u32_RawDataLen;
|
||||
|
||||
// read filename
|
||||
sscanf((const char *)u8_RxData + u32_RxPos, "%s %n ", sFilename, &u32_Bytes);
|
||||
u32_RxPos += u32_Bytes;
|
||||
|
||||
// write response
|
||||
*pu32_TxLen = sprintf((char*)u8_TxData, "%s", "LOAD ");
|
||||
|
||||
if ( FileExist(sFilename) )
|
||||
{
|
||||
*pu32_TxLen += sprintf((char*)u8_TxData + *pu32_TxLen, "%s %s %u ", "OK ", sFilename, FileSize(sFilename));
|
||||
|
||||
// read file
|
||||
FileRead(sFilename, &u32_RawDataLen, u8_TxData + *pu32_TxLen);
|
||||
*pu32_TxLen += u32_RawDataLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pu32_TxLen += sprintf((char*)u8_TxData + *pu32_TxLen, "%s %s", "NOK ", sFilename);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("Unknown command %s ignored", sCmd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// handles recieved messages
|
||||
#ifdef WIN32
|
||||
static DWORD WINAPI UDPStorageThread(LPVOID lpParam)
|
||||
#else
|
||||
static void* UDPStorageThread(void *arg)
|
||||
#endif
|
||||
{
|
||||
u8 u8_RxData[UDP_RX_MSG_MAX_LEN];
|
||||
u8 u8_TxData[UDP_TX_MSG_MAX_LEN];
|
||||
u32 u32_TxLen;
|
||||
|
||||
// create UDP socket and listen
|
||||
|
||||
#ifdef WIN32
|
||||
SOCKET s;
|
||||
struct sockaddr_in server, si_other;
|
||||
int slen, recv_len;
|
||||
WSADATA wsa;
|
||||
|
||||
slen = sizeof(si_other);
|
||||
|
||||
// Initialize winsock
|
||||
APP_STORAGE_INFO_PRINT("\nInitialising Winsock...");
|
||||
if ( WSAStartup(MAKEWORD(2, 2), &wsa) != 0 )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("Failed. Error Code : %d", WSAGetLastError());
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
APP_STORAGE_INFO_PRINT("Initialized.\n");
|
||||
|
||||
// Create a socket
|
||||
if ( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("Could not create socket : %d", WSAGetLastError());
|
||||
}
|
||||
APP_STORAGE_INFO_PRINT("Socket created.\n");
|
||||
|
||||
// Prepare the sockaddr_in structure
|
||||
memset(&server, 0, sizeof(server));
|
||||
server.sin_family = AF_INET;
|
||||
server.sin_addr.s_addr = INADDR_ANY;
|
||||
server.sin_port = htons(STORAGE_SERVER_UDP_PORT);
|
||||
|
||||
// Bind
|
||||
if ( bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("Bind failed with error code : %d", WSAGetLastError());
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
puts("Bind done");
|
||||
|
||||
// keep listening for data
|
||||
while (1)
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("Waiting for data...");
|
||||
fflush(stdout);
|
||||
|
||||
// clear the buffer by filling null, it might have previously received data
|
||||
memset(u8_RxData, '\0', sizeof(u8_RxData));
|
||||
|
||||
// try to receive some data, this is a blocking call
|
||||
if ( (recv_len = recvfrom(s, u8_RxData, sizeof(u8_RxData), 0, (struct sockaddr *)&si_other, &slen)) == SOCKET_ERROR )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("recvfrom() failed with error code : %d", WSAGetLastError());
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// print details of the client/peer and the data received
|
||||
APP_STORAGE_INFO_PRINT("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
|
||||
|
||||
HandleMsg(u8_RxData, u8_TxData, &u32_TxLen);
|
||||
|
||||
// now reply the client
|
||||
if ( sendto(s, u8_TxData, u32_TxLen, 0, (struct sockaddr *)&si_other, slen) == SOCKET_ERROR )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("sendto() failed with error code : %d", WSAGetLastError());
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
closesocket(s);
|
||||
WSACleanup();
|
||||
#else
|
||||
int sockfd;
|
||||
struct sockaddr_in servaddr,cliaddr;
|
||||
socklen_t len;
|
||||
|
||||
UNUSED_PARAMETER(arg);
|
||||
|
||||
sockfd = socket(AF_INET,SOCK_DGRAM,0);
|
||||
if(sockfd<0)
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("hanServer Error bind \n\n ");
|
||||
exit(1);
|
||||
}
|
||||
bzero(& servaddr, sizeof(servaddr));
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
servaddr.sin_port = htons(STORAGE_SERVER_UDP_PORT);
|
||||
if (bind(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) == -1 )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("Bind failed with error code");
|
||||
close(sockfd);
|
||||
exit(1);
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
len = sizeof(cliaddr);
|
||||
if ( recvfrom(sockfd, u8_RxData, sizeof(u8_RxData), 0, (struct sockaddr *)&cliaddr, &len) == -1 )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("recvfrom() failed with error code");
|
||||
close(sockfd);
|
||||
exit(1);
|
||||
}
|
||||
HandleMsg(u8_RxData, u8_TxData, &u32_TxLen);
|
||||
if(sendto(sockfd, u8_TxData, u32_TxLen, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)) < 0)
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("sendto() failed with error code");
|
||||
close(sockfd);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
Storage Server protocol Mgr API
|
||||
********************************************/
|
||||
E_CMBS_RC UDPStorageMgr_Init(void)
|
||||
{
|
||||
// simply spawn UDP thread
|
||||
|
||||
#ifdef WIN32
|
||||
DWORD dwThreadId;
|
||||
|
||||
CreateThread(
|
||||
NULL, // default security attributes
|
||||
0, // use default stack size
|
||||
UDPStorageThread, // thread function name
|
||||
0, // argument to thread function
|
||||
0, // use default creation flags
|
||||
&dwThreadId); // returns the thread identifier
|
||||
|
||||
if ( dwThreadId == 0 )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR could not create thread!! ");
|
||||
ExitProcess(3);
|
||||
}
|
||||
|
||||
#else
|
||||
int err;
|
||||
pthread_t tid;
|
||||
|
||||
DECT_DBG("start thread UDPStorageThread...\n");
|
||||
err = pthread_create(&tid, NULL, UDPStorageThread, NULL);
|
||||
|
||||
if ( err != 0 )
|
||||
{
|
||||
APP_STORAGE_INFO_PRINT("ERROR could not create thread!! ");
|
||||
}
|
||||
else
|
||||
{
|
||||
pthread_join(tid,NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return CMBS_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
//************* [End of file] ******************************************************************
|
||||
43
dectmngr/src/app/appcmbs/UDPStorageServer.h
Normal file
43
dectmngr/src/app/appcmbs/UDPStorageServer.h
Normal file
@@ -0,0 +1,43 @@
|
||||
/*************************************************************************************************************
|
||||
*** UDP Storage server
|
||||
**
|
||||
**************************************************************************************************************/
|
||||
#ifndef __UDP_STORAGE_SRVR_H__
|
||||
#define __UDP_STORAGE_SRVR_H__
|
||||
|
||||
// UDP API definition
|
||||
// ==============
|
||||
// STORE <filename> <length decimal> <data raw binary>
|
||||
// Response: STORE OK <filename> / STORE NOK <filename>
|
||||
//
|
||||
// LOAD <filename>
|
||||
// Response: LOAD OK <filename> <length decimal> <data raw binary> / LOAD NOK <filename>
|
||||
|
||||
|
||||
/*******************************************
|
||||
Includes
|
||||
********************************************/
|
||||
#include "cmbs_api.h"
|
||||
|
||||
/*******************************************
|
||||
Defines
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Types
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Globals
|
||||
********************************************/
|
||||
|
||||
/*******************************************
|
||||
Storage Mgr API
|
||||
********************************************/
|
||||
|
||||
E_CMBS_RC UDPStorageMgr_Init(void);
|
||||
|
||||
|
||||
#endif /* __UDP_STORAGE_SRVR_H__ */
|
||||
|
||||
//************* [End of file] ******************************************************************
|
||||
550
dectmngr/src/app/appcmbs/appAvsService.c
Normal file
550
dectmngr/src/app/appcmbs/appAvsService.c
Normal file
@@ -0,0 +1,550 @@
|
||||
/*!
|
||||
* \file appSmartVoiceService.c
|
||||
* \brief handle ULE internal PBX
|
||||
* \Author moria
|
||||
*
|
||||
|
||||
*
|
||||
*******************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cmbs_api.h"
|
||||
#include "appcall.h"
|
||||
#include "cmbs_voipline.h"
|
||||
#include "appCallRouter.h"
|
||||
#include "tcx_hostlog.h"
|
||||
#include "appCallRouter.h"
|
||||
#include "appAvsService.h"
|
||||
#include "cmbs_han.h"
|
||||
#include "appHanMw.h"
|
||||
#include "apphan.h"
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
#define APPSMARTVOICE_MAX_NUM_CALLS 10
|
||||
#define APPSMARTVOICE_NO_CALL APPSMARTVOICE_MAX_NUM_CALLS
|
||||
#define APPSMARTVOICE_NO_FREE_SLOTS 0xFFFFFFFF
|
||||
u32 appSmartVoiceSrv_appID = 3; /* Holds appID of the current app*/
|
||||
|
||||
ST_SMARTVOICE_CALL_DATA G_st_SMARTVOICE_CallData[APPSMARTVOICE_MAX_NUM_CALLS];
|
||||
|
||||
//Forward declarations for CB functions
|
||||
EXTAPP_RC appSmartVoice_OnCallEstablish(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength);
|
||||
EXTAPP_RC appSmartVoice_OnMergeCallResponse(IN u32 cmbsCallID);
|
||||
EXTAPP_RC appSmartVoice_OnMediaChange(u32 u32_CallID, EXTVOIP_CODEC e_Codec);
|
||||
EXTAPP_RC appSmartVoice_SetAudioChannel (IN u32 cmbsCallID, IN u32 mediaChannelID, IN EXTVOIP_CODEC codec);
|
||||
void appSmartVoice_UpdateCallState(IN u32 cmbsCallID, IN EXTVOIP_CALL_STATE e_CallState);
|
||||
u8 appSmartVoice_AssignNewCallId(void);
|
||||
EXTAPP_RC appSmartVoice_OnCallRelease(IN u32 cmbsCallID, IN EXTVOIP_RELEASE_REASON releaseReason);
|
||||
u32 appSmartVoice_OnDivertCall(ST_DIVERT_CALL_INFO *pst_DivertCallInfo);
|
||||
EXTAPP_RC appSmartVoice_OnCallAnswer(IN u32 u32_cmbsCallID, IN EXTVOIP_CODEC codec);
|
||||
|
||||
EXTAPP_RC LoadSmartVoiceService (void)
|
||||
{
|
||||
u8 u8_Idx;
|
||||
EXTAPP_RC res;
|
||||
ST_APP_FNC_TABLE st_AppTable;
|
||||
memset(&st_AppTable,0x00,sizeof(ST_APP_FNC_TABLE));
|
||||
|
||||
st_AppTable.fncSetupCall = appSmartVoice_OnCallEstablish;
|
||||
st_AppTable.fncDisconnectCall = appSmartVoice_OnCallRelease;
|
||||
st_AppTable.fncMediaChange = appSmartVoice_OnMediaChange;
|
||||
st_AppTable.fncSetAudioChannel = appSmartVoice_SetAudioChannel;
|
||||
st_AppTable.fncUpdateCallState = appSmartVoice_UpdateCallState;
|
||||
st_AppTable.fncDivertOutgoingCall = appSmartVoice_OnDivertCall;
|
||||
st_AppTable.fncAnswerCall = appSmartVoice_OnCallAnswer;
|
||||
st_AppTable.LineName[0] = 0;
|
||||
|
||||
for (u8_Idx = 0; u8_Idx < APPSMARTVOICE_MAX_NUM_CALLS; u8_Idx++)
|
||||
{
|
||||
G_st_SMARTVOICE_CallData[u8_Idx].e_Call = E_APPCMBS_CALL_CLOSE;
|
||||
G_st_SMARTVOICE_CallData[u8_Idx].e_Media = E_APPCMBS_MEDIA_CLOSE;
|
||||
g_u32_CallChannelIDMap[u8_Idx] = APPSMARTVOICE_NO_FREE_SLOTS;
|
||||
}
|
||||
|
||||
res = AppCallRouter_AppInit(appSmartVoiceSrv_appID, &st_AppTable);
|
||||
|
||||
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
u8 appSmartVoice_AssignNewCallId(void)
|
||||
{
|
||||
u8 u8_Idx;
|
||||
|
||||
for (u8_Idx = 0; u8_Idx < APPSMARTVOICE_MAX_NUM_CALLS; u8_Idx++)
|
||||
{
|
||||
if(G_st_SMARTVOICE_CallData[u8_Idx].e_Call == E_APPCMBS_CALL_CLOSE)
|
||||
break;
|
||||
}
|
||||
return u8_Idx;
|
||||
}
|
||||
|
||||
u8 appSmartVoice_GetCallId(IN u32 cmbsCallID)
|
||||
{
|
||||
u8 u8_Idx;
|
||||
|
||||
for (u8_Idx = 0; u8_Idx < APPSMARTVOICE_MAX_NUM_CALLS; u8_Idx++)
|
||||
{
|
||||
if(G_st_SMARTVOICE_CallData[u8_Idx].u32_CmbsCallId == cmbsCallID && G_st_SMARTVOICE_CallData[u8_Idx].e_Call != E_APPCMBS_CALL_CLOSE)
|
||||
break;
|
||||
}
|
||||
return u8_Idx;
|
||||
|
||||
}
|
||||
|
||||
void appSmartVoice_UpdateCallState(IN u32 cmbsCallID, IN EXTVOIP_CALL_STATE e_CallState)
|
||||
{
|
||||
u8 u8_CallId = appSmartVoice_GetCallId(cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
printf("\n appSmartVoice_UpdateCallState: Invalid call id \n");
|
||||
}
|
||||
else
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Call = e_CallState;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
EXTAPP_RC appSmartVoice_OnCallEstablish(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength)
|
||||
{
|
||||
PST_SMARTVOICE_CALL_DATA pst_CallData;
|
||||
ST_APPCALL_PROPERTIES st_Properties;
|
||||
|
||||
u8 u8_CallId = appSmartVoice_AssignNewCallId();
|
||||
|
||||
if (u8_CallId == APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
printf("\n appSmartVoice_OnCallEstablish: Error \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
pst_CallData = &G_st_SMARTVOICE_CallData[u8_CallId];
|
||||
|
||||
pst_CallData->u32_CmbsCallId = cmbsCallID;
|
||||
|
||||
|
||||
printf("\n<<<<<< appSmartVoice_OnCallEstablish >>>>>>>\n");
|
||||
|
||||
if(!codecListLength)
|
||||
pst_CallData->e_Codec = EXTVOIP_CODEC_PCM_LINEAR_NB;
|
||||
else
|
||||
pst_CallData->e_Codec = codecList[0];
|
||||
|
||||
extvoip_GetChannelSlotsForCall(cmbsCallID, pst_CallData->e_Codec, &(pst_CallData->u32_ChannelParameter));
|
||||
pst_CallData->e_Media = E_APPCMBS_MEDIA_PEND;
|
||||
|
||||
//st_Properties.e_IE = CMBS_IE_CALLPROGRESS;
|
||||
// st_Properties.psz_Value = "CMBS_CALL_PROGR_SETUP_ACK\0";
|
||||
// appcall_ProgressCall(&st_Properties, 1, (u16)cmbsCallID, NULL);
|
||||
|
||||
|
||||
st_Properties.e_IE = CMBS_IE_CALLPROGRESS;
|
||||
st_Properties.psz_Value = "CMBS_CALL_PROGR_PROCEEDING\0";
|
||||
appcall_ProgressCall(&st_Properties, 1, (u16)cmbsCallID, NULL);
|
||||
|
||||
// TBD: Establish channel to S2/IOT with call id, slots
|
||||
pst_CallData->e_Call = E_APPCMBS_CALL_OUT_PROC;
|
||||
|
||||
strncpy(G_st_SMARTVOICE_CallData[u8_CallId].ch_CalledID, calledID, strlen(calledID));
|
||||
return EXTAPP_RC_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appSmartVoice_OnCallRelease(IN u32 cmbsCallID, IN EXTVOIP_RELEASE_REASON releaseReason)
|
||||
{
|
||||
u8 u8_CallId = appSmartVoice_GetCallId(cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
printf("\n appSmartVoice_OnCallRelease: Call released \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
if (extvoip_CallMediaStop(cmbsCallID))
|
||||
{
|
||||
extvoip_FreeSlotsForCall(cmbsCallID,&(G_st_SMARTVOICE_CallData[u8_CallId].u32_ChannelParameter));
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Call = E_APPCMBS_CALL_CLOSE;
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_PEND;
|
||||
memset(G_st_SMARTVOICE_CallData[u8_CallId].ch_CalledID,'\0',sizeof(char)*CALL_PARTICIPANT_ID_MAX_LEN);
|
||||
}
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Hanserver/S2 application should invoke this API after contact resolution
|
||||
u32 appSmartVoice_CallContact(u32 u32_CallId, char * CalledPartyName, char * psz_Digits)
|
||||
{
|
||||
u32 u32_ActiveCallID = AppCallRouter_DivertOutgoingCall(u32_CallId, CalledPartyName, psz_Digits) ;
|
||||
|
||||
return u32_ActiveCallID;
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appSmartVoice_OnMediaChange(u32 u32_CallID, EXTVOIP_CODEC e_Codec)
|
||||
{
|
||||
PST_CALL_OBJ pst_Call = _appcall_CallObjGetById(u32_CallID);
|
||||
|
||||
if(pst_Call)
|
||||
{
|
||||
// answer current call
|
||||
extvoip_OnAnswerCall(u32_CallID, e_Codec);
|
||||
|
||||
if (extvoip_CallMediaStart(u32_CallID, (u16)(pst_Call->u32_ChannelParameter)) == TRUE)
|
||||
{
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appSmartVoice_OnMediaChange: ERROR \n ");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appSmartVoice_OnMediaChange: Invalid Call Id \n ");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
EXTAPP_RC appSmartVoice_SetAudioChannel (IN u32 cmbsCallID, IN u32 mediaChannelID, IN EXTVOIP_CODEC e_Codec)
|
||||
{
|
||||
u8 u8_CallId = appSmartVoice_GetCallId(cmbsCallID);
|
||||
char ch_Param[CALL_PARTICIPANT_ID_MAX_LEN];
|
||||
|
||||
if (u8_CallId == APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
printf("\n appSmartVoice_SetAudioChannel: Error \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].u32_ChannelID = mediaChannelID;
|
||||
// answer current call
|
||||
extvoip_OnAnswerCall(cmbsCallID, e_Codec);
|
||||
|
||||
if (extvoip_CallMediaStart(cmbsCallID, G_st_SMARTVOICE_CallData[u8_CallId].u32_ChannelParameter))
|
||||
{
|
||||
// p_AudioApp_AudioStart((u8)pst_Call->u32_ChannelID, (u8 *)pst_Call->ch_CallerID);
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_ACTIVE;
|
||||
|
||||
memcpy(ch_Param, &G_st_SMARTVOICE_CallData[u8_CallId].ch_CalledID[1], sizeof(G_st_SMARTVOICE_CallData[u8_CallId].ch_CalledID) - 1);
|
||||
app_HanMWAudioStart(cmbsCallID, ch_Param);
|
||||
appSmartVoice_AddToCallChannelMap(mediaChannelID, u8_CallId);
|
||||
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appSmartVoice_SetAudioChannel: ERROR \n ");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
u32 appSmartVoice_OnDivertCall(ST_DIVERT_CALL_INFO *pst_DivertCallInfo)
|
||||
{
|
||||
u32 u32_ActiveCmbsCallId;
|
||||
ST_APPCALL_PROPERTIES st_Properties[7];
|
||||
PST_CALL_OBJ pst_Call;
|
||||
char psz_Codecs[CMBS_AUDIO_CODEC_MAX * 2] = { 0 };
|
||||
|
||||
if(!pst_DivertCallInfo)
|
||||
{
|
||||
printf("\n appSmartVoice_OnDivertCall: Error \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
u32_ActiveCmbsCallId = pst_DivertCallInfo->cmbsCallID;
|
||||
|
||||
// get call object
|
||||
pst_Call = _appcall_CallObjGetById(u32_ActiveCmbsCallId);
|
||||
if ( !pst_Call )
|
||||
{
|
||||
printf("appSmartVoice_OnDivertCall : NO SUCH CALL WITH ID %d\n", u32_ActiveCmbsCallId);
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
if(pst_DivertCallInfo->u8_NumOfCodecs)
|
||||
{
|
||||
u8 u8_Idx = 0;
|
||||
sprintf(psz_Codecs, "%d",pst_DivertCallInfo->pu8_CodecsList[u8_Idx++]);
|
||||
while(u8_Idx != pst_DivertCallInfo->u8_NumOfCodecs)
|
||||
{
|
||||
u8 u8_Len = strlen(psz_Codecs);
|
||||
char psz_Temp[5]={0,};
|
||||
sprintf(psz_Temp, ",%d",pst_DivertCallInfo->pu8_CodecsList[u8_Idx++]);
|
||||
strcat(&psz_Codecs[u8_Len],psz_Temp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// put codecs priority (WB, NB)
|
||||
sprintf(psz_Codecs, "%d,%d", (CMBS_AUDIO_CODEC_PCM_LINEAR_WB), (CMBS_AUDIO_CODEC_PCM_LINEAR_NB));
|
||||
}
|
||||
st_Properties[0].e_IE = CMBS_IE_CALLERPARTY;
|
||||
st_Properties[0].psz_Value = pst_DivertCallInfo->psz_CalledDigits;
|
||||
st_Properties[1].e_IE = CMBS_IE_CALLEDPARTY;
|
||||
st_Properties[1].psz_Value = pst_DivertCallInfo->psz_CallerID;/*h1 for testing*/
|
||||
st_Properties[2].e_IE = CMBS_IE_MEDIADESCRIPTOR;
|
||||
st_Properties[2].psz_Value = psz_Codecs;
|
||||
st_Properties[3].e_IE = CMBS_IE_CALLERNAME;
|
||||
st_Properties[3].psz_Value = "SMARTVOICE",
|
||||
st_Properties[4].e_IE = CMBS_IE_LINE_ID;
|
||||
st_Properties[4].psz_Value = "1\0";
|
||||
st_Properties[5].e_IE = CMBS_IE_MELODY;
|
||||
st_Properties[5].psz_Value = "1\0";
|
||||
st_Properties[6].e_IE = CMBS_IE_RECONNECT_CALL;
|
||||
st_Properties[6].psz_Value = "1\0";
|
||||
|
||||
|
||||
|
||||
pst_DivertCallInfo->cmbsCallID = appcall_EstablishCall(st_Properties, 7);
|
||||
|
||||
if(_appcall_CallObjGetById(pst_DivertCallInfo->cmbsCallID))
|
||||
{
|
||||
u8 u8_CallId = appSmartVoice_AssignNewCallId();
|
||||
if(u8_CallId != APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].u32_CmbsCallId = pst_DivertCallInfo->cmbsCallID;
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].u32_ChannelParameter = pst_DivertCallInfo->u32_ChannelParameter;
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_PEND;
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Call= E_APPCMBS_CALL_OUT_PROC;
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\appSmartVoice_OnDivertCall: unable to assign new Smart Voice callId\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\appSmartVoice_OnDivertCall: unable to divert call\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
appSmartVoice_AddToCallChannelMap(pst_DivertCallInfo->u32_ChannelID,u32_ActiveCmbsCallId);
|
||||
return pst_DivertCallInfo->cmbsCallID;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appSmartVoice_OnCallAnswer(IN u32 u32_cmbsCallID, IN EXTVOIP_CODEC codec)
|
||||
{
|
||||
u32 u32_ChannelSlots;
|
||||
u8 u8_CallId = appSmartVoice_GetCallId(u32_cmbsCallID);
|
||||
|
||||
if(u8_CallId == APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
printf("\appSmartVoice_OnCallAnswer: Invalid call Id\n");
|
||||
return EXTVOIP_RC_FAIL;
|
||||
}
|
||||
|
||||
|
||||
extvoip_GetChannelSlotsForCall(u32_cmbsCallID,codec,&u32_ChannelSlots);
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].u32_ChannelParameter = u32_ChannelSlots;
|
||||
|
||||
|
||||
if(u32_ChannelSlots != APPSMARTVOICE_NO_FREE_SLOTS)
|
||||
{
|
||||
if(appmedia_CallObjMediaStart(0,u32_cmbsCallID,u32_ChannelSlots,NULL))
|
||||
G_st_SMARTVOICE_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_ACTIVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appSmartVoice_OnCallAnswer: No free slots for call %d \n", u8_CallId);
|
||||
}
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
void appSmartVoice_AddToCallChannelMap(u32 u32_ChannelId, u32 u32_cmbsCallId)
|
||||
{
|
||||
//Add Channel ID against appropriate call ID
|
||||
g_u32_CallChannelIDMap[u32_cmbsCallId] = u32_ChannelId;
|
||||
}
|
||||
|
||||
u32 appSmartVoice_GetCallIDfromChannelID(u32 u32_ChannelId)
|
||||
{
|
||||
u32 u32_CallID = 0xFFFF;
|
||||
u8 u32_Index = 0;
|
||||
|
||||
//Get Call ID from Call ID and Channel ID map
|
||||
for(u32_Index = 0;u32_Index < APPSMARTVOICE_MAX_NUM_CALLS; u32_Index++)
|
||||
{
|
||||
if(g_u32_CallChannelIDMap[u32_Index] == u32_ChannelId)
|
||||
{
|
||||
u32_CallID = u32_Index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return u32_CallID;
|
||||
}
|
||||
|
||||
void appSmartVoice_ReleaseSmvCall(u32 u32_CallID)
|
||||
{
|
||||
//Release call for the call ID
|
||||
extvoip_OnDisconnectCall(u32_CallID,EXTVOIP_REASON_NORMAL);
|
||||
|
||||
//Clear the channel call mapping
|
||||
g_u32_CallChannelIDMap[u32_CallID] = APPSMARTVOICE_NO_FREE_SLOTS;
|
||||
}
|
||||
|
||||
// Helper function to get Device ID from a string
|
||||
static bool appSmv_ConvertDeviceIdFromStr(const u8 *pu8_Buffer, u16 *pu16_DeviceId)
|
||||
{
|
||||
|
||||
u16 u16_DeviceId = 0;
|
||||
u8 u8_DeviceIdNibbleStr, u8_Index, NumOfNibbles = sizeof(u16_DeviceId)*2;
|
||||
|
||||
for(u8_Index=0; u8_Index<NumOfNibbles; u8_Index++)
|
||||
{
|
||||
u8_DeviceIdNibbleStr = pu8_Buffer[u8_Index];
|
||||
|
||||
if (u8_DeviceIdNibbleStr >= '0' && u8_DeviceIdNibbleStr <= '9')
|
||||
{
|
||||
u16_DeviceId |= (u8_DeviceIdNibbleStr - '0') << (12 - u8_Index * 4);
|
||||
}
|
||||
else if (u8_DeviceIdNibbleStr >= 'A' && u8_DeviceIdNibbleStr <= 'F')
|
||||
{
|
||||
u16_DeviceId |= (u8_DeviceIdNibbleStr - 'A' + 0xA) << (12 - u8_Index * 4);
|
||||
}
|
||||
}
|
||||
|
||||
*pu16_DeviceId = u16_DeviceId;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u8 appSmv_ConvertDeviceIdToStr(u16 u16_DeviceId, u8 *pu8_Buffer)
|
||||
{
|
||||
|
||||
u8 u8_Index, u8_DeviceIdNibble = 0, NumOfNibbles = sizeof(u16_DeviceId)*2;
|
||||
|
||||
for(u8_Index=1; u8_Index<=NumOfNibbles; u8_Index++)
|
||||
{
|
||||
|
||||
u8_DeviceIdNibble = u16_DeviceId & 0xF;
|
||||
|
||||
if (u8_DeviceIdNibble <= 9)
|
||||
{
|
||||
pu8_Buffer[NumOfNibbles-u8_Index] = u8_DeviceIdNibble + '0';
|
||||
}
|
||||
else if (u8_DeviceIdNibble >= 0xA && u8_DeviceIdNibble <= 0xF)
|
||||
{
|
||||
pu8_Buffer[NumOfNibbles-u8_Index] = u8_DeviceIdNibble + 'A' - 0xA;
|
||||
}
|
||||
|
||||
u16_DeviceId >>= 4;
|
||||
}
|
||||
|
||||
return NumOfNibbles;
|
||||
}
|
||||
|
||||
static bool appSmv_ConvertUnitIdFromStr(const u8 *pu8_Buffer, u8 *pu8_UnitId)
|
||||
{
|
||||
|
||||
u8 u8_UnitId = 0, u8_DeviceIdNibbleStr, u8_Index, NumOfNibbles = sizeof(u8_UnitId)*2;
|
||||
|
||||
for(u8_Index=0; u8_Index<NumOfNibbles; u8_Index++)
|
||||
{
|
||||
u8_DeviceIdNibbleStr = pu8_Buffer[u8_Index];
|
||||
|
||||
if (u8_DeviceIdNibbleStr >= '0' && u8_DeviceIdNibbleStr <= '9')
|
||||
{
|
||||
u8_UnitId |= (u8_DeviceIdNibbleStr - '0') << (4 - u8_Index * 4);
|
||||
}
|
||||
else if (u8_DeviceIdNibbleStr >= 'A' && u8_DeviceIdNibbleStr <= 'F')
|
||||
{
|
||||
u8_UnitId |= (u8_DeviceIdNibbleStr - 'A' + 0xA) << (4 - u8_Index * 4);
|
||||
}
|
||||
}
|
||||
|
||||
*pu8_UnitId = u8_UnitId;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void appSmartVoice_MakeCall(u32 u32_ChannelId, const char* calledID)
|
||||
|
||||
{
|
||||
//Find if Called ID belongs to Device
|
||||
if (strlen(calledID) == 8 && calledID[0] == 'D')
|
||||
{
|
||||
u16 u16_DeviceId = 0;
|
||||
u8 u8_UnitId = 1;
|
||||
ST_HAN_VOICE_CALL_REQ_PARAMS st_CallReqParams;
|
||||
st_CallReqParams.u32_FieldMask = 0;
|
||||
|
||||
//Parse the called ID to find Device and Unit IDs
|
||||
appSmv_ConvertDeviceIdFromStr((const u8 *) &calledID[1], &u16_DeviceId);
|
||||
|
||||
if(calledID[5] == 'U')
|
||||
{
|
||||
appSmv_ConvertUnitIdFromStr((const u8 *) &calledID[6], &u8_UnitId);
|
||||
}
|
||||
|
||||
//Send message to device
|
||||
app_DsrHanVoiceCallReq(u16_DeviceId, u8_UnitId, &st_CallReqParams);
|
||||
}
|
||||
// If Handset
|
||||
else if (strlen(calledID) == 2 && calledID[0] == 'h')
|
||||
{
|
||||
u32 u32_cmbsCallId;
|
||||
char ch_CallerNum[30] = {0};
|
||||
char ch_CallerName[30] = {0};
|
||||
EXTVOIP_CODEC codecList[] = { EXTVOIP_CODEC_PCM_LINEAR_WB, EXTVOIP_CODEC_PCM_LINEAR_NB };
|
||||
PST_SMARTVOICE_CALL_DATA pst_CallData;
|
||||
//Establish call
|
||||
extvoip_OnSetupCall(appSmartVoiceSrv_appID, 0, calledID, ch_CallerNum, ch_CallerName, codecList, sizeof(codecList)/sizeof(EXTVOIP_CODEC), (int *) &u32_cmbsCallId);
|
||||
u8 u8_CallID = appSmartVoice_AssignNewCallId();
|
||||
|
||||
pst_CallData = &G_st_SMARTVOICE_CallData[u8_CallID];
|
||||
|
||||
pst_CallData->u32_CmbsCallId = u32_cmbsCallId;
|
||||
pst_CallData->e_Call = E_APPCMBS_CALL_INC_RING;
|
||||
appSmartVoice_AddToCallChannelMap(u32_ChannelId, u32_cmbsCallId);
|
||||
}
|
||||
}
|
||||
|
||||
void appSmartVoice_ReleaseCall(u32 u32_ChannelId)
|
||||
{
|
||||
u32 u32_CallID = appSmartVoice_GetCallIDfromChannelID(u32_ChannelId);
|
||||
|
||||
if (u32_CallID == APPSMARTVOICE_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_AnswerCall: Error \n");
|
||||
return;
|
||||
}
|
||||
|
||||
extvoip_OnDisconnectCall(u32_CallID,EXTVOIP_REASON_NORMAL);
|
||||
}
|
||||
|
||||
void appSmartVioce_DisplayString(PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u32 u32_ChannelId, char *psz_Display)
|
||||
{
|
||||
//Get call ID from channel ID
|
||||
u32 u32_CallID = appSmartVoice_GetCallIDfromChannelID(u32_ChannelId);
|
||||
|
||||
appcall_DisplayString(pst_Properties, 1, (u16) u32_CallID, NULL);
|
||||
}
|
||||
|
||||
40
dectmngr/src/app/appcmbs/appAvsService.h
Normal file
40
dectmngr/src/app/appcmbs/appAvsService.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*!
|
||||
* \file appSmartVoiceService.h
|
||||
* \brief
|
||||
* \Author DSPG
|
||||
*
|
||||
* @(#) %filespec: appSmartVoiceService.h
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
// register callbacks
|
||||
EXTAPP_RC LoadSmartVoiceService(void);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_CmbsCallId; /*!< Call Instance to identify the call on CMBS */
|
||||
ST_IE_CALLERPARTY st_CallerParty; /*!< Caller Party, incoming call CLI, outgoing call Handset number */
|
||||
ST_IE_CALLEDPARTY st_CalledParty; /*!< Called Party, incoming call ringing mask, outgoing call to be dialled number */
|
||||
char ch_CallerID[CALL_PARTICIPANT_ID_MAX_LEN]; /*!< buffer of caller party number */
|
||||
char ch_CalledID[CALL_PARTICIPANT_ID_MAX_LEN]; /*!< buffer of called party number */
|
||||
u32 u32_ChannelID; /*!< Channel ID to identify the media connection on CMBS */
|
||||
u32 u32_ChannelParameter; /*!< Channel Parameter provides information about the parameter settings, e.g. IOM - used slots */
|
||||
EXTVOIP_CODEC e_Codec; /*!< used codec */
|
||||
u8 pu8_CodecsList[EXTVOIP_CODEC_MAX]; /*!< Codecs list */
|
||||
u8 u8_CodecsLength; /*!< Codecs list length */
|
||||
E_APPCMBS_CALL e_Call; /*!< call state */
|
||||
E_APPCMBS_MEDIA e_Media; /*!< media entity state */
|
||||
bool b_Incoming; /*!< TRUE for incoming calls, FALSE o/w */
|
||||
} ST_SMARTVOICE_CALL_DATA, * PST_SMARTVOICE_CALL_DATA;
|
||||
|
||||
u32 g_u32_CallChannelIDMap[10];
|
||||
|
||||
void appSmartVoice_AddToCallChannelMap(u32 u32_ChannelID, u32 u32_CallID);
|
||||
|
||||
u32 appSmartVoice_CallContact(u32 u32_ChannelID, char * CalledPartyName, char * psz_Digits);
|
||||
void appSmartVoice_ReleaseCall(u32 u32_cmbsCallID);
|
||||
u32 appSmartVoice_GetCallIDfromChannelID(u32 u32_ChannelID);
|
||||
void appSmartVoice_MakeCall(u32 u32_ChannelID, const char* calledID);
|
||||
void appSmartVoice_ReleaseSmvCall(u32 u32_cmbsCallID);
|
||||
void appSmartVioce_DisplayString(PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u32 u32_ChannelID, char *psz_Display);
|
||||
|
||||
287
dectmngr/src/app/appcmbs/appCallRouter.c
Normal file
287
dectmngr/src/app/appcmbs/appCallRouter.c
Normal file
@@ -0,0 +1,287 @@
|
||||
#include "cmbs_voipline.h"
|
||||
#include "appCallRouter.h"
|
||||
#include "ListsApp.h"
|
||||
#include "string.h"
|
||||
#include "stdlib.h"
|
||||
|
||||
#define APP_ROUTER_INFO_PRINT(format, ...) tcx_WriteLog(ROUTER_MODULE, LOG_LEVEL_INFO, format, ##__VA_ARGS__ )
|
||||
#define APP_ROUTER_ERROR_PRINT(format, ...) tcx_WriteLog(ROUTER_MODULE, LOG_LEVEL_ERROR, format, ##__VA_ARGS__ )
|
||||
|
||||
#define APP_ROUTER_NO_APP 0xFFFFFFFF
|
||||
|
||||
ST_APP_FNC_TABLE g_st_AppTable[MAX_NUM_OF_APPS];
|
||||
u32 g_u32_AppCallIDMap[APPCALL_CALLOBJ_MAX];
|
||||
u32 AppCallRouter_GetAppForCallDivert(char *psz_Digits);
|
||||
|
||||
ST_CMBS_ROUTE_TABLE g_st_cmbs_route_table[MAX_NUM_OF_APPS] = {
|
||||
/* app_id line_start max_line HS_Num Device_id digits ListenInCall*/
|
||||
{3, -1, -1, NULL, NULL, "@", NULL }, //Smart Voice app
|
||||
{5, -1, -1, NULL, NULL, "**", NULL }, //ULE internal PBX, ** route call via voice routing table
|
||||
{5, -1, -1, NULL, NULL, "h*", "@" },
|
||||
{5, -1, -1, NULL, NULL, "D*", "@" },
|
||||
{5, -1, -1, NULL, "D*", NULL, NULL },
|
||||
{0, 0, 0, "h*", "D*", "ANY", "@" } //Voipline app, default handler for call
|
||||
};
|
||||
|
||||
// ========== CallRouter_Init ===========
|
||||
/*!
|
||||
\brief Callback function of all registered apps being called
|
||||
\param[in] None
|
||||
\return None
|
||||
*/
|
||||
void AppCallRouter_Init (void)
|
||||
{
|
||||
int index;
|
||||
for(index = 0; index < APPCALL_CALLOBJ_MAX; index++)
|
||||
g_u32_AppCallIDMap[index] = APP_ROUTER_NO_APP;
|
||||
|
||||
memset(g_st_AppTable, 0, sizeof(g_st_AppTable));
|
||||
}
|
||||
|
||||
u8 AppCallRouter_AppInit (u32 u32_AppId, ST_APP_FNC_TABLE *pst_AppTable)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for (i=0;i<MAX_NUM_OF_APPS;i++)
|
||||
{
|
||||
if ((g_st_cmbs_route_table[i].u32_AppId == u32_AppId) && (g_st_cmbs_route_table[i].u32_AppId < MAX_NUM_OF_APPS))
|
||||
{
|
||||
APP_ROUTER_INFO_PRINT("g_st_AppTable %d 0x%x\n",i,g_st_AppTable[i]);
|
||||
memcpy (&g_st_AppTable[g_st_cmbs_route_table[i].u32_AppId], pst_AppTable, sizeof(ST_APP_FNC_TABLE));
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
}
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
// ========== CallRouter_AppSelection ===========
|
||||
/*!
|
||||
\brief Selects matching app based on the condition provided in the ST_CMBS_ROUTE_TABLE
|
||||
\param[in] u32_CallID CallID from CMBS
|
||||
\param[in] psz_CalledId pointer parameter buffer
|
||||
\param[in] psz_CallerHandset pointer parameter buffer
|
||||
\param[in] u32_LineId expected lineID
|
||||
\return < EXTAPP_RC >
|
||||
*/
|
||||
EXTAPP_RC AppCallRouter_AppSelection(IN u32 u32_CallID, IN const char* psz_CalledId, IN const char* psz_CallerHandset, IN u32 u32_LineId)
|
||||
{
|
||||
int i=0;
|
||||
char input[50];
|
||||
int res=-1;
|
||||
printf("\n\n CallRouter_AppSelection \n");
|
||||
for (i=0;i<MAX_NUM_OF_APPS;i++)
|
||||
{
|
||||
|
||||
if (NULL == g_st_AppTable[g_st_cmbs_route_table[i].u32_AppId].fncSetupCall )
|
||||
continue;
|
||||
|
||||
APP_ROUTER_INFO_PRINT("%s %d HS/D %s line %d\n",__FUNCTION__,i,psz_CallerHandset,u32_LineId);
|
||||
|
||||
if ( ((g_st_cmbs_route_table[i].u32_StartLineId != -1) && (g_st_cmbs_route_table[i].u32_MaxLineId != -1)) && ((u32_LineId >= g_st_cmbs_route_table[i].u32_StartLineId) && (u32_LineId<=g_st_cmbs_route_table[i].u32_MaxLineId)) )
|
||||
{
|
||||
APP_ROUTER_INFO_PRINT("\n -> line MAtching AppID %d %d\n",g_u32_AppCallIDMap[u32_CallID],g_st_cmbs_route_table[i].u32_AppId);
|
||||
|
||||
res = AppCallRouter_MakeCall(u32_CallID , g_st_cmbs_route_table[i].u32_AppId);
|
||||
if(res != EXTAPP_RC_OK)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
AppCallRouter_AddToAppCallMap(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if(psz_CallerHandset[0] == 'D')
|
||||
{
|
||||
if (g_st_cmbs_route_table[i].psz_DeviceId &&
|
||||
((strcmp("D*",g_st_cmbs_route_table[i].psz_DeviceId) == 0) || (strcmp(psz_CallerHandset,g_st_cmbs_route_table[i].psz_DeviceId) == 0)))
|
||||
{
|
||||
APP_ROUTER_INFO_PRINT("\n -> Dev MAtching AppID %d %d\n",g_u32_AppCallIDMap[u32_CallID],g_st_cmbs_route_table[i].u32_AppId);
|
||||
|
||||
res = AppCallRouter_MakeCall(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
if(res != EXTAPP_RC_OK)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
AppCallRouter_AddToAppCallMap(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(input,"H%s",psz_CallerHandset);
|
||||
if(g_st_cmbs_route_table[i].psz_HandsetNum &&
|
||||
((strcmp("H*",g_st_cmbs_route_table[i].psz_HandsetNum) == 0) || (strcmp(g_st_cmbs_route_table[i].psz_HandsetNum,input) == 0)))
|
||||
{
|
||||
APP_ROUTER_INFO_PRINT("\n -> HS MAtching AppID %d %d\n",g_u32_AppCallIDMap[u32_CallID],g_st_cmbs_route_table[i].u32_AppId);
|
||||
|
||||
res = AppCallRouter_MakeCall(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
if(res != EXTAPP_RC_OK)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
AppCallRouter_AddToAppCallMap(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((g_st_cmbs_route_table[i].psz_Digits && strcmp(psz_CalledId, g_st_cmbs_route_table[i].psz_Digits) == 0 ) ||
|
||||
((g_st_cmbs_route_table[i].u32_AppId == 3) && (psz_CalledId[0] == g_st_cmbs_route_table[i].psz_Digits[0])))
|
||||
{
|
||||
APP_ROUTER_INFO_PRINT("\n -> Dig MAtching AppID %d %d\n",g_u32_AppCallIDMap[u32_CallID],g_st_cmbs_route_table[i].u32_AppId);
|
||||
|
||||
res = AppCallRouter_MakeCall(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
if(res != EXTAPP_RC_OK)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
AppCallRouter_AddToAppCallMap(u32_CallID,g_st_cmbs_route_table[i].u32_AppId);
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
APP_ROUTER_ERROR_PRINT("\n -> NOT MAtching with App cond, call id %d\n", u32_CallID);
|
||||
|
||||
return EXTAPP_RC_FAIL;
|
||||
|
||||
}
|
||||
|
||||
// ========== AppCallRouter_MakeCall ===========
|
||||
/*!
|
||||
\brief Calls the Setup Call API of the selected App
|
||||
\param[in] u32_CallID CallID from CMBS
|
||||
\return < EXTVOIP_RC >
|
||||
*/
|
||||
EXTVOIP_RC AppCallRouter_MakeCall(u32 u32_CallID, u32 u32_AppId)
|
||||
{
|
||||
PST_CALL_OBJ pstCall;
|
||||
EXTVOIP_RC rc = CMBS_RC_OK;
|
||||
EXTVOIP_CODEC codecs[CMBS_AUDIO_CODEC_MAX] = {0};
|
||||
|
||||
|
||||
if ((u32_AppId == -1) || (u32_AppId >= MAX_NUM_OF_APPS))
|
||||
return EXTVOIP_RC_FAIL;
|
||||
|
||||
// get call object
|
||||
pstCall = _appcall_CallObjGetById(u32_CallID);
|
||||
if(!pstCall)
|
||||
return EXTVOIP_RC_FAIL;
|
||||
|
||||
// make codecs list
|
||||
if(pstCall->u8_CodecsLength)
|
||||
{
|
||||
int i = 0;
|
||||
for(i=0;i<pstCall->u8_CodecsLength;i++)
|
||||
codecs[i] = cmbsCodec2VoipCodec(pstCall->pu8_CodecsList[i]);
|
||||
}
|
||||
|
||||
|
||||
APP_ROUTER_INFO_PRINT("\n CallRouter_MakeCall %d 0x%x\n",u32_AppId,(unsigned int *)(g_st_AppTable[u32_AppId]).fncSetupCall);
|
||||
|
||||
// call SetupCall function
|
||||
if((g_st_AppTable[u32_AppId]).fncSetupCall)
|
||||
rc = ((g_st_AppTable[u32_AppId]).fncSetupCall)(u32_CallID, pstCall->ch_CalledID, pstCall->ch_CallerID, pstCall->u8_LineId, codecs, pstCall->u8_CodecsLength);
|
||||
|
||||
if(rc != EXTVOIP_RC_OK)
|
||||
return EXTVOIP_RC_FAIL;
|
||||
|
||||
return EXTVOIP_RC_OK;
|
||||
}
|
||||
|
||||
void AppCallRouter_AddToAppCallMap(u32 u32_CallID, u32 u32_AppId)
|
||||
{
|
||||
if(u32_CallID < APPCALL_CALLOBJ_MAX)
|
||||
g_u32_AppCallIDMap[u32_CallID] = u32_AppId;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
u32 AppCallRouter_DivertOutgoingCall( u32 u32_CallId, char *CalledPartyName, char *psz_Digits )
|
||||
{
|
||||
u32 u32_AppId, u32_ActiveCallID;
|
||||
char psz_CallerID[CALL_PARTICIPANT_ID_MAX_LEN] = {0,};
|
||||
EXTAPP_RC rc = EXTAPP_RC_FAIL;
|
||||
|
||||
ST_DIVERT_CALL_INFO st_DivertCallInfo = {0,};
|
||||
|
||||
EXTVOIP_CODEC codecs[EXTVOIP_CODEC_MAX] = {0};
|
||||
PST_CALL_OBJ pst_ActiveCall = _appcall_CallObjGetById(u32_CallId);
|
||||
|
||||
|
||||
if(!pst_ActiveCall)
|
||||
{
|
||||
printf("\n AppCallRouter_DivertOutgoingCall: Error");
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
u32_AppId = AppCallRouter_GetAppForCallDivert(psz_Digits /*, u32_LineId*/);
|
||||
|
||||
|
||||
if (u32_AppId == MAX_NUM_OF_APPS)
|
||||
{
|
||||
printf("AppCallRouter_DivertOutgoingCall: No App for Call Divert");
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
// make codecs list
|
||||
if(pst_ActiveCall->u8_CodecsLength)
|
||||
{
|
||||
int i = 0;
|
||||
for(i=0;i<pst_ActiveCall->u8_CodecsLength;i++)
|
||||
codecs[i] = cmbsCodec2VoipCodec(pst_ActiveCall->pu8_CodecsList[i]);
|
||||
}
|
||||
|
||||
st_DivertCallInfo.cmbsCallID = u32_CallId;
|
||||
st_DivertCallInfo.psz_CalledID = CalledPartyName;
|
||||
st_DivertCallInfo.psz_CalledDigits = psz_Digits;
|
||||
if(pst_ActiveCall->ch_CallerID[0] != 'D')
|
||||
{
|
||||
psz_CallerID[0]='h';
|
||||
strcpy(psz_CallerID+1,pst_ActiveCall->ch_CallerID);
|
||||
st_DivertCallInfo.psz_CallerID = psz_CallerID;
|
||||
}
|
||||
else
|
||||
{
|
||||
st_DivertCallInfo.psz_CallerID = pst_ActiveCall->ch_CallerID;
|
||||
|
||||
}
|
||||
|
||||
st_DivertCallInfo.u32_LineId = pst_ActiveCall->u8_LineId;
|
||||
st_DivertCallInfo.pu8_CodecsList = codecs;
|
||||
st_DivertCallInfo.u8_NumOfCodecs = pst_ActiveCall->u8_CodecsLength;
|
||||
|
||||
u32_ActiveCallID = g_st_AppTable[u32_AppId].fncDivertOutgoingCall(&st_DivertCallInfo);
|
||||
|
||||
if(rc == EXTAPP_RC_OK)
|
||||
AppCallRouter_AddToAppCallMap(st_DivertCallInfo.cmbsCallID,u32_AppId);
|
||||
|
||||
return u32_ActiveCallID;
|
||||
|
||||
}
|
||||
|
||||
u32 AppCallRouter_GetAppForCallDivert(char *psz_Digits)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i=0;i<MAX_NUM_OF_APPS;i++)
|
||||
{
|
||||
|
||||
if(psz_Digits && g_st_cmbs_route_table[i].psz_Digits)
|
||||
{
|
||||
if (((psz_Digits[0] == 'D') && (strcmp("D*", g_st_cmbs_route_table[i].psz_Digits) == 0 )) ||
|
||||
((psz_Digits[0] == 'h') && (strcmp("h*", g_st_cmbs_route_table[i].psz_Digits) == 0 )) ||
|
||||
(strcmp(psz_Digits,g_st_cmbs_route_table[i].psz_Digits) == 0) ||
|
||||
((psz_Digits[0] != 'D') && (psz_Digits[0] != 'h') && (strcmp("ANY", g_st_cmbs_route_table[i].psz_Digits) == 0))
|
||||
)
|
||||
|
||||
return g_st_cmbs_route_table[i].u32_AppId;
|
||||
}
|
||||
}
|
||||
return MAX_NUM_OF_APPS;
|
||||
}
|
||||
188
dectmngr/src/app/appcmbs/appCallRouter.h
Normal file
188
dectmngr/src/app/appcmbs/appCallRouter.h
Normal file
@@ -0,0 +1,188 @@
|
||||
#ifndef APPCALLROUTER
|
||||
#define APPCALLROUTER
|
||||
|
||||
#include "cmbs_voip_api.h"
|
||||
#include "ListsApp.h"
|
||||
|
||||
#define MAX_NUM_OF_APPS 6
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EXTAPP_RC_OK,
|
||||
EXTAPP_RC_FAIL
|
||||
} EXTAPP_RC;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 cmbsCallID;
|
||||
char *psz_CallerID;
|
||||
char *psz_CalledID;
|
||||
char *psz_CalledDigits;
|
||||
u16 u16_HsNum;
|
||||
u16 u16_DeviceId;
|
||||
u32 u32_LineId;
|
||||
EXTVOIP_CODEC *pu8_CodecsList;
|
||||
u8 u8_NumOfCodecs;
|
||||
u32 u32_ChannelID; /*!< Channel ID to identify the media connection on CMBS */
|
||||
u32 u32_ChannelParameter; /*!< Channel Parameter provides information about the parameter settings, e.g. IOM - used slots */
|
||||
|
||||
}ST_DIVERT_CALL_INFO;
|
||||
|
||||
|
||||
// Make a call
|
||||
typedef EXTAPP_RC (*app_SetupCallFunc)(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength);
|
||||
|
||||
// Proceeding
|
||||
typedef EXTAPP_RC (*app_ProceedingCallFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Alerting
|
||||
typedef EXTAPP_RC (*app_AlertingCallFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Answer call
|
||||
typedef EXTAPP_RC (*app_AnswerCallFunc)(IN u32 cmbsCallID, IN EXTVOIP_CODEC codec);
|
||||
|
||||
// Release active call
|
||||
typedef EXTAPP_RC (*app_DisconnectCallFunc)(IN u32 cmbsCallID, IN EXTVOIP_RELEASE_REASON disconnectReason);
|
||||
|
||||
// Release active call ack
|
||||
typedef EXTAPP_RC (*app_DisconnectCallDoneFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Hold call
|
||||
typedef EXTAPP_RC (*app_HoldCallFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Hold call ack
|
||||
typedef EXTAPP_RC (*app_HoldCallAckFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Resume call
|
||||
typedef EXTAPP_RC (*app_ResumeCallFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Resume call ack
|
||||
typedef EXTAPP_RC (*app_ResumeCallAckFunc)(IN u32 cmbsCallID);
|
||||
|
||||
// Conference call
|
||||
typedef EXTAPP_RC (*app_ConferenceCallFunc)(IN u32 cmbsCallID, IN u32 cmbsCallID2);
|
||||
|
||||
// Change codec
|
||||
typedef EXTAPP_RC (*app_MediaChangeFunc)(IN u32 cmbsCallID, IN EXTVOIP_CODEC codec);
|
||||
|
||||
// Change codec ack
|
||||
typedef EXTAPP_RC (*app_MediaChangeAckFunc)(IN u32 cmbsCallID, IN EXTVOIP_CODEC codec);
|
||||
|
||||
// Send digits
|
||||
typedef EXTAPP_RC (*app_SendDigitsCallFunc)(IN u32 cmbsCallID, IN char* digits);
|
||||
|
||||
// Merge call response
|
||||
typedef EXTAPP_RC (*app_MergeCallResFunc)(IN u32 cmbsCallID);
|
||||
|
||||
/*
|
||||
* Helpers
|
||||
*/
|
||||
|
||||
// Retrieve call caller id
|
||||
typedef EXTAPP_RC (*app_GetCallerIDFunc)(IN u32 cmbsCallID, OUT char* callerID);
|
||||
|
||||
// Retrieve call called id
|
||||
typedef EXTAPP_RC (*app_GetCalledIDFunc)(IN u32 cmbsCallID, OUT char* calledID);
|
||||
|
||||
|
||||
/*
|
||||
* Audio config
|
||||
*/
|
||||
|
||||
// Set audio channel
|
||||
typedef EXTAPP_RC (*app_SetAudioChannelFunc)(IN u32 cmbsCallID, IN u32 mediaChannelID, IN EXTVOIP_CODEC codec);
|
||||
|
||||
/*
|
||||
* Contacts sync
|
||||
*/
|
||||
|
||||
// Retrieve contacts size
|
||||
typedef u32 (*app_GetContactsCountFunc)();
|
||||
|
||||
// Retrieve contact entry
|
||||
typedef EXTAPP_RC (*app_GetContactEntryFunc)(IN u32 itemid, OUT char* firstName, OUT char* lastName, OUT char* number, OUT u32* isOnline);
|
||||
|
||||
//Divert outgoing call
|
||||
typedef u32 (*app_DivertOutgoingCallFunc)(IN ST_DIVERT_CALL_INFO *pst_DivertCallInfo );
|
||||
|
||||
|
||||
typedef void (*app_UpdateCallStateFunc)(IN u32 cmbsCallID, IN EXTVOIP_CALL_STATE e_CallState);
|
||||
|
||||
typedef struct app_FnTable_s
|
||||
{
|
||||
// line ID
|
||||
//u32 LineID;
|
||||
|
||||
char LineName[LIST_NAME_MAX_LEN];
|
||||
|
||||
// function for call setup
|
||||
app_SetupCallFunc fncSetupCall;
|
||||
// function for call proceeding
|
||||
app_ProceedingCallFunc fncProceedingCall;
|
||||
// function for call proceeding
|
||||
app_AlertingCallFunc fncAlertingCall;
|
||||
// function for call answer
|
||||
app_AnswerCallFunc fncAnswerCall;
|
||||
// function for call disconnect
|
||||
app_DisconnectCallFunc fncDisconnectCall;
|
||||
// function for call disconnect done
|
||||
app_DisconnectCallDoneFunc fncDisconnectCallDone;
|
||||
// function for call hold
|
||||
app_HoldCallFunc fncHoldCall;
|
||||
// function for call hold acknowledge
|
||||
app_HoldCallAckFunc fncHoldCallDone;
|
||||
// function for call resume
|
||||
app_ResumeCallFunc fncResumeCall;
|
||||
// function for call conference
|
||||
app_ConferenceCallFunc fncConferenceCall;
|
||||
// function for call resume acknowledge
|
||||
app_ResumeCallAckFunc fncResumeCallDone;
|
||||
// function for call codec change
|
||||
app_MediaChangeFunc fncMediaChange;
|
||||
// function for call codec change acknowledge
|
||||
app_MediaChangeAckFunc fncMediaChangeAck;
|
||||
// function to send digits
|
||||
app_SendDigitsCallFunc fncSendDigits;
|
||||
// function to retrieve caller ID
|
||||
app_GetCallerIDFunc fncGetCallerID;
|
||||
// function to retrieve called ID
|
||||
app_GetCalledIDFunc fncGetCalledID;
|
||||
// function to set audio channel
|
||||
app_SetAudioChannelFunc fncSetAudioChannel;
|
||||
// function to retrieve cotacts size
|
||||
app_GetContactsCountFunc fncContactsCount;
|
||||
// function to retrieve contact entry
|
||||
app_GetContactEntryFunc fncContactsEntry;
|
||||
// function for merge call response
|
||||
app_MergeCallResFunc fncMergeCallRes;
|
||||
// function to Divert Outgoing Calls
|
||||
app_DivertOutgoingCallFunc fncDivertOutgoingCall;
|
||||
// function to update call state
|
||||
app_UpdateCallStateFunc fncUpdateCallState;
|
||||
} ST_APP_FNC_TABLE;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_AppId;
|
||||
u32 u32_StartLineId;
|
||||
u32 u32_MaxLineId;
|
||||
const char *psz_HandsetNum;
|
||||
const char *psz_DeviceId;
|
||||
const char *psz_Digits;
|
||||
const char *psz_ListenInCall;
|
||||
}ST_CMBS_ROUTE_TABLE;
|
||||
|
||||
|
||||
void AppCallRouter_Init (void);
|
||||
void AppCallRouter_AddToAppCallMap(u32 u32_CallID, u32 u32_AppId);
|
||||
EXTAPP_RC AppCallRouter_AppSelection(IN u32 u32_CallID, IN const char* psz_CalledId, IN const char* psz_CallerHandset, IN u32 u32_LineId);
|
||||
|
||||
u8 AppCallRouter_AppInit (u32 u32_AppId, ST_APP_FNC_TABLE *pst_AppTable);
|
||||
|
||||
EXTVOIP_RC AppCallRouter_MakeCall(u32 u32_CallID, u32 u32_AppId);
|
||||
|
||||
EXTAPP_RC AppCallRouter_AnswerCall(u32 u32_CallID);
|
||||
u32 AppCallRouter_DivertOutgoingCall( u32 u32_CallId, char *CalledPartyName, char *psz_Digits );
|
||||
#endif
|
||||
2046
dectmngr/src/app/appcmbs/appHanMw.c
Normal file
2046
dectmngr/src/app/appcmbs/appHanMw.c
Normal file
File diff suppressed because it is too large
Load Diff
210
dectmngr/src/app/appcmbs/appHanMw.h
Normal file
210
dectmngr/src/app/appcmbs/appHanMw.h
Normal file
@@ -0,0 +1,210 @@
|
||||
/*!
|
||||
* \file appHanMW.h
|
||||
* \brief HAN MW API
|
||||
* \author HAN Team
|
||||
*
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined( _APPHANMW_H )
|
||||
#define _APPHANMW_H
|
||||
|
||||
#include "cmbs_han.h"
|
||||
#include "appcall.h"
|
||||
|
||||
E_CMBS_RC app_HanMwMsgSend_ImplicitLinkSetup (u16 u16_RequestId, u16 u16_DestDeviceId, ST_IE_HAN_MSG_CTL* pst_HANMsgCtl , ST_IE_HAN_MSG * pst_HANMsg );
|
||||
E_CMBS_RC app_HanMwRawMsgSend_ImplicitLinkSetup (u16 u16_RequestId, u16 u16_DestDeviceId, ST_IE_HAN_MSG_CTL* pst_HANMsgCtl , ST_IE_DATA * pst_RawMsg );
|
||||
void app_HanMWDeleteDeviceViaQueue(u16 u16_deviceId, bool b_BlackList);
|
||||
void app_HanMWInitialize(void);
|
||||
void app_HanMWReleaseLinkRequest(u16 u16_deviceId);
|
||||
void app_HanMWHwVersionGet(void);
|
||||
void app_HanMWSwVersionGet(void);
|
||||
void app_HanMWGetNumOfFunMsgInQ(u16 u16_deviceId);
|
||||
void app_HanMWClearFunMsgQ(u16 u16_deviceId);
|
||||
void app_HanMWGetMaxNumOfDevices(void);
|
||||
void app_HanMWGetNumOfRegDevices(void);
|
||||
void app_HanMWOnMergeCallsResponse(ST_IE_RESPONSE st_Response, u16 u16_CallId, u8 *pu8_FirstParticipant, u8 *pu8_SecondParticipant);
|
||||
void app_HanMWOnCallReleaseResponse(u16 u16_CallId);
|
||||
void app_HanMWReleaseCall(u16 u16_CallId);
|
||||
void app_HanMWOnCallReleaseInd(u16 u16_CallId);
|
||||
void app_HanMWOnCallEstablishInd(u16 u16_CallId, u8 *pu8_Participant);
|
||||
void app_HanMWOnDeviceReleasedFromCall(u16 u16_CallId, u16 u16_DeviceId);
|
||||
void app_HanMWOnHsReleasedFromCall(u16 u16_CallId, u8 u8_HsNum);
|
||||
|
||||
|
||||
void app_HanMWDivertCall(u32 u32_ChannelId, char *pNum, char *pName);
|
||||
void app_HanMWAudioStart(u32 u32_AudioLineId, char *pParam);
|
||||
|
||||
void app_HanMwGetActiveCallsInfo(void);
|
||||
void app_HanMwSmvCallRelease(u32 u32_ChannelId);
|
||||
void app_HanMwAudioStart(u32 u32_ChannelId);
|
||||
void app_HanMWAudioStop(u32 u32_ChannelId);
|
||||
void app_HanMWAudioEnd(u32 u32_ChannelId);
|
||||
void app_HanMwAudioProgress(u32 u32_ChannelId);
|
||||
void app_HanMwQueryEnd(u32 u32_ChannelId);
|
||||
void app_HanMwMakeCall(u32 u32_ChannelId, char *CalledId);
|
||||
|
||||
void app_HanMWOnActiveCallsInfoGetRes(ST_ALLACTIVECALLSINFO st_AllActiveCalls);
|
||||
void app_HanMwOnSmvCallReleaseRes(u32 u32_ChannelId);
|
||||
void app_HanMWOnAudioStart(u32 u32_ChannelId, const u8 *pu8_DevUnitID);
|
||||
void app_HanMWOnAudioStop(const u8 *pu8_DevUnitID);
|
||||
void app_HanMWOnAudioEnd(const u8 *pu8_DevUnitID);
|
||||
|
||||
|
||||
void app_HanMWSetNEMoMode(char *pMode);
|
||||
void app_HanMWOnSetNEMoModeRes(bool b_status);
|
||||
|
||||
void app_HanMWFirmwareUpdateStart(char *pFileName,u32 u32_PacketSize,u32 u32_RestoreParam);
|
||||
void app_HanMWOnFirmwareUpdateStartRes(bool b_status);
|
||||
void app_HanMWOnFirmwareUpdateEndRes(bool b_status);
|
||||
|
||||
void app_HanMWOnTargetUpSetDefaults(void);
|
||||
|
||||
void app_HanMWDataCallRelease(u8 u8_SessionId);
|
||||
void app_HanMWDataCallSend(u8 u8_SessionId, u16 u16_DataLen, u8* pu8_Data);
|
||||
void app_HanMWOnDataCallSendRes(u8 u8_SessionId, u8 u8_Status);
|
||||
void app_HanMWOnDataCallReleaseInd(u8 u8_SessionId, u8 u8_Status);
|
||||
void app_HanMWOnDataCallSessionCreatedInd(u16 u16_AppId, u8 u8_SessionId, u16 u16_DeviceId);
|
||||
void app_HanMWOnDataCallReceivedDataInd(u8 u8_SessionId, u16 u16_DataLen, u8* pu8_Data);
|
||||
|
||||
typedef void (*t_fptrHANClientOnRegClosed)( E_CMBS_EVENT_ID , void * );
|
||||
typedef void (*t_fptrHANClientOnReadDeviceTableRes)( void * );
|
||||
typedef void (*t_fptrHANClientOnReadDeviceSubInfoRes)( void * );
|
||||
typedef u32 (*t_fptrHANClientOnMsgRecv)( void * , ST_IE_HAN_MSG *);
|
||||
typedef u32 (*t_fptrHANClientOnDeviceFullDeleted)( u16, ST_IE_RESPONSE, u16 );
|
||||
typedef u32 (*t_fptrHANClientOnDeviceRegistered)( u16 );
|
||||
typedef u32 (*t_fptrHANClientOnDevicePartialDeleted)( u16 );
|
||||
typedef u32(*t_fptrHANClientOnOpenRegRes)(int);
|
||||
typedef u32(*t_fptrHANClientOnCloseRegRes)(int);
|
||||
typedef u32(*t_fptrHANClientOnHandsetRegistered)(u8);
|
||||
typedef u32(*t_fptrHANClientOnTargetUpIndication)();
|
||||
typedef u32(*t_fptrHANClientOnEepParamGetRes)(bool, u8 *, u16,u8 *);
|
||||
typedef u32(*t_fptrHANClientOnEepParamSetRes)(bool, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnEepAreaGetRes)(bool, u32, u16, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnEepAreaSetRes)(bool);
|
||||
typedef u32(*t_fptrHANClientOnProdParamGetRes)(bool, u8 *, u16,u8 *);
|
||||
typedef u32(*t_fptrHANClientOnProdParamSetRes)(bool, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnRamAreaGetRes)(bool, u32, u16, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnRamAreaSetRes)(bool);
|
||||
typedef u32(*t_fptrHANClientOnEepromSizeGetRes)(bool, u32);
|
||||
typedef u32(*t_fptrHANClientOnHwVersionGetRes)(bool, u8 *, u8 *, u8 *, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnSwVersionGetRes)(bool, u16, u16, u16, u16);
|
||||
typedef u32(*t_fptrHANClientOnGetNumOfFunMsgInQRes)(bool, u16, u8, u8);
|
||||
|
||||
typedef u32(*t_fptrHANClientOnMessageSendRes)(bool, u16);
|
||||
typedef void (*t_fptrHANClientOnReadDeviceTablePhase2Res)( void * );
|
||||
typedef void (*t_fptrHANClientOnReadDeviceSubInfoPhase2Res)( void * );
|
||||
typedef void (*t_fptrHANClientOnReadBlackListDeviceTableRes)( void * );
|
||||
typedef u32 (*t_fptrHANClientOnDeviceDeleted)( u16 );
|
||||
typedef u32(*t_fptrHANClientOnRawMsgRecv)( void * , ST_IE_DATA *);
|
||||
typedef u32(*t_fptrHANClientOnRawMessageSendRes)(bool, u16);
|
||||
typedef u32(*t_fptrHANClientOnGetNumOfRegDevicesRes)(u16);
|
||||
typedef u32(*t_fptrHANClientOnGetMaxNumOfDevicesRes)(u16);
|
||||
|
||||
typedef u32(*t_fptrHANClientOnMergeCallsRes)(bool, u16, u8 *, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnCallReleaseResponse)(u16);
|
||||
typedef u32(*t_fptrHANClientOnCallReleaseInd)(u16);
|
||||
typedef u32(*t_fptrHANClientOnCallEstablishInd)(u16, u8 *);
|
||||
typedef u32(*t_fptrHANClientOnDeviceReleasedFromCall)(u16, u16);
|
||||
typedef u32(*t_fptrHANClientOnHsReleasedFromCall)(u16, u8);
|
||||
typedef void(*t_fptrHANClientOnActiveCallsInfoGetRes)(ST_ALLACTIVECALLSINFO);
|
||||
typedef void(*t_fptrHANClientOnDataCallSendRes)(u8 , u8 );
|
||||
typedef void(*t_fptrHANClientOnDataCallReleaseInd)(u8, u8);
|
||||
typedef void(*t_fptrHANClientOnDataCallSessionCreatedInd)(u16, u8, u16);
|
||||
typedef void(*t_fptrHANClientOnDataCallReceivedDataInd)(u8, u16, u8*);
|
||||
typedef void(*t_fptrHANClientOnSetNEMoModeRes)(bool);
|
||||
typedef void(*t_fptrHANClientOnFirmwareUpdateStartRes)(bool);
|
||||
typedef void(*t_fptrHANClientOnFirmwareUpdateEndRes)(bool);
|
||||
typedef void(*t_fptrHANClientOnSmvCallReleaseRes)(u16);
|
||||
typedef void(*t_fptrHANClientOnAudioStart)(u32 , const u8 *);
|
||||
typedef void(*t_fptrHANClientOnAudioStop)(const u8 *);
|
||||
typedef void(*t_fptrHANClientOnAudioEnd)(const u8 *);
|
||||
typedef u32(*t_fptrHANClientOnDivertCallRes)(u32);
|
||||
|
||||
typedef struct s_fptrHanClient
|
||||
{
|
||||
t_fptrHANClientOnRegClosed g_fptrHANClientOnRegClosed;
|
||||
t_fptrHANClientOnReadDeviceTableRes g_fptrHANClientOnReadDeviceTableRes;
|
||||
t_fptrHANClientOnReadDeviceSubInfoRes g_fptrHANClientOnReadDeviceSubInfoRes;
|
||||
t_fptrHANClientOnMsgRecv g_fptrHANClientOnMsgRecv;
|
||||
t_fptrHANClientOnDeviceFullDeleted g_fptrHANClientOnDeviceFullDeleted;
|
||||
t_fptrHANClientOnDeviceRegistered g_fptrHANClientOnDeviceRegistered;
|
||||
t_fptrHANClientOnDevicePartialDeleted g_fptrHANClientOnDevicePartialDeleted;
|
||||
t_fptrHANClientOnOpenRegRes g_fptrHANClientOnOpenRegRes;
|
||||
t_fptrHANClientOnCloseRegRes g_fptrHANClientOnCloseRegRes;
|
||||
t_fptrHANClientOnHandsetRegistered g_fptrHANClientOnHandsetRegistered;
|
||||
t_fptrHANClientOnTargetUpIndication g_fptrHANClientOnTargetUpIndication;
|
||||
t_fptrHANClientOnEepParamGetRes g_fptrHANClientOnEepParamGetRes;
|
||||
t_fptrHANClientOnEepParamSetRes g_fptrHANClientOnEepParamSetRes;
|
||||
t_fptrHANClientOnEepAreaGetRes g_fptrHANClientOnEepAreaGetRes;
|
||||
t_fptrHANClientOnEepAreaSetRes g_fptrHANClientOnEepAreaSetRes;
|
||||
t_fptrHANClientOnProdParamGetRes g_fptrHANClientOnProdParamGetRes;
|
||||
t_fptrHANClientOnProdParamSetRes g_fptrHANClientOnProdParamSetRes;
|
||||
t_fptrHANClientOnRamAreaGetRes g_fptrHANClientOnRamAreaGetRes;
|
||||
t_fptrHANClientOnRamAreaSetRes g_fptrHANClientOnRamAreaSetRes;
|
||||
t_fptrHANClientOnEepromSizeGetRes g_fptrHANClientOnEepromSizeGetRes;
|
||||
t_fptrHANClientOnHwVersionGetRes g_fptrHANClientOnHwVersionGetRes;
|
||||
t_fptrHANClientOnSwVersionGetRes g_fptrHANClientOnSwVersionGetRes;
|
||||
t_fptrHANClientOnGetNumOfFunMsgInQRes g_fptrHANClientOnGetNumOfFunMsgInQRes;
|
||||
t_fptrHANClientOnMessageSendRes g_fptrHANClientOnMessageSendRes;
|
||||
t_fptrHANClientOnReadDeviceTablePhase2Res g_fptrHANClientOnReadDeviceTablePhase2Res;
|
||||
t_fptrHANClientOnReadDeviceSubInfoPhase2Res g_fptrHANClientOnReadDeviceSubInfoPhase2Res;
|
||||
t_fptrHANClientOnReadBlackListDeviceTableRes g_fptrHANClientOnReadBlackListDeviceTable;
|
||||
t_fptrHANClientOnDeviceDeleted g_fptrHANClientOnDeviceDeleted ;
|
||||
t_fptrHANClientOnRawMsgRecv g_fptrHANClientOnRawMsgRecv;
|
||||
t_fptrHANClientOnRawMessageSendRes g_fptrHANClientOnRawMessageSendRes;
|
||||
t_fptrHANClientOnGetNumOfRegDevicesRes g_fptrHANClientOnGetNumOfRegDevicesRes;
|
||||
t_fptrHANClientOnGetMaxNumOfDevicesRes g_fptrHANClientOnGetMaxNumOfDevicesRes;
|
||||
|
||||
t_fptrHANClientOnMergeCallsRes g_fptrHANClientOnMergeCallsRes;
|
||||
t_fptrHANClientOnCallReleaseResponse g_fptrHANClientOnCallReleaseResponse;
|
||||
t_fptrHANClientOnCallReleaseInd g_fptrHANClientOnCallReleaseInd;
|
||||
t_fptrHANClientOnCallEstablishInd g_fptrHANClientOnCallEstablishInd;
|
||||
t_fptrHANClientOnDeviceReleasedFromCall g_fptrHANClientOnDeviceReleasedFromCall;
|
||||
t_fptrHANClientOnHsReleasedFromCall g_fptrHANClientOnHsReleasedFromCall;
|
||||
t_fptrHANClientOnActiveCallsInfoGetRes g_fptrHANClientOnActiveCallsInfoGetRes;
|
||||
t_fptrHANClientOnDataCallSendRes g_fptrHANClientOnDataCallSendRes;
|
||||
t_fptrHANClientOnDataCallReleaseInd g_fptrHANClientOnDataCallReleaseInd;
|
||||
t_fptrHANClientOnDataCallSessionCreatedInd g_fptrHANClientOnDataCallSessionCreatedInd;
|
||||
t_fptrHANClientOnDataCallReceivedDataInd g_fptrHANClientOnDataCallReceivedDataInd;
|
||||
t_fptrHANClientOnSetNEMoModeRes g_fptrHANClientOnSetNEMoModeRes;
|
||||
t_fptrHANClientOnFirmwareUpdateStartRes g_fptrHANClientOnFirmwareUpdateStartRes;
|
||||
t_fptrHANClientOnFirmwareUpdateEndRes g_fptrHANClientOnFirmwareUpdateEndRes;
|
||||
t_fptrHANClientOnSmvCallReleaseRes g_fptrHANClientOnSmvCallReleaseRes;
|
||||
t_fptrHANClientOnAudioStart g_fptrHANClientOnAudioStart;
|
||||
t_fptrHANClientOnAudioStop g_fptrHANClientOnAudioStop;
|
||||
t_fptrHANClientOnAudioEnd g_fptrHANClientOnAudioEnd;
|
||||
t_fptrHANClientOnDivertCallRes g_fptrHANClientOnDivertCallRes;
|
||||
|
||||
}s_fptrHanClient;
|
||||
|
||||
typedef void(*t_fptrHANServerOnTargetUpSetDefaults)(void);
|
||||
|
||||
typedef struct s_fptrHanServer
|
||||
{
|
||||
t_fptrHANServerOnTargetUpSetDefaults g_fptrHANServerOnTargetUpSetDefaults;
|
||||
}s_fptrHanServer;
|
||||
|
||||
void app_HanMWRegisterCallBacks(s_fptrHanClient* HanClientRegisterCallBacks);
|
||||
void app_HanMWRegisterServerCallBacks(s_fptrHanServer* HanServerRegisterCallBacks);
|
||||
|
||||
E_CMBS_RC app_HanMwDeviceReadTable (u16 u16_NumOfEntries, u16 u16_IndexOfFirstEntry, u8 isBrief);
|
||||
E_CMBS_RC app_HanMwReadSingleDeviceRegistrationInformation(u16 u16_DeviceId);
|
||||
E_CMBS_RC app_HanMwDeviceReadTablePhase2(u16 u16_NumOfEntries, u16 u16_IndexOfFirstEntry);
|
||||
E_CMBS_RC app_HanMwReadSingleDeviceRegistrationInformationPhase2(u16 u16_DeviceId);
|
||||
E_CMBS_RC app_HanMwDeviceReadBlackListTable (u16 u16_NumOfEntries, u16 u16_IndexOfFirstEntry);
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NO_MSG_IN_QUEUE = 0,
|
||||
FOUND_MSG_IN_QUEUE,
|
||||
} E_MSG_IN_QUEUE_STATUS;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // _APPHANMW_H
|
||||
|
||||
/**********************[End Of File]**********************************************************************************************************/
|
||||
743
dectmngr/src/app/appcmbs/appUleIntPbx.c
Normal file
743
dectmngr/src/app/appcmbs/appUleIntPbx.c
Normal file
@@ -0,0 +1,743 @@
|
||||
/*!
|
||||
* \file appUleIntPbx.c
|
||||
* \brief handle ULE internal PBX
|
||||
* \Author moria
|
||||
*
|
||||
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "appUleIntPbx.h"
|
||||
#include "cmbs_api.h"
|
||||
#include "cmbs_han.h"
|
||||
#include "appcall.h"
|
||||
#include "apphan.h"
|
||||
#include "apphanvoicecallroutingtable.h"
|
||||
#include "cmbs_voipline.h"
|
||||
|
||||
#include "tcx_hostlog.h"
|
||||
|
||||
#include "appAvsService.h"
|
||||
|
||||
|
||||
#define APP_ULE_INX_PBX_INFO_PRINT(format, ...) tcx_WriteLog(ULE_INT_PBX, LOG_LEVEL_INFO, format, ##__VA_ARGS__ )
|
||||
#define APP_ULE_INX_PBX_TRACE_PRINT(format, ...) tcx_WriteLog(ULE_INT_PBX, LOG_LEVEL_TRACE, format, ##__VA_ARGS__ )
|
||||
#define APP_ULE_INX_PBX_WARNING_PRINT(format, ...) tcx_WriteLog(ULE_INT_PBX, LOG_LEVEL_WARNING, format, ##__VA_ARGS__ )
|
||||
#define APP_ULE_INX_PBX_ERROR_PRINT(format, ...) tcx_WriteLog(ULE_INT_PBX, LOG_LEVEL_ERROR, format, ##__VA_ARGS__ )
|
||||
#define APP_ULE_INX_PBX_RT_PRINT(format, ...) tcx_WriteLog(ULE_INT_PBX, LOG_LEVEL_REAL_TIME, format, ##__VA_ARGS__ )
|
||||
#define APP_ULE_INX_PBX_PRINT_DATA(pu8_Buffer, u16_Length) tcx_WriteLogData(ULE_INT_PBX, LOG_LEVEL_INFO, pu8_Buffer, u16_Length)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#define APP_PBX_CALL_PPARTICIPANT_HS_LEN 2
|
||||
#define APP_PBX_CALL_PPARTICIPANT_DEVICE_LEN 8
|
||||
|
||||
#define APP_PBX_CALL_PARTICIPANT_DEVICE_OFFSET 1
|
||||
#define APP_PBX_CALL_PARTICIPANT_UNIT_OFFSET 6
|
||||
#define APP_PBX_CALL_PARTICIPANT_HS_NUM_OFFSET 1
|
||||
|
||||
#define APP_PBX_DEVICE_IDENTIFIER_OFFSET 0
|
||||
#define APP_PBX_UNIT_IDENTIFIER_OFFSET 5
|
||||
#define APP_PBX_HS_IDENTIFIER_OFFSET 0
|
||||
|
||||
#define APP_PBX_DEVICE_IDENTIFIER 'D'
|
||||
#define APP_PBX_UNIT_IDENTIFIER 'U'
|
||||
#define APP_PBX_HS_IDENTIFIER 'h'
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_CallId1;
|
||||
u32 u32_CallId2;
|
||||
bool b_ConvertToInt;
|
||||
|
||||
}ST_CALL_MERGE_INFO;
|
||||
|
||||
#define MERGE_CALL_DB_SIZE 5
|
||||
#define MERGE_CALL_INVALID_CALL_ID 0xFFFFFFFF
|
||||
#define MERGE_CALL_INVALID_RECORD_ID 0xFF
|
||||
|
||||
ST_CALL_MERGE_INFO g_st_CallsPengingForMerge_DB[MERGE_CALL_DB_SIZE] = {{MERGE_CALL_INVALID_CALL_ID, MERGE_CALL_INVALID_CALL_ID, FALSE},
|
||||
{MERGE_CALL_INVALID_CALL_ID, MERGE_CALL_INVALID_CALL_ID, FALSE},
|
||||
{MERGE_CALL_INVALID_CALL_ID, MERGE_CALL_INVALID_CALL_ID, FALSE},
|
||||
{MERGE_CALL_INVALID_CALL_ID, MERGE_CALL_INVALID_CALL_ID, FALSE},
|
||||
{MERGE_CALL_INVALID_CALL_ID, MERGE_CALL_INVALID_CALL_ID, FALSE}};
|
||||
|
||||
bool G_b_IntPbx_CallDivert = FALSE;
|
||||
EXTAPP_RC appUleIntPbx_SetAudioChannel (IN u32 cmbsCallID, IN u32 mediaChannelID, IN EXTVOIP_CODEC e_Codec);
|
||||
extern E_APPCMBS_MEDIA _appcall_CallObjMediaGet(PST_CALL_OBJ pst_Call);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
u8 apppbx_AllocPendingMergeEntry()
|
||||
{
|
||||
u8 u8_Index = 0;
|
||||
|
||||
for(u8_Index=0; u8_Index<MERGE_CALL_DB_SIZE; u8_Index++)
|
||||
{
|
||||
if(g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId1 == MERGE_CALL_INVALID_CALL_ID &&
|
||||
g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId2 == MERGE_CALL_INVALID_CALL_ID)
|
||||
{
|
||||
APP_ULE_INX_PBX_TRACE_PRINT("apppbx_AllocPendingMergeEntry -> allocated entry %d\n", u8_Index);
|
||||
|
||||
return u8_Index;
|
||||
}
|
||||
}
|
||||
|
||||
return MERGE_CALL_INVALID_RECORD_ID;
|
||||
|
||||
}
|
||||
|
||||
u8 apppbx_FindPendingMergeEntry(u32 u32_CallId)
|
||||
{
|
||||
u8 u8_Index = 0;
|
||||
|
||||
for(u8_Index=0; u8_Index<MERGE_CALL_DB_SIZE; u8_Index++)
|
||||
{
|
||||
if(g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId1 == u32_CallId ||
|
||||
g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId2 == u32_CallId)
|
||||
{
|
||||
APP_ULE_INX_PBX_TRACE_PRINT("apppbx_FindPendingMergeEntry -> entry %d\n", u8_Index);
|
||||
|
||||
return u8_Index;
|
||||
}
|
||||
}
|
||||
|
||||
return MERGE_CALL_INVALID_RECORD_ID;
|
||||
}
|
||||
|
||||
bool apppbx_FreePendingMergeEntry(u32 u32_CallId)
|
||||
{
|
||||
u8 u8_Index = 0;
|
||||
|
||||
for(u8_Index=0; u8_Index<MERGE_CALL_DB_SIZE; u8_Index++)
|
||||
{
|
||||
if(g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId1 == u32_CallId ||
|
||||
g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId2 == u32_CallId)
|
||||
|
||||
{
|
||||
APP_ULE_INX_PBX_TRACE_PRINT("apppbx_FreePendingMergeEntry -> entry %d\n", u8_Index);
|
||||
|
||||
g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId1 = MERGE_CALL_INVALID_CALL_ID;
|
||||
g_st_CallsPengingForMerge_DB[u8_Index].u32_CallId2 = MERGE_CALL_INVALID_CALL_ID;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//Forward declarations for CB functions
|
||||
EXTAPP_RC appUleIntPbx_OnCallEstablish(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength);
|
||||
EXTAPP_RC appUleIntPbx_OnCallAnswer(IN u32 cmbsCallID, IN EXTVOIP_CODEC codec);
|
||||
EXTAPP_RC appUleIntPbx_OnMergeCallResponse(IN u32 cmbsCallID);
|
||||
|
||||
u32 appUleIntPbx_OnDivertCall(ST_DIVERT_CALL_INFO *pst_DivertCallInfo);
|
||||
EXTAPP_RC appUleIntPbx_SendDigits(IN u32 u32_cmbsCallID, IN char* psz_Digits);
|
||||
|
||||
u32 UleIntPbx_appID = 5; /* Holds appID of the current app*/
|
||||
|
||||
|
||||
EXTAPP_RC LoadUleIntPbx (void)
|
||||
{
|
||||
EXTVOIP_RC res;
|
||||
ST_APP_FNC_TABLE st_AppTable;
|
||||
|
||||
st_AppTable.fncSetupCall = appUleIntPbx_OnCallEstablish;
|
||||
st_AppTable.fncAnswerCall = appUleIntPbx_OnCallAnswer;
|
||||
st_AppTable.fncMergeCallRes = appUleIntPbx_OnMergeCallResponse;
|
||||
|
||||
st_AppTable.fncProceedingCall = NULL;
|
||||
st_AppTable.fncAlertingCall = NULL;
|
||||
st_AppTable.fncDisconnectCall = NULL;
|
||||
st_AppTable.fncDisconnectCallDone = NULL;
|
||||
st_AppTable.fncHoldCall = NULL;
|
||||
st_AppTable.fncHoldCallDone = NULL;
|
||||
st_AppTable.fncResumeCall = NULL;
|
||||
st_AppTable.fncConferenceCall = NULL;
|
||||
st_AppTable.fncResumeCallDone = NULL;
|
||||
st_AppTable.fncMediaChange = NULL;
|
||||
st_AppTable.fncMediaChangeAck = NULL;
|
||||
st_AppTable.fncSendDigits = appUleIntPbx_SendDigits;
|
||||
st_AppTable.fncGetCallerID = NULL;
|
||||
st_AppTable.fncGetCalledID = NULL;
|
||||
st_AppTable.fncSetAudioChannel = NULL;
|
||||
st_AppTable.fncContactsCount = NULL;
|
||||
st_AppTable.fncContactsEntry = NULL;
|
||||
st_AppTable.fncDivertOutgoingCall = appUleIntPbx_OnDivertCall;
|
||||
st_AppTable.fncUpdateCallState = NULL;
|
||||
|
||||
st_AppTable.LineName[0] = 0;
|
||||
|
||||
res = AppCallRouter_AppInit(UleIntPbx_appID, &st_AppTable);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static bool apppbx_ConvertDeviceIdFromStr(const u8 *pu8_Buffer, u16 *pu16_DeviceId)
|
||||
{
|
||||
|
||||
u16 u16_DeviceId = 0;
|
||||
u8 u8_DeviceIdNibbleStr, u8_Index, NumOfNibbles = sizeof(u16_DeviceId)*2;
|
||||
|
||||
for(u8_Index=0; u8_Index<NumOfNibbles; u8_Index++)
|
||||
{
|
||||
u8_DeviceIdNibbleStr = pu8_Buffer[u8_Index];
|
||||
|
||||
if (u8_DeviceIdNibbleStr >= '0' && u8_DeviceIdNibbleStr <= '9')
|
||||
{
|
||||
u16_DeviceId |= (u8_DeviceIdNibbleStr - '0') << (12 - u8_Index * 4);
|
||||
}
|
||||
else if (u8_DeviceIdNibbleStr >= 'A' && u8_DeviceIdNibbleStr <= 'F')
|
||||
{
|
||||
u16_DeviceId |= (u8_DeviceIdNibbleStr - 'A' + 0xA) << (12 - u8_Index * 4);
|
||||
}
|
||||
}
|
||||
|
||||
*pu16_DeviceId = u16_DeviceId;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static u8 apppbx_ConvertDeviceIdToStr(u16 u16_DeviceId, u8 *pu8_Buffer)
|
||||
{
|
||||
|
||||
u8 u8_Index, u8_DeviceIdNibble = 0, NumOfNibbles = sizeof(u16_DeviceId)*2;
|
||||
|
||||
for(u8_Index=1; u8_Index<=NumOfNibbles; u8_Index++)
|
||||
{
|
||||
|
||||
u8_DeviceIdNibble = u16_DeviceId & 0xF;
|
||||
|
||||
if (u8_DeviceIdNibble <= 9)
|
||||
{
|
||||
pu8_Buffer[NumOfNibbles-u8_Index] = u8_DeviceIdNibble + '0';
|
||||
}
|
||||
else if (u8_DeviceIdNibble >= 0xA && u8_DeviceIdNibble <= 0xF)
|
||||
{
|
||||
pu8_Buffer[NumOfNibbles-u8_Index] = u8_DeviceIdNibble + 'A' - 0xA;
|
||||
}
|
||||
|
||||
u16_DeviceId >>= 4;
|
||||
}
|
||||
|
||||
return NumOfNibbles;
|
||||
}
|
||||
|
||||
static bool apppbx_ConvertUnitIdFromStr(const u8 *pu8_Buffer, u8 *pu8_UnitId)
|
||||
{
|
||||
|
||||
u8 u8_UnitId = 0, u8_DeviceIdNibbleStr, u8_Index, NumOfNibbles = sizeof(u8_UnitId)*2;
|
||||
|
||||
for(u8_Index=0; u8_Index<NumOfNibbles; u8_Index++)
|
||||
{
|
||||
u8_DeviceIdNibbleStr = pu8_Buffer[u8_Index];
|
||||
|
||||
if (u8_DeviceIdNibbleStr >= '0' && u8_DeviceIdNibbleStr <= '9')
|
||||
{
|
||||
u8_UnitId |= (u8_DeviceIdNibbleStr - '0') << (4 - u8_Index * 4);
|
||||
}
|
||||
else if (u8_DeviceIdNibbleStr >= 'A' && u8_DeviceIdNibbleStr <= 'F')
|
||||
{
|
||||
u8_UnitId |= (u8_DeviceIdNibbleStr - 'A' + 0xA) << (4 - u8_Index * 4);
|
||||
}
|
||||
}
|
||||
|
||||
*pu8_UnitId = u8_UnitId;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static u8 apppbx_ConvertUnitIdToStr(u8 u8_UnitId, u8 *pu8_Buffer)
|
||||
{
|
||||
|
||||
u8 u8_Index, u8_UnitIdNibble = 0, NumOfNibbles = sizeof(u8_UnitId)*2;
|
||||
|
||||
for(u8_Index=1; u8_Index<=NumOfNibbles; u8_Index++)
|
||||
{
|
||||
|
||||
u8_UnitIdNibble = u8_UnitId & 0xF;
|
||||
|
||||
if (u8_UnitIdNibble <= 9)
|
||||
{
|
||||
pu8_Buffer[NumOfNibbles - u8_Index] = u8_UnitIdNibble + '0';
|
||||
}
|
||||
else if (u8_UnitIdNibble >= 0xA && u8_UnitIdNibble <= 0xF)
|
||||
{
|
||||
pu8_Buffer[NumOfNibbles - u8_Index] = u8_UnitIdNibble + 'A' - 0xA;
|
||||
}
|
||||
|
||||
u8_UnitId >>= 4;
|
||||
}
|
||||
|
||||
return NumOfNibbles;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void appUleIntPbx_Call2HS(PST_CALL_OBJ pst_Call, u16 u16_DstId)
|
||||
{
|
||||
u32 u32_CallId;
|
||||
EXTVOIP_RC en_Status = EXTVOIP_RC_FAIL;
|
||||
//ST_APPCALL_PROPERTIES st_Properties = {0};
|
||||
char ch_HsNum[30] = {0};
|
||||
char ch_CallerNum[30] = {0};
|
||||
char ch_CallerName[30] = {0};
|
||||
u8 u8_EntryIndex;
|
||||
u8 u8_LineId;
|
||||
|
||||
EXTVOIP_CODEC codecList[] = { EXTVOIP_CODEC_PCM_LINEAR_WB, EXTVOIP_CODEC_PCM_LINEAR_NB };
|
||||
|
||||
ch_HsNum[0] = 'h';
|
||||
ch_HsNum[1] = (u8) u16_DstId + '0';
|
||||
|
||||
|
||||
|
||||
// alloc record in pending for merge DB
|
||||
u8_EntryIndex = apppbx_AllocPendingMergeEntry();
|
||||
|
||||
if(u8_EntryIndex == MERGE_CALL_INVALID_RECORD_ID)
|
||||
{
|
||||
APP_ULE_INX_PBX_ERROR_PRINT("Cannot alloc record for merging call");
|
||||
return;
|
||||
}
|
||||
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1 = _appcall_CallObjIdGet(pst_Call);
|
||||
|
||||
if(!G_b_IntPbx_CallDivert)
|
||||
{
|
||||
|
||||
memcpy(&ch_CallerNum[0], &pst_Call->ch_CallerID[0], pst_Call->st_CallerParty.u8_AddressLen );
|
||||
u8_LineId = 0;
|
||||
|
||||
//send call progress
|
||||
extvoip_OnProceedingCall(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1);
|
||||
|
||||
// answer current call
|
||||
extvoip_OnAnswerCall(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1, EXTVOIP_CODEC_PCM_LINEAR_WB);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(&ch_CallerNum[0], &pst_Call->ch_CalledID[0], pst_Call->st_CalledParty.u8_AddressLen );
|
||||
u8_LineId = 1;
|
||||
}
|
||||
en_Status = extvoip_OnSetupCall(UleIntPbx_appID, u8_LineId, ch_HsNum, ch_CallerNum, ch_CallerName, codecList, sizeof(codecList)/sizeof(EXTVOIP_CODEC), (int *) &u32_CallId);
|
||||
|
||||
if(en_Status == EXTVOIP_RC_OK)
|
||||
{
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2 = u32_CallId;
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].b_ConvertToInt = FALSE;
|
||||
}
|
||||
|
||||
// merge calls will be invoked on call answer
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
EXTAPP_RC appUleIntPbx_OnCallEstablish(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength)
|
||||
{
|
||||
PST_CALL_OBJ pst_CallPending = NULL;
|
||||
PST_CALL_OBJ pst_Call = _appcall_CallObjGetById(cmbsCallID);
|
||||
u8 u8_EntryIndex;
|
||||
|
||||
APP_ULE_INX_PBX_TRACE_PRINT("<<<<<< appUleIntPbx_OnCallEstablish >>>>>>>\n\n");
|
||||
|
||||
// make sure Caller Party Number is not empty
|
||||
if(pst_Call)
|
||||
{
|
||||
// check whether a call is waiting for this HS/ device to be merged
|
||||
pst_CallPending = appcall_GetCallPendingforDeviceObj(pst_Call);
|
||||
|
||||
if (pst_CallPending)
|
||||
{
|
||||
pst_CallPending->b_WaitingForMerge = FALSE;
|
||||
|
||||
// alloc record in pending for merge DB
|
||||
u8_EntryIndex = apppbx_AllocPendingMergeEntry();
|
||||
|
||||
if(u8_EntryIndex == MERGE_CALL_INVALID_RECORD_ID)
|
||||
{
|
||||
APP_ULE_INX_PBX_ERROR_PRINT("Cannot alloc record for merging call");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1 = _appcall_CallObjIdGet(pst_CallPending);
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2 = cmbsCallID;
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].b_ConvertToInt = FALSE;
|
||||
|
||||
//Answer both calls
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Answer and merge calls: %d, %d\n",
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1, g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2);
|
||||
|
||||
if(!G_b_IntPbx_CallDivert)
|
||||
{
|
||||
extvoip_OnAnswerCall(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1, EXTVOIP_CODEC_PCM_LINEAR_WB); // current call
|
||||
}
|
||||
|
||||
extvoip_OnAnswerCall(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2, EXTVOIP_CODEC_PCM_LINEAR_WB); //pending call
|
||||
|
||||
if(!G_b_IntPbx_CallDivert)
|
||||
{
|
||||
// stop media channel
|
||||
appmedia_CallObjMediaStop(pst_Call->u32_CallInstance, 0, NULL);
|
||||
appmedia_CallObjMediaStop(pst_CallPending->u32_CallInstance, 0, NULL);
|
||||
}
|
||||
// merge calls
|
||||
appcall_MergeCalls(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1,
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2,
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].b_ConvertToInt);
|
||||
G_b_IntPbx_CallDivert = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// check wether the calling device has specified the called party
|
||||
if (strlen(calledID) == APP_PBX_CALL_PPARTICIPANT_DEVICE_LEN && calledID[APP_PBX_DEVICE_IDENTIFIER_OFFSET] == APP_PBX_DEVICE_IDENTIFIER)
|
||||
{
|
||||
u16 u16_DeviceId = 0;
|
||||
u8 u8_UnitId = 1;
|
||||
|
||||
ST_HAN_VOICE_CALL_REQ_PARAMS st_CallReqParams;
|
||||
|
||||
apppbx_ConvertDeviceIdFromStr((const u8 *) &calledID[APP_PBX_CALL_PARTICIPANT_DEVICE_OFFSET], &u16_DeviceId);
|
||||
|
||||
if(calledID[APP_PBX_UNIT_IDENTIFIER_OFFSET] == APP_PBX_UNIT_IDENTIFIER)
|
||||
{
|
||||
apppbx_ConvertUnitIdFromStr((const u8 *) &calledID[APP_PBX_CALL_PARTICIPANT_UNIT_OFFSET], &u8_UnitId);
|
||||
}
|
||||
|
||||
st_CallReqParams.u32_FieldMask = 0;
|
||||
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Calling device has specified the called party - device#%d, unit %d\n", u16_DeviceId, u8_UnitId);
|
||||
|
||||
// Mark call as waiting to be merged
|
||||
pst_Call->b_WaitingForMerge = TRUE;
|
||||
|
||||
// send FUN message to device requesting it to set up a call
|
||||
app_DsrHanVoiceCallReq(u16_DeviceId, u8_UnitId, &st_CallReqParams);
|
||||
}
|
||||
|
||||
else if (strlen(calledID) == APP_PBX_CALL_PPARTICIPANT_HS_LEN && calledID[APP_PBX_HS_IDENTIFIER_OFFSET] == APP_PBX_HS_IDENTIFIER)
|
||||
{
|
||||
u8 u8_HsNum = calledID[APP_PBX_CALL_PARTICIPANT_HS_NUM_OFFSET] - '0';
|
||||
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Calling device has specified the called party - HS %d\n", u8_HsNum);
|
||||
|
||||
appUleIntPbx_Call2HS(pst_Call, u8_HsNum);
|
||||
}
|
||||
|
||||
// valid called party was not specified by the calling party, later: handle HS number/ digits
|
||||
else
|
||||
{
|
||||
u16 u16_DeviceId = 0;
|
||||
u8 u8_UnitId = 1, u8_HsNum = 0;
|
||||
bool b_MatchFound;
|
||||
|
||||
st_apphan_VoiceCallRoutingTableRecord st_VoiceCallRoutingTableRecord;
|
||||
|
||||
if (callerHandset[APP_PBX_DEVICE_IDENTIFIER_OFFSET] == APP_PBX_DEVICE_IDENTIFIER)
|
||||
{
|
||||
apppbx_ConvertDeviceIdFromStr((const u8 *) &callerHandset[APP_PBX_CALL_PARTICIPANT_DEVICE_OFFSET], &u16_DeviceId);
|
||||
apppbx_ConvertUnitIdFromStr((const u8 *) &callerHandset[APP_PBX_CALL_PARTICIPANT_UNIT_OFFSET], &u8_UnitId);
|
||||
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Calling device #%d, unit%d\n", u16_DeviceId, u8_UnitId);
|
||||
|
||||
// look for a match for device in Voice Call Routing Table
|
||||
b_MatchFound = p_VoiceCallRoutingTable_FindMatchForDevice(u16_DeviceId, u8_UnitId, NULL, &st_VoiceCallRoutingTableRecord);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Convert HS number from char to decimal
|
||||
u8_HsNum = callerHandset[0] - '0';
|
||||
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Calling HS #%d\n", u8_HsNum);
|
||||
|
||||
// look for a match for HS in Voice Call Routing Table
|
||||
b_MatchFound = p_VoiceCallRoutingTable_FindMatchForHS(u8_HsNum, NULL, &st_VoiceCallRoutingTableRecord);
|
||||
}
|
||||
|
||||
// look for a match for this device/ HS in audio routing table
|
||||
if (b_MatchFound)
|
||||
{
|
||||
ST_HAN_VOICE_CALL_REQ_PARAMS st_CallReqParams;
|
||||
|
||||
st_CallReqParams.u32_FieldMask = 0;
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Found a match for Calling party number in Voice Call Routing Table\n");
|
||||
|
||||
// Mark call as waiting to be merged
|
||||
pst_Call->b_WaitingForMerge = TRUE;
|
||||
|
||||
if(st_VoiceCallRoutingTableRecord.u8_DstType == DEVICE_ENTITY)
|
||||
{
|
||||
u8 u8_Len = 0;
|
||||
pst_Call->st_CalledParty.u8_AddressLen = 0;
|
||||
|
||||
// send FUN "Make a Call" req to device
|
||||
app_DsrHanVoiceCallReq(st_VoiceCallRoutingTableRecord.u16_DstId, st_VoiceCallRoutingTableRecord.u8_DstUnitId, &st_CallReqParams);
|
||||
|
||||
// store device and unit id as Called Party Number
|
||||
pst_Call->st_CalledParty.pu8_Address[0] = APP_PBX_DEVICE_IDENTIFIER;
|
||||
pst_Call->st_CalledParty.u8_AddressLen++;
|
||||
|
||||
u8_Len = apppbx_ConvertDeviceIdToStr(st_VoiceCallRoutingTableRecord.u16_DstId, &pst_Call->st_CalledParty.pu8_Address[1]);
|
||||
pst_Call->st_CalledParty.u8_AddressLen += u8_Len;
|
||||
|
||||
pst_Call->st_CalledParty.pu8_Address[5] = APP_PBX_UNIT_IDENTIFIER;
|
||||
pst_Call->st_CalledParty.u8_AddressLen++;
|
||||
|
||||
u8_Len = apppbx_ConvertUnitIdToStr(st_VoiceCallRoutingTableRecord.u8_DstUnitId, &pst_Call->st_CalledParty.pu8_Address[6]);
|
||||
pst_Call->st_CalledParty.u8_AddressLen += u8_Len ;
|
||||
|
||||
}
|
||||
// Destination is HS
|
||||
else
|
||||
{
|
||||
appUleIntPbx_Call2HS(pst_Call, st_VoiceCallRoutingTableRecord.u16_DstId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Failed to find match for device in AudioRoutingTable for device#%d\n", u16_DeviceId != 0 ? u16_DeviceId : u8_HsNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
APP_ULE_INX_PBX_ERROR_PRINT("Could not find call in appcall DB: call_id = %d \n", cmbsCallID);
|
||||
|
||||
}
|
||||
|
||||
return EXTAPP_RC_OK;
|
||||
|
||||
}
|
||||
|
||||
EXTAPP_RC appUleIntPbx_OnCallAnswer(IN u32 cmbsCallID, IN EXTVOIP_CODEC codec)
|
||||
{
|
||||
PST_CALL_OBJ pst_Call = _appcall_CallObjGetById(cmbsCallID);
|
||||
u8 u8_EntryIndex = apppbx_FindPendingMergeEntry(cmbsCallID);
|
||||
if(u8_EntryIndex != MERGE_CALL_INVALID_RECORD_ID)
|
||||
{
|
||||
//call divert from device to handset
|
||||
if((cmbsCallID == g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1) &&
|
||||
(_appcall_CallObjMediaGet(pst_Call) == E_APPCMBS_MEDIA_PEND))
|
||||
{
|
||||
u32 u32_ChannelSlots;
|
||||
extvoip_GetChannelSlotsForCall(cmbsCallID,codec,&u32_ChannelSlots);
|
||||
appmedia_CallObjMediaStart(0,cmbsCallID,u32_ChannelSlots,NULL);
|
||||
}
|
||||
else if ((cmbsCallID == g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2) &&
|
||||
(_appcall_CallObjMediaGet(pst_Call) == E_APPCMBS_MEDIA_PEND))
|
||||
{
|
||||
//pst_Call = _appcall_CallObjGetById(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1);
|
||||
//appmedia_CallObjMediaStart(0,cmbsCallID,pst_Call->u32_ChannelParameter,NULL);
|
||||
}
|
||||
|
||||
if ( (g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1 != MERGE_CALL_INVALID_RECORD_ID) &&
|
||||
(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2 != MERGE_CALL_INVALID_RECORD_ID) &&
|
||||
(cmbsCallID == g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2))
|
||||
{
|
||||
|
||||
PST_CALL_OBJ pst_Call1 = _appcall_CallObjGetById(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1);
|
||||
PST_CALL_OBJ pst_Call2 = _appcall_CallObjGetById(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2);
|
||||
|
||||
// clear call pending
|
||||
pst_Call1->b_WaitingForMerge = FALSE;
|
||||
pst_Call2->b_WaitingForMerge = FALSE;
|
||||
|
||||
// stop media channel
|
||||
//appmedia_CallObjMediaStop(pst_Call1->u32_CallInstance, 0, NULL);
|
||||
//appmedia_CallObjMediaStop(pst_Call2->u32_CallInstance, 0, NULL);
|
||||
|
||||
appcall_MergeCalls(g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId1,
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].u32_CallId2,
|
||||
g_st_CallsPengingForMerge_DB[u8_EntryIndex].b_ConvertToInt);
|
||||
if(G_b_IntPbx_CallDivert)
|
||||
G_b_IntPbx_CallDivert = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //call divert from device to device
|
||||
if(G_b_IntPbx_CallDivert && (_appcall_CallObjMediaGet(pst_Call) == E_APPCMBS_MEDIA_PEND))
|
||||
{
|
||||
u32 u32_ChannelSlots;
|
||||
extvoip_GetChannelSlotsForCall(cmbsCallID,codec,&u32_ChannelSlots);
|
||||
appmedia_CallObjMediaStart(0,cmbsCallID,u32_ChannelSlots,NULL);
|
||||
}
|
||||
}
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appUleIntPbx_OnMergeCallResponse(IN u32 cmbsCallID)
|
||||
{
|
||||
bool b_Status = apppbx_FreePendingMergeEntry(cmbsCallID);
|
||||
|
||||
return b_Status ? EXTAPP_RC_OK : EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
|
||||
u32 appUleIntPbx_OnDivertCall(ST_DIVERT_CALL_INFO *pst_DivertCallInfo)
|
||||
{
|
||||
PST_CALL_OBJ pst_Call = NULL;
|
||||
ST_APPCALL_PROPERTIES st_Properties[7];
|
||||
char psz_Codecs[CMBS_AUDIO_CODEC_MAX * 2] = { 0 };
|
||||
if(pst_DivertCallInfo)
|
||||
{
|
||||
pst_Call = _appcall_CallObjGetById(pst_DivertCallInfo->cmbsCallID);
|
||||
if(!pst_Call)
|
||||
{
|
||||
printf("\n appUleIntPbx_OnDivertCall:Error\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appUleIntPbx_OnDivertCall:Error\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
//Establish half call to caller device/HS
|
||||
|
||||
|
||||
if(pst_DivertCallInfo->u8_NumOfCodecs)
|
||||
{
|
||||
u8 u8_Idx = 0;
|
||||
sprintf(psz_Codecs, "%d",pst_DivertCallInfo->pu8_CodecsList[u8_Idx++]);
|
||||
while(u8_Idx != pst_DivertCallInfo->u8_NumOfCodecs)
|
||||
{
|
||||
u8 u8_Len = strlen(psz_Codecs);
|
||||
char psz_Temp[5]={0,};
|
||||
sprintf(psz_Temp, ",%d",pst_DivertCallInfo->pu8_CodecsList[u8_Idx++]);
|
||||
strcat(&psz_Codecs[u8_Len],psz_Temp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// put codecs priority (WB, NB)
|
||||
sprintf(psz_Codecs, "%d,%d", (CMBS_AUDIO_CODEC_PCM_LINEAR_WB), (CMBS_AUDIO_CODEC_PCM_LINEAR_NB));
|
||||
}
|
||||
st_Properties[0].e_IE = CMBS_IE_CALLERPARTY;
|
||||
st_Properties[0].psz_Value = pst_DivertCallInfo->psz_CalledDigits;
|
||||
st_Properties[1].e_IE = CMBS_IE_CALLEDPARTY;
|
||||
st_Properties[1].psz_Value = pst_DivertCallInfo->psz_CallerID;
|
||||
//st_Properties[1].psz_Value = ALL_HS_STRING;
|
||||
st_Properties[2].e_IE = CMBS_IE_MEDIADESCRIPTOR;
|
||||
st_Properties[2].psz_Value = psz_Codecs;
|
||||
st_Properties[3].e_IE = CMBS_IE_CALLERNAME;
|
||||
st_Properties[3].psz_Value = pst_DivertCallInfo->psz_CalledID,
|
||||
st_Properties[4].e_IE = CMBS_IE_LINE_ID;
|
||||
st_Properties[4].psz_Value = "1\0";
|
||||
st_Properties[5].e_IE = CMBS_IE_MELODY;
|
||||
st_Properties[5].psz_Value = "1\0";
|
||||
st_Properties[6].e_IE = CMBS_IE_RECONNECT_CALL;
|
||||
st_Properties[6].psz_Value = "1\0";
|
||||
pst_DivertCallInfo->cmbsCallID = appcall_EstablishCall(st_Properties, 7);
|
||||
|
||||
|
||||
if(pst_DivertCallInfo->cmbsCallID == ~0)
|
||||
return ~0;
|
||||
|
||||
AppCallRouter_AddToAppCallMap(pst_DivertCallInfo->cmbsCallID,UleIntPbx_appID);
|
||||
pst_Call = _appcall_CallObjGetById(pst_DivertCallInfo->cmbsCallID);
|
||||
G_b_IntPbx_CallDivert = TRUE;
|
||||
|
||||
|
||||
// check whether the calling device has specified the called party
|
||||
if (strlen(pst_DivertCallInfo->psz_CalledDigits) == APP_PBX_CALL_PPARTICIPANT_DEVICE_LEN &&
|
||||
pst_DivertCallInfo->psz_CalledDigits[APP_PBX_DEVICE_IDENTIFIER_OFFSET] == APP_PBX_DEVICE_IDENTIFIER)
|
||||
{
|
||||
u16 u16_DeviceId = 0;
|
||||
u8 u8_UnitId = 1;
|
||||
|
||||
ST_HAN_VOICE_CALL_REQ_PARAMS st_CallReqParams;
|
||||
|
||||
apppbx_ConvertDeviceIdFromStr((const u8 *) &pst_DivertCallInfo->psz_CalledDigits[APP_PBX_CALL_PARTICIPANT_DEVICE_OFFSET], &u16_DeviceId);
|
||||
|
||||
if(pst_DivertCallInfo->psz_CalledDigits[APP_PBX_UNIT_IDENTIFIER_OFFSET] == APP_PBX_UNIT_IDENTIFIER)
|
||||
{
|
||||
apppbx_ConvertUnitIdFromStr((const u8 *) &pst_DivertCallInfo->psz_CalledDigits[APP_PBX_CALL_PARTICIPANT_UNIT_OFFSET], &u8_UnitId);
|
||||
}
|
||||
|
||||
// st_CallReqParams.u32_FieldMask = CMBS_HAN_OTHER_PARTY_ID_MASK;
|
||||
// st_CallReqParams.pu8_OtherPartyId[0] = strlen(pst_DivertCallInfo->psz_CallerID);
|
||||
// memcpy(&(st_CallReqParams.pu8_OtherPartyId[1]),pst_DivertCallInfo->psz_CallerID, st_CallReqParams.pu8_OtherPartyId[0]);
|
||||
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Calling device has specified the called party - device#%d, unit %d\n", u16_DeviceId, u8_UnitId);
|
||||
|
||||
// Mark call as waiting to be merged
|
||||
pst_Call->b_WaitingForMerge = TRUE;
|
||||
|
||||
// send FUN message to device requesting it to set up a call
|
||||
app_DsrHanVoiceCallReq(u16_DeviceId, u8_UnitId, &st_CallReqParams);
|
||||
}
|
||||
|
||||
else if (strlen(pst_DivertCallInfo->psz_CalledDigits) == APP_PBX_CALL_PPARTICIPANT_HS_LEN && pst_DivertCallInfo->psz_CalledDigits[APP_PBX_HS_IDENTIFIER_OFFSET] == APP_PBX_HS_IDENTIFIER)
|
||||
{
|
||||
u8 u8_HsNum = pst_DivertCallInfo->psz_CalledDigits[APP_PBX_CALL_PARTICIPANT_HS_NUM_OFFSET] - '0';
|
||||
|
||||
APP_ULE_INX_PBX_INFO_PRINT("Calling device has specified the called party - HS %d\n", u8_HsNum);
|
||||
|
||||
appUleIntPbx_Call2HS(pst_Call, u8_HsNum);
|
||||
}
|
||||
|
||||
appSmartVoice_AddToCallChannelMap(pst_Call->u32_ChannelID,pst_DivertCallInfo->cmbsCallID);
|
||||
return pst_DivertCallInfo->cmbsCallID;
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appUleIntPbx_SendDigits(IN u32 u32_cmbsCallID, IN char* psz_Digits)
|
||||
{
|
||||
PST_CALL_OBJ pst_Call = _appcall_CallObjGetById(u32_cmbsCallID);
|
||||
|
||||
if(!pst_Call)
|
||||
{
|
||||
printf("\n appUleIntPbx_OnDivertCall:Error\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
if(strcmp(psz_Digits,"@") == 0)
|
||||
{
|
||||
AppCallRouter_DivertOutgoingCall(u32_cmbsCallID,NULL,psz_Digits);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("appUleIntPbx_SendDigits: Cannot handle digits ");
|
||||
}
|
||||
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
22
dectmngr/src/app/appcmbs/appUleIntPbx.h
Normal file
22
dectmngr/src/app/appcmbs/appUleIntPbx.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/*!
|
||||
* \file appUleIntPbx.c.h
|
||||
* \brief
|
||||
* \Author DSPG
|
||||
*
|
||||
* @(#) %filespec: appUleIntPbx.h
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
#if !defined( APPULEINTPBX_H )
|
||||
#define APPULEINTPBX_H
|
||||
|
||||
|
||||
#include "appCallRouter.h"
|
||||
|
||||
|
||||
// register callbacks
|
||||
EXTAPP_RC LoadUleIntPbx();
|
||||
|
||||
|
||||
#endif // APPULEINTPBX_H
|
||||
541
dectmngr/src/app/appcmbs/appVoipService.c
Normal file
541
dectmngr/src/app/appcmbs/appVoipService.c
Normal file
@@ -0,0 +1,541 @@
|
||||
/*!
|
||||
* \file appVoipService.c
|
||||
* \brief handle ULE internal PBX
|
||||
* \Author moria
|
||||
*
|
||||
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cmbs_api.h"
|
||||
#include "appcall.h"
|
||||
#include "appCallRouter.h"
|
||||
#include "tcx_hostlog.h"
|
||||
#include "cmbs_voipline.h"
|
||||
#include "appCallRouter.h"
|
||||
#include "appVoipService.h"
|
||||
#include "appAvsService.h"
|
||||
#include "dect_common.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define APPVOIP_MAX_NUM_CALLS 10
|
||||
#define APPVOIP_NO_CALL APPVOIP_MAX_NUM_CALLS
|
||||
#define APPVOIP_NO_FREE_SLOTS 0xFFFFFFFF
|
||||
|
||||
u32 appVoipSrv_appID = 0; /* Holds appID of the current app*/
|
||||
|
||||
ST_VOIP_CALL_DATA G_st_VOIP_CallData[APPVOIP_MAX_NUM_CALLS];
|
||||
|
||||
|
||||
u32 G_u32_SlotsMask;
|
||||
|
||||
u32 G_u32_CallIdSlotMap[APPVOIP_MAX_NUM_CALLS];
|
||||
bool G_b_UseSameSlotsForDivertedCall = FALSE;
|
||||
|
||||
|
||||
//Forward declarations for CB functions
|
||||
EXTAPP_RC appVoipService_OnCallEstablish(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength);
|
||||
EXTAPP_RC appVoipService_OnCallAnswer(IN u32 cmbsCallID, IN EXTVOIP_CODEC codec);
|
||||
|
||||
EXTAPP_RC appVoipService_OnCallRelease(IN u32 cmbsCallID, IN EXTVOIP_RELEASE_REASON ReleaseReason);
|
||||
EXTAPP_RC appVoipService_OnCallReleaseDone(IN u32 cmbsCallID);
|
||||
|
||||
u32 appVoipService_OnDivertCall(ST_DIVERT_CALL_INFO *pst_DivertCallInfo);
|
||||
void appVoipService_GetSlotsForCall(IN u32 u32_cmbsCallID,IN EXTVOIP_CODEC e_Codec, OUT u32 *pu32_ChannelSlots);
|
||||
void appVoipService_FreeSlotsForCall(IN u32 u32_cmbsCallID,IN u32 *pu32_ChannelSlots);
|
||||
void appVoipService_UpdateCallState(IN u32 u32_cmbsCallID, IN EXTVOIP_CALL_STATE e_CallState);
|
||||
EXTAPP_RC appVoipService_SetAudioChannel (IN u32 u32_cmbsCallID, IN u32 mediaChannelID, IN EXTVOIP_CODEC e_Codec);
|
||||
EXTAPP_RC appVoipService_SendDigits(IN u32 u32_cmbsCallID, IN char* psz_Digits);
|
||||
|
||||
|
||||
|
||||
EXTAPP_RC LoadVoipService (void)
|
||||
{
|
||||
ST_APP_FNC_TABLE st_AppTable;
|
||||
EXTAPP_RC res;
|
||||
u8 u8_Idx;
|
||||
|
||||
memset(&st_AppTable,0x00,sizeof(ST_APP_FNC_TABLE));
|
||||
|
||||
st_AppTable.fncSetupCall = appVoipService_OnCallEstablish;
|
||||
st_AppTable.fncAnswerCall = appVoipService_OnCallAnswer;
|
||||
st_AppTable.fncDivertOutgoingCall = appVoipService_OnDivertCall;
|
||||
st_AppTable.fncUpdateCallState = appVoipService_UpdateCallState;
|
||||
st_AppTable.fncDisconnectCall = appVoipService_OnCallRelease;
|
||||
st_AppTable.fncDisconnectCallDone = appVoipService_OnCallReleaseDone;
|
||||
st_AppTable.fncSetAudioChannel = appVoipService_SetAudioChannel;
|
||||
st_AppTable.fncSendDigits = appVoipService_SendDigits;
|
||||
st_AppTable.LineName[0] = 0;
|
||||
|
||||
|
||||
for (u8_Idx = 0; u8_Idx < APPVOIP_MAX_NUM_CALLS; u8_Idx++)
|
||||
{
|
||||
G_st_VOIP_CallData[u8_Idx].e_Call = E_APPCMBS_CALL_CLOSE;
|
||||
G_st_VOIP_CallData[u8_Idx].u32_ChannelParameter = G_u32_CallIdSlotMap[u8_Idx] = APPVOIP_NO_FREE_SLOTS;
|
||||
}
|
||||
|
||||
res = AppCallRouter_AppInit(appVoipSrv_appID, &st_AppTable);
|
||||
extvoip_RegisterSlotConfigCb(appVoipService_GetSlotsForCall, appVoipService_FreeSlotsForCall);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
u8 appVoipService_AssignNewCallId(void)
|
||||
{
|
||||
u8 u8_Idx;
|
||||
|
||||
for (u8_Idx = 0; u8_Idx < APPVOIP_MAX_NUM_CALLS; u8_Idx++)
|
||||
{
|
||||
if(G_st_VOIP_CallData[u8_Idx].e_Call == E_APPCMBS_CALL_CLOSE)
|
||||
break;
|
||||
}
|
||||
return u8_Idx;
|
||||
}
|
||||
|
||||
u8 appVoipService_GetCallId(IN u32 cmbsCallID)
|
||||
{
|
||||
u8 u8_Idx;
|
||||
|
||||
for (u8_Idx = 0; u8_Idx < APPVOIP_MAX_NUM_CALLS; u8_Idx++)
|
||||
{
|
||||
if(G_st_VOIP_CallData[u8_Idx].u32_CmbsCallId == cmbsCallID && G_st_VOIP_CallData[u8_Idx].e_Call != E_APPCMBS_CALL_CLOSE)
|
||||
break;
|
||||
}
|
||||
return u8_Idx;
|
||||
|
||||
}
|
||||
|
||||
void appVoipService_UpdateCallState(IN u32 u32_cmbsCallID, IN EXTVOIP_CALL_STATE e_CallState)
|
||||
{
|
||||
u8 u8_CallId = appVoipService_GetCallId(u32_cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_UpdateCallState: Invalid call id \n");
|
||||
}
|
||||
else
|
||||
{
|
||||
G_st_VOIP_CallData[u8_CallId].e_Call = e_CallState;
|
||||
printf("\n appVoipService_UpdateCallState: %d\n", e_CallState);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
EXTAPP_RC appVoipService_OnCallAnswer(IN u32 u32_cmbsCallID, IN EXTVOIP_CODEC codec)
|
||||
{
|
||||
u32 u32_ChannelSlots;
|
||||
u8 u8_CallId = appVoipService_GetCallId(u32_cmbsCallID);
|
||||
|
||||
if(u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\nappVoipService_OnCallAnswer: Invalid call Id\n");
|
||||
return EXTVOIP_RC_FAIL;
|
||||
}
|
||||
|
||||
if (G_b_UseSameSlotsForDivertedCall)
|
||||
{
|
||||
u32_ChannelSlots = G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter;
|
||||
}
|
||||
else
|
||||
{
|
||||
appVoipService_GetSlotsForCall(u32_cmbsCallID,codec,&u32_ChannelSlots);
|
||||
G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter = u32_ChannelSlots;
|
||||
}
|
||||
|
||||
if(u32_ChannelSlots != APPVOIP_NO_FREE_SLOTS)
|
||||
{
|
||||
if(appmedia_CallObjMediaStart(0,u32_cmbsCallID,u32_ChannelSlots,NULL))
|
||||
G_st_VOIP_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_ACTIVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appVoipService_OnCallAnswer: No free slots for call %d \n", u8_CallId);
|
||||
}
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
u32 appVoipService_OnDivertCall(ST_DIVERT_CALL_INFO *pst_DivertCallInfo)
|
||||
{
|
||||
u32 u32_ActiveCmbsCallId;
|
||||
ST_EXTVOIPCALLINFO st_CallInfo = {0,};
|
||||
PST_CALL_OBJ pst_Call;
|
||||
EXTVOIP_CODEC p_CodecList[] = {EXTVOIP_CODEC_PCM_LINEAR_WB, EXTVOIP_CODEC_PCM_LINEAR_NB};
|
||||
|
||||
if(!pst_DivertCallInfo)
|
||||
{
|
||||
printf("\n appVoipService_OnDivertCall: Error \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
u32_ActiveCmbsCallId = pst_DivertCallInfo->cmbsCallID;
|
||||
|
||||
// get call object
|
||||
pst_Call = _appcall_CallObjGetById(u32_ActiveCmbsCallId);
|
||||
if ( !pst_Call )
|
||||
{
|
||||
printf("appVoipService_OnDivertCall : NO SUCH CALL WITH ID %d\n", u32_ActiveCmbsCallId);
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
if(pst_DivertCallInfo->u8_NumOfCodecs)
|
||||
{
|
||||
st_CallInfo.p_codecList = pst_DivertCallInfo->pu8_CodecsList;
|
||||
st_CallInfo.codecListLen = pst_DivertCallInfo->u8_NumOfCodecs;
|
||||
}
|
||||
else
|
||||
{
|
||||
st_CallInfo.codecListLen = 2;
|
||||
st_CallInfo.p_codecList = p_CodecList;
|
||||
}
|
||||
|
||||
st_CallInfo.psz_CallerParty = pst_DivertCallInfo->psz_CalledDigits;
|
||||
st_CallInfo.psz_CalledParty = pst_DivertCallInfo->psz_CallerID;
|
||||
st_CallInfo.psz_CallerName = pst_DivertCallInfo->psz_CalledID;
|
||||
st_CallInfo.LineId = 1;
|
||||
st_CallInfo.Melody = 1;
|
||||
|
||||
|
||||
pst_DivertCallInfo->cmbsCallID = extvoip_MakeIncomingCall(appVoipSrv_appID,&st_CallInfo,1);
|
||||
|
||||
if(_appcall_CallObjGetById(pst_DivertCallInfo->cmbsCallID))
|
||||
{
|
||||
u8 u8_CallId = appVoipService_AssignNewCallId();
|
||||
if(u8_CallId != APPVOIP_NO_CALL)
|
||||
{
|
||||
G_st_VOIP_CallData[u8_CallId].u32_CmbsCallId = pst_DivertCallInfo->cmbsCallID;
|
||||
G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter = pst_DivertCallInfo->u32_ChannelParameter;
|
||||
G_st_VOIP_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_PEND;
|
||||
G_st_VOIP_CallData[u8_CallId].e_Call= E_APPCMBS_CALL_OUT_PROC;
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nappVoipService_OnDivertCall: unable to assign new voip callId\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nappVoipService_OnDivertCall: unable to divert call\n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
appSmartVoice_AddToCallChannelMap(pst_DivertCallInfo->u32_ChannelID,u32_ActiveCmbsCallId);
|
||||
return pst_DivertCallInfo->cmbsCallID;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appVoipService_OnCallEstablish(IN u32 cmbsCallID, IN const char* calledID, IN const char* callerHandset, IN u32 lineID, IN EXTVOIP_CODEC* codecList, IN u32 codecListLength)
|
||||
{
|
||||
|
||||
PST_VOIP_CALL_DATA pst_CallData;
|
||||
ST_APPCALL_PROPERTIES st_Properties;
|
||||
|
||||
u8 u8_CallId = appVoipService_AssignNewCallId();
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_OnCallEstablish: Error \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
pst_CallData = &G_st_VOIP_CallData[u8_CallId];
|
||||
|
||||
pst_CallData->u32_CmbsCallId = cmbsCallID;
|
||||
|
||||
|
||||
printf("\n<<<<<< appVoipService_OnCallEstablish >>>>>>>\n");
|
||||
|
||||
if(!codecListLength)
|
||||
pst_CallData->e_Codec = EXTVOIP_CODEC_PCM_LINEAR_WB;
|
||||
else
|
||||
pst_CallData->e_Codec = codecList[0];
|
||||
|
||||
appVoipService_GetSlotsForCall(cmbsCallID, pst_CallData->e_Codec, &(pst_CallData->u32_ChannelParameter));
|
||||
pst_CallData->e_Media = E_APPCMBS_MEDIA_PEND;
|
||||
|
||||
|
||||
st_Properties.e_IE = CMBS_IE_CALLPROGRESS;
|
||||
st_Properties.psz_Value = "CMBS_CALL_PROGR_SETUP_ACK\0";
|
||||
appcall_ProgressCall(&st_Properties, 1, (u16)cmbsCallID, NULL);
|
||||
|
||||
if(lineID == APPCALL_NO_LINE) //no line id
|
||||
{
|
||||
static char s_reason[5] = { 0 };
|
||||
sprintf(s_reason, "%d", CMBS_REL_REASON_USER_BUSY);
|
||||
// disconnecting call
|
||||
st_Properties.e_IE = CMBS_IE_CALLRELEASE_REASON;
|
||||
st_Properties.psz_Value = s_reason;
|
||||
appcall_ReleaseCall(&st_Properties, 1, (u16)cmbsCallID, NULL);
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
|
||||
st_Properties.e_IE = CMBS_IE_CALLPROGRESS;
|
||||
st_Properties.psz_Value = "CMBS_CALL_PROGR_PROCEEDING\0";
|
||||
appcall_ProgressCall(&st_Properties, 1, (u16)cmbsCallID, NULL);
|
||||
pst_CallData->e_Call = E_APPCMBS_CALL_OUT_PROC;
|
||||
return EXTAPP_RC_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appVoipService_OnCallRelease(IN u32 cmbsCallID, IN EXTVOIP_RELEASE_REASON ReleaseReason)
|
||||
{
|
||||
printf("\nappVoipService_OnCallRelease\n");
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EXTAPP_RC appVoipService_OnCallReleaseDone(IN u32 cmbsCallID)
|
||||
{
|
||||
printf("\appVoipService_OnCallReleaseDone\n");
|
||||
|
||||
u8 u8_CallId = appVoipService_GetCallId(cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_OnCallReleaseDone: Call already released \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
appVoipService_FreeSlotsForCall(cmbsCallID,&(G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter));
|
||||
G_st_VOIP_CallData[u8_CallId].e_Call = E_APPCMBS_CALL_CLOSE;
|
||||
G_st_VOIP_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_CLOSE;
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void appVoipService_OnMediaChange(u32 u32_CallID, EXTVOIP_CODEC e_Codec)
|
||||
{
|
||||
u8 u8_CallId = appVoipService_GetCallId(u32_CallID);
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_OnMediaChange: Invalid call ID \n");
|
||||
return;
|
||||
}
|
||||
|
||||
// answer current call
|
||||
extvoip_OnAnswerCall(u32_CallID, e_Codec);
|
||||
|
||||
|
||||
if( G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter != 0xFF)
|
||||
{
|
||||
|
||||
G_u32_CallIdSlotMap[u32_CallID] = G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter;
|
||||
|
||||
appmedia_CallObjMediaStart(0,u32_CallID,G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter,NULL);
|
||||
printf("\nappVoipService_OnMediaChange: Success\n");
|
||||
}
|
||||
|
||||
else
|
||||
printf("\n nappVoipService_OnMediaChange: ERROR \n ");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void appVoipService_GetSlotsForCall(IN u32 u32_cmbsCallID,IN EXTVOIP_CODEC e_Codec, OUT u32 *pu32_ChannelSlots)
|
||||
{
|
||||
u32 u32_Slots;
|
||||
u8 u8_SlotMaxOffset = 0, u8_Idx;
|
||||
|
||||
switch (e_Codec)
|
||||
{
|
||||
case EXTVOIP_CODEC_PCMU:
|
||||
case EXTVOIP_CODEC_PCMA:
|
||||
case EXTVOIP_CODEC_PCM8:
|
||||
u32_Slots = 0x01;
|
||||
u8_SlotMaxOffset = 31;
|
||||
break;
|
||||
|
||||
case EXTVOIP_CODEC_PCMU_WB:
|
||||
case EXTVOIP_CODEC_PCMA_WB:
|
||||
case EXTVOIP_CODEC_PCM_LINEAR_NB:
|
||||
u32_Slots = 0x03;
|
||||
u8_SlotMaxOffset = 30;
|
||||
break;
|
||||
|
||||
case EXTVOIP_CODEC_PCM_LINEAR_WB:
|
||||
u32_Slots = 0x0F;
|
||||
u8_SlotMaxOffset = 28;
|
||||
break;
|
||||
|
||||
default:
|
||||
DECT_DBG("appVoipService_GetSlotsForCall - Unsupported codec!\n");
|
||||
*pu32_ChannelSlots = APPVOIP_NO_FREE_SLOTS;
|
||||
DECT_DBG("\n\nNo free slots - aborting media start\n\n");
|
||||
}
|
||||
|
||||
if (u8_SlotMaxOffset > 0)
|
||||
{
|
||||
for (u8_Idx = 0; u8_Idx <= u8_SlotMaxOffset; ++u8_Idx)
|
||||
{
|
||||
if ( ((u32_Slots << u8_Idx) & G_u32_SlotsMask) == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( u8_Idx <= u8_SlotMaxOffset )
|
||||
{
|
||||
/* available slots exist */
|
||||
//st_MediaChannel.u32_ChannelParameter = u32_Slots << u8_Idx;
|
||||
*pu32_ChannelSlots = u32_Slots << u8_Idx;
|
||||
G_u32_SlotsMask |= *pu32_ChannelSlots;
|
||||
}
|
||||
}
|
||||
|
||||
G_u32_CallIdSlotMap[u32_cmbsCallID] = *pu32_ChannelSlots;
|
||||
}
|
||||
|
||||
void appVoipService_FreeSlotsForCall(IN u32 u32_cmbsCallID,IN u32 *pu32_ChannelSlots)
|
||||
{
|
||||
G_u32_CallIdSlotMap[u32_cmbsCallID] = APPVOIP_NO_FREE_SLOTS;
|
||||
|
||||
G_u32_SlotsMask &= (u32)(~(*pu32_ChannelSlots));
|
||||
return;
|
||||
}
|
||||
|
||||
EXTAPP_RC appVoipService_SetAudioChannel (IN u32 cmbsCallID, IN u32 mediaChannelID, IN EXTVOIP_CODEC e_Codec)
|
||||
{
|
||||
u8 u8_CallId = appVoipService_GetCallId(cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_SetAudioChannel: Error \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
G_st_VOIP_CallData[u8_CallId].u32_ChannelID = mediaChannelID;
|
||||
G_st_VOIP_CallData[u8_CallId].e_Codec = e_Codec;
|
||||
|
||||
|
||||
#if 0
|
||||
// answer current call
|
||||
extvoip_OnAnswerCall(cmbsCallID, e_Codec);
|
||||
#endif
|
||||
|
||||
if (extvoip_CallMediaStart(cmbsCallID, G_st_VOIP_CallData[u8_CallId].u32_ChannelParameter))
|
||||
{
|
||||
G_st_VOIP_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_ACTIVE;
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n appVoipService_SetAudioChannel: ERROR \n ");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
EXTAPP_RC appVoipService_SendDigits(IN u32 u32_cmbsCallID, IN char* psz_Digits)
|
||||
{
|
||||
u8 u8_CallId = appVoipService_GetCallId(u32_cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_SendDigits: Invalid call Id \n");
|
||||
return EXTAPP_RC_FAIL;
|
||||
}
|
||||
|
||||
if(strcmp(psz_Digits,"@") == 0)
|
||||
{
|
||||
AppCallRouter_DivertOutgoingCall(u32_cmbsCallID,NULL,psz_Digits);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
ST_APPCALL_PROPERTIES st_Properties;
|
||||
printf("send digits to network");
|
||||
st_Properties.e_IE = CMBS_IE_CALLPROGRESS;
|
||||
st_Properties.psz_Value = "CMBS_CALL_PROGR_RINGING\0";
|
||||
appcall_ProgressCall(&st_Properties, 1, (u16)u32_cmbsCallID, NULL);
|
||||
}
|
||||
|
||||
return EXTAPP_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
void appVoipService_EstablishIncomingCall(void)
|
||||
{
|
||||
u32 u32_cmbsCallID;
|
||||
|
||||
EXTVOIP_CODEC codecList[2] = { EXTVOIP_CODEC_PCM_LINEAR_WB,EXTVOIP_CODEC_PCM_LINEAR_NB };
|
||||
char psz_CallerName[] = "Inc Test Call";
|
||||
char psz_CallerParty[] = "124571";
|
||||
char psz_CalledParty[] = "h123456789A";
|
||||
|
||||
ST_EXTVOIPCALLINFO st_CallInfo = {psz_CallerName,psz_CallerParty,psz_CalledParty,0,codecList,2};
|
||||
u32_cmbsCallID = extvoip_MakeIncomingCall(appVoipSrv_appID,&st_CallInfo,0);
|
||||
|
||||
if(_appcall_CallObjGetById(u32_cmbsCallID))
|
||||
{
|
||||
u8 u8_CallId = appVoipService_AssignNewCallId();
|
||||
if(u8_CallId != APPVOIP_NO_CALL)
|
||||
{
|
||||
G_st_VOIP_CallData[u8_CallId].u32_CmbsCallId = u32_cmbsCallID;
|
||||
G_st_VOIP_CallData[u8_CallId].e_Call = E_APPCMBS_CALL_INC_PEND;
|
||||
G_st_VOIP_CallData[u8_CallId].e_Media = E_APPCMBS_MEDIA_PEND;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\appVoipService_EstablishIncomingCall: unable to assign new voip callId\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void appVoipService_AnswerCall(u32 u32_cmbsCallID)
|
||||
{
|
||||
u8 u8_CallId = appVoipService_GetCallId(u32_cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_AnswerCall: Error \n");
|
||||
return ;
|
||||
}
|
||||
|
||||
extvoip_OnAnswerCall(u32_cmbsCallID, G_st_VOIP_CallData[u8_CallId].e_Codec);
|
||||
}
|
||||
|
||||
void appVoipService_ReleaseCall(u32 u32_cmbsCallID)
|
||||
{
|
||||
u8 u8_CallId = appVoipService_GetCallId(u32_cmbsCallID);
|
||||
|
||||
if (u8_CallId == APPVOIP_NO_CALL)
|
||||
{
|
||||
printf("\n appVoipService_AnswerCall: Error \n");
|
||||
return;
|
||||
}
|
||||
|
||||
extvoip_OnDisconnectCall(u32_cmbsCallID,EXTVOIP_REASON_NORMAL);
|
||||
}
|
||||
|
||||
27
dectmngr/src/app/appcmbs/appVoipService.h
Normal file
27
dectmngr/src/app/appcmbs/appVoipService.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*!
|
||||
* \file appVoipService.h
|
||||
* \brief
|
||||
* \Author DSPG
|
||||
*
|
||||
* @(#) %filespec: appVoipService.h
|
||||
*
|
||||
*******************************************************************************/
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_CmbsCallId; /*!< Call Instance to identify the call on CMBS */
|
||||
u32 u32_ChannelID; /*!< Channel ID to identify the media connection on CMBS */
|
||||
u32 u32_ChannelParameter; /*!< Channel Parameter provides information about the parameter settings, e.g. IOM - used slots */
|
||||
EXTVOIP_CODEC e_Codec; /*!< used codec */
|
||||
u8 pu8_CodecsList[EXTVOIP_CODEC_MAX]; /*!< Codecs list */
|
||||
u8 u8_CodecsLength; /*!< Codecs list length */
|
||||
E_APPCMBS_CALL e_Call; /*!< call state */
|
||||
E_APPCMBS_MEDIA e_Media; /*!< media entity state */
|
||||
bool b_Incoming; /*!< TRUE for incoming calls, FALSE o/w */
|
||||
} ST_VOIP_CALL_DATA, * PST_VOIP_CALL_DATA;
|
||||
|
||||
// register callbacks
|
||||
EXTAPP_RC LoadVoipService(void);
|
||||
void appVoipService_EstablishIncomingCall(void);
|
||||
void appVoipService_AnswerCall(u32 u32_cmbsCallID);
|
||||
void appVoipService_ReleaseCall(u32 u32_cmbsCallID);
|
||||
|
||||
6853
dectmngr/src/app/appcmbs/appcall.c
Normal file
6853
dectmngr/src/app/appcmbs/appcall.c
Normal file
File diff suppressed because it is too large
Load Diff
302
dectmngr/src/app/appcmbs/appcall.h
Normal file
302
dectmngr/src/app/appcmbs/appcall.h
Normal file
@@ -0,0 +1,302 @@
|
||||
/*!
|
||||
* \file appcall.h
|
||||
* \brief
|
||||
* \Author DSPG
|
||||
*
|
||||
* @(#) %filespec: appcall.h~NBGD53#18 %
|
||||
*
|
||||
*******************************************************************************
|
||||
* \par History
|
||||
* \n==== History ============================================================
|
||||
* date name version action
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* 12-Jun-2013 tcmc_asa brought verison 18 (2.99.9) to 3.x branch
|
||||
* 28-Jan-2013 tcmc_asa 18 Added appcall_CallInbandInfoCNIP(), PR 3615
|
||||
* 24-Jan-2013 tcmc_asa 17 Added E_APPCALL_SWITCH_RECEIVED_CODEC
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined( APPCALL_H )
|
||||
#define APPCALL_H
|
||||
|
||||
#include "cmbs_api.h"
|
||||
#include "cfr_ie.h"
|
||||
|
||||
#ifdef PNCAP
|
||||
#include "pncap_def.h"
|
||||
#endif
|
||||
|
||||
typedef enum
|
||||
{
|
||||
E_APPCALL_AUTOMAT_MODE_OFF, /*!< call object automat mode off */
|
||||
E_APPCALL_AUTOMAT_MODE_ON /*!< call object automat mode on, incoming and outgoing calls shall be handled in simple statemachine */
|
||||
}E_APPCALL_AUTOMAT_MODE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
E_APPCALL_PREFERRED_CODEC_RECEIVED_CODEC,
|
||||
E_APPCALL_PREFERRED_CODEC_WB, /*! G722 */
|
||||
E_APPCALL_PREFERRED_CODEC_NB, /*! G726 */
|
||||
E_APPCALL_SWITCH_RECEIVED_CODEC /* WB->NB or NB->WB */
|
||||
}E_APPCALL_PREFERRED_CODEC;
|
||||
|
||||
/*! \brief exchange structure between CMBS API layer and upper application */
|
||||
typedef struct
|
||||
{
|
||||
E_CMBS_IE_TYPE e_IE; /*! IE type */
|
||||
char * psz_Value; /*! string value in case of upper -> CMBS API layer */
|
||||
}ST_APPCALL_PROPERTIES, * PST_APPCALL_PROPERTIES;
|
||||
|
||||
/*! \brief CMBS API layer call states */
|
||||
typedef enum
|
||||
{
|
||||
E_APPCMBS_CALL_CLOSE, /*!< line is closed */
|
||||
|
||||
E_APPCMBS_CALL_INC_PEND, /*!< CMBS target is informed of an incoming call*/
|
||||
E_APPCMBS_CALL_INC_RING, /*!< CMBS target let the handset ringing */
|
||||
|
||||
E_APPCMBS_CALL_OUT_PEND, /*!< CMBS-API layer received a outgoing call establishment event */
|
||||
E_APPCMBS_CALL_OUT_PEND_DIAL, /*!< Digits will be collected in CLD array, if Dialtone was switched on.
|
||||
it is automatically switched off, if call enters this state */
|
||||
E_APPCMBS_CALL_OUT_INBAND, /*!< The outgoing call is set-up to carry inband signalling, e.g. network tones */
|
||||
E_APPCMBS_CALL_OUT_PROC, /*!< The outgoing call is proceeding state */
|
||||
E_APPCMBS_CALL_OUT_RING, /*!< The outgoing call is in ringing state, if not the inband tone is available */
|
||||
|
||||
E_APPCMBS_CALL_ACTIVE, /*!< The call is in active mode, media shall be transmitted after channel start */
|
||||
E_APPCMBS_CALL_RELEASE, /*!< The call is in release mode */
|
||||
E_APPCMBS_CALL_ON_HOLD, /*!< The call is on hold */
|
||||
E_APPCMBS_CALL_CONFERENCE, /*!< The call is in conference mode */
|
||||
E_APPCMBS_CALL_SCREENING, /*!< The call is in screening mode */
|
||||
}E_APPCMBS_CALL;
|
||||
|
||||
/*! \brief CBS API layer media state */
|
||||
typedef enum
|
||||
{
|
||||
E_APPCMBS_MEDIA_CLOSE, /*!< Media entity is closed */
|
||||
E_APPCMBS_MEDIA_PEND, /*!< Media entity is prepared, codec negotiated and channel ID from Target available */
|
||||
E_APPCMBS_MEDIA_ACTIVE /*!< Media entity is started to stream */
|
||||
} E_APPCMBS_MEDIA;
|
||||
|
||||
/*! \brief Line node, it contains every important information of the line */
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_foo; /*!< foo */ //TODO
|
||||
} ST_LINE_OBJ, * PST_LINE_OBJ;
|
||||
|
||||
|
||||
#define APPCALL_INVALID_HS_NUM 0xFF
|
||||
|
||||
#define MAX_NUM_OF_PARTICIPANTS_IN_CONFERENCE 10
|
||||
#define CALL_PARTICIPANT_ID_MAX_LEN 30
|
||||
|
||||
/*! \brief Call node, it contains every important information of the connection */
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_CallInstance; /*!< Call Instance to identify the call on CMBS */
|
||||
u8 u8_LineId; /*!< Line ID*/
|
||||
u8 u8_LineSubType; /*!< Line Sub Type*/
|
||||
ST_IE_CALLERPARTY st_CallerParty; /*!< Caller Party, incoming call CLI, outgoing call Handset number */
|
||||
ST_IE_CALLEDPARTY st_CalledParty; /*!< Called Party, incoming call ringing mask, outgoing call to be dialed number */
|
||||
ST_IE_CALLERPARTY st_TmpParty; /*!< further feature, temp party, e.g. call waiting active and the CMBS API layer has to restore connection*/
|
||||
char ch_TmpParty[CALL_PARTICIPANT_ID_MAX_LEN]; /*!< buffer of temp party number */
|
||||
char ch_CallerID[CALL_PARTICIPANT_ID_MAX_LEN]; /*!< buffer of caller party number */
|
||||
char ch_CalledID[CALL_PARTICIPANT_ID_MAX_LEN]; /*!< buffer of called party number */
|
||||
u32 u32_ChannelID; /*!< Channel ID to identify the media connection on CMBS */
|
||||
u32 u32_ChannelParameter; /*!< Channel Parameter provides information about the parameter settings, e.g. IOM - used slots */
|
||||
E_CMBS_AUDIO_CODEC e_Codec; /*!< used codec */
|
||||
u8 pu8_CodecsList[CMBS_AUDIO_CODEC_MAX]; /*!< Codecs list */
|
||||
u8 u8_CodecsLength; /*!< Codecs list length */
|
||||
E_APPCMBS_CALL e_Call; /*!< call state */
|
||||
E_APPCMBS_MEDIA e_Media; /*!< media entity state */
|
||||
bool b_Incoming; /*!< TRUE for incoming calls, FALSE o/w */
|
||||
bool b_CodecsOfferedToTarget; /*!< TRUE when codecs have been sent to target (relevant for outgoing calls only) */
|
||||
bool b_IsSplashRing; /*!< TRUE when this call is for Splash Ring only */
|
||||
bool b_WaitingForMerge; /*!< TRUE if call is waiting to be merged, FALSE o/w */
|
||||
u8 pu8_ListOfParticipants[MAX_NUM_OF_PARTICIPANTS_IN_CONFERENCE][CALL_PARTICIPANT_ID_MAX_LEN]; /*!< stores participant ids for all participants of the call */
|
||||
u8 u8_NumOfParticipants; /*!< stores number of participants in the call */
|
||||
} ST_CALL_OBJ, * PST_CALL_OBJ;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 u8_CallReleaseInProgress;
|
||||
u32 u32_CallInstance;
|
||||
ST_IE_RELEASE_REASON st_Reason;
|
||||
bool b_SendReleaseRequest;
|
||||
}ST_CALL_RELEASE;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 u32_CallInstance_1;
|
||||
u32 u32_CallInstance_2;
|
||||
}ST_CMBS_APP_CONF_CALL_ENTRY, *PST_CMBS_APP_CONF_CALL_ENTRY;
|
||||
|
||||
#ifdef PNCAP
|
||||
typedef enum {
|
||||
DateTimeSync,
|
||||
MWISend,
|
||||
MissedCallNotification,
|
||||
NameNumber
|
||||
}ePnCapAttribute;
|
||||
|
||||
typedef struct {
|
||||
u8 IntName[26];
|
||||
int u8_IntNum;
|
||||
int u8_Coding;
|
||||
}pncap_name_and_number;
|
||||
|
||||
typedef union {
|
||||
/** all values should be in BCD format */
|
||||
struct pncap_date_and_time PnCapDateTime;
|
||||
pncap_name_and_number PnCapNameNum;
|
||||
u8 u8_MessagesWaiting;
|
||||
}UnionPnCapFacility;
|
||||
|
||||
typedef enum{
|
||||
PNCAP_RESERVE_FACILITY=1
|
||||
}ePnCapReserved;
|
||||
#endif
|
||||
|
||||
#define CMBS_MAX_NUMBER_OF_CONFERENCE_CALLS 5
|
||||
|
||||
/*! \brief max line */
|
||||
#define APPCALL_LINEOBJ_MAX 40
|
||||
/*! \brief max connection for CMBS API layer */
|
||||
#if (NBS==1)
|
||||
#define APPCALL_CALLOBJ_MAX 10
|
||||
#else
|
||||
#define APPCALL_CALLOBJ_MAX 8
|
||||
#endif
|
||||
|
||||
#define APPCALL_NO_LINE 0xFF
|
||||
#define APPCALL_NO_CALL 0xFFFF
|
||||
#define APPCALL_NO_INDEX 0xFF
|
||||
#define APPCALL_NO_MEDIA_CHANNEL 0xFF
|
||||
|
||||
#define ALL_HS_STRING "h123456789A\0"
|
||||
#define ALL_HS_1 "h1\0"
|
||||
#define ALL_HS_2 "h2\0"
|
||||
#define ALL_HS_3 "h3\0"
|
||||
#define ALL_HS_4 "h4\0"
|
||||
#define ALL_HS_5 "h5\0"
|
||||
#define ALL_HS_6 "h6\0"
|
||||
#define ALL_HS_7 "h7\0"
|
||||
#define ALL_HS_8 "h8\0"
|
||||
#define ALL_HS_9 "h9\0"
|
||||
#define ALL_HS_10 "hA\0"
|
||||
#define CALL_RELEASE_0 "0\0"
|
||||
#define CALL_RELEASE_1 "1\0"
|
||||
#define CALL_RELEASE_2 "2\0"
|
||||
#define CALL_RELEASE_3 "3\0"
|
||||
#define CALL_RELEASE_4 "4\0"
|
||||
#define CMBS_MULTICALL_LINE_NUM_OF_CALLS 2
|
||||
#define CMBS_NO_LINE_DEFINED 0x7F
|
||||
#define CMBS_NO_ENTRY_FOUND 0xFF
|
||||
#define CMBS_MAX_NUM_OF_LINES 5
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 u16_CallId;
|
||||
ST_CALL_OBJ st_CallInfo;
|
||||
} ST_SINGLE_CALL_INFO, * PST_SINGLE_CALL_INFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 u16_NumberOfActiveCalls;
|
||||
ST_SINGLE_CALL_INFO st_ActiveCallInfo[APPCALL_CALLOBJ_MAX];
|
||||
}ST_ALLACTIVECALLSINFO, * PST_ALLACTIVECALLSINFO;
|
||||
|
||||
#if defined( __cplusplus )
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void appcall_Initialize (void);
|
||||
void appcall_AutomatMode ( E_APPCALL_AUTOMAT_MODE e_Mode );
|
||||
u16 appcall_EstablishCall ( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties );
|
||||
|
||||
void appcall_ReconnectSwitch(u16 u16_SrCallId, u16 u16_DestCallId, PST_APPCALL_PROPERTIES pst_Properties);
|
||||
|
||||
int appcall_ReleaseCall( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_AnswerCall ( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_ProgressCall ( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_DisplayCall ( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_DisplayString ( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u16 u16_CallId, char * psz_Display );
|
||||
int appcall_ResumeCall( u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_HoldCall( u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_CallInbandInfo( u16 u16_CallId, char * psz_CLI );
|
||||
int appcall_CallInbandInfoCNIP( u16 u16_CallId, char * pu8_Name, char * pu8_FirstName, char * pch_cli );
|
||||
int appcall_MergeCalls( u16 u16_CallId1, u16 u16_CallId2, u8 u8_CovertToInt );
|
||||
int appcall_AnswerFxsCall(u16 u16_CallId1);
|
||||
int appcall_MakeSPKOgCall(u16 u8_HsNo);
|
||||
|
||||
|
||||
int appcall_EmergencyCallRelease( u16 u16_CallId );
|
||||
int appcall_EmergencyCallReleaseByCallInstance( u16 u16_CallInstance );
|
||||
u16 appcall_EstablishSplashRing( PST_APPCALL_PROPERTIES pst_Properties, int n_Properties, u8 u8_SplashTimer );
|
||||
void appcall_ReleaseSplashRingCall(PST_CALL_OBJ pst_Call);
|
||||
|
||||
/* appmedia_CallObjTonePlay: u16_ToneDur parameter & u16_DTMFToneToHSMask are only valid for DTMF request.
|
||||
* For all other tones values should be 0 (will be ignored)
|
||||
*/
|
||||
void appmedia_CallObjTonePlay(char *psz_Value, u16 u16_ToneVolume, int bo_On, u16 u16_CallId, char *psz_CLI, u16 u16_ToneDur, u16 u16_DTMFToneToHSMask);
|
||||
bool appmedia_CallObjMediaStart( u32 u32_CallInstance, u16 u16_CallId, u32 u32_ChannelSlots, char * psz_CLI );
|
||||
void appmedia_CallObjMediaStop( u32 u32_CallInstance, u16 u16_CallId, char * psz_CLI );
|
||||
void appmedia_CallObjMediaOffer( u16 u16_CallId, char ch_Audio );
|
||||
|
||||
void appcall_InfoPrint ( void );
|
||||
bool appcall_IsHsInCallWithLine ( u8 u8_HsNumber, u8 u8_LineId );
|
||||
bool appcall_IsLineInUse ( u8 u8_LineId );
|
||||
void appcall_HandleLineUseStatus (u8 u8_LineId);
|
||||
void appcall_HandleHSUseStatus (u8 u8_LineId, u16 u16_HsNr, bool b_InUse);
|
||||
u8 appcall_GetMaximumNumberOfAllowedCalls(u8 u8_LineId);
|
||||
|
||||
void appcall_SetActiveCallTable(u8 u8_Line, u32 u32_CallInstanse);
|
||||
void appcall_RemoveCallFromTable(u8 u8_Line, u32 u32_CallInstanse);
|
||||
bool appcall_IsCallInTable(u8 u8_Line, u32 u32_CallInstanse);
|
||||
u8 appcall_GetNumOfActiveCallsForLine(u8 u8_Line);
|
||||
bool appcall_CheckHSInOtherCall(u8 u8_Line, u16 u16_HSNum, u32 u32_CallInstance);
|
||||
u16 appcall_GetHSMask(u8 u8_Line, u32 u32_CallInstanse);
|
||||
void appcall_SetHSMask(u8 u8_Line, u32 u32_CallInstanse, u16 u16_HSMask);
|
||||
void appcall_HSUseChange(u8 u8_LineId, u16 u16_HSMask, u32 u32_CallInstance);
|
||||
void appcall_SetHsStatus( u32 u32_CallInstanse, PST_IE_CALL_STATE st_CallState);
|
||||
void appcall_GetHsStatus( u8 u8_HsNo, ST_IE_CALL_STATE *st_CallState);
|
||||
void appcall_ConferenceCallTableClearEntry(u32 u32_CallInstance);
|
||||
u32 appcall_ConferencePartnerGet(u32 u32_CallInstance);
|
||||
u8 appcall_ConferenceCallTableSet(u32 u32_CallInstance_to, u32 u32_CallInstance_frm);
|
||||
void appcall_ConferenceCallTableInit();
|
||||
void appcall_RefreshCallInfo();
|
||||
void appcall_HsStatusInit(void);
|
||||
|
||||
void appcall_GetActiveCallsInfo(void);
|
||||
|
||||
#ifdef PNCAP
|
||||
u16 appcall_PnCapDataCallStart( u16 u16_HsNo );
|
||||
u16 appcall_PnCapDataPacketSend( u8 *u8_Name, u8 *u8_Num, u16 u16_CallId );
|
||||
u16 appcall_PnCapDataTransferStop( u16 u16_CallId );
|
||||
u16 appcall_PnCapDataCallProc(u16 u16_CallId , u16 u16_HsNo);
|
||||
u16 appcall_PnCapDataCallCfm(u16 u16_CallId , u16 u16_HsNo);
|
||||
u16 appcall_PnCapPhoneBookActivate(u16 u16_HsNo );
|
||||
void appcall_PnCapAttribute(ePnCapAttribute PncapAttribute, UnionPnCapFacility AttributeStructure, u16 u16_HSMask );
|
||||
#endif
|
||||
|
||||
ST_CALL_OBJ *appcall_GetCallPendingforDeviceObj(PST_CALL_OBJ pst_Call);
|
||||
void app_Call2HS(PST_CALL_OBJ pst_Call, u16 u16_DstId);
|
||||
|
||||
|
||||
//void app_PrintCallInfo( E_CMBS_CALL_INFO e_Info );
|
||||
|
||||
PST_CALL_OBJ _appcall_CallObjGetById( u16 u16_CallId );
|
||||
u16 _appcall_CallObjIdGet(PST_CALL_OBJ pst_Call);
|
||||
|
||||
PST_CALL_OBJ _appcall_CallObjGet(u32 u32_CallInstance, char *psz_CLI);
|
||||
|
||||
u32 appcall_AllocateSlots(u32 u32_NumSlots);
|
||||
void appcall_DeallocateSlots(u32 u32_Slots);
|
||||
|
||||
#if defined( __cplusplus )
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // APPCALL_H
|
||||
//*/
|
||||
622
dectmngr/src/app/appcmbs/appcmbs.c
Normal file
622
dectmngr/src/app/appcmbs/appcmbs.c
Normal file
@@ -0,0 +1,622 @@
|
||||
/*!
|
||||
\brief Initialize the CMBS application
|
||||
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <termios.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h> //we need <sys/select.h>; should be included in <sys/types.h> ???
|
||||
#include <signal.h>
|
||||
#include <sys/msg.h>
|
||||
#include <errno.h>
|
||||
#include "cmbs_platf.h"
|
||||
#include "cmbs_api.h"
|
||||
#include "cmbs_han.h"
|
||||
#include "cmbs_util.h"
|
||||
#include "cmbs_dbg.h"
|
||||
#include "cfr_ie.h"
|
||||
#include "cfr_mssg.h"
|
||||
#include "appcmbs.h"
|
||||
#include "appsrv.h"
|
||||
#include "appcall.h"
|
||||
#include "applog.h"
|
||||
#include "apphan.h"
|
||||
#include "appfacility.h"
|
||||
#include "appmsgparser.h"
|
||||
#ifdef Q_AUTO
|
||||
#include <jsystem_tx.h>
|
||||
#endif
|
||||
#include "appHanMw.h"
|
||||
#include "ListsApp.h"
|
||||
#ifdef CMBS_PLUGIN
|
||||
#include "cmbs_plugin.h"
|
||||
#endif
|
||||
|
||||
extern u8 u8_APP_LA_Initialized;
|
||||
extern void app_LaInitialize(void);
|
||||
extern u8 tcx_DetectComPort(bool interactiveMode, E_CMBS_DEVTYPE *pu8_type);
|
||||
extern void tcx_USBConfig(u8 u8_Port, u32 u32_BaudRate);
|
||||
u32 g_u32_BaudRate = 115200;
|
||||
extern ST_CMBS_DEV g_st_DevMedia;
|
||||
extern ST_CMBS_DEV g_st_DevCtl;
|
||||
ST_CB_LOG_BUFFER pfn_log_buffer_Cb;
|
||||
#define DEFAULT_MAX_TRANSFER_SIZE (240)
|
||||
u32 g_CMBSMaxTransferSize = DEFAULT_MAX_TRANSFER_SIZE;
|
||||
ST_CMBS_APP_INST g_CMBSAppInstance;
|
||||
extern void cmbs_api_MsgQDestroy(int nMsgQId);
|
||||
extern int cmbs_api_MsgQCreate(void);
|
||||
|
||||
//Target alive indication callback
|
||||
static t_fptrHANTargetAliveIndication g_fptrHANTargetAliveIndication = NULL;
|
||||
|
||||
/*!***************************************************************************
|
||||
*
|
||||
* \brief CMBS application feedback entity
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
// different CMBS parts use different entities
|
||||
// which will be called by callback function
|
||||
// if the entity consumes the event, it shall return TRUE
|
||||
typedef int (*PFN_APP_ENTITY_CB)(void *pv_AppRef,
|
||||
E_CMBS_EVENT_ID e_EventID,
|
||||
void *pv_EventIEListRef);
|
||||
|
||||
|
||||
// a flag for external Client
|
||||
t_e_ExternalClient g_e_externalClient = NO_EXTERNAL_CLIENT;
|
||||
|
||||
t_e_ExternalClient appcmbs_GetExternalClientInformation()
|
||||
{
|
||||
return g_e_externalClient;
|
||||
}
|
||||
|
||||
void appcmbs_RegisterTargetAliveIndicationCB(t_fptrHANTargetAliveIndication fpt_registerCallBackForTargetAliveIndication)
|
||||
{
|
||||
g_fptrHANTargetAliveIndication = fpt_registerCallBackForTargetAliveIndication;
|
||||
}
|
||||
|
||||
|
||||
void appcmbs_SetExternalClientInformation(t_e_ExternalClient client)
|
||||
|
||||
{
|
||||
g_e_externalClient = client;
|
||||
}
|
||||
|
||||
|
||||
// global callback function table of received CMBS Events
|
||||
PFN_APP_ENTITY_CB g_pfn_app_Entity[] =
|
||||
{
|
||||
(PFN_APP_ENTITY_CB)app_ServiceEntity,
|
||||
(PFN_APP_ENTITY_CB)app_CallEntity,
|
||||
(PFN_APP_ENTITY_CB)app_SwupEntity,
|
||||
NULL, //(PFN_APP_ENTITY_CB)app_MediaEntity - currently inside call entity
|
||||
(PFN_APP_ENTITY_CB)app_FacilityEntity,
|
||||
#ifdef CMBS_PLUGIN
|
||||
(PFN_APP_ENTITY_CB)app_PluginEntity,
|
||||
#endif
|
||||
(PFN_APP_ENTITY_CB)app_DataEntity,
|
||||
(PFN_APP_ENTITY_CB)app_LaEntity,
|
||||
(PFN_APP_ENTITY_CB)app_UleDataEntity,
|
||||
// suotafile will be first so if it is enabled and consume the event, the suota app will not interfere
|
||||
(PFN_APP_ENTITY_CB)app_SuotaFileEntity,
|
||||
(PFN_APP_ENTITY_CB)app_SuotaEntity,
|
||||
(PFN_APP_ENTITY_CB)app_HANEntity,
|
||||
(PFN_APP_ENTITY_CB)app_RTPEntity,
|
||||
(PFN_APP_ENTITY_CB)app_LogEntity,
|
||||
(PFN_APP_ENTITY_CB)app_CmdEntity
|
||||
#if defined (CRASH_DUMP)
|
||||
,
|
||||
(PFN_APP_ENTITY_CB)app_CrashDumpEntity
|
||||
#endif
|
||||
};
|
||||
// global object of application
|
||||
ST_CMBS_APPL g_cmbsappl;
|
||||
|
||||
u8 g_HoldCfm = 1; /* 0 - decline hold, 1 - accept hold */
|
||||
u8 g_HoldResumeCfm = 1; /* 0 - decline hold resume, 1 - accept hold resume */
|
||||
u8 g_TransferAutoCfm = 1;
|
||||
u8 g_ConfAutoCfm = 1;
|
||||
u8 g_EarlyMediaAutoCfm = 1;
|
||||
u16 g_u16_DemoCallId = APPCALL_NO_CALL;
|
||||
u16 g_u16_DemoCallId_0 = APPCALL_NO_CALL;
|
||||
u16 g_u16_DemoCallId_1 = APPCALL_NO_CALL;
|
||||
u16 g_u16_DemoCallId_2 = APPCALL_NO_CALL;
|
||||
u16 g_u16_DemoCallId_3 = APPCALL_NO_CALL;
|
||||
u16 g_u16_DemoCallId_4 = APPCALL_NO_CALL;
|
||||
|
||||
PST_CMBS_APP_INST appcmbs_get_CMBSAppInstance(void)
|
||||
{
|
||||
return &g_CMBSAppInstance;
|
||||
}
|
||||
|
||||
// ========== appcmbs_CallBack ===========
|
||||
/*!
|
||||
\brief registered callback function to CMBS API for received events
|
||||
\param[in] pv_AppRef application reference pointer
|
||||
\param[in] e_EventID received event ID
|
||||
\param[in] pv_EventData IE list pointer
|
||||
\return <none>
|
||||
*/
|
||||
void appcmbs_CallBack(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if ( pv_AppRef )
|
||||
{} // Just one callback function registered, so we don't have to evaluate pv_AppRef
|
||||
///////////////////////////////////////////////
|
||||
// JSystem
|
||||
#ifdef Q_AUTO
|
||||
// call the JSystem Callback function
|
||||
//JSystemCallback(e_EventID, pv_EventData);
|
||||
///////////////////////////////////////////////////
|
||||
#else
|
||||
if(g_fptrHANTargetAliveIndication)
|
||||
{
|
||||
g_fptrHANTargetAliveIndication();
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < (sizeof(g_pfn_app_Entity) / sizeof(PFN_APP_ENTITY_CB)); i++)
|
||||
{
|
||||
if ( g_pfn_app_Entity[i] )
|
||||
{
|
||||
if ( g_pfn_app_Entity[i](pv_AppRef, e_EventID, pv_EventData) )
|
||||
{
|
||||
// no handler is needed anymore, event is consumed
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
APPCMBS_WARN(("Warning: Event: %d %s is not handled, yet\n", e_EventID, cmbs_dbg_GetEventName(e_EventID)));
|
||||
}
|
||||
|
||||
int appcmbs_CordlessStart(ST_IE_SYPO_SPECIFICATION *SYPOParameters)
|
||||
{
|
||||
|
||||
// Start DECT module
|
||||
appcmbs_PrepareRecvAdd ( TRUE); // This function must be called before sending messages if you want to wait for event/container.
|
||||
cmbs_dsr_sys_Start(g_cmbsappl.pv_CMBSRef, SYPOParameters);
|
||||
|
||||
return appcmbs_WaitForEvent(CMBS_EV_DSR_SYS_START_RES); // This function must be called only after appcmbs_PrepareRecvAdd ( TRUE)
|
||||
}
|
||||
|
||||
|
||||
// ========== appcmbs_MaxTransferSizeGet ===========
|
||||
/*!
|
||||
\brief short description
|
||||
\param[in,out] None
|
||||
\return <int> return Max size of transfer supported by the Target
|
||||
*/
|
||||
void appcmbs_MaxTransferSizeGet(void)
|
||||
{
|
||||
ST_APPCMBS_CONTAINER st_Container;
|
||||
u32 u32_temp = 0;
|
||||
|
||||
//Get CMBS MAX Buffer size supporetd by target
|
||||
appcmbs_PrepareRecvAdd ( TRUE); // This function must be called before sending messages if you want to wait for event/container.
|
||||
app_SrvParamGet(CMBS_PARAM_MAX_TRANSFER_SIZE, 1);
|
||||
appcmbs_WaitForContainer(CMBS_EV_DSR_PARAM_GET_RES, &st_Container); // This function must be called only after appcmbs_PrepareRecvAdd ( TRUE)
|
||||
if ( st_Container.n_InfoLen )
|
||||
{
|
||||
memcpy(&u32_temp, st_Container.ch_Info, CMBS_PARAM_MAX_TRANSFER_SIZE_LENGTH);
|
||||
cfr_ie_ser_u32((u8 *)&g_CMBSMaxTransferSize,u32_temp);
|
||||
}
|
||||
|
||||
if ( g_CMBSMaxTransferSize == 0 )
|
||||
{
|
||||
// can happen if the target is old and does not support the CMBS_PARAM_MAX_TRANSFER_SIZE parameter
|
||||
APPCMBS_INFO(("g_CMBSMaxTransferSize setting to default %u", DEFAULT_MAX_TRANSFER_SIZE));
|
||||
g_CMBSMaxTransferSize = DEFAULT_MAX_TRANSFER_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== appcmbs_Initialize ===========
|
||||
/*!
|
||||
\brief short description
|
||||
\param[in,out] pv_AppReference application pointer reference
|
||||
\return <int> return zero if successful
|
||||
*/
|
||||
E_CMBS_RC appcmbs_Initialize(void *pv_AppReference, PST_CMBS_DEV pst_DevCtl, PST_CMBS_DEV pst_DevMedia, PST_CB_LOG_BUFFER pfn_log_buffer_Cb)
|
||||
{
|
||||
E_CMBS_RC e_RC = CMBS_RC_OK;
|
||||
// reset application
|
||||
memset(&g_cmbsappl, 0, sizeof(g_cmbsappl));
|
||||
g_cmbsappl.pv_ApplRef = pv_AppReference;
|
||||
|
||||
// initialize application
|
||||
appcall_Initialize();
|
||||
app_FacilityInit();
|
||||
// intercommunication between engine and application
|
||||
g_cmbsappl.n_MssgAppID = cmbs_api_MsgQCreate();
|
||||
// initialize CMBS API and register callback function
|
||||
// for test application
|
||||
|
||||
cmbs_api_RegisterLogBufferCb(cmbs_api_get_LogBufferCb(), pfn_log_buffer_Cb);
|
||||
cmbs_dbg_SetParseIEFunc(app_PrintIe2Log);
|
||||
|
||||
if ( (e_RC = cmbs_api_Init(CMBS_MODE_MLB, pst_DevCtl, pst_DevMedia)) == CMBS_RC_OK )
|
||||
{
|
||||
APPCMBS_INFO(("APP: INFO CMBS-API started with Module version %04x\n", cmbs_api_ModuleVersionGet()));
|
||||
|
||||
if ( (g_cmbsappl.pv_CMBSRef = cmbs_api_RegisterCb(&g_cmbsappl, (PFN_CMBS_API_CB)appcmbs_CallBack, 0x0100)) == NULL )
|
||||
{
|
||||
APPCMBS_WARN(("APP: WARN Can't register API callback function\n"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Initialization failed\n");
|
||||
return e_RC;
|
||||
}
|
||||
|
||||
if ( !u8_APP_LA_Initialized )
|
||||
{
|
||||
app_LaInitialize();
|
||||
u8_APP_LA_Initialized = 1;
|
||||
}
|
||||
|
||||
app_HanMWInitialize();
|
||||
return e_RC;
|
||||
}
|
||||
// ========== appcmbs_Cleanup ===========
|
||||
/*!
|
||||
\brief clean up CMBS API layer and CMBS API
|
||||
|
||||
\param[in] <none>
|
||||
\return <none>
|
||||
|
||||
*/
|
||||
void appcmbs_Cleanup(void)
|
||||
{
|
||||
APPCMBS_INFO(("APP: INFO Cleanup CMBS connectivity\n"));
|
||||
cmbs_api_UnInit();
|
||||
cmbs_api_MsgQDestroy(g_cmbsappl.n_MssgAppID);
|
||||
List_Close();
|
||||
}
|
||||
|
||||
// ========== app_ResponseCheck ===========
|
||||
/*!
|
||||
\brief check the IE response item and return response code
|
||||
\param[in] pv_List IE list pointer
|
||||
\return <s8> return response code TRUE/FALSE or -1 in case not finding IE
|
||||
*/
|
||||
s8 app_ResponseCheck(void *pv_List)
|
||||
{
|
||||
void *pv_IE;
|
||||
u16 u16_IE;
|
||||
|
||||
cmbs_api_ie_GetFirst(pv_List, &pv_IE, &u16_IE);
|
||||
|
||||
while (pv_IE != NULL)
|
||||
{
|
||||
if ( u16_IE == CMBS_IE_RESPONSE )
|
||||
{
|
||||
ST_IE_RESPONSE st_Response;
|
||||
|
||||
// check response code:
|
||||
cmbs_api_ie_ResponseGet(pv_IE, &st_Response);
|
||||
|
||||
return st_Response.e_Response;
|
||||
}
|
||||
cmbs_api_ie_GetNext(pv_List, &pv_IE, &u16_IE);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ========== appcmbs_PrepareRecvAdd ===========
|
||||
/*!
|
||||
\brief set token to pass received infromation to upper layer
|
||||
\param[in] u32_Token TRUE for passing
|
||||
\return <none>
|
||||
|
||||
*/
|
||||
|
||||
void appcmbs_PrepareRecvAdd(u32 u32_Token)
|
||||
{
|
||||
g_cmbsappl.n_Token = (int)u32_Token;
|
||||
}
|
||||
|
||||
#ifdef Q_AUTO
|
||||
void appcmbs_PrepareRecvAddJSys(u32 u32_Token)
|
||||
{
|
||||
g_cmbsappl.j_Token = (int)u32_Token;
|
||||
}
|
||||
#endif
|
||||
// ========== appcmbs_WaitForContainer ===========
|
||||
/*!
|
||||
\brief Synchronization function enables the application to wait until
|
||||
requested CMBS event was received.
|
||||
\param[in] n_Event wait for this CMBS event
|
||||
\param[in,out] pst_Container pointer to CMBS information contatiner
|
||||
\return <int> return TRUE, if received, otherwise FALSE on error
|
||||
\todo timeout handling has to be integrated
|
||||
*/
|
||||
|
||||
int appcmbs_WaitForContainer(int n_Event, PST_APPCMBS_CONTAINER pst_Container)
|
||||
{
|
||||
int nRetVal;
|
||||
int bo_Run = TRUE;
|
||||
ST_APPCMBS_LINUX_CONTAINER LinuxContainer;
|
||||
|
||||
g_cmbsappl.n_Token = 1;
|
||||
|
||||
while (bo_Run)
|
||||
{
|
||||
nRetVal = msgrcv(g_cmbsappl.n_MssgAppID, &LinuxContainer, sizeof(ST_APPCMBS_CONTAINER), 0, 0);
|
||||
if ( nRetVal == -1 )
|
||||
{
|
||||
g_cmbsappl.n_Token = 0;
|
||||
bo_Run = FALSE;
|
||||
}
|
||||
else if ( n_Event == LinuxContainer.Content.n_Event )
|
||||
{
|
||||
if ( pst_Container )
|
||||
memcpy(pst_Container, &LinuxContainer.Content, nRetVal);
|
||||
g_cmbsappl.n_Token = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// timeout handler
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int appcmbs_WaitForEvent(int n_Event)
|
||||
{
|
||||
return appcmbs_WaitForContainer(n_Event, NULL);
|
||||
}
|
||||
|
||||
int appcmbs_ObjectSignalTrace(void)
|
||||
{
|
||||
struct msqid_ds ds;
|
||||
int len = -1;
|
||||
|
||||
memset(&ds, 0, sizeof(ds));
|
||||
|
||||
if (msgctl(g_cmbsappl.n_MssgAppID, IPC_STAT, &ds) == 0)
|
||||
len = ds.msg_qnum;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
// ========== appcmbs_ObjectSignal ===========
|
||||
/*!
|
||||
\brief signal to application of received event
|
||||
\param[in] psz_Info pointer to information buffer
|
||||
\param[in] n_InfoLen length of information
|
||||
\param[in] n_Info additional information, e.g. IE element
|
||||
\param[in] n_Event received CMBS event
|
||||
\return <none>
|
||||
*/
|
||||
void appcmbs_ObjectSignal(char *psz_Info, int n_InfoLen, int n_Info, int n_Event)
|
||||
{
|
||||
int nRetVal;
|
||||
|
||||
if ( g_cmbsappl.n_MssgAppID >= 0 )
|
||||
{
|
||||
ST_APPCMBS_LINUX_CONTAINER LinuxContainer;
|
||||
|
||||
LinuxContainer.mType = 1;
|
||||
memcpy(LinuxContainer.Content.ch_Info, psz_Info, n_InfoLen);
|
||||
LinuxContainer.Content.n_InfoLen = n_InfoLen;
|
||||
LinuxContainer.Content.n_Event = n_Event;
|
||||
LinuxContainer.Content.n_Info = n_Info;
|
||||
|
||||
nRetVal = msgsnd(g_cmbsappl.n_MssgAppID, &LinuxContainer, (3 * (sizeof(int)) + n_InfoLen), 0);
|
||||
|
||||
if ( nRetVal == -1 )
|
||||
{
|
||||
APPCMBS_ERROR(("App:ERROR !!! Container Object was not sent! %d\n",errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== appcmbs_IEInfoGet ===========
|
||||
/*!
|
||||
\brief handles general to IE function
|
||||
\param[in] pv_IE IE buffer
|
||||
\param[in] u16_IE enumeration of IE
|
||||
\param[in,out] p_Info pointer to IE object
|
||||
\return <none>
|
||||
*/
|
||||
void appcmbs_IEInfoGet(void *pv_IE, u16 u16_IE, PST_APPCMBS_IEINFO p_Info)
|
||||
{
|
||||
switch (u16_IE)
|
||||
{
|
||||
case CMBS_IE_CALLERNAME:
|
||||
cmbs_api_ie_CallerNameGet(pv_IE, &p_Info->Info.st_CallerName);
|
||||
break;
|
||||
|
||||
case CMBS_IE_CALLERPARTY:
|
||||
cmbs_api_ie_CallerPartyGet(pv_IE, &p_Info->Info.st_CallerParty);
|
||||
break;
|
||||
case CMBS_IE_CALLEDPARTY:
|
||||
cmbs_api_ie_CalledPartyGet(pv_IE, &p_Info->Info.st_CalledParty);
|
||||
break;
|
||||
|
||||
case CMBS_IE_CALLINSTANCE:
|
||||
cmbs_api_ie_CallInstanceGet(pv_IE, &p_Info->Info.u32_CallInstance);
|
||||
break;
|
||||
|
||||
case CMBS_IE_CALLPROGRESS:
|
||||
cmbs_api_ie_CallProgressGet(pv_IE, &p_Info->Info.st_CallProgress);
|
||||
break;
|
||||
|
||||
case CMBS_IE_CALLINFO:
|
||||
cmbs_api_ie_CallInfoGet(pv_IE, &p_Info->Info.st_CallInfo);
|
||||
break;
|
||||
|
||||
case CMBS_IE_MEDIACHANNEL:
|
||||
cmbs_api_ie_MediaChannelGet(pv_IE, &p_Info->Info.st_MediaChannel);
|
||||
break;
|
||||
|
||||
case CMBS_IE_MEDIADESCRIPTOR:
|
||||
cmbs_api_ie_MediaDescGet(pv_IE, &p_Info->Info.st_MediaDesc);
|
||||
break;
|
||||
|
||||
case CMBS_IE_CALLRELEASE_REASON:
|
||||
cmbs_api_ie_CallReleaseReasonGet(pv_IE, &p_Info->Info.st_Reason);
|
||||
break;
|
||||
|
||||
case CMBS_IE_PARAMETER:
|
||||
cmbs_api_ie_ParameterGet(pv_IE, &p_Info->Info.st_Param);
|
||||
break;
|
||||
|
||||
case CMBS_IE_FW_VERSION:
|
||||
cmbs_api_ie_FwVersionGet(pv_IE, &p_Info->Info.st_FwVersion);
|
||||
break;
|
||||
|
||||
case CMBS_IE_HW_VERSION:
|
||||
cmbs_api_ie_HwVersionGet(pv_IE, &p_Info->Info.st_HwVersion);
|
||||
break;
|
||||
case CMBS_IE_EEPROM_VERSION:
|
||||
cmbs_api_ie_EEPROMVersionGet(pv_IE, &p_Info->Info.st_EEPROMVersion);
|
||||
break;
|
||||
case CMBS_IE_SYS_LOG:
|
||||
cmbs_api_ie_SysLogGet(pv_IE, &p_Info->Info.st_SysLog);
|
||||
break;
|
||||
|
||||
case CMBS_IE_SUBSCRIBED_HS_LIST:
|
||||
cmbs_api_ie_SubscribedHSListGet(pv_IE, &p_Info->Info.st_SubscribedHsList);
|
||||
break;
|
||||
|
||||
case CMBS_IE_LINE_SETTINGS_LIST:
|
||||
cmbs_api_ie_LineSettingsListGet(pv_IE, &p_Info->Info.st_LineSettingsList);
|
||||
break;
|
||||
|
||||
case CMBS_IE_RESPONSE:
|
||||
cmbs_api_ie_ResponseGet(pv_IE, &p_Info->Info.st_Resp);
|
||||
break;
|
||||
|
||||
case CMBS_IE_LINE_ID:
|
||||
cmbs_api_ie_LineIdGet(pv_IE, &p_Info->Info.u8_LineId);
|
||||
break;
|
||||
|
||||
case CMBS_IE_MELODY:
|
||||
cmbs_api_ie_MelodyGet(pv_IE, &p_Info->Info.u8_Melody);
|
||||
break;
|
||||
|
||||
case CMBS_IE_DECT_SETTINGS_LIST:
|
||||
cmbs_api_ie_DectSettingsListGet(pv_IE, &p_Info->Info.st_DectSettings);
|
||||
break;
|
||||
|
||||
case CMBS_IE_PROP_FIELDS_LIST:
|
||||
cmbs_api_ie_PropDectSettingsListGet(pv_IE, &p_Info->Info.st_PropSettings);
|
||||
break;
|
||||
|
||||
case CMBS_IE_CALL_LIST:
|
||||
cmbs_api_ie_CallListGet(pv_IE, &p_Info->Info.st_CallList);
|
||||
break;
|
||||
|
||||
default:
|
||||
if ( CMBS_IE_USER_DEFINED_START <= u16_IE && u16_IE <= CMBS_IE_USER_DEFINED_END )
|
||||
{
|
||||
break;
|
||||
}
|
||||
APPCMBS_WARN(("APP: WARN IE_ToString: IE:%d not implemented\n", u16_IE));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void appcmbs_VersionGet(char *pc_Version)
|
||||
{
|
||||
char ch_RcBuild[20];
|
||||
u16 u16_Version = cmbs_api_ModuleVersionGet();
|
||||
u16 u16_Build = cmbs_api_ModuleVersionBuildGet();
|
||||
|
||||
if (u16_Build>>8)
|
||||
{
|
||||
sprintf (ch_RcBuild,"- RC %u", (u16_Build>>8));
|
||||
}
|
||||
else
|
||||
{
|
||||
ch_RcBuild[0] = '\0';
|
||||
}
|
||||
|
||||
if ( u16_Version > 0xFFF )
|
||||
sprintf(pc_Version, "Version %x.%02x.%x - Build %hu %s", (u16_Version >> 12), ((u16_Version >> 4)& 0xFF),(u16_Version & 0xF), (u16_Build & 0xFF), ch_RcBuild);
|
||||
else
|
||||
sprintf(pc_Version, "Version %02x.%02x - Build %hu %s", (u16_Version >> 8), (u16_Version & 0xFF), (u16_Build & 0xFF), ch_RcBuild);
|
||||
}
|
||||
|
||||
unsigned long appcmbs_GetTickCount(void)
|
||||
{
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv,NULL);
|
||||
return ((unsigned long)tv.tv_sec*1000);
|
||||
}
|
||||
|
||||
int appcmbs_ReconnectApplication(unsigned long ulTimeoutMs)
|
||||
{
|
||||
u32 u32_Sec, i;
|
||||
int resp;
|
||||
u8 u8_HwChip_temp, u8_HwComType_temp;
|
||||
|
||||
//effi - need this to re-regsiter the log callbacks
|
||||
ST_CB_LOG_BUFFER * pfnLogCallbacks=cmbs_api_get_LogBufferCb();
|
||||
|
||||
cmbs_api_UnInit();
|
||||
|
||||
if ( ulTimeoutMs )
|
||||
{
|
||||
u32_Sec = ulTimeoutMs / 1000;
|
||||
|
||||
for (i = 0; i <= u32_Sec; ++i)
|
||||
{
|
||||
printf("\r%d sec. remaining...", u32_Sec - i);
|
||||
SleepMs(1000);
|
||||
}
|
||||
}
|
||||
|
||||
APPCMBS_INFO(("\n"));
|
||||
|
||||
// Back and restore u8_HwChip and u8_HwComType since cmbs_api_Init cleans them
|
||||
u8_HwChip_temp = appcmbs_get_CMBSAppInstance()->u8_HwChip;
|
||||
u8_HwComType_temp = appcmbs_get_CMBSAppInstance()->u8_HwComType;
|
||||
|
||||
resp = cmbs_api_Init(CMBS_MODE_MLB, &g_st_DevCtl, &g_st_DevMedia);
|
||||
cmbs_api_RegisterCb(&g_cmbsappl, (PFN_CMBS_API_CB)appcmbs_CallBack, 0x0100);
|
||||
|
||||
// Effi - need to reregister the log functions
|
||||
// Register callback functions for log buffer handling
|
||||
cmbs_api_RegisterLogBufferCb(&g_cmbsappl, pfnLogCallbacks);
|
||||
|
||||
cmbs_dbg_SetParseIEFunc(app_PrintIe2Log);
|
||||
|
||||
appcmbs_get_CMBSAppInstance()->u8_HwChip = u8_HwChip_temp;
|
||||
appcmbs_get_CMBSAppInstance()->u8_HwComType = u8_HwComType_temp;
|
||||
|
||||
if ( resp == CMBS_RC_OK )
|
||||
{
|
||||
cmbs_dsr_sys_Start(g_cmbsappl.pv_CMBSRef, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
APPCMBS_ERROR(("appcmbs_Initialize failure %d!!!", resp));
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
int app_CmdEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData)
|
||||
{
|
||||
UNUSED_PARAMETER(pv_AppRef);
|
||||
UNUSED_PARAMETER(pv_EventData);
|
||||
// return TRUE for all commands
|
||||
return (e_EventID & CMBS_CMD_MASK) == CMBS_CMD_MASK;
|
||||
}
|
||||
|
||||
#ifdef CMBS_PLUGIN
|
||||
int app_PluginEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData)
|
||||
{
|
||||
return CMBS_HandleEventPlugins(pv_AppRef, e_EventID, pv_EventData);
|
||||
}
|
||||
#endif
|
||||
|
||||
void app_CreateThread(start_routine pfn)
|
||||
{
|
||||
pthread_t uTempThread;
|
||||
pthread_create( &uTempThread, NULL, pfn, (void*) NULL);
|
||||
}
|
||||
208
dectmngr/src/app/appcmbs/appcmbs.h
Normal file
208
dectmngr/src/app/appcmbs/appcmbs.h
Normal file
@@ -0,0 +1,208 @@
|
||||
/*!
|
||||
* \file appmain.h
|
||||
* \brief object and utility declaration
|
||||
* \Author kelbch
|
||||
*
|
||||
* @(#) %filespec: appcmbs.h~13.1.1.1.1.1.10 %
|
||||
*
|
||||
*******************************************************************************
|
||||
* \par History
|
||||
* \n==== History ============================================================\n
|
||||
* date name version action \n
|
||||
* ----------------------------------------------------------------------------\n
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined( APPCMBS_H )
|
||||
#define APPCMBS_H
|
||||
|
||||
#include "cfr_mssg.h"
|
||||
|
||||
#ifndef caseretstr
|
||||
#define caseretstr(x) case x: return #x
|
||||
#endif
|
||||
|
||||
#if defined ( TCXLOG_FILE )
|
||||
#include "tcx_hostlog.h"
|
||||
#define APPCMBS_ERROR(x) GENERAL_LOG_ERROR_PRINT x
|
||||
#define APPCMBS_WARN(x) GENERAL_LOG_WARNING_PRINT x
|
||||
#define APPCMBS_INFO(x) GENERAL_LOG_INFO_PRINT x
|
||||
|
||||
#define APPCMBS_IE(x) GENERAL_LOG_INFO_PRINT x
|
||||
#else
|
||||
#define APPCMBS_ERROR(x) printf x
|
||||
#define APPCMBS_WARN(x) printf x
|
||||
#define APPCMBS_INFO(x) printf x
|
||||
#define APPCMBS_IE(x) printf x
|
||||
#endif
|
||||
|
||||
#define APPCMBS_RECONNECT_TIMEOUT (60000) //60 sec (should be enough for eeprom resetting)
|
||||
#define HAN_DECT_SUBS_LENGTH (101*1000+5)
|
||||
#define HAN_ULE_SUBS_LENGTH (15*1000)
|
||||
#define HAN_FUN_SUBS_LENGTH (131*1000)
|
||||
#define HAN_FUN_GROUP_LIST_LENGTH (50)
|
||||
#define HAN_FUN_GROUP_TABLE_LENGTH (500)
|
||||
#define HAN_ULE_BROADCAST_CONVERSION_TABLE_LENGTH (600)
|
||||
|
||||
#define PARAM_REPEATER_SUBS_DATA_LENGTH 50*28 //50 bytes per Repeater and handset over repeater, 28 in maximum case
|
||||
|
||||
|
||||
|
||||
typedef void* (*start_routine)(void *);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
E_CMBS_IE_TYPE e_IE;
|
||||
union
|
||||
{
|
||||
u32 u32_CallInstance;
|
||||
u8 u8_LineId;
|
||||
ST_IE_CALLEDPARTY st_CalledParty;
|
||||
ST_IE_CALLERPARTY st_CallerParty;
|
||||
ST_IE_CALLERNAME st_CallerName;
|
||||
ST_IE_CALLPROGRESS st_CallProgress;
|
||||
ST_IE_CALLINFO st_CallInfo;
|
||||
ST_IE_DISPLAY_STRING st_DisplayString;
|
||||
ST_IE_RELEASE_REASON st_Reason;
|
||||
ST_IE_MEDIA_DESCRIPTOR st_MediaDesc;
|
||||
ST_IE_MEDIA_CHANNEL st_MediaChannel;
|
||||
ST_IE_TONE st_Tone;
|
||||
ST_IE_TIMEOFDAY st_Time;
|
||||
ST_IE_HANDSETINFO st_HandsetInfo;
|
||||
ST_IE_PARAMETER st_Param;
|
||||
ST_IE_FW_VERSION st_FwVersion;
|
||||
ST_IE_HW_VERSION st_HwVersion;
|
||||
ST_IE_SYS_LOG st_SysLog;
|
||||
ST_IE_SUBSCRIBED_HS_LIST st_SubscribedHsList;
|
||||
ST_IE_LINE_SETTINGS_LIST st_LineSettingsList;
|
||||
ST_IE_DECT_SETTINGS_LIST st_DectSettings;
|
||||
ST_IE_PROP_FIELDS_LIST st_PropSettings;
|
||||
ST_IE_USER_DEFINED st_UserDefined;
|
||||
ST_IE_RESPONSE st_Resp;
|
||||
// ST_IE_STATUS st_Status;
|
||||
u32 u32_IntegerValue;
|
||||
u8 u8_Melody;
|
||||
ST_IE_EEPROM_VERSION st_EEPROMVersion;
|
||||
ST_IE_CALL_LIST st_CallList;
|
||||
}Info;
|
||||
} ST_APPCMBS_IEINFO, *PST_APPCMBS_IEINFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void *pv_ApplRef;
|
||||
void *pv_CMBSRef;
|
||||
int n_MssgAppID;
|
||||
int n_Token;
|
||||
|
||||
#ifdef Q_AUTO
|
||||
int j_Token;
|
||||
#endif
|
||||
|
||||
int RegistrationWindowStatus; // 0 - Closed, 1 - Opened
|
||||
}ST_CMBS_APPL, *PST_CMBS_APPL;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int n_InfoLen;
|
||||
int n_Info;
|
||||
int n_Event;
|
||||
char ch_Info[4*1024];
|
||||
} ST_APPCMBS_CONTAINER, *PST_APPCMBS_CONTAINER;
|
||||
|
||||
typedef union {
|
||||
u8 pu8_HAN_DECT_DATA[HAN_DECT_SUBS_LENGTH];
|
||||
u8 pu8_HAN_ULE_DATA[HAN_ULE_SUBS_LENGTH];
|
||||
u8 pu8_HAN_FUN_DATA[HAN_FUN_SUBS_LENGTH];
|
||||
u8 pu8_HAN_FUN_GROUP_LIST_DATA[HAN_FUN_GROUP_LIST_LENGTH];
|
||||
u8 pu8_HAN_FUN_GROUP_TABLE_DATA[HAN_FUN_GROUP_TABLE_LENGTH];
|
||||
u8 pu8_HAN_ULE_BROADCAST_CONVERSION_TABLE_DATA[HAN_ULE_BROADCAST_CONVERSION_TABLE_LENGTH];
|
||||
u8 pu8_HAN_ULE_MULTICAST_ENC_PARAMS_DATA[CMBS_PARAM_ULE_MULTICAST_ENC_PARAMS_LENGTH];
|
||||
u8 pu8_REPEATER_SUBS_DATA[PARAM_REPEATER_SUBS_DATA_LENGTH];
|
||||
} UnionHanEEPROMBackupEBlocksPools;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
long mType;
|
||||
ST_APPCMBS_CONTAINER Content;
|
||||
} ST_APPCMBS_LINUX_CONTAINER, *PST_APPCMBS_LINUX_CONTAINER;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
E_CMBS_HW_CHIP u8_HwChip; /*!< HW chip */
|
||||
E_CMBS_HW_CHIP_VERSION u8_HwChipVersion; /*!< HW chip version */
|
||||
E_CMBS_HW_BOARD u8_HwBoard; /*!< HW board type */
|
||||
E_CMBS_HW_COM_TYPE u8_HwComType; /*!< HW communication */
|
||||
|
||||
} ST_CMBS_APP_INST, *PST_CMBS_APP_INST;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NO_EXTERNAL_CLIENT,
|
||||
EXTERNAL_CLIENT_EXIST
|
||||
}t_e_ExternalClient;
|
||||
|
||||
typedef u32(*t_fptrHANTargetAliveIndication)();
|
||||
|
||||
|
||||
extern ST_CMBS_APPL g_cmbsappl;
|
||||
|
||||
#if defined( __cplusplus )
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
s8 app_ResponseCheck(void *pv_List);
|
||||
u8 app_ASC2HEX(char *psz_Digits);
|
||||
|
||||
void keyb_ParamAreaGetBySegments(u32 u32_Pos, u32 u32_Length, u8 *pu8_Data, u32 packet_max_size);
|
||||
void keyb_ParamAreaSetBySegments(u32 u32_Pos, u32 u32_Length, u8 *pu8_Data, u16 packet_max_size);
|
||||
E_CMBS_RC keyb_ParamAreaGetFromFile(u8 *pu8_Data, u8 *pu8_path);
|
||||
|
||||
t_e_ExternalClient appcmbs_GetExternalClientInformation();
|
||||
void appcmbs_SetExternalClientInformation(t_e_ExternalClient client);
|
||||
|
||||
//callback for target alive indication
|
||||
void appcmbs_RegisterTargetAliveIndicationCB(t_fptrHANTargetAliveIndication fpt_registerCallBackForTargetAliveIndication);
|
||||
|
||||
// callback for CMBS responses according specification
|
||||
int app_ServiceEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_CallEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_SwupEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_FacilityEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_DataEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_LaEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_UleDataEntity(void * pv_AppRef, E_CMBS_EVENT_ID e_EventID, void * pv_EventData);
|
||||
int app_SuotaEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_SuotaFileEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_RTPEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_HANEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_CmdEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
int app_PluginEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
#if defined (CRASH_DUMP)
|
||||
int app_CrashDumpEntity(void *pv_AppRef, E_CMBS_EVENT_ID e_EventID, void *pv_EventData);
|
||||
#endif
|
||||
|
||||
// initialize the CMBS application
|
||||
E_CMBS_RC appcmbs_Initialize(void *pv_AppReference, PST_CMBS_DEV pst_DevCtl, PST_CMBS_DEV pst_DevMedia, PST_CB_LOG_BUFFER pfn_log_buffer_Cb);
|
||||
void appcmbs_Cleanup(void);
|
||||
void appcmbs_InitEeprom(u8 *pu8_EEprom, u16 u16_Size);
|
||||
int appcmbs_CordlessStart(ST_IE_SYPO_SPECIFICATION *SYPOParameters);
|
||||
// synchronize upper application with async CMBS received Data
|
||||
int appcmbs_ObjectSignalTrace(void);
|
||||
void appcmbs_ObjectSignal(char *psz_Info, int n_InfoLen, int n_Info, int n_Event);
|
||||
void appcmbs_PrepareRecvAdd(u32 u32_Token);
|
||||
int appcmbs_WaitForContainer(int n_Event, PST_APPCMBS_CONTAINER pst_Container);
|
||||
int appcmbs_WaitForEvent(int n_Event);
|
||||
|
||||
void appcmbs_IEInfoGet(void *pv_IE, u16 u16_IE, PST_APPCMBS_IEINFO p_Info);
|
||||
void appcmbs_VersionGet(char *pc_Version);
|
||||
unsigned long appcmbs_GetTickCount(void);
|
||||
int appcmbs_ReconnectApplication(unsigned long ulTimeoutMs);
|
||||
void app_CreateThread(start_routine);
|
||||
PST_CMBS_APP_INST appcmbs_get_CMBSAppInstance(void);
|
||||
void appcmbs_MaxTransferSizeGet(void);
|
||||
|
||||
#if defined( __cplusplus )
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // APPCMBS_H
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user