Compare commits
709 Commits
Subsurface
...
Subsurface
| Author | SHA1 | Date | |
|---|---|---|---|
| d5f9b352fc | |||
| 311f8d05f4 | |||
| deaaeee7a1 | |||
| c281b04bfc | |||
| 132a3949fd | |||
| 27a37fc95a | |||
| d1106cb8ba | |||
|
|
9641883f2f | ||
|
|
c7e89eab11 | ||
|
|
9b12e8e638 | ||
|
|
d9c230820f | ||
|
|
5d321deb8a | ||
|
|
9f2674ee7c | ||
|
|
6bd1183c34 | ||
|
|
0c125489df | ||
|
|
fa224f5300 | ||
|
|
8f686ce1d8 | ||
|
|
a7fb341fb0 | ||
|
|
ff0023b8b4 | ||
|
|
6e65428fc8 | ||
|
|
89221475cf | ||
|
|
bff6f7c140 | ||
|
|
ca55a11ed5 | ||
|
|
bb502c6d8b | ||
|
|
792090566e | ||
|
|
62a29eea15 | ||
|
|
4bbfe1659e | ||
|
|
39bc2fe05c | ||
|
|
edfb1a9c67 | ||
|
|
d37cb91734 | ||
|
|
78710ab2f1 | ||
|
|
76170009b4 | ||
|
|
1d0aeecf65 | ||
|
|
de6696bc7f | ||
|
|
cfe345aa8e | ||
|
|
d47e1ce02b | ||
|
|
08d8c3e132 | ||
|
|
2d9008aff7 | ||
|
|
e1762fc8bd | ||
|
|
3c50e91a10 | ||
|
|
cb0164150e | ||
|
|
e83732e200 | ||
|
|
a7e7439cab | ||
|
|
072f0d4242 | ||
|
|
baa1c494c1 | ||
|
|
330cb88952 | ||
|
|
37421a1b9a | ||
|
|
fe9b47f4bd | ||
|
|
ed871137b1 | ||
|
|
4a9be44afd | ||
|
|
a985b11859 | ||
|
|
b2310e62d6 | ||
|
|
301fdbe364 | ||
|
|
beb348dbf6 | ||
|
|
5d36cc0798 | ||
|
|
993283d1c8 | ||
|
|
323804d5e6 | ||
|
|
ecc9e0b09b | ||
|
|
577b694087 | ||
|
|
58ea31e62e | ||
|
|
97b2c89aaa | ||
|
|
8bfbb94087 | ||
|
|
9cde393e5f | ||
|
|
9bc742d3ac | ||
|
|
a4cd21b811 | ||
|
|
f77e9c03fc | ||
|
|
f818a5a92a | ||
|
|
3e39cb427a | ||
|
|
e81eca685a | ||
|
|
dc8f32609e | ||
|
|
196cfdf4df | ||
|
|
503afc1a5f | ||
|
|
e02df46a2b | ||
|
|
2879bd69a5 | ||
|
|
4a2dec531e | ||
|
|
67cd1cc0fd | ||
|
|
929ce47155 | ||
|
|
147d3df635 | ||
|
|
4aa70c9e2a | ||
|
|
571df62ce5 | ||
|
|
ceaaba3e77 | ||
|
|
1222041b46 | ||
|
|
3733b87ac9 | ||
|
|
0afd62d7af | ||
|
|
3a68af418e | ||
|
|
ff0328537e | ||
|
|
3d82d6796f | ||
|
|
25bd1f9853 | ||
|
|
c16530b8ab | ||
|
|
d4402aa296 | ||
|
|
13705f2b2d | ||
|
|
ee147afceb | ||
|
|
b13ad617ac | ||
|
|
838717dbae | ||
|
|
436063c74d | ||
|
|
763fc68741 | ||
|
|
9b7aa813e0 | ||
|
|
63f5a4d652 | ||
|
|
679db0bae6 | ||
|
|
0a4f37770f | ||
|
|
4e24b3a277 | ||
|
|
becb8bd36e | ||
|
|
4b383a778e | ||
|
|
b1ff2c6a8e | ||
|
|
bca8f9e2d2 | ||
|
|
a34e909a84 | ||
|
|
db9371cf9f | ||
|
|
070de23b83 | ||
|
|
49aa12b172 | ||
|
|
2f1b99f2f9 | ||
|
|
6c3bbb2cc7 | ||
|
|
1c8cd096b5 | ||
|
|
40c95ca02a | ||
|
|
72ddd6a439 | ||
|
|
d4472b758f | ||
|
|
b0e77fd05f | ||
|
|
cee9a2e926 | ||
|
|
9c38ae3e01 | ||
|
|
629d567381 | ||
|
|
bec4a747ff | ||
|
|
43f48af418 | ||
|
|
e45c62b028 | ||
|
|
767a2fad91 | ||
|
|
083b1eb8de | ||
|
|
118f6d79ba | ||
|
|
cf221de9b7 | ||
|
|
3a2dc6cce4 | ||
|
|
86fd58c8c6 | ||
|
|
1930b9eb59 | ||
|
|
554855cc7d | ||
|
|
27b471e76b | ||
|
|
00033e4af0 | ||
|
|
d327aea6ff | ||
|
|
12f44f3410 | ||
|
|
46d4bee8ab | ||
|
|
c288effa01 | ||
|
|
d9dd30f327 | ||
|
|
8b5b86fb4e | ||
|
|
4ddef92b80 | ||
|
|
543bd58ddd | ||
|
|
8d3271e586 | ||
|
|
2ba9904757 | ||
|
|
648651e2d7 | ||
|
|
7efedfbb2b | ||
|
|
255a2dbb9a | ||
|
|
ee78d6f65b | ||
|
|
328812e95b | ||
|
|
98c7887e9c | ||
|
|
5fd9317533 | ||
|
|
9787bb7ac9 | ||
|
|
1b9aea3213 | ||
|
|
9a3363dc7d | ||
|
|
f03f9b3bb3 | ||
|
|
201be561d4 | ||
|
|
78373d827b | ||
|
|
4e83b1642c | ||
|
|
9eef8c50c0 | ||
|
|
86e9cc3443 | ||
|
|
3ce34a0b6d | ||
|
|
187f8d625b | ||
|
|
fca64faa3c | ||
|
|
e0e3bc8994 | ||
|
|
ceae89e149 | ||
|
|
3414f72f60 | ||
|
|
d0857c49ec | ||
|
|
f59cbf0fe5 | ||
|
|
45b9ee8376 | ||
|
|
cf81ac79b3 | ||
|
|
90bb40e5ea | ||
|
|
bf268d79b4 | ||
|
|
989c992154 | ||
|
|
b1f4ad94eb | ||
|
|
547b1cfd15 | ||
|
|
064e198315 | ||
|
|
9019805f52 | ||
|
|
f4fae1b9f6 | ||
|
|
094a225363 | ||
|
|
79c9c5b7f9 | ||
|
|
6200a7923f | ||
|
|
2129403c1e | ||
|
|
59a0844ee6 | ||
|
|
ed0b21beae | ||
|
|
755f23fdfa | ||
|
|
db2540485e | ||
|
|
2577afed55 | ||
|
|
2c5ebef594 | ||
|
|
913a65fde6 | ||
|
|
1e47f597fa | ||
|
|
5218d3921a | ||
|
|
6874130743 | ||
|
|
2f3a057969 | ||
|
|
c2102f62d6 | ||
|
|
bf93040ab1 | ||
|
|
8a6abab1da | ||
|
|
005a2501b9 | ||
|
|
9508401971 | ||
|
|
89ae8b94cf | ||
|
|
a99d990117 | ||
|
|
c578e0a158 | ||
|
|
34bc6b1613 | ||
|
|
59dd6a2a56 | ||
|
|
28c27e2392 | ||
|
|
3d388a0a96 | ||
|
|
c5813d624a | ||
|
|
3eedf4d24d | ||
|
|
3e5282bf74 | ||
|
|
43a503f6f0 | ||
|
|
4d8cdaaf8e | ||
|
|
ce578cafb9 | ||
|
|
12c77a228e | ||
|
|
6ab140461a | ||
|
|
18f06ea585 | ||
|
|
7fb943ae7f | ||
|
|
565bb2af02 | ||
|
|
95f309a1c9 | ||
|
|
107f5b14e3 | ||
|
|
391d4db419 | ||
|
|
972beb52be | ||
|
|
80f22dce0b | ||
|
|
26c43d6d8b | ||
|
|
8451286c17 | ||
|
|
be5bb9e690 | ||
|
|
e6f091909b | ||
|
|
4616e2ed21 | ||
|
|
a17e466bd1 | ||
|
|
643a6211b2 | ||
|
|
aff0c28d08 | ||
|
|
4b4efb2c07 | ||
|
|
2443d3ea47 | ||
|
|
d0c7562c41 | ||
|
|
7c3e92e391 | ||
|
|
0aad8cfd13 | ||
|
|
cd72516668 | ||
|
|
0064097c03 | ||
|
|
8bfb965589 | ||
|
|
82c0134811 | ||
|
|
4512a0a5d7 | ||
|
|
52d2684479 | ||
|
|
7e3bf7eeb8 | ||
|
|
ea051578e6 | ||
|
|
77498afe5e | ||
|
|
5f3a0f0b8a | ||
|
|
0753f10661 | ||
|
|
0448ce686a | ||
|
|
39dbb275cc | ||
|
|
bedd6180f1 | ||
|
|
c6640aa7d3 | ||
|
|
7a650f940c | ||
|
|
86e1d59a6a | ||
|
|
54fa676e75 | ||
|
|
d1242a28cf | ||
|
|
ccd37d4fa3 | ||
|
|
811a9b4f89 | ||
|
|
2794f96e47 | ||
|
|
d960a37e12 | ||
|
|
17bc0faa51 | ||
|
|
f6df075d51 | ||
|
|
c5dced237a | ||
|
|
c9c441b8bb | ||
|
|
5e2d376627 | ||
|
|
16e49eee6d | ||
|
|
70411048e5 | ||
|
|
331bcbdaf7 | ||
|
|
af03e39383 | ||
|
|
93fe31eef5 | ||
|
|
b2040d9adb | ||
|
|
cadbffe416 | ||
|
|
cd0f42804a | ||
|
|
ba4a119a4f | ||
|
|
9ff6e5caad | ||
|
|
a8bcfb998b | ||
|
|
1c39c68203 | ||
|
|
0a9b8b1318 | ||
|
|
7e075eb959 | ||
|
|
e52468e0c3 | ||
|
|
1a4798792e | ||
|
|
c4b694fdb1 | ||
|
|
b6df353752 | ||
|
|
6e40a457f3 | ||
|
|
a282ae0b29 | ||
|
|
3057ac79c2 | ||
|
|
f2cc4ab7ef | ||
|
|
75f260a941 | ||
|
|
643b4271f6 | ||
|
|
e0409a9496 | ||
|
|
70d3cdcc08 | ||
|
|
e7da5acff3 | ||
|
|
03974481b0 | ||
|
|
58d410b1a2 | ||
|
|
38bd51e63a | ||
|
|
2ef285faf3 | ||
|
|
3e87ed050c | ||
|
|
927362354d | ||
|
|
5bb6257acb | ||
|
|
060c0b7215 | ||
|
|
eaeb5c5341 | ||
|
|
5cb527d53c | ||
|
|
cfc9ddc380 | ||
|
|
cffda88ae8 | ||
|
|
b186846a9e | ||
|
|
da2446283a | ||
|
|
6645b3f5e4 | ||
|
|
c8bd477c84 | ||
|
|
c747dc7184 | ||
|
|
9307acbe4a | ||
|
|
9106250a53 | ||
|
|
449b65cf1b | ||
|
|
0bc7b195e5 | ||
|
|
fba5676b78 | ||
|
|
87d484e9a8 | ||
|
|
14fd0296d4 | ||
|
|
47cbed5355 | ||
|
|
2ccdc46561 | ||
|
|
37c4203537 | ||
|
|
9ab0800c00 | ||
|
|
d85d8811f0 | ||
|
|
76d225dcfc | ||
|
|
6ef72ab420 | ||
|
|
1418766a1a | ||
|
|
752a064bb3 | ||
|
|
a4d771956a | ||
|
|
007a2bc835 | ||
|
|
6b576da5ef | ||
|
|
6bb13a564f | ||
|
|
bf482f6025 | ||
|
|
d49a8a3e64 | ||
|
|
95920af7b7 | ||
|
|
3d3271abe1 | ||
|
|
b713136a00 | ||
|
|
03ddc84384 | ||
|
|
580e1d5fc5 | ||
|
|
f42df2d846 | ||
|
|
ecc23a5a76 | ||
|
|
d63c6cd04e | ||
|
|
034819cd2d | ||
|
|
0f677fcaac | ||
|
|
efc9236fbc | ||
|
|
b9a99de158 | ||
|
|
81f95d3880 | ||
|
|
38ebb81536 | ||
|
|
939470df52 | ||
|
|
0239329f06 | ||
|
|
d5dffb70be | ||
|
|
4ffd45c126 | ||
|
|
ba6a8a43f7 | ||
|
|
5eddaeade6 | ||
|
|
fc76b4a258 | ||
|
|
b0cce363f1 | ||
|
|
10a4ec0b08 | ||
|
|
0688b74099 | ||
|
|
1130b7eade | ||
|
|
8f383ac531 | ||
|
|
7c9726da64 | ||
|
|
548fce69f8 | ||
|
|
b97acabb01 | ||
|
|
6c9a758648 | ||
|
|
e592c7e7b7 | ||
|
|
cebf4089cc | ||
|
|
099fda0d2b | ||
|
|
8b06f2c31d | ||
|
|
484e9dcdc3 | ||
|
|
9438064afc | ||
|
|
6ab4ac7f7f | ||
|
|
9eddbe88be | ||
|
|
e53e7cf961 | ||
|
|
90a08ad845 | ||
|
|
e58a5866bb | ||
|
|
4fc85409da | ||
|
|
47be86eb79 | ||
|
|
1712b99f79 | ||
|
|
89b1cc4f28 | ||
|
|
3a300a6a8f | ||
|
|
c4a3db4ac1 | ||
|
|
9554e87431 | ||
|
|
ea3e542450 | ||
|
|
05e066b2ff | ||
|
|
8df5c15db9 | ||
|
|
e1bbdd5e65 | ||
|
|
7f553c1276 | ||
|
|
b7850e9cbf | ||
|
|
50f3ba3189 | ||
|
|
014a15ba62 | ||
|
|
5b133233f7 | ||
|
|
c77a311a89 | ||
|
|
57cd11fffe | ||
|
|
fe9a3d9a10 | ||
|
|
625f56b494 | ||
|
|
0ebd5d3879 | ||
|
|
d52dfb002d | ||
|
|
1801023c68 | ||
|
|
a004fdffed | ||
|
|
c6ea7afb76 | ||
|
|
469d3ee177 | ||
|
|
8cfd2aacaf | ||
|
|
8e1335e372 | ||
|
|
8a10e545d4 | ||
|
|
7d26fb6a13 | ||
|
|
2e63eaec16 | ||
|
|
2909863573 | ||
|
|
39dc77d669 | ||
|
|
d6153a5a07 | ||
|
|
f33814c13c | ||
|
|
ad566ab04f | ||
|
|
3e89e1b871 | ||
|
|
e2ecd96daa | ||
|
|
7a4c5e919f | ||
|
|
51b1ae925c | ||
|
|
1df0e13cc4 | ||
|
|
378b9c1aec | ||
|
|
3c1e763a47 | ||
|
|
9dace57814 | ||
|
|
c77551b366 | ||
|
|
33a20bd2b8 | ||
|
|
5380b247af | ||
|
|
c72dc4aa73 | ||
|
|
c84bbd93a3 | ||
|
|
57f0ce6d79 | ||
|
|
edacbb2f13 | ||
|
|
6986840c0d | ||
|
|
cdd618e683 | ||
|
|
71a149d776 | ||
|
|
6935fe717a | ||
|
|
6b22340ddc | ||
|
|
8d17c3c01c | ||
|
|
da8ae52b50 | ||
|
|
91658dd167 | ||
|
|
ae58a66d9a | ||
|
|
7018206f56 | ||
|
|
d58b8f6928 | ||
|
|
e9129ff45a | ||
|
|
91acd9bb2d | ||
|
|
c065a78402 | ||
|
|
21742bd2ec | ||
|
|
85074dba40 | ||
|
|
8d35ee6978 | ||
|
|
9e6035f98a | ||
|
|
cac0eb7d81 | ||
|
|
ee84202b2b | ||
|
|
9525bc8047 | ||
|
|
48e46cf777 | ||
|
|
53f82e4ac9 | ||
|
|
cb7f47b60b | ||
|
|
cdfbe4092d | ||
|
|
cf6c0d6640 | ||
|
|
6042aa8875 | ||
|
|
680752bc0f | ||
|
|
93597f1ed9 | ||
|
|
6b0cf9a9f3 | ||
|
|
c5405cc0c2 | ||
|
|
fb6cde0d17 | ||
|
|
025fb5ed1a | ||
|
|
704ed3f1e4 | ||
|
|
a1c408e8f4 | ||
|
|
b9657e4545 | ||
|
|
62057c90bd | ||
|
|
41f89f415e | ||
|
|
8594445088 | ||
|
|
4e9e94d9f8 | ||
|
|
99c2ca7205 | ||
|
|
cf104bb8de | ||
|
|
dc4b2e0592 | ||
|
|
15c23eb7f6 | ||
|
|
af2249a7c5 | ||
|
|
086b0a799e | ||
|
|
06ca08ed2b | ||
|
|
8ea51ad16e | ||
|
|
82f298febd | ||
|
|
9e92381be4 | ||
|
|
dff6d0c514 | ||
|
|
da4a8a90c7 | ||
|
|
7b9b6b4005 | ||
|
|
d1b865d192 | ||
|
|
94cd864dba | ||
|
|
ffa9e0aa3c | ||
|
|
8a1d32d319 | ||
|
|
416022f3cc | ||
|
|
8fb0f1ca94 | ||
|
|
39aad6bb52 | ||
|
|
f93b2afcc8 | ||
|
|
1d235daf30 | ||
|
|
ebb8715e2c | ||
|
|
5dc7e54596 | ||
|
|
59d9791446 | ||
|
|
a01b9bc9b9 | ||
|
|
4a60f89f4a | ||
|
|
ba96b3092d | ||
|
|
f65e3cf39e | ||
|
|
4fe1b96689 | ||
|
|
cfd54ff80e | ||
|
|
4bc5ee90ef | ||
|
|
4baf140d25 | ||
|
|
6ba0726a42 | ||
|
|
4923d3761e | ||
|
|
437db813d5 | ||
|
|
4b2156d378 | ||
|
|
91309a3d54 | ||
|
|
a67bab58ca | ||
|
|
e71278a13f | ||
|
|
c205299c02 | ||
|
|
0359a57fdc | ||
|
|
be0e32b43b | ||
|
|
af5716d685 | ||
|
|
f6fa2b84bc | ||
|
|
ef4bd94717 | ||
|
|
018198dc17 | ||
|
|
02ae8d3fdb | ||
|
|
9f3e0a7026 | ||
|
|
ad297c1cc9 | ||
|
|
03c8e350dd | ||
|
|
ae733fd8a8 | ||
|
|
b9a3606f37 | ||
|
|
a5ba2f4e41 | ||
|
|
612011249d | ||
|
|
b92cf6de69 | ||
|
|
7f21998ad5 | ||
|
|
ab230fd4e0 | ||
|
|
21a9fa6879 | ||
|
|
4bbcb6a8a1 | ||
|
|
4c91309c56 | ||
|
|
e215d10296 | ||
|
|
e2ae5f9525 | ||
|
|
a7edb159fd | ||
|
|
6c441bb402 | ||
|
|
e23c374cd8 | ||
|
|
03ff5d32f2 | ||
|
|
41b24adfcb | ||
|
|
ffeb6b2447 | ||
|
|
f801b512c3 | ||
|
|
912eb37ac3 | ||
|
|
d62674a803 | ||
|
|
d21070ad1a | ||
|
|
8829619473 | ||
|
|
dc508c30f9 | ||
|
|
1cd285a4d8 | ||
|
|
d5aa15c1c5 | ||
|
|
07dff48a3b | ||
|
|
01d89add2f | ||
|
|
708fbb02de | ||
|
|
209890daeb | ||
|
|
c70046bccf | ||
|
|
e80e320b8b | ||
|
|
334105322c | ||
|
|
feec939a29 | ||
|
|
a74d4ca14d | ||
|
|
7b29651d1e | ||
|
|
732c607c22 | ||
|
|
e4c88a9309 | ||
|
|
6fb09e05a4 | ||
|
|
ca784be4e2 | ||
|
|
ddf086271c | ||
|
|
0dc10062ce | ||
|
|
b188c41420 | ||
|
|
629e33432f | ||
|
|
7b29c5d43d | ||
|
|
5c55760fd5 | ||
|
|
05a21bc8ee | ||
|
|
f37c3d3c86 | ||
|
|
74957542bb | ||
|
|
7d48587ed8 | ||
|
|
019a98f80c | ||
|
|
88a814a616 | ||
|
|
01ec0c0970 | ||
|
|
6ee786c31a | ||
|
|
8a70885f89 | ||
|
|
6867ffb143 | ||
|
|
5116ee8f2d | ||
|
|
530b28bf6f | ||
|
|
2ea24cf043 | ||
|
|
f05f60c4ad | ||
|
|
81bca1ff7c | ||
|
|
4bbebe7c32 | ||
|
|
ec14ee2b77 | ||
|
|
d876542d39 | ||
|
|
3287e3bd5d | ||
|
|
2b96b2f52c | ||
|
|
e363e5b1fd | ||
|
|
da2582237f | ||
|
|
4c93e14b0e | ||
|
|
179ec4688f | ||
|
|
47bb08bbfd | ||
|
|
ae503626ae | ||
|
|
472e73118d | ||
|
|
864b40cb3d | ||
|
|
0b2959d8c7 | ||
|
|
c622998fb1 | ||
|
|
0d3d34a5c9 | ||
|
|
ab522a4a52 | ||
|
|
ed21d776dd | ||
|
|
43303eadf6 | ||
|
|
52388efe59 | ||
|
|
f5d636d12e | ||
|
|
04c367fd06 | ||
|
|
e04a7fb33d | ||
|
|
24f800d185 | ||
|
|
6e87c1d7b7 | ||
|
|
96949627aa | ||
|
|
a2100843b9 | ||
|
|
e968f84999 | ||
|
|
884f66a115 | ||
|
|
b1d434f0ea | ||
|
|
631cfd8c45 | ||
|
|
a4d9f72cf0 | ||
|
|
e4f04128be | ||
|
|
4da94a7285 | ||
|
|
ff1ee12770 | ||
|
|
17b3e07398 | ||
|
|
aee70d1ec7 | ||
|
|
b3144ac26b | ||
|
|
564958f927 | ||
|
|
0d73a38900 | ||
|
|
41f50534aa | ||
|
|
472e9e984c | ||
|
|
2985616532 | ||
|
|
6085a11b1f | ||
|
|
51d6a40132 | ||
|
|
b3ebfa0e6e | ||
|
|
8aef4a49a0 | ||
|
|
1a0909ac92 | ||
|
|
c2fc0cdd1c | ||
|
|
6ed9c3c64c | ||
|
|
0fde62050d | ||
|
|
680f233690 | ||
|
|
ab37d94ee9 | ||
|
|
cecf8c5d6f | ||
|
|
4879174164 | ||
|
|
26f4cae47c | ||
|
|
8a3fd3b136 | ||
|
|
62d54cf3f3 | ||
|
|
29f781f803 | ||
|
|
56d194d377 | ||
|
|
1908394af4 | ||
|
|
945898f8fd | ||
|
|
8957d61f4e | ||
|
|
c5504b5437 | ||
|
|
3d394c9262 | ||
|
|
9477791bfe | ||
|
|
5bec560673 | ||
|
|
8f7abc5a2d | ||
|
|
0978f8c0fa | ||
|
|
3dcf93e26e | ||
|
|
afff8b450f | ||
|
|
a7d0033bae | ||
|
|
0c5cf94b10 | ||
|
|
6b50e7f959 | ||
|
|
630b5e7c3c | ||
|
|
c50958495d | ||
|
|
44eba5515c | ||
|
|
ef2402eff5 | ||
|
|
30ea13b36b | ||
|
|
46608ce898 | ||
|
|
aee59a33be | ||
|
|
eed993fd16 | ||
|
|
3230387fff | ||
|
|
7c95581826 | ||
|
|
7d48cffc0d | ||
|
|
43f196b804 | ||
|
|
5344f3926a | ||
|
|
38c3f289b5 | ||
|
|
755b52febc | ||
|
|
01ccb7ce4b | ||
|
|
96bac1de13 | ||
|
|
ea2272d4b0 | ||
|
|
2c7d1fe39f | ||
|
|
54fef8e093 | ||
|
|
0026fbd289 | ||
|
|
b62f160dd5 | ||
|
|
c15d422f75 | ||
|
|
5207fcd86b | ||
|
|
38ff1f75dd | ||
|
|
4897a8351b | ||
|
|
ee31f24cfb | ||
|
|
eb4c150024 | ||
|
|
a8adb16c0d | ||
|
|
becaf02ab6 | ||
|
|
efd47cd9a1 | ||
|
|
0ac15dffd3 | ||
|
|
05f5522210 | ||
|
|
9117b593fc | ||
|
|
85eef19f8f | ||
|
|
695212ddf8 | ||
|
|
0ce3bd3e6d | ||
|
|
30e4060817 | ||
|
|
ca91500ed5 | ||
|
|
296fad2d9d | ||
|
|
f992d201ad | ||
|
|
931d1857ce | ||
|
|
90eed3c790 | ||
|
|
6d5ac37f99 | ||
|
|
9e169c9a3f | ||
|
|
3e36cad5ee | ||
|
|
9ca91ca584 | ||
|
|
0ae9e355f8 | ||
|
|
c194f559d8 | ||
|
|
d23bc6e089 | ||
|
|
c3556d81c9 | ||
|
|
21b0f01852 | ||
|
|
4335c9b9eb | ||
|
|
4144e0c7ff | ||
|
|
2f097e54fe | ||
|
|
4e93b9a8f8 | ||
|
|
e22adbb3f9 | ||
|
|
88cc5e1413 | ||
|
|
71f76819c0 | ||
|
|
5997caf45f | ||
|
|
681720e96a | ||
|
|
96e6bf5848 | ||
|
|
bd00ddea17 | ||
|
|
81f3fdd854 | ||
|
|
a833992ed6 |
173
.github/workflows/build.yml
vendored
Normal file
173
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
name: Build
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
linux:
|
||||||
|
|
||||||
|
name: Linux
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
compiler: [gcc, clang]
|
||||||
|
|
||||||
|
env:
|
||||||
|
CC: ${{ matrix.compiler }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install dependencies
|
||||||
|
run: sudo apt-get install libbluetooth-dev libusb-1.0-0-dev
|
||||||
|
- run: autoreconf --install --force
|
||||||
|
- run: ./configure --prefix=/usr
|
||||||
|
- run: make
|
||||||
|
- run: make distcheck
|
||||||
|
- name: Package artifacts
|
||||||
|
run: |
|
||||||
|
make install DESTDIR=$PWD/artifacts
|
||||||
|
tar -czf ${{ github.job }}-${{ matrix.compiler }}.tar.gz -C artifacts usr
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ github.job }}-${{ matrix.compiler }}
|
||||||
|
path: ${{ github.job }}-${{ matrix.compiler }}.tar.gz
|
||||||
|
|
||||||
|
mac:
|
||||||
|
|
||||||
|
name: Mac
|
||||||
|
|
||||||
|
runs-on: macos-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
compiler: [gcc, clang]
|
||||||
|
|
||||||
|
env:
|
||||||
|
CC: ${{ matrix.compiler }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install dependencies
|
||||||
|
run: brew install autoconf automake libtool hidapi libusb
|
||||||
|
- run: autoreconf --install --force
|
||||||
|
- run: ./configure --prefix=/usr
|
||||||
|
- run: make
|
||||||
|
- run: make distcheck
|
||||||
|
- name: Package artifacts
|
||||||
|
run: |
|
||||||
|
make install DESTDIR=$PWD/artifacts
|
||||||
|
tar -czf ${{ github.job }}-${{ matrix.compiler }}.tar.gz -C artifacts usr
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ github.job }}-${{ matrix.compiler }}
|
||||||
|
path: ${{ github.job }}-${{ matrix.compiler }}.tar.gz
|
||||||
|
|
||||||
|
windows:
|
||||||
|
|
||||||
|
name: Windows
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
arch: [i686, x86_64]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Install dependencies
|
||||||
|
run: sudo apt-get install gcc-mingw-w64 binutils-mingw-w64 mingw-w64-tools
|
||||||
|
- name: Install libusb
|
||||||
|
env:
|
||||||
|
LIBUSB_VERSION: 1.0.26
|
||||||
|
run: |
|
||||||
|
wget -c https://github.com/libusb/libusb/archive/refs/tags/v${LIBUSB_VERSION}.tar.gz
|
||||||
|
tar xzf v${LIBUSB_VERSION}.tar.gz
|
||||||
|
pushd libusb-${LIBUSB_VERSION}
|
||||||
|
autoreconf --install --force
|
||||||
|
./configure --host=${{ matrix.arch }}-w64-mingw32 --prefix=/usr
|
||||||
|
make
|
||||||
|
make install DESTDIR=$PWD/../artifacts
|
||||||
|
popd
|
||||||
|
- name: Install hidapi
|
||||||
|
env:
|
||||||
|
HIDAPI_VERSION: 0.12.0
|
||||||
|
run: |
|
||||||
|
wget -c https://github.com/libusb/hidapi/archive/refs/tags/hidapi-${HIDAPI_VERSION}.tar.gz
|
||||||
|
tar xzf hidapi-${HIDAPI_VERSION}.tar.gz
|
||||||
|
pushd hidapi-hidapi-${HIDAPI_VERSION}
|
||||||
|
autoreconf --install --force
|
||||||
|
./configure --host=${{ matrix.arch }}-w64-mingw32 --prefix=/usr LDFLAGS='-static-libgcc'
|
||||||
|
make
|
||||||
|
make install DESTDIR=$PWD/../artifacts
|
||||||
|
popd
|
||||||
|
- run: autoreconf --install --force
|
||||||
|
- run: ./configure --host=${{ matrix.arch }}-w64-mingw32 --prefix=/usr
|
||||||
|
env:
|
||||||
|
PKG_CONFIG_LIBDIR: ${{ github.workspace }}/artifacts/usr/lib/pkgconfig
|
||||||
|
PKG_CONFIG_SYSROOT_DIR: ${{ github.workspace }}/artifacts
|
||||||
|
PKG_CONFIG_ALLOW_SYSTEM_CFLAGS: 1
|
||||||
|
PKG_CONFIG_ALLOW_SYSTEM_LIBS: 1
|
||||||
|
- run: make
|
||||||
|
- run: make distcheck
|
||||||
|
- name: Package artifacts
|
||||||
|
run: |
|
||||||
|
make install DESTDIR=$PWD/artifacts
|
||||||
|
tar -czf ${{ github.job }}-${{ matrix.arch }}.tar.gz -C artifacts usr
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ github.job }}-${{ matrix.arch }}
|
||||||
|
path: ${{ github.job }}-${{ matrix.arch }}.tar.gz
|
||||||
|
|
||||||
|
# msvc:
|
||||||
|
#
|
||||||
|
# name: Visual Studio
|
||||||
|
#
|
||||||
|
# runs-on: windows-latest
|
||||||
|
#
|
||||||
|
# strategy:
|
||||||
|
# fail-fast: false
|
||||||
|
# matrix:
|
||||||
|
# platform: [x86, x64]
|
||||||
|
#
|
||||||
|
# env:
|
||||||
|
# CONFIGURATION: Release
|
||||||
|
#
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v3
|
||||||
|
# - uses: msys2/setup-msys2@v2
|
||||||
|
# with:
|
||||||
|
# install: autoconf automake libtool pkg-config make gcc
|
||||||
|
# - run: |
|
||||||
|
# autoreconf --install --force
|
||||||
|
# ./configure --prefix=/usr
|
||||||
|
# make -C src revision.h
|
||||||
|
# shell: msys2 {0}
|
||||||
|
# - uses: microsoft/setup-msbuild@v1
|
||||||
|
# - run: msbuild -m -p:Platform=${{ matrix.platform }} -p:Configuration=${{ env.CONFIGURATION }} contrib/msvc/libdivecomputer.vcxproj
|
||||||
|
# - uses: actions/upload-artifact@v3
|
||||||
|
# with:
|
||||||
|
# name: ${{ github.job }}-${{ matrix.platform }}
|
||||||
|
# path: contrib/msvc/${{ matrix.platform }}/${{ env.CONFIGURATION }}/bin
|
||||||
|
|
||||||
|
android:
|
||||||
|
|
||||||
|
name: Android
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- run: |
|
||||||
|
autoreconf --install --force
|
||||||
|
./configure --prefix=/usr
|
||||||
|
make -C src revision.h
|
||||||
|
- run: $ANDROID_NDK/ndk-build -C contrib/android NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ github.job }}
|
||||||
|
path: contrib/android/libs
|
||||||
47
.github/workflows/release.yml
vendored
Normal file
47
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags: 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Version number
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
VERSION="${GITHUB_REF/refs\/tags\/v/}"
|
||||||
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Build distribution tarball
|
||||||
|
id: build
|
||||||
|
run: |
|
||||||
|
sudo apt-get install libbluetooth-dev libusb-1.0-0-dev
|
||||||
|
autoreconf --install --force
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make distcheck
|
||||||
|
|
||||||
|
- name: Check tarball version number
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
FILENAME="libdivecomputer-${{ steps.version.outputs.version }}.tar.gz"
|
||||||
|
if [ ! -f "${FILENAME}" ]; then
|
||||||
|
echo ::error ::Tarball \'${FILENAME}\' not found!
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Create Github release
|
||||||
|
id: release
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
if [ "${VERSION}" != "${VERSION%%-*}" ]; then
|
||||||
|
PRERELEASE="-p"
|
||||||
|
fi
|
||||||
|
gh release create ${PRERELEASE} "${{ github.ref }}" "libdivecomputer-${VERSION}.tar.gz"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
34
.gitignore
vendored
34
.gitignore
vendored
@ -37,32 +37,7 @@ Makefile.in
|
|||||||
/doc/html/
|
/doc/html/
|
||||||
/doc/latex/
|
/doc/latex/
|
||||||
|
|
||||||
/examples/aladin
|
/examples/dctool
|
||||||
/examples/atom2
|
|
||||||
/examples/d9
|
|
||||||
/examples/darwin
|
|
||||||
/examples/edy
|
|
||||||
/examples/eon
|
|
||||||
/examples/frog
|
|
||||||
/examples/iconhd
|
|
||||||
/examples/leonardo
|
|
||||||
/examples/memomouse
|
|
||||||
/examples/n2ition3
|
|
||||||
/examples/nemo
|
|
||||||
/examples/ostc
|
|
||||||
/examples/ostc-fwupdate
|
|
||||||
/examples/predator
|
|
||||||
/examples/puck
|
|
||||||
/examples/sensus
|
|
||||||
/examples/sensuspro
|
|
||||||
/examples/sensusultra
|
|
||||||
/examples/smart
|
|
||||||
/examples/solution
|
|
||||||
/examples/universal
|
|
||||||
/examples/veo250
|
|
||||||
/examples/vtpro
|
|
||||||
/examples/vyper
|
|
||||||
/examples/vyper2
|
|
||||||
|
|
||||||
/include/libdivecomputer/version.h
|
/include/libdivecomputer/version.h
|
||||||
|
|
||||||
@ -72,13 +47,14 @@ Makefile.in
|
|||||||
/m4/ltsugar.m4
|
/m4/ltsugar.m4
|
||||||
/m4/ltversion.m4
|
/m4/ltversion.m4
|
||||||
|
|
||||||
/msvc/Debug/
|
/msvc/x64/
|
||||||
/msvc/Release/
|
/msvc/x86/
|
||||||
/msvc/*.ncb
|
/msvc/*.ncb
|
||||||
/msvc/*.suo
|
/msvc/*.suo
|
||||||
/msvc/*.vcproj.*.user
|
|
||||||
|
|
||||||
/src/libdivecomputer.exp
|
/src/libdivecomputer.exp
|
||||||
/src/libdivecomputer.la
|
/src/libdivecomputer.la
|
||||||
/src/libdivecomputer.rc
|
/src/libdivecomputer.rc
|
||||||
/src/revision.h
|
/src/revision.h
|
||||||
|
|
||||||
|
/build
|
||||||
|
|||||||
55
.travis.yml
Normal file
55
.travis.yml
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
language: c
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
compiler: gcc
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
compiler: clang
|
||||||
|
|
||||||
|
- os: osx
|
||||||
|
compiler: gcc
|
||||||
|
|
||||||
|
- os: osx
|
||||||
|
compiler: clang
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
compiler: i686-w64-mingw32-gcc
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-mingw-w64
|
||||||
|
- binutils-mingw-w64
|
||||||
|
- mingw-w64-tools
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
compiler: x86_64-w64-mingw32-gcc
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-mingw-w64
|
||||||
|
- binutils-mingw-w64
|
||||||
|
- mingw-w64-tools
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- libbluetooth-dev
|
||||||
|
- libusb-1.0-0-dev
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- hidapi
|
||||||
|
- libusb
|
||||||
|
|
||||||
|
script:
|
||||||
|
- case $CC in
|
||||||
|
*-gcc) TARGET="${CC%-gcc}" ;;
|
||||||
|
esac
|
||||||
|
- if [ -n "$TARGET" ]; then
|
||||||
|
TARGETOPTS="--host=${TARGET}";
|
||||||
|
unset CC;
|
||||||
|
fi
|
||||||
|
- autoreconf --install --force
|
||||||
|
- ./configure $TARGETOPTS --disable-doc
|
||||||
|
- make
|
||||||
@ -16,4 +16,8 @@ pkgconfig_DATA = libdivecomputer.pc
|
|||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
libdivecomputer.pc.in \
|
libdivecomputer.pc.in \
|
||||||
msvc/libdivecomputer.vcproj
|
contrib/README \
|
||||||
|
contrib/android/Android.mk \
|
||||||
|
contrib/msvc/libdivecomputer.vcxproj \
|
||||||
|
contrib/msvc/libdivecomputer.vcxproj.filters \
|
||||||
|
contrib/udev/libdivecomputer.rules
|
||||||
|
|||||||
74
NEWS
74
NEWS
@ -1,3 +1,77 @@
|
|||||||
|
Version 0.8.0 (2023-05-11)
|
||||||
|
==========================
|
||||||
|
|
||||||
|
The v0.8.0 release is mainly a bugfix release, and brings in support for a
|
||||||
|
number of new devices. This release is fully backwards compatible with the
|
||||||
|
previous one.
|
||||||
|
|
||||||
|
New features:
|
||||||
|
|
||||||
|
* Add support for new backends:
|
||||||
|
- excursion: Deep Six Excursion, Crest CR-4, Genesis Centauri, Tusa TC1, Scorpena Alpha
|
||||||
|
- screen: Seac Screen and Action
|
||||||
|
- cosmiq: Deepblu Cosmiq+
|
||||||
|
- s1: Oceans S1
|
||||||
|
- freedom: Divesoft Freedom and Liberty
|
||||||
|
* Add support for some new devices:
|
||||||
|
- Aqualung: i200C
|
||||||
|
- Cressi: Donatello, Michelangelo, Neon
|
||||||
|
- Mares: Puck Pro +
|
||||||
|
- Oceanic: Geo Air
|
||||||
|
- Ratio: iX3M 2
|
||||||
|
- Scubapro: G2 TEK
|
||||||
|
- Shearwater: Petrel 3, Perdix 2
|
||||||
|
- Sherwood: Amphos Air 2.0
|
||||||
|
* Add support for parsing the decompression model
|
||||||
|
* Add a public api to configure the depth calibration
|
||||||
|
* Add a public api to configure the clock synchronization
|
||||||
|
* Add a basic Android build system
|
||||||
|
|
||||||
|
Removed/changed features:
|
||||||
|
|
||||||
|
* Migrate to Visual Studio 2013 (or newer)
|
||||||
|
* Move the Visual Studio project to the contrib directory
|
||||||
|
|
||||||
|
Version 0.7.0 (2021-05-07)
|
||||||
|
==========================
|
||||||
|
|
||||||
|
The main highlight of the v0.7.0 release is the introduction of the new
|
||||||
|
I/O interface. With this common interface, the dive computer backends
|
||||||
|
can more easily use different I/O implementations at runtime, including
|
||||||
|
an application defined one. This is needed to support Bluetooth Low
|
||||||
|
Energy (BLE), for which there is no built-in implementation available.
|
||||||
|
|
||||||
|
Due to the fundamental changes to the I/O layer, this release is not
|
||||||
|
backwards compatible.
|
||||||
|
|
||||||
|
New features:
|
||||||
|
|
||||||
|
* A new I/O interface
|
||||||
|
* Add support for new backends:
|
||||||
|
- goa: Cressi Goa and Cartesio
|
||||||
|
- divecomputereu: Tecdiving DiveComputer.eu
|
||||||
|
- extreme: McLean Extreme
|
||||||
|
- lynx: Liquivision Xen, Xeo, Lynx and Kaon
|
||||||
|
- sp2: Sporasub SP2
|
||||||
|
* Add support for many new devices:
|
||||||
|
- Aqualung: i100, i200C, i300C, i470TC, i550C, i770R
|
||||||
|
- Heinrichs Weikamp: OSTC 2 TR
|
||||||
|
- Mares: Genius, Horizon, Quad Air, Smart Air
|
||||||
|
- Oceanic: Geo 4.0, Pro Plus 4, Pro Plus X, Veo 4.0
|
||||||
|
- Ratio: iDive Color, iX3M GPS, iX3M 2021
|
||||||
|
- Scubapro: A1, A2, Aladin H Matrix, G2 Console, G2 HUD
|
||||||
|
- Seac: Guru, Jack
|
||||||
|
- Shearwater: Peregrine, Teric
|
||||||
|
- Sherwood: Amphos 2.0, Beacon, Sage, Wisdom 4
|
||||||
|
- Suunto: D5, EON Steel Black
|
||||||
|
- Tusa: Talis
|
||||||
|
* Firmware upgrade support for the Ratio computers
|
||||||
|
* Support for semi-closed circuit diving
|
||||||
|
|
||||||
|
Removed/changed features:
|
||||||
|
|
||||||
|
* Unify the Uwatec Smart, Meridian and G2 backends
|
||||||
|
|
||||||
Version 0.6.0 (2017-11-24)
|
Version 0.6.0 (2017-11-24)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
|
|||||||
111
configure.ac
111
configure.ac
@ -1,8 +1,8 @@
|
|||||||
# Versioning.
|
# Versioning.
|
||||||
m4_define([dc_version_major],[0])
|
m4_define([dc_version_major],[0])
|
||||||
m4_define([dc_version_minor],[7])
|
m4_define([dc_version_minor],[9])
|
||||||
m4_define([dc_version_micro],[0])
|
m4_define([dc_version_micro],[0])
|
||||||
m4_define([dc_version_suffix],[devel])
|
m4_define([dc_version_suffix],[devel-Subsurface-NG])
|
||||||
m4_define([dc_version],dc_version_major.dc_version_minor.dc_version_micro[]m4_ifset([dc_version_suffix],-[dc_version_suffix]))
|
m4_define([dc_version],dc_version_major.dc_version_minor.dc_version_micro[]m4_ifset([dc_version_suffix],-[dc_version_suffix]))
|
||||||
|
|
||||||
# Libtool versioning.
|
# Libtool versioning.
|
||||||
@ -72,18 +72,21 @@ AM_CONDITIONAL([HAVE_MANDOC],[test -n "$MANDOC"])
|
|||||||
# Enable automake silent build rules.
|
# Enable automake silent build rules.
|
||||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
# Checks for native Windows.
|
# Checks for operating system.
|
||||||
AC_MSG_CHECKING([for native Win32])
|
AC_MSG_CHECKING([for operating system])
|
||||||
case "$host" in
|
case "$host" in
|
||||||
*-*-mingw*)
|
*-*-mingw*)
|
||||||
os_win32=yes
|
platform=windows
|
||||||
|
;;
|
||||||
|
*-*-darwin*)
|
||||||
|
platform=mac
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
os_win32=no
|
platform=default
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
AC_MSG_RESULT([$os_win32])
|
AC_MSG_RESULT([$platform])
|
||||||
AM_CONDITIONAL([OS_WIN32], [test "$os_win32" = "yes"])
|
AM_CONDITIONAL([OS_WIN32], [test "$platform" = "windows"])
|
||||||
|
|
||||||
DEPENDENCIES=""
|
DEPENDENCIES=""
|
||||||
|
|
||||||
@ -100,16 +103,29 @@ AS_IF([test "x$with_libusb" != "xno"], [
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# Checks for MTP support.
|
||||||
|
AC_ARG_WITH([libmtp],
|
||||||
|
[AS_HELP_STRING([--without-libmtp],
|
||||||
|
[Build without the libmtp library])],
|
||||||
|
[], [with_libmtp=auto])
|
||||||
|
AS_IF([test "x$with_libmtp" != "xno"], [
|
||||||
|
PKG_CHECK_MODULES([LIBMTP], [libmtp], [have_libmtp=yes], [have_libmtp=no])
|
||||||
|
AS_IF([test "x$have_libmtp" = "xyes"], [
|
||||||
|
AC_DEFINE([HAVE_LIBMTP], [1], [libmtp library])
|
||||||
|
DEPENDENCIES="$DEPENDENCIES libmtp"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
# Checks for HIDAPI support.
|
# Checks for HIDAPI support.
|
||||||
AC_ARG_WITH([hidapi],
|
AC_ARG_WITH([hidapi],
|
||||||
[AS_HELP_STRING([--without-hidapi],
|
[AS_HELP_STRING([--without-hidapi],
|
||||||
[Build without the hidapi library])],
|
[Build without the hidapi library])],
|
||||||
[], [with_hidapi=auto])
|
[], [with_hidapi=hidapi])
|
||||||
AS_IF([test "x$with_hidapi" != "xno"], [
|
AS_IF([test "x$with_hidapi" != "xno"], [
|
||||||
PKG_CHECK_MODULES([HIDAPI], [hidapi], [have_hidapi=yes], [have_hidapi=no])
|
PKG_CHECK_MODULES([HIDAPI], [$with_hidapi], [have_hidapi=yes], [have_hidapi=no])
|
||||||
AS_IF([test "x$have_hidapi" = "xyes"], [
|
AS_IF([test "x$have_hidapi" = "xyes"], [
|
||||||
AC_DEFINE([HAVE_HIDAPI], [1], [hidapi library])
|
AC_DEFINE([HAVE_HIDAPI], [1], [hidapi library])
|
||||||
DEPENDENCIES="$DEPENDENCIES hidapi"
|
DEPENDENCIES="$DEPENDENCIES $with_hidapi"
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -154,9 +170,10 @@ AC_CHECK_HEADERS([sys/socket.h linux/types.h linux/irda.h], , , [
|
|||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
AC_CHECK_HEADERS([linux/serial.h])
|
AC_CHECK_HEADERS([linux/serial.h])
|
||||||
AC_CHECK_HEADERS([IOKit/serial/ioss.h])
|
AC_CHECK_HEADERS([IOKit/serial/ioss.h])
|
||||||
AC_CHECK_HEADERS([getopt.h])
|
AC_CHECK_HEADERS([unistd.h getopt.h])
|
||||||
AC_CHECK_HEADERS([sys/param.h])
|
AC_CHECK_HEADERS([sys/param.h])
|
||||||
AC_CHECK_HEADERS([pthread.h])
|
AC_CHECK_HEADERS([pthread.h])
|
||||||
|
AC_CHECK_HEADERS([mach/mach_time.h])
|
||||||
|
|
||||||
# Checks for global variable declarations.
|
# Checks for global variable declarations.
|
||||||
AC_CHECK_DECLS([optreset])
|
AC_CHECK_DECLS([optreset])
|
||||||
@ -169,23 +186,35 @@ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[
|
|||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_FUNC_STRERROR_R
|
AC_FUNC_STRERROR_R
|
||||||
AC_CHECK_FUNCS([localtime_r gmtime_r timegm _mkgmtime])
|
AC_CHECK_FUNCS([localtime_r gmtime_r timegm _mkgmtime])
|
||||||
|
AC_CHECK_FUNCS([clock_gettime mach_absolute_time])
|
||||||
AC_CHECK_FUNCS([getopt_long])
|
AC_CHECK_FUNCS([getopt_long])
|
||||||
|
|
||||||
# Checks for supported compiler options.
|
# Checks for supported compiler options.
|
||||||
|
AX_APPEND_COMPILE_FLAGS([-Werror=unknown-warning-option],[ERROR_CFLAGS])
|
||||||
AX_APPEND_COMPILE_FLAGS([ \
|
AX_APPEND_COMPILE_FLAGS([ \
|
||||||
-pedantic \
|
|
||||||
-Wall \
|
-Wall \
|
||||||
-Wextra \
|
|
||||||
-Wshadow \
|
-Wshadow \
|
||||||
-Wrestrict \
|
-Wrestrict \
|
||||||
-Wformat=2 \
|
-Wformat=2 \
|
||||||
-Wwrite-strings \
|
-Wwrite-strings \
|
||||||
-Wcast-qual \
|
|
||||||
-Wpointer-arith \
|
-Wpointer-arith \
|
||||||
-Wstrict-prototypes \
|
-Wstrict-prototypes \
|
||||||
-Wmissing-prototypes \
|
-Wmissing-prototypes \
|
||||||
-Wmissing-declarations \
|
-Wmissing-declarations \
|
||||||
-Wno-unused-parameter \
|
-Wno-unused-parameter \
|
||||||
|
-Wno-unused-function \
|
||||||
|
-Wno-unused-variable \
|
||||||
|
-Wno-unused-but-set-variable \
|
||||||
|
-Wno-pointer-sign \
|
||||||
|
-Wno-shadow \
|
||||||
|
-Wenum-conversion \
|
||||||
|
-Werror=enum-conversion \
|
||||||
|
-fmacro-prefix-map='$(top_srcdir)/'= \
|
||||||
|
],,[$ERROR_CFLAGS])
|
||||||
|
|
||||||
|
# Windows specific compiler options.
|
||||||
|
AS_IF([test "$platform" = "windows"], [
|
||||||
|
AX_APPEND_COMPILE_FLAGS([-Wno-pedantic-ms-format])
|
||||||
])
|
])
|
||||||
|
|
||||||
# Versioning.
|
# Versioning.
|
||||||
@ -200,6 +229,25 @@ m4_ifset([dc_version_suffix],[
|
|||||||
AC_DEFINE(HAVE_VERSION_SUFFIX, [1], [Define if a version suffix is present.])
|
AC_DEFINE(HAVE_VERSION_SUFFIX, [1], [Define if a version suffix is present.])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# Supported transports
|
||||||
|
transport_serial="yes"
|
||||||
|
transport_usb="${have_libusb-no}"
|
||||||
|
if test "$have_hidapi" = "yes"; then
|
||||||
|
transport_usbhid="yes"
|
||||||
|
elif test "$have_libusb" = "yes" && test "$platform" != "mac"; then
|
||||||
|
transport_usbhid="yes"
|
||||||
|
else
|
||||||
|
transport_usbhid="no"
|
||||||
|
fi
|
||||||
|
if test "$platform" = "windows"; then
|
||||||
|
transport_irda="$ac_cv_header_af_irda_h"
|
||||||
|
transport_bluetooth="$ac_cv_header_ws2bth_h"
|
||||||
|
else
|
||||||
|
transport_irda="$ac_cv_header_linux_irda_h"
|
||||||
|
transport_bluetooth="${have_bluez-no}"
|
||||||
|
fi
|
||||||
|
transport_ble="no"
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
libdivecomputer.pc
|
libdivecomputer.pc
|
||||||
Makefile
|
Makefile
|
||||||
@ -207,10 +255,41 @@ AC_CONFIG_FILES([
|
|||||||
include/libdivecomputer/Makefile
|
include/libdivecomputer/Makefile
|
||||||
include/libdivecomputer/version.h
|
include/libdivecomputer/version.h
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libdivecomputer.rc
|
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/doxygen.cfg
|
doc/doxygen.cfg
|
||||||
doc/man/Makefile
|
doc/man/Makefile
|
||||||
examples/Makefile
|
examples/Makefile
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
AC_MSG_NOTICE([
|
||||||
|
$PACKAGE $VERSION
|
||||||
|
===============
|
||||||
|
|
||||||
|
Compiler:
|
||||||
|
|
||||||
|
CC : $CC
|
||||||
|
CFLAGS : $CFLAGS
|
||||||
|
LDFLAGS : $LDFLAGS
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
Logging : $enable_logging
|
||||||
|
Pseudo terminal : $enable_pty
|
||||||
|
Example applications : $enable_examples
|
||||||
|
Documentation : $enable_doc
|
||||||
|
|
||||||
|
Transports:
|
||||||
|
|
||||||
|
Serial : $transport_serial
|
||||||
|
USB : $transport_usb
|
||||||
|
USBHID : $transport_usbhid
|
||||||
|
IrDA : $transport_irda
|
||||||
|
Bluetooth : $transport_bluetooth
|
||||||
|
BLE : $transport_ble
|
||||||
|
|
||||||
|
Building:
|
||||||
|
|
||||||
|
Type 'make' to compile $PACKAGE.
|
||||||
|
|
||||||
|
Type 'make install' to install $PACKAGE.
|
||||||
|
])
|
||||||
|
|||||||
56
contrib/README
Normal file
56
contrib/README
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
Alternative build systems
|
||||||
|
=========================
|
||||||
|
|
||||||
|
The autotools based build system is the official build system for the
|
||||||
|
libdivecomputer project. But for convenience, a few alternative build systems
|
||||||
|
are available as well. Unfortunately, these builds systems require a few extra
|
||||||
|
steps to generate some header files.
|
||||||
|
|
||||||
|
If you have access to a UNIX build system (for example a Linux virtual machine,
|
||||||
|
MinGW, Cygwin or the Windows Subsystem for Linux), you can use the autotools
|
||||||
|
build system to generate those files:
|
||||||
|
|
||||||
|
$ autoreconf --install --force
|
||||||
|
$ ./configure
|
||||||
|
$ make -C src revision.h
|
||||||
|
|
||||||
|
Alternative, you can generate those files manually. First, create the version.h
|
||||||
|
file from the version.h.in template:
|
||||||
|
|
||||||
|
$ cp include/libdivecomputer/version.h.in include/libdivecomputer/version.h
|
||||||
|
|
||||||
|
and replace all the @DC_VERSION@ placeholders with the values defined in the
|
||||||
|
configure.ac file.
|
||||||
|
|
||||||
|
Next, generate the revision.h file:
|
||||||
|
|
||||||
|
$ echo "#define DC_VERSION_REVISION \"$(git rev-parse --verify HEAD)\"" > src/revision.h
|
||||||
|
|
||||||
|
The alternative build systems are ready to use now.
|
||||||
|
|
||||||
|
Visual Studio
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The Visual Studio project file can be opened in the IDE, or build directly from
|
||||||
|
the command-line:
|
||||||
|
|
||||||
|
msbuild -m -p:Platform=x86|x64 -p:Configuration=Debug|Release contrib/msvc/libdivecomputer.vcxproj
|
||||||
|
|
||||||
|
Android NDK
|
||||||
|
-----------
|
||||||
|
|
||||||
|
$ANDROID_NDK/ndk-build -C contrib/android NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk
|
||||||
|
|
||||||
|
Linux udev rules
|
||||||
|
================
|
||||||
|
|
||||||
|
For dive computers using USB or USB HID communication, regular users typically
|
||||||
|
don't have the necessary permissions to access the device nodes. This can be
|
||||||
|
fixed with some udev rules.
|
||||||
|
|
||||||
|
Install the udev rules, and reload them:
|
||||||
|
|
||||||
|
$ sudo cp contrib/udev/libdivecomputer.rules /etc/udev/rules.d/
|
||||||
|
$ sudo udevadm control --reload
|
||||||
|
|
||||||
|
Note: the provided udev rules assume the user is in the plugdev group.
|
||||||
148
contrib/android/Android.mk
Normal file
148
contrib/android/Android.mk
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
LOCAL_PATH := $(call my-dir)/../..
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := libdivecomputer
|
||||||
|
LOCAL_CFLAGS := -DENABLE_LOGGING -DHAVE_VERSION_SUFFIX -DHAVE_PTHREAD_H -DHAVE_STRERROR_R -DHAVE_CLOCK_GETTIME -DHAVE_LOCALTIME_R -DHAVE_GMTIME_R -DHAVE_TIMEGM -DHAVE_STRUCT_TM_TM_GMTOFF
|
||||||
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
src/aes.c \
|
||||||
|
src/array.c \
|
||||||
|
src/atomics_cobalt.c \
|
||||||
|
src/atomics_cobalt_parser.c \
|
||||||
|
src/bluetooth.c \
|
||||||
|
src/buffer.c \
|
||||||
|
src/checksum.c \
|
||||||
|
src/citizen_aqualand.c \
|
||||||
|
src/citizen_aqualand_parser.c \
|
||||||
|
src/cochran_commander.c \
|
||||||
|
src/cochran_commander_parser.c \
|
||||||
|
src/common.c \
|
||||||
|
src/context.c \
|
||||||
|
src/cressi_edy.c \
|
||||||
|
src/cressi_edy_parser.c \
|
||||||
|
src/cressi_goa.c \
|
||||||
|
src/cressi_goa_parser.c \
|
||||||
|
src/cressi_leonardo.c \
|
||||||
|
src/cressi_leonardo_parser.c \
|
||||||
|
src/custom.c \
|
||||||
|
src/datetime.c \
|
||||||
|
src/deepblu_cosmiq.c \
|
||||||
|
src/deepblu_cosmiq_parser.c \
|
||||||
|
src/deepsix_excursion.c \
|
||||||
|
src/deepsix_excursion_parser.c \
|
||||||
|
src/descriptor.c \
|
||||||
|
src/device.c \
|
||||||
|
src/diverite_nitekq.c \
|
||||||
|
src/diverite_nitekq_parser.c \
|
||||||
|
src/divesoft_freedom.c \
|
||||||
|
src/divesoft_freedom_parser.c \
|
||||||
|
src/divesystem_idive.c \
|
||||||
|
src/divesystem_idive_parser.c \
|
||||||
|
src/hdlc.c \
|
||||||
|
src/hw_frog.c \
|
||||||
|
src/hw_ostc3.c \
|
||||||
|
src/hw_ostc.c \
|
||||||
|
src/hw_ostc_parser.c \
|
||||||
|
src/ihex.c \
|
||||||
|
src/iostream.c \
|
||||||
|
src/irda.c \
|
||||||
|
src/iterator.c \
|
||||||
|
src/liquivision_lynx.c \
|
||||||
|
src/liquivision_lynx_parser.c \
|
||||||
|
src/mares_common.c \
|
||||||
|
src/mares_darwin.c \
|
||||||
|
src/mares_darwin_parser.c \
|
||||||
|
src/mares_iconhd.c \
|
||||||
|
src/mares_iconhd_parser.c \
|
||||||
|
src/mares_nemo.c \
|
||||||
|
src/mares_nemo_parser.c \
|
||||||
|
src/mares_puck.c \
|
||||||
|
src/mclean_extreme.c \
|
||||||
|
src/mclean_extreme_parser.c \
|
||||||
|
src/oceanic_atom2.c \
|
||||||
|
src/oceanic_atom2_parser.c \
|
||||||
|
src/oceanic_common.c \
|
||||||
|
src/oceanic_veo250.c \
|
||||||
|
src/oceanic_veo250_parser.c \
|
||||||
|
src/oceanic_vtpro.c \
|
||||||
|
src/oceanic_vtpro_parser.c \
|
||||||
|
src/oceans_s1.c \
|
||||||
|
src/oceans_s1_common.c \
|
||||||
|
src/oceans_s1_parser.c \
|
||||||
|
src/packet.c \
|
||||||
|
src/parser.c \
|
||||||
|
src/pelagic_i330r.c \
|
||||||
|
src/platform.c \
|
||||||
|
src/rbstream.c \
|
||||||
|
src/reefnet_sensus.c \
|
||||||
|
src/reefnet_sensus_parser.c \
|
||||||
|
src/reefnet_sensuspro.c \
|
||||||
|
src/reefnet_sensuspro_parser.c \
|
||||||
|
src/reefnet_sensusultra.c \
|
||||||
|
src/reefnet_sensusultra_parser.c \
|
||||||
|
src/ringbuffer.c \
|
||||||
|
src/seac_screen.c \
|
||||||
|
src/seac_screen_parser.c \
|
||||||
|
src/serial_posix.c \
|
||||||
|
src/shearwater_common.c \
|
||||||
|
src/shearwater_petrel.c \
|
||||||
|
src/shearwater_predator.c \
|
||||||
|
src/shearwater_predator_parser.c \
|
||||||
|
src/socket.c \
|
||||||
|
src/sporasub_sp2.c \
|
||||||
|
src/sporasub_sp2_parser.c \
|
||||||
|
src/suunto_common2.c \
|
||||||
|
src/suunto_common.c \
|
||||||
|
src/suunto_d9.c \
|
||||||
|
src/suunto_d9_parser.c \
|
||||||
|
src/suunto_eon.c \
|
||||||
|
src/suunto_eon_parser.c \
|
||||||
|
src/suunto_eonsteel.c \
|
||||||
|
src/suunto_eonsteel_parser.c \
|
||||||
|
src/suunto_solution.c \
|
||||||
|
src/suunto_solution_parser.c \
|
||||||
|
src/suunto_vyper2.c \
|
||||||
|
src/suunto_vyper.c \
|
||||||
|
src/suunto_vyper_parser.c \
|
||||||
|
src/tecdiving_divecomputereu.c \
|
||||||
|
src/tecdiving_divecomputereu_parser.c \
|
||||||
|
src/timer.c \
|
||||||
|
src/usb.c \
|
||||||
|
src/usbhid.c \
|
||||||
|
src/uwatec_aladin.c \
|
||||||
|
src/uwatec_memomouse.c \
|
||||||
|
src/uwatec_memomouse_parser.c \
|
||||||
|
src/uwatec_smart.c \
|
||||||
|
src/uwatec_smart_parser.c \
|
||||||
|
src/version.c \
|
||||||
|
src/zeagle_n2ition3.c \
|
||||||
|
src/field-cache.c \
|
||||||
|
src/usb_storage.c \
|
||||||
|
src/garmin.c \
|
||||||
|
src/garmin_parser.c
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := dctool
|
||||||
|
LOCAL_SHARED_LIBRARIES := libdivecomputer
|
||||||
|
LOCAL_CFLAGS := -DHAVE_UNISTD_H -DHAVE_GETOPT_H -DHAVE_GETOPT_LONG -DHAVE_DECL_OPTRESET=1
|
||||||
|
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
examples/common.c \
|
||||||
|
examples/dctool.c \
|
||||||
|
examples/dctool_download.c \
|
||||||
|
examples/dctool_dump.c \
|
||||||
|
examples/dctool_fwupdate.c \
|
||||||
|
examples/dctool_help.c \
|
||||||
|
examples/dctool_list.c \
|
||||||
|
examples/dctool_parse.c \
|
||||||
|
examples/dctool_read.c \
|
||||||
|
examples/dctool_scan.c \
|
||||||
|
examples/dctool_timesync.c \
|
||||||
|
examples/dctool_version.c \
|
||||||
|
examples/dctool_write.c \
|
||||||
|
examples/output.c \
|
||||||
|
examples/output_raw.c \
|
||||||
|
examples/output_xml.c \
|
||||||
|
examples/utils.c
|
||||||
|
include $(BUILD_EXECUTABLE)
|
||||||
408
contrib/msvc/libdivecomputer.vcxproj
Normal file
408
contrib/msvc/libdivecomputer.vcxproj
Normal file
@ -0,0 +1,408 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{CEA7215A-D6B5-4840-8086-3C854F371997}</ProjectGuid>
|
||||||
|
<RootNamespace>libdivecomputer</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)$(PlatformTarget)\$(Configuration)\bin\</OutDir>
|
||||||
|
<IntDir>$(PlatformTarget)\$(Configuration)\obj\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)$(PlatformTarget)\$(Configuration)\bin\</OutDir>
|
||||||
|
<IntDir>$(PlatformTarget)\$(Configuration)\obj\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)$(PlatformTarget)\$(Configuration)\bin\</OutDir>
|
||||||
|
<IntDir>$(PlatformTarget)\$(Configuration)\obj\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)$(PlatformTarget)\$(Configuration)\bin\</OutDir>
|
||||||
|
<IntDir>$(PlatformTarget)\$(Configuration)\obj\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBDIVECOMPUTER_EXPORTS;ENABLE_LOGGING;HAVE_VERSION_SUFFIX;HAVE_AF_IRDA_H;HAVE_WS2BTH_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader />
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<ModuleDefinitionFile>$(OutDir)libdivecomputer.def</ModuleDefinitionFile>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
</Link>
|
||||||
|
<ResourceCompile>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBDIVECOMPUTER_EXPORTS;ENABLE_LOGGING;HAVE_VERSION_SUFFIX;HAVE_AF_IRDA_H;HAVE_WS2BTH_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<ModuleDefinitionFile>$(OutDir)libdivecomputer.def</ModuleDefinitionFile>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
</Link>
|
||||||
|
<ResourceCompile>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBDIVECOMPUTER_EXPORTS;ENABLE_LOGGING;HAVE_VERSION_SUFFIX;HAVE_AF_IRDA_H;HAVE_WS2BTH_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeader />
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<ModuleDefinitionFile>$(OutDir)libdivecomputer.def</ModuleDefinitionFile>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
</Link>
|
||||||
|
<ResourceCompile>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBDIVECOMPUTER_EXPORTS;ENABLE_LOGGING;HAVE_VERSION_SUFFIX;HAVE_AF_IRDA_H;HAVE_WS2BTH_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<ModuleDefinitionFile>$(OutDir)libdivecomputer.def</ModuleDefinitionFile>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
</Link>
|
||||||
|
<ResourceCompile>
|
||||||
|
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\src\aes.c" />
|
||||||
|
<ClCompile Include="..\..\src\array.c" />
|
||||||
|
<ClCompile Include="..\..\src\atomics_cobalt.c" />
|
||||||
|
<ClCompile Include="..\..\src\atomics_cobalt_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\bluetooth.c" />
|
||||||
|
<ClCompile Include="..\..\src\buffer.c" />
|
||||||
|
<ClCompile Include="..\..\src\checksum.c" />
|
||||||
|
<ClCompile Include="..\..\src\citizen_aqualand.c" />
|
||||||
|
<ClCompile Include="..\..\src\citizen_aqualand_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\cochran_commander.c" />
|
||||||
|
<ClCompile Include="..\..\src\cochran_commander_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\common.c" />
|
||||||
|
<ClCompile Include="..\..\src\context.c" />
|
||||||
|
<ClCompile Include="..\..\src\cressi_edy.c" />
|
||||||
|
<ClCompile Include="..\..\src\cressi_edy_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\cressi_goa.c" />
|
||||||
|
<ClCompile Include="..\..\src\cressi_goa_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\cressi_leonardo.c" />
|
||||||
|
<ClCompile Include="..\..\src\cressi_leonardo_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\custom.c" />
|
||||||
|
<ClCompile Include="..\..\src\datetime.c" />
|
||||||
|
<ClCompile Include="..\..\src\deepblu_cosmiq.c" />
|
||||||
|
<ClCompile Include="..\..\src\deepblu_cosmiq_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\deepsix_excursion.c" />
|
||||||
|
<ClCompile Include="..\..\src\deepsix_excursion_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\descriptor.c" />
|
||||||
|
<ClCompile Include="..\..\src\device.c" />
|
||||||
|
<ClCompile Include="..\..\src\diverite_nitekq.c" />
|
||||||
|
<ClCompile Include="..\..\src\diverite_nitekq_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\divesoft_freedom.c" />
|
||||||
|
<ClCompile Include="..\..\src\divesoft_freedom_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\divesystem_idive.c" />
|
||||||
|
<ClCompile Include="..\..\src\divesystem_idive_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\hdlc.c" />
|
||||||
|
<ClCompile Include="..\..\src\hw_frog.c" />
|
||||||
|
<ClCompile Include="..\..\src\hw_ostc.c" />
|
||||||
|
<ClCompile Include="..\..\src\hw_ostc3.c" />
|
||||||
|
<ClCompile Include="..\..\src\hw_ostc_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\ihex.c" />
|
||||||
|
<ClCompile Include="..\..\src\iostream.c" />
|
||||||
|
<ClCompile Include="..\..\src\irda.c" />
|
||||||
|
<ClCompile Include="..\..\src\iterator.c" />
|
||||||
|
<ClCompile Include="..\..\src\liquivision_lynx.c" />
|
||||||
|
<ClCompile Include="..\..\src\liquivision_lynx_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_common.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_darwin.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_darwin_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_iconhd.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_iconhd_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_nemo.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_nemo_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\mares_puck.c" />
|
||||||
|
<ClCompile Include="..\..\src\mclean_extreme.c" />
|
||||||
|
<ClCompile Include="..\..\src\mclean_extreme_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_atom2.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_atom2_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_common.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_veo250.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_veo250_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_vtpro.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceanic_vtpro_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceans_s1.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceans_s1_common.c" />
|
||||||
|
<ClCompile Include="..\..\src\oceans_s1_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\packet.c" />
|
||||||
|
<ClCompile Include="..\..\src\parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\pelagic_i330r.c" />
|
||||||
|
<ClCompile Include="..\..\src\platform.c" />
|
||||||
|
<ClCompile Include="..\..\src\rbstream.c" />
|
||||||
|
<ClCompile Include="..\..\src\reefnet_sensus.c" />
|
||||||
|
<ClCompile Include="..\..\src\reefnet_sensuspro.c" />
|
||||||
|
<ClCompile Include="..\..\src\reefnet_sensuspro_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\reefnet_sensusultra.c" />
|
||||||
|
<ClCompile Include="..\..\src\reefnet_sensusultra_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\reefnet_sensus_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\ringbuffer.c" />
|
||||||
|
<ClCompile Include="..\..\src\seac_screen.c" />
|
||||||
|
<ClCompile Include="..\..\src\seac_screen_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\serial_win32.c" />
|
||||||
|
<ClCompile Include="..\..\src\shearwater_common.c" />
|
||||||
|
<ClCompile Include="..\..\src\shearwater_petrel.c" />
|
||||||
|
<ClCompile Include="..\..\src\shearwater_predator.c" />
|
||||||
|
<ClCompile Include="..\..\src\shearwater_predator_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\socket.c" />
|
||||||
|
<ClCompile Include="..\..\src\sporasub_sp2.c" />
|
||||||
|
<ClCompile Include="..\..\src\sporasub_sp2_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_common.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_common2.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_d9.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_d9_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_eon.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_eonsteel.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_eonsteel_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_eon_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_solution.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_solution_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_vyper.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_vyper2.c" />
|
||||||
|
<ClCompile Include="..\..\src\suunto_vyper_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\tecdiving_divecomputereu.c" />
|
||||||
|
<ClCompile Include="..\..\src\tecdiving_divecomputereu_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\timer.c" />
|
||||||
|
<ClCompile Include="..\..\src\usb.c" />
|
||||||
|
<ClCompile Include="..\..\src\usbhid.c" />
|
||||||
|
<ClCompile Include="..\..\src\uwatec_aladin.c" />
|
||||||
|
<ClCompile Include="..\..\src\uwatec_memomouse.c" />
|
||||||
|
<ClCompile Include="..\..\src\uwatec_memomouse_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\uwatec_smart.c" />
|
||||||
|
<ClCompile Include="..\..\src\uwatec_smart_parser.c" />
|
||||||
|
<ClCompile Include="..\..\src\version.c" />
|
||||||
|
<ClCompile Include="..\..\src\zeagle_n2ition3.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\atomics_cobalt.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\ble.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\bluetooth.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\buffer.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\common.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\context.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\custom.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\datetime.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\descriptor.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\device.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\divesystem_idive.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\hw_frog.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\hw_ostc.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\hw_ostc3.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\ioctl.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\iostream.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\irda.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\iterator.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\oceanic_atom2.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\oceanic_veo250.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\oceanic_vtpro.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\parser.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\reefnet_sensus.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\reefnet_sensuspro.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\reefnet_sensusultra.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\serial.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\suunto_d9.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\suunto_eon.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\suunto_vyper2.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\units.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\usb.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\usbhid.h" />
|
||||||
|
<ClInclude Include="..\..\include\libdivecomputer\version.h" />
|
||||||
|
<ClInclude Include="..\..\src\aes.h" />
|
||||||
|
<ClInclude Include="..\..\src\array.h" />
|
||||||
|
<ClInclude Include="..\..\src\atomics_cobalt.h" />
|
||||||
|
<ClInclude Include="..\..\src\checksum.h" />
|
||||||
|
<ClInclude Include="..\..\src\citizen_aqualand.h" />
|
||||||
|
<ClInclude Include="..\..\src\cochran_commander.h" />
|
||||||
|
<ClInclude Include="..\..\src\common-private.h" />
|
||||||
|
<ClInclude Include="..\..\src\context-private.h" />
|
||||||
|
<ClInclude Include="..\..\src\cressi_edy.h" />
|
||||||
|
<ClInclude Include="..\..\src\cressi_goa.h" />
|
||||||
|
<ClInclude Include="..\..\src\cressi_leonardo.h" />
|
||||||
|
<ClInclude Include="..\..\src\deepblu_cosmiq.h" />
|
||||||
|
<ClInclude Include="..\..\src\deepsix_excursion.h" />
|
||||||
|
<ClInclude Include="..\..\src\device-private.h" />
|
||||||
|
<ClInclude Include="..\..\src\diverite_nitekq.h" />
|
||||||
|
<ClInclude Include="..\..\src\divesoft_freedom.h" />
|
||||||
|
<ClInclude Include="..\..\src\divesystem_idive.h" />
|
||||||
|
<ClInclude Include="..\..\src\hdlc.h" />
|
||||||
|
<ClInclude Include="..\..\src\hw_frog.h" />
|
||||||
|
<ClInclude Include="..\..\src\hw_ostc.h" />
|
||||||
|
<ClInclude Include="..\..\src\hw_ostc3.h" />
|
||||||
|
<ClInclude Include="..\..\src\ihex.h" />
|
||||||
|
<ClInclude Include="..\..\src\iostream-private.h" />
|
||||||
|
<ClInclude Include="..\..\src\iterator-private.h" />
|
||||||
|
<ClInclude Include="..\..\src\liquivision_lynx.h" />
|
||||||
|
<ClInclude Include="..\..\src\mares_common.h" />
|
||||||
|
<ClInclude Include="..\..\src\mares_darwin.h" />
|
||||||
|
<ClInclude Include="..\..\src\mares_iconhd.h" />
|
||||||
|
<ClInclude Include="..\..\src\mares_nemo.h" />
|
||||||
|
<ClInclude Include="..\..\src\mares_puck.h" />
|
||||||
|
<ClInclude Include="..\..\src\mclean_extreme.h" />
|
||||||
|
<ClInclude Include="..\..\src\oceanic_atom2.h" />
|
||||||
|
<ClInclude Include="..\..\src\oceanic_common.h" />
|
||||||
|
<ClInclude Include="..\..\src\oceanic_veo250.h" />
|
||||||
|
<ClInclude Include="..\..\src\oceanic_vtpro.h" />
|
||||||
|
<ClInclude Include="..\..\src\oceans_s1.h" />
|
||||||
|
<ClInclude Include="..\..\src\oceans_s1_common.h" />
|
||||||
|
<ClInclude Include="..\..\src\packet.h" />
|
||||||
|
<ClInclude Include="..\..\src\parser-private.h" />
|
||||||
|
<ClInclude Include="..\..\src\pelagic_i330r.h" />
|
||||||
|
<ClInclude Include="..\..\src\platform.h" />
|
||||||
|
<ClInclude Include="..\..\src\rbstream.h" />
|
||||||
|
<ClInclude Include="..\..\src\reefnet_sensus.h" />
|
||||||
|
<ClInclude Include="..\..\src\reefnet_sensuspro.h" />
|
||||||
|
<ClInclude Include="..\..\src\reefnet_sensusultra.h" />
|
||||||
|
<ClInclude Include="..\..\src\revision.h" />
|
||||||
|
<ClInclude Include="..\..\src\ringbuffer.h" />
|
||||||
|
<ClInclude Include="..\..\src\seac_screen.h" />
|
||||||
|
<ClInclude Include="..\..\src\shearwater_common.h" />
|
||||||
|
<ClInclude Include="..\..\src\shearwater_petrel.h" />
|
||||||
|
<ClInclude Include="..\..\src\shearwater_predator.h" />
|
||||||
|
<ClInclude Include="..\..\src\socket.h" />
|
||||||
|
<ClInclude Include="..\..\src\sporasub_sp2.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_common.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_common2.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_d9.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_eon.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_eonsteel.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_solution.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_vyper.h" />
|
||||||
|
<ClInclude Include="..\..\src\suunto_vyper2.h" />
|
||||||
|
<ClInclude Include="..\..\src\tecdiving_divecomputereu.h" />
|
||||||
|
<ClInclude Include="..\..\src\timer.h" />
|
||||||
|
<ClInclude Include="..\..\src\uwatec_aladin.h" />
|
||||||
|
<ClInclude Include="..\..\src\uwatec_memomouse.h" />
|
||||||
|
<ClInclude Include="..\..\src\uwatec_smart.h" />
|
||||||
|
<ClInclude Include="..\..\src\zeagle_n2ition3.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="..\..\src\libdivecomputer.rc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="..\..\src\libdivecomputer.symbols">
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo EXPORTS > "$(OutDir)libdivecomputer.def" && type "%(FullPath)" >> "$(OutDir)libdivecomputer.def"</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">echo EXPORTS > "$(OutDir)libdivecomputer.def" && type "%(FullPath)" >> "$(OutDir)libdivecomputer.def"</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)libdivecomputer.def;%(Outputs)</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)libdivecomputer.def;%(Outputs)</Outputs>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">echo EXPORTS > "$(OutDir)libdivecomputer.def" && type "%(FullPath)" >> "$(OutDir)libdivecomputer.def"</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">echo EXPORTS > "$(OutDir)libdivecomputer.def" && type "%(FullPath)" >> "$(OutDir)libdivecomputer.def"</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)libdivecomputer.def;%(Outputs)</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)libdivecomputer.def;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
17
contrib/msvc/libdivecomputer.vcxproj.filters
Normal file
17
contrib/msvc/libdivecomputer.vcxproj.filters
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
35
contrib/udev/libdivecomputer.rules
Normal file
35
contrib/udev/libdivecomputer.rules
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Atomic Aquatics Cobalt
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="0471", ATTR{idProduct}=="0888", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0471", ATTRS{idProduct}=="0888", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Suunto EON Steel
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="1493", ATTR{idProduct}=="0030", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1493", ATTRS{idProduct}=="0030", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Suunto EON Core
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="1493", ATTR{idProduct}=="0033", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1493", ATTRS{idProduct}=="0033", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Suunto D5
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="1493", ATTR{idProduct}=="0035", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1493", ATTRS{idProduct}=="0035", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Suunto EON Steel Black
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="1493", ATTR{idProduct}=="0036", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1493", ATTRS{idProduct}=="0036", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Scubapro G2
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="2e6c", ATTR{idProduct}=="3201", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2e6c", ATTRS{idProduct}=="3201", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Scubapro G2 Console
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="2e6c", ATTR{idProduct}=="3211", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2e6c", ATTRS{idProduct}=="3211", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Scubapro G2 HUD
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="2e6c", ATTR{idProduct}=="4201", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2e6c", ATTRS{idProduct}=="4201", GROUP="plugdev"
|
||||||
|
|
||||||
|
# Scubapro Aladin Square
|
||||||
|
SUBSYSTEM=="usb", ATTR{idVendor}=="c251", ATTR{idProduct}=="2006", GROUP="plugdev"
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="c251", ATTRS{idProduct}=="2006", GROUP="plugdev"
|
||||||
102
doc/McLeanExtreme-wire-format.txt
Normal file
102
doc/McLeanExtreme-wire-format.txt
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
|
||||||
|
COMPUTER CONFIGURATION
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The computer configuration (including gradient factors, gasses etc) is read and written as a single, fixed size block.
|
||||||
|
|
||||||
|
Config section
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Computer configuration and individual dive configurations both start with identical generic configuration sections of length 0x002d bytes
|
||||||
|
|
||||||
|
0x0000 uint8_t format ZERO
|
||||||
|
0x0001 uint8_t gas[0]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x0002 uint8_t gas[0]_pHe helium content [0, 100] (percent)
|
||||||
|
0x0003 uint8_t gas[1]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x0004 uint8_t gas[1]_pHe helium content [0, 100] (percent)
|
||||||
|
0x0005 uint8_t gas[2]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x0006 uint8_t gas[2]_pHe helium content [0, 100] (percent)
|
||||||
|
0x0007 uint8_t gas[3]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x0008 uint8_t gas[3]_pHe helium content [0, 100] (percent)
|
||||||
|
0x0009 uint8_t gas[4]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x000a uint8_t gas[4]_pHe helium content [0, 100] (percent)
|
||||||
|
0x000b uint8_t gas[5]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x000c uint8_t gas[5]_pHe helium content [0, 100] (percent)
|
||||||
|
0x000d uint8_t gas[6]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x000e uint8_t gas[6]_pHe helium content [0, 100] (percent)
|
||||||
|
0x000f uint8_t gas[7]_pO2 oxygen content [0, 100] (percent)
|
||||||
|
0x0010 uint8_t gas[7]_pHe helium content [0, 100] (percent)
|
||||||
|
0x0011 uint8_t gas_mask bitwise mask of enabled gasses
|
||||||
|
0x0012 uint8_t gas_active current gas index
|
||||||
|
0x0013 uint8_t setpoint[0] (centibar)
|
||||||
|
0x0014 uint8_t setpoint[1] (centibar)
|
||||||
|
0x0015 uint8_t setpoint[2] (centibar)
|
||||||
|
0x0016 uint8_t setpoint_mask bitwise mask of enabled setpoints
|
||||||
|
0x0017 uint8_t setpoint_active current setpoint index
|
||||||
|
0x0018 bool metric display units [true: metric, false: imperial]
|
||||||
|
0x0019 uint16_t name dive number
|
||||||
|
0x001b uint8_t laststop_index last stop depth enumeration [0, 3] (metric: 3m, 4m, 5m, 6m imperial: 10ft, 13ft, 16ft, 18ft)
|
||||||
|
0x001c uint16_t Vasc ascent speed limit (millibar/minute)
|
||||||
|
0x001e uint16_t Psurf surface pressure (millibar)
|
||||||
|
0x0020 uint8_t gfs_index predefined gf enumeration [0, 5] (only used in rec mode)
|
||||||
|
0x0021 uint8_t gf lo custom gf low [0, 255] (ignored in rec mode)
|
||||||
|
0x0022 uint8_t gf hi custom gf high [0, 255] (ignored in rec mode)
|
||||||
|
0x0023 uint8_t density_index predefined water density enumeration [0: 1.000, 1: 1.020, 2: 1.030]
|
||||||
|
0x0024 uint16_t ppN2_limit nitrogen partial pressure alert (millibars)
|
||||||
|
0x0026 uint16_t ppO2_limit oxygen partial pressure alert (millibars)
|
||||||
|
0x0028 uint16_t ppO2_bottomlimit oxygen partial pressure alert (millibars)
|
||||||
|
0x002a uint16_t density_limit (units ??)
|
||||||
|
0x002c uint8_t operatingmode operating mode enumeration [0: OC rec, 1: OC tec, 2: CC, 3: Gauge]
|
||||||
|
|
||||||
|
Computer configuration
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The computer configuration is read and written as a single block of 0x006a bytes formatted thusly:
|
||||||
|
|
||||||
|
<config section as above>
|
||||||
|
0x002d +
|
||||||
|
0x0000 int64_t epoch internal adjustment used to set computer time
|
||||||
|
0x0008 uint16_t inactive_timeout number of seconds of inactivity before the computer turns itself off
|
||||||
|
0x000a uint16_t dive_timeout number of seconds on surface before declaring dive finished
|
||||||
|
0x000c uint16_t log_period number of seconds between dive samples
|
||||||
|
0x000e uint16_t log_timeout not used
|
||||||
|
0x0010 uint16_t brightness_timeout number of seconds of inactivity before the computer dims the screen
|
||||||
|
0x0012 uint8_t brightness dimmed screen brightness [0, 10]
|
||||||
|
0x0013 uint8_t colorscheme computer color scheme enumeration [0, 12]
|
||||||
|
0x0014 uint8_t language computer display language enumeration [0, 1]
|
||||||
|
0x0015 uint8_t batterytype user-defined battery type enumeration [0, 4]
|
||||||
|
0x0016 uint16_t batterytime computer up time since last battery change
|
||||||
|
0x0018 <48 bytes> compass calibration data (cannot be written)
|
||||||
|
0x0048 uint8_t button_sensitivity piezo button sensitivity [0, 9]
|
||||||
|
0x0049 uint8_t orientation screen and button orientation
|
||||||
|
0x004a char[32] diver_name diver name (guaranteed at least one nul terminator)
|
||||||
|
0x006a
|
||||||
|
|
||||||
|
Dive configuration
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Individual dives are read as a single block of 0x002d bytes formatted thusly:
|
||||||
|
|
||||||
|
<config section as above>
|
||||||
|
0x002d +
|
||||||
|
0x0000 uint32_t log_start log start (seconds since midnight 1 jan 2000)
|
||||||
|
0x0004 uint32_t dive_start dive start (seconds since midnight 1 jan 2000)
|
||||||
|
0x0008 uint32_t dive_end dive end (seconds since midnight 1 jan 2000)
|
||||||
|
0x000c uint32_t log_end log end (seconds since midnight 1 jan 2000)
|
||||||
|
0x0010 uint8_t temp_min minimum ambient temperature (degrees centigrade)
|
||||||
|
0x0011 uint8_t temp_max maximum ambient temperature (degrees centigrade)
|
||||||
|
0x0012 uint16_t pO2_min minimum inspired oxygen partial pressure during the dive (millibars)
|
||||||
|
0x0014 uint16_t pO2_max maximum inspired oxygen partial pressure during the dive (millibars)
|
||||||
|
0x0016 uint16_t Pmax maximum ambient pressure during the dive (millibars)
|
||||||
|
0x0018 uint16_t Pav average ambient pressure during the dive (millibars)
|
||||||
|
0x001a uint32_t ISS integral supersaturation of dive mbar*minutes
|
||||||
|
0x001e uint16_t CNS_start CNS at start of dive (percent)
|
||||||
|
0x0020 uint16_t CNS_max maximum CNS encountered during the dive (percent)
|
||||||
|
0x0022 uint16_t OTU OTU dive
|
||||||
|
0x0024 uint16_t tndl shortest NDL calculated during dive (seconds)
|
||||||
|
0x0026 uint32_t tdeco longest decompression time calculated during dive (seconds)
|
||||||
|
0x002a uint8_t ndeco deepest decompression stop index calculated during dive (seconds)
|
||||||
|
0x002b uint16_t tdesat desaturation time calculated at end of dive (seconds)
|
||||||
|
0x002d
|
||||||
|
|
||||||
|
|
||||||
@ -14,8 +14,10 @@ MANPAGES = \
|
|||||||
dc_datetime_mktime.3 \
|
dc_datetime_mktime.3 \
|
||||||
dc_datetime_now.3 \
|
dc_datetime_now.3 \
|
||||||
dc_descriptor_free.3 \
|
dc_descriptor_free.3 \
|
||||||
|
dc_descriptor_get_model.3 \
|
||||||
dc_descriptor_get_product.3 \
|
dc_descriptor_get_product.3 \
|
||||||
dc_descriptor_get_vendor.3 \
|
dc_descriptor_get_vendor.3 \
|
||||||
|
dc_descriptor_get_transports.3 \
|
||||||
dc_descriptor_iterator.3 \
|
dc_descriptor_iterator.3 \
|
||||||
dc_device_close.3 \
|
dc_device_close.3 \
|
||||||
dc_device_foreach.3 \
|
dc_device_foreach.3 \
|
||||||
@ -30,8 +32,29 @@ MANPAGES = \
|
|||||||
dc_parser_get_field.3 \
|
dc_parser_get_field.3 \
|
||||||
dc_parser_new.3 \
|
dc_parser_new.3 \
|
||||||
dc_parser_samples_foreach.3 \
|
dc_parser_samples_foreach.3 \
|
||||||
dc_parser_set_data.3 \
|
dc_bluetooth_open.3 \
|
||||||
libdivecomputer.3
|
dc_bluetooth_iterator_new.3 \
|
||||||
|
dc_bluetooth_device_get_address.3 \
|
||||||
|
dc_bluetooth_device_get_name.3 \
|
||||||
|
dc_bluetooth_addr2str.3 \
|
||||||
|
dc_bluetooth_str2addr.3 \
|
||||||
|
dc_bluetooth_device_free.3 \
|
||||||
|
dc_usbhid_open.3 \
|
||||||
|
dc_usbhid_device_get_pid.3 \
|
||||||
|
dc_usbhid_device_get_vid.3 \
|
||||||
|
dc_usbhid_iterator_new.3 \
|
||||||
|
dc_usbhid_device_free.3 \
|
||||||
|
dc_serial_open.3 \
|
||||||
|
dc_serial_device_get_name.3 \
|
||||||
|
dc_serial_iterator_new.3 \
|
||||||
|
dc_serial_device_free.3 \
|
||||||
|
dc_irda_open.3 \
|
||||||
|
dc_irda_device_get_name.3 \
|
||||||
|
dc_irda_device_get_address.3 \
|
||||||
|
dc_irda_iterator_new.3 \
|
||||||
|
dc_irda_device_free.3 \
|
||||||
|
dc_iostream_close.3 \
|
||||||
|
libdivecomputer.3
|
||||||
|
|
||||||
HTMLPAGES = $(MANPAGES:%=%.html)
|
HTMLPAGES = $(MANPAGES:%=%.html)
|
||||||
|
|
||||||
|
|||||||
61
doc/man/dc_bluetooth_addr2str.3
Normal file
61
doc/man/dc_bluetooth_addr2str.3
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_ADDR2STR 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_addr2str
|
||||||
|
.Nd Convert a bluetooth address to a string.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft "const char*"
|
||||||
|
.Fo dc_bluetooth_addr2str
|
||||||
|
.Fa "dc_bluetooth_address_t address"
|
||||||
|
.Fa "char *str"
|
||||||
|
.Fa "size_t size"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Convert a bluetooth address to a string.
|
||||||
|
.Pp
|
||||||
|
The bluetooth address is formatted as XX:XX:XX:XX:XX:XX, where each XX is a
|
||||||
|
hexadecimal number specifying an octet of the 48-bit address.
|
||||||
|
The minimum size for the buffer is
|
||||||
|
.Dv DC_BLUETOOTH_SIZE
|
||||||
|
bytes.
|
||||||
|
.Pp
|
||||||
|
The reverse can be done with
|
||||||
|
.Xr dc_bluetooth_str2addr 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the bluetooth address represented as a string.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_bluetooth_str2addr 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
52
doc/man/dc_bluetooth_device_free.3
Normal file
52
doc/man/dc_bluetooth_device_free.3
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_DEVICE_FREE 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_device_free
|
||||||
|
.Nd Destroy the bluetooth device and free all resources.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft void
|
||||||
|
.Fo dc_bluetooth_device_free
|
||||||
|
.Fa "dc_bluetooth_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Destroy the bluetooth device and free all resources.
|
||||||
|
The bluetooth
|
||||||
|
.Fa device
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
69
doc/man/dc_bluetooth_device_get_address.3
Normal file
69
doc/man/dc_bluetooth_device_get_address.3
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_DEVICE_GET_ADDRESS 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_device_get_address
|
||||||
|
.Nd Get the address of a bluetooth device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft "dc_bluetooth_address_t"
|
||||||
|
.Fo dc_bluetooth_device_get_address
|
||||||
|
.Fa "dc_bluetooth_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the bluetooth device address of given bluetooth
|
||||||
|
.Fa device .
|
||||||
|
Required when opening transport communication with
|
||||||
|
.Xr dc_bluetooth_open 3 .
|
||||||
|
Requires a valid
|
||||||
|
.Fa device
|
||||||
|
of type
|
||||||
|
.Ft dc_bluetooth_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the bluetooth address of
|
||||||
|
.Fa device
|
||||||
|
as
|
||||||
|
.Ft dc_bluetooth_address_t
|
||||||
|
which is a 64bit integer holding the bluetooth address.
|
||||||
|
|
||||||
|
The address can be formatted as a string by using
|
||||||
|
.Xr dc_bluetooth_addr2str 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_bluetooth_open 3 ,
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 ,
|
||||||
|
.Xr dc_bluetooth_device_get_name 3 ,
|
||||||
|
.Xr dc_bluetooth_addr2str 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
61
doc/man/dc_bluetooth_device_get_name.3
Normal file
61
doc/man/dc_bluetooth_device_get_name.3
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_DEVICE_GET_NAME 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_device_get_name
|
||||||
|
.Nd Get the name of a bluetooth device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft "const char *"
|
||||||
|
.Fo dc_bluetooth_device_get_name
|
||||||
|
.Fa "dc_bluetooth_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the name of given bluetooth
|
||||||
|
.Fa device .
|
||||||
|
Used for displaying.
|
||||||
|
Requires a valid
|
||||||
|
.Fa bluetooth_device
|
||||||
|
of type
|
||||||
|
.Ft dc_bluetooth_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the bluetooth device of
|
||||||
|
.Fa device .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_bluetooth_open 3 ,
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 ,
|
||||||
|
.Xr dc_bluetooth_device_get_address 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
102
doc/man/dc_bluetooth_iterator_new.3
Normal file
102
doc/man/dc_bluetooth_iterator_new.3
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_ITERATOR_NEW 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_iterator_new
|
||||||
|
.Nd Create an iterator to enumerate the bluetooth devices.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_bluetooth_iterator_new
|
||||||
|
.Fa "dc_iterator_t **iterator"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Iterates through the available bluetooth devices which matches the given
|
||||||
|
.Fa descriptor .
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3
|
||||||
|
and a
|
||||||
|
.Fa descriptor
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_descriptor_iterator 3 .
|
||||||
|
.Pp
|
||||||
|
On returning
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the
|
||||||
|
.Fa iterator
|
||||||
|
will be set to an
|
||||||
|
.Ft dc_iterator_t
|
||||||
|
which can be used to iterate the available bluetooth devices using
|
||||||
|
.Xr dc_iterator_next 3 .
|
||||||
|
.Pp
|
||||||
|
The value type of the iterator is of type
|
||||||
|
.Ft dc_bluetooth_device_t .
|
||||||
|
This value can be used in functions to extract information about this specific bluetooth device, namely
|
||||||
|
.Xr dc_bluetooth_device_get_name 3
|
||||||
|
and
|
||||||
|
.Xr dc_bluetooth_device_get_address 3 .
|
||||||
|
When done the bluetooth device needs to be freed with
|
||||||
|
.Xr dc_bluetooth_device_free 3 .
|
||||||
|
.Pp
|
||||||
|
After iterating the
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success, or another
|
||||||
|
.Ft dc_status_t
|
||||||
|
code on failure.
|
||||||
|
|
||||||
|
On
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the returned
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed when done using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_usbhid_iterator_new 3 ,
|
||||||
|
.Xr dc_serial_iterator_new 3 ,
|
||||||
|
.Xr dc_irda_iterator_new 3 ,
|
||||||
|
.Xr dc_bluetooth_device_get_name 3 ,
|
||||||
|
.Xr dc_bluetooth_device_get_address 3 ,
|
||||||
|
.Xr dc_bluetooth_device_free 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
87
doc/man/dc_bluetooth_open.3
Normal file
87
doc/man/dc_bluetooth_open.3
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_OPEN 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_open
|
||||||
|
.Nd Opens an iostream for a bluetooth device
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_bluetooth_open
|
||||||
|
.Fa "dc_iostream_t **iostream"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "dc_bluetooth_address_t address"
|
||||||
|
.Fa "unsigned int port"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Opens an iostream for a bluetooth device.
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
a 48-bit bluetooth
|
||||||
|
.Fa address
|
||||||
|
given by
|
||||||
|
.Xr dc_bluetooth_iterator_new 3
|
||||||
|
together with
|
||||||
|
.Xr dc_bluetooth_device_get_address 3
|
||||||
|
or
|
||||||
|
.Xr dc_bluetooth_str2addr 3
|
||||||
|
and a bluetooth rfcomm
|
||||||
|
.Fa port
|
||||||
|
number (use 0 for autodetection).
|
||||||
|
.Pp
|
||||||
|
Upon returning
|
||||||
|
.Dv DC_STATUS_SUCCESS ,
|
||||||
|
the
|
||||||
|
.Fa iostream
|
||||||
|
pointer must be freed with
|
||||||
|
.Xr dc_iostream_close 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success or one of several error values on error.
|
||||||
|
On success, the
|
||||||
|
.Fa iostream
|
||||||
|
pointer is filled in with an open handle.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_iostream_close 3 ,
|
||||||
|
.Xr dc_serial_open 3 ,
|
||||||
|
.Xr dc_irda_open 3 ,
|
||||||
|
.Xr dc_usbhid_open 3 ,
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 ,
|
||||||
|
.Xr dc_bluetooth_device_get_address 3 ,
|
||||||
|
.Xr dc_bluetooth_str2addr 3 ,
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
58
doc/man/dc_bluetooth_str2addr.3
Normal file
58
doc/man/dc_bluetooth_str2addr.3
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_BLUETOOTH_STR2ADDR 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_bluetooth_str2addr
|
||||||
|
.Nd Convert a string to a bluetooth address.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/bluetooth.h
|
||||||
|
.Ft "dc_bluetooth_address_t"
|
||||||
|
.Fo dc_bluetooth_addr2str
|
||||||
|
.Fa "const char *address"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Convert a string to a bluetooth address.
|
||||||
|
.Pp
|
||||||
|
The string
|
||||||
|
.Fa address
|
||||||
|
is expected to be in the format XX:XX:XX:XX:XX:XX,
|
||||||
|
where each XX is a hexadecimal number specifying an octet of the 48-bit address.
|
||||||
|
.Pp
|
||||||
|
The reverse can be done with
|
||||||
|
.Xr dc_bluetooth_addr2str 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the bluetooth address represented as a 48-bit number.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_bluetooth_addr2str 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
@ -82,7 +82,7 @@ is
|
|||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_datetime_localtime 3 ,
|
.Xr dc_datetime_localtime 3 ,
|
||||||
.Xr dc_datetime_mktime 3 ,
|
.Xr dc_datetime_mktime 3 ,
|
||||||
.Xr dc_datetime_new 3
|
.Xr dc_datetime_now 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -82,7 +82,7 @@ is
|
|||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_datetime_gmtime 3 ,
|
.Xr dc_datetime_gmtime 3 ,
|
||||||
.Xr dc_datetime_mktime 3 ,
|
.Xr dc_datetime_mktime 3 ,
|
||||||
.Xr dc_datetime_new 3
|
.Xr dc_datetime_now 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -47,7 +47,7 @@ may not sanely be converted.
|
|||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_datetime_gmtime 3 ,
|
.Xr dc_datetime_gmtime 3 ,
|
||||||
.Xr dc_datetime_localtime 3 ,
|
.Xr dc_datetime_localtime 3 ,
|
||||||
.Xr dc_datetime_new 3
|
.Xr dc_datetime_now 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
.\"
|
.\"
|
||||||
.\" libdivecomputer
|
.\" libdivecomputer
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (C) 2017 Kristaps Dzonsons <kristaps@bsd.lv>
|
.\" Copyright (C) 2018 Kristaps Dzonsons <kristaps@bsd.lv>
|
||||||
.\"
|
.\"
|
||||||
.\" This library is free software; you can redistribute it and/or
|
.\" This library is free software; you can redistribute it and/or
|
||||||
.\" modify it under the terms of the GNU Lesser General Public
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
@ -18,42 +19,28 @@
|
|||||||
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
.\" MA 02110-1301 USA
|
.\" MA 02110-1301 USA
|
||||||
.\"
|
.\"
|
||||||
.Dd January 5, 2017
|
.Dd August 19, 2018
|
||||||
.Dt DC_PARSER_SET_DATA 3
|
.Dt DC_DESCRIPTOR_GET_MODEL 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm dc_parser_set_data
|
.Nm dc_descriptor_get_model
|
||||||
.Nd assigns parse data to a dive parser
|
.Nd get the model of a dive computer descriptor
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In libdivecomputer/parser.h
|
.In libdivecomputer/descriptor.h
|
||||||
.Ft dc_status_t
|
.Ft "unsigned int"
|
||||||
.Fo dc_parser_set_data
|
.Fo dc_descriptor_get_model
|
||||||
.Fa "dc_parser_t *parser"
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
.Fa "const unsigned char *data"
|
|
||||||
.Fa "unsigned int size"
|
|
||||||
.Fc
|
.Fc
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
Assigns the binary sequence
|
Gets the model number of a dive computer descriptor or 0 if none was
|
||||||
.Fa data
|
defined for the computer.
|
||||||
of length
|
0 is also a valid model number.
|
||||||
.Fa size
|
|
||||||
bytes to
|
|
||||||
.Fa parser ,
|
|
||||||
which was created with
|
|
||||||
.Xr dc_parser_new 3 .
|
|
||||||
How the data is parsed depends upon the values provided to
|
|
||||||
.Xr dc_parser_new 3 .
|
|
||||||
The data usually comes from the callback assigned to
|
|
||||||
.Xr dc_device_foreach 3 .
|
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
Returns
|
This returns the model number or 0 if none exists.
|
||||||
.Dv DC_STATUS_OK
|
|
||||||
on success and another code on failure.
|
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_device_foreach 3 ,
|
.Xr dc_descriptor_iterator 3
|
||||||
.Xr dc_parser_new 3
|
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
72
doc/man/dc_descriptor_get_transports.3
Normal file
72
doc/man/dc_descriptor_get_transports.3
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_DESCRIPTOR_GET_TRANSPORTS 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_descriptor_get_transports
|
||||||
|
.Nd Gets the transports supported by the given descriptor.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/descriptor.h
|
||||||
|
.Ft "unsigned int"
|
||||||
|
.Fo dc_descriptor_get_transports
|
||||||
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Gets the transports supported by the given
|
||||||
|
.Fa descriptor .
|
||||||
|
The
|
||||||
|
.Fa descriptor
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_descriptor_iterator 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns a union (bitwise OR) of the transports supported by the given
|
||||||
|
.Fa descriptor .
|
||||||
|
.Pp
|
||||||
|
The result is combination of
|
||||||
|
.Dv DC_TRANSPORT_USB ,
|
||||||
|
.Dv DC_TRANSPORT_USBHID ,
|
||||||
|
.Dv DC_TRANSPORT_BLE ,
|
||||||
|
.Dv DC_TRANSPORT_BLUETOOTH ,
|
||||||
|
.Dv DC_TRANSPORT_SERIAL ,
|
||||||
|
.Dv DC_TRANSPORT_IRDA
|
||||||
|
.Pp
|
||||||
|
To determine if a specific transport is supported use the following code
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
unsigned int transports = dc_descriptor_get_transports(descriptor);
|
||||||
|
if(transports & DC_TRANSPORT_USBHID) {
|
||||||
|
// Device supports USB HID as transport
|
||||||
|
}
|
||||||
|
.Ed
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_descriptor_iterator 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
@ -53,7 +53,7 @@ with
|
|||||||
Each dive invokes
|
Each dive invokes
|
||||||
.Fa callback
|
.Fa callback
|
||||||
with the dive data, which should be parsed with
|
with the dive data, which should be parsed with
|
||||||
.Xr dc_parser_set_data 3 ,
|
.Xr dc_parser_new 3 ,
|
||||||
and the binary fingerprint of the dive.
|
and the binary fingerprint of the dive.
|
||||||
The fingerprint can be used to record the newest dive and stop
|
The fingerprint can be used to record the newest dive and stop
|
||||||
processing (on subsequent invocations) when the same dive fingerprint is
|
processing (on subsequent invocations) when the same dive fingerprint is
|
||||||
@ -72,7 +72,7 @@ If
|
|||||||
returns zero, this will not be reflected in the return value (usually
|
returns zero, this will not be reflected in the return value (usually
|
||||||
.Dv DC_STATUS_SUCCESS ) .
|
.Dv DC_STATUS_SUCCESS ) .
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_parser_set_data 3
|
.Xr dc_parser_new 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
.\" MA 02110-1301 USA
|
.\" MA 02110-1301 USA
|
||||||
.\"
|
.\"
|
||||||
.Dd January 5, 2017
|
.Dd June 5, 2020
|
||||||
.Dt DC_DEVICE_OPEN 3
|
.Dt DC_DEVICE_OPEN 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -33,7 +33,7 @@
|
|||||||
.Fa "dc_device_t **device"
|
.Fa "dc_device_t **device"
|
||||||
.Fa "dc_context_t *context"
|
.Fa "dc_context_t *context"
|
||||||
.Fa "dc_descriptor_t *descriptor"
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
.Fa "const char *name"
|
.Fa "dc_iostream_t *iostream"
|
||||||
.Fc
|
.Fc
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
Open a dive computer device for processing.
|
Open a dive computer device for processing.
|
||||||
@ -45,19 +45,14 @@ a dive computer
|
|||||||
.Fa descriptor
|
.Fa descriptor
|
||||||
usually found by searching through
|
usually found by searching through
|
||||||
.Xr dc_descriptor_iterator 3 ,
|
.Xr dc_descriptor_iterator 3 ,
|
||||||
and a platform-specific device
|
and a
|
||||||
.Fa name
|
.Fa iostream
|
||||||
.Po
|
opened with a transport specific open function like
|
||||||
such as
|
.Xr dc_usbhid_open 3 ,
|
||||||
.Pa /dev/ttyUSBx
|
.Xr dc_irda_open 3 ,
|
||||||
on Linux,
|
.Xr dc_serial_open 3 ,
|
||||||
.Pa /dev/tty.xxx
|
|
||||||
on Mac OS X,
|
|
||||||
.Pa /dev/ttyUx
|
|
||||||
on the BSDs,
|
|
||||||
or
|
or
|
||||||
.Pa COMx
|
.Xr dc_bluetooth_open 3
|
||||||
on Microsoft Windows
|
|
||||||
.Pc .
|
.Pc .
|
||||||
.Pp
|
.Pp
|
||||||
Upon returning
|
Upon returning
|
||||||
@ -83,6 +78,10 @@ The
|
|||||||
library was written by
|
library was written by
|
||||||
.An Jef Driesen ,
|
.An Jef Driesen ,
|
||||||
.Mt jef@libdivecomputer.org .
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
The manpages were written by
|
The manpages were written by
|
||||||
.An Kristaps Dzonsons ,
|
.An Kristaps Dzonsons ,
|
||||||
.Mt kristaps@bsd.lv .
|
.Mt kristaps@bsd.lv .
|
||||||
|
and
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl
|
||||||
60
doc/man/dc_iostream_close.3
Normal file
60
doc/man/dc_iostream_close.3
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_IOSTREAM_CLOSE 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_iostream_close
|
||||||
|
.Nd Close the I/O stream and free all resources.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/iostream.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_iostream_close
|
||||||
|
.Fa "dc_iostream_t *iostream"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Close the I/O stream and free all resources.
|
||||||
|
Accepts the
|
||||||
|
.Fa iostream
|
||||||
|
to close and free.
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success, or another
|
||||||
|
.Ft dc_status_t
|
||||||
|
code on failure.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_usbhid_open 3 ,
|
||||||
|
.Xr dc_serial_open 3 ,
|
||||||
|
.Xr dc_irda_open 3 ,
|
||||||
|
.Xr dc_bluetooth_open 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
52
doc/man/dc_irda_device_free.3
Normal file
52
doc/man/dc_irda_device_free.3
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_IRDA_DEVICE_FREE 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_irda_device_free
|
||||||
|
.Nd Destroy the irda device and free all resources.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/irda.h
|
||||||
|
.Ft void
|
||||||
|
.Fo dc_irda_device_free
|
||||||
|
.Fa "dc_irda_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Destroy the irda device and free all resources.
|
||||||
|
The irda
|
||||||
|
.Fa device
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_irda_iterator_new 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_irda_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
59
doc/man/dc_irda_device_get_address.3
Normal file
59
doc/man/dc_irda_device_get_address.3
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_IRDA_DEVICE_GET_ADDRESS 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_irda_device_get_address
|
||||||
|
.Nd Get the address of the IrDA device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/irda.h
|
||||||
|
.Ft "unsigned int"
|
||||||
|
.Fo dc_irda_device_get_address
|
||||||
|
.Fa "dc_irda_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the address of the IrDA device. Return value used for opening a IrDA device using
|
||||||
|
.Xr dc_irda_open 3 .
|
||||||
|
Requires a valid irda
|
||||||
|
.Fa device
|
||||||
|
of type
|
||||||
|
.Ft dc_irda_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_irda_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the IrDA address of given IrDA
|
||||||
|
.Fa device
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_irda_open 3 ,
|
||||||
|
.Xr dc_irda_device_get_name 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
58
doc/man/dc_irda_device_get_name.3
Normal file
58
doc/man/dc_irda_device_get_name.3
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_IRDA_DEVICE_GET_NAME 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_irda_device_get_name
|
||||||
|
.Nd Get the address of the IrDA device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/irda.h
|
||||||
|
.Ft "const char *"
|
||||||
|
.Fo dc_irda_device_get_name
|
||||||
|
.Fa "dc_irda_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the name of the IrDA device. Used for displaying.
|
||||||
|
Requires a valid irda
|
||||||
|
.Fa device
|
||||||
|
of type
|
||||||
|
.Ft dc_irda_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_irda_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the IrDA name of given
|
||||||
|
.Fa irda_device
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_irda_device_get_address 3 .
|
||||||
|
.Xr dc_irda_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
102
doc/man/dc_irda_iterator_new.3
Normal file
102
doc/man/dc_irda_iterator_new.3
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_IRDA_ITERATOR_NEW 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_irda_iterator_new
|
||||||
|
.Nd Create an iterator to enumerate the IrDA devices.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/irda.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_irda_iterator_new
|
||||||
|
.Fa "dc_iterator_t **iterator"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Iterates through the available IrDA devices which matches the given
|
||||||
|
.Fa descriptor .
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3
|
||||||
|
and a
|
||||||
|
.Fa descriptor
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_descriptor_iterator 3 .
|
||||||
|
.Pp
|
||||||
|
On returning
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the
|
||||||
|
.Fa iterator
|
||||||
|
will be set to an
|
||||||
|
.Ft dc_iterator_t
|
||||||
|
which can be used to iterate the available IrDA devices using
|
||||||
|
.Xr dc_iterator_next 3 .
|
||||||
|
.Pp
|
||||||
|
The value type of the iterator is of type
|
||||||
|
.Ft dc_irda_device_t .
|
||||||
|
This value can be used in functions to extract information about this specific IrDA device, namely
|
||||||
|
.Xr dc_irda_device_get_name 3
|
||||||
|
and
|
||||||
|
.Xr dc_irda_device_get_address 3 .
|
||||||
|
When done the IrDA device needs to be freed with
|
||||||
|
.Xr dc_irda_device_free 3 .
|
||||||
|
.Pp
|
||||||
|
After iterating the
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success, or another
|
||||||
|
.Ft dc_status_t
|
||||||
|
code on failure.
|
||||||
|
|
||||||
|
On
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the returned
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed when done using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_usbhid_iterator_new 3 ,
|
||||||
|
.Xr dc_serial_iterator_new 3 ,
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 ,
|
||||||
|
.Xr dc_irda_device_get_name 3 ,
|
||||||
|
.Xr dc_irda_device_get_address 3 ,
|
||||||
|
.Xr dc_irda_device_free 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
85
doc/man/dc_irda_open.3
Normal file
85
doc/man/dc_irda_open.3
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_IRDA_OPEN 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_irda_open
|
||||||
|
.Nd Opens an iostream for a IrDA device
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/irda.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_irda_open
|
||||||
|
.Fa "dc_iostream_t **iostream"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "unsigned int address"
|
||||||
|
.Fa "unsigned int lsap"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Opens an iostream for a IrDA (Infra Red) device.
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Fa address
|
||||||
|
given through
|
||||||
|
.Xr dc_irda_iterator_new 3
|
||||||
|
together with
|
||||||
|
.Xr dc_irda_device_get_address 3
|
||||||
|
, the last argument
|
||||||
|
.Fa lsap
|
||||||
|
is a port number used during the communication. Currently only Uwatec computers use IrDA comminication and for those the
|
||||||
|
.Fa lsap
|
||||||
|
can be hardcoded to 1
|
||||||
|
.Pp
|
||||||
|
Upon returning
|
||||||
|
.Dv DC_STATUS_SUCCESS ,
|
||||||
|
the
|
||||||
|
.Fa iostream
|
||||||
|
pointer must be freed with
|
||||||
|
.Xr dc_iostream_close 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success or one of several error values on error.
|
||||||
|
On success, the
|
||||||
|
.Fa iostream
|
||||||
|
pointer is filled in with an open handle.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_iostream_close 3 ,
|
||||||
|
.Xr dc_serial_open 3 ,
|
||||||
|
.Xr dc_usbhid_open 3 ,
|
||||||
|
.Xr dc_bluetooth_open 3 ,
|
||||||
|
.Xr dc_irda_iterator_new 3 ,
|
||||||
|
.Xr dc_irda_device_get_address 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
@ -37,7 +37,7 @@
|
|||||||
Extract the date and time of a dive,
|
Extract the date and time of a dive,
|
||||||
.Fa parser ,
|
.Fa parser ,
|
||||||
previously initialised with
|
previously initialised with
|
||||||
.Xr dc_parser_set_data 3 .
|
.Xr dc_parser_new 3 .
|
||||||
This returns the broken-down time-stamp of the dive in the local time of
|
This returns the broken-down time-stamp of the dive in the local time of
|
||||||
the dive.
|
the dive.
|
||||||
.Pp
|
.Pp
|
||||||
@ -57,7 +57,7 @@ messages on further failure.
|
|||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_datetime_gmtime 3 ,
|
.Xr dc_datetime_gmtime 3 ,
|
||||||
.Xr dc_datetime_localtime 3 ,
|
.Xr dc_datetime_localtime 3 ,
|
||||||
.Xr dc_parser_set_data 3
|
.Xr dc_parser_new 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -39,7 +39,7 @@
|
|||||||
Extract a field from a dive,
|
Extract a field from a dive,
|
||||||
.Fa parser ,
|
.Fa parser ,
|
||||||
previously initialised with
|
previously initialised with
|
||||||
.Xr dc_parser_set_data 3 .
|
.Xr dc_parser_new 3 .
|
||||||
The
|
The
|
||||||
.Fa value
|
.Fa value
|
||||||
field type depends upon the
|
field type depends upon the
|
||||||
@ -149,7 +149,7 @@ the tank volume units as
|
|||||||
or
|
or
|
||||||
.Dv DC_TANKVOLUME_METRIC ;
|
.Dv DC_TANKVOLUME_METRIC ;
|
||||||
.Va volume ,
|
.Va volume ,
|
||||||
the tank volume in bar or zero if the tank is
|
the tank volume in litres or zero if the tank is
|
||||||
.Dv DC_TANKVOLUME_NONE ;
|
.Dv DC_TANKVOLUME_NONE ;
|
||||||
.Va workpressure ,
|
.Va workpressure ,
|
||||||
the work pressure in bar or zero if
|
the work pressure in bar or zero if
|
||||||
@ -187,7 +187,7 @@ if the field was retrieved,
|
|||||||
if the field is not supported by the device, or other error messages on
|
if the field is not supported by the device, or other error messages on
|
||||||
further failure.
|
further failure.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_parser_set_data 3
|
.Xr dc_parser_new 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -39,8 +39,6 @@
|
|||||||
.Fa "dc_parser_t **parser"
|
.Fa "dc_parser_t **parser"
|
||||||
.Fa "dc_context_t *context"
|
.Fa "dc_context_t *context"
|
||||||
.Fa "dc_descriptor_t *descriptor"
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
.Fa "unsigned int devtime"
|
|
||||||
.Fa "dc_ticks_t systime"
|
|
||||||
.Fc
|
.Fc
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
Creates a parser for a single dive extracted from the dive computer with
|
Creates a parser for a single dive extracted from the dive computer with
|
||||||
@ -55,10 +53,6 @@ parameter; and
|
|||||||
.Nm dc_parser_new2 ,
|
.Nm dc_parser_new2 ,
|
||||||
which is given device values (model, etc.) directly.
|
which is given device values (model, etc.) directly.
|
||||||
.Pp
|
.Pp
|
||||||
After filling in the
|
|
||||||
.Fa parser
|
|
||||||
parameter, one usually sets parser data with
|
|
||||||
.Xr dc_parser_set_data 3 .
|
|
||||||
The pointer must later be freed with
|
The pointer must later be freed with
|
||||||
.Xr dc_parser_destroy 3 .
|
.Xr dc_parser_destroy 3 .
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
|
|||||||
@ -31,7 +31,7 @@
|
|||||||
.Ft "typedef void"
|
.Ft "typedef void"
|
||||||
.Fo "(*dc_sample_callback_t)"
|
.Fo "(*dc_sample_callback_t)"
|
||||||
.Fa "dc_sample_type_t type"
|
.Fa "dc_sample_type_t type"
|
||||||
.Fa "dc_sample_value_t value"
|
.Fa "const dc_sample_value_t *value"
|
||||||
.Fa "void *userdata"
|
.Fa "void *userdata"
|
||||||
.Fc
|
.Fc
|
||||||
.Ft dc_status_t
|
.Ft dc_status_t
|
||||||
@ -42,7 +42,7 @@
|
|||||||
.Fc
|
.Fc
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
Extract the samples taken during a dive as previously initialised with
|
Extract the samples taken during a dive as previously initialised with
|
||||||
.Xr dc_parser_set_data 3 .
|
.Xr dc_parser_new 3 .
|
||||||
Each sample is passed to
|
Each sample is passed to
|
||||||
.Fa callback
|
.Fa callback
|
||||||
with the
|
with the
|
||||||
@ -63,7 +63,7 @@ closed.
|
|||||||
The following sample types may be raised:
|
The following sample types may be raised:
|
||||||
.Bl -tag -width Ds
|
.Bl -tag -width Ds
|
||||||
.It Dv DC_SAMPLE_TIME
|
.It Dv DC_SAMPLE_TIME
|
||||||
The time of the sample taken in seconds after the dive began.
|
The time of the sample taken in milliseconds after the dive began.
|
||||||
Set in the
|
Set in the
|
||||||
.Fa time
|
.Fa time
|
||||||
field.
|
field.
|
||||||
@ -126,7 +126,7 @@ Sets the
|
|||||||
.Fa rbt
|
.Fa rbt
|
||||||
field.
|
field.
|
||||||
.It Dv DC_SAMPLE_HEARTBEAT
|
.It Dv DC_SAMPLE_HEARTBEAT
|
||||||
The diver's heartbeet in beats per minute.
|
The diver's heartbeat in beats per minute.
|
||||||
Sets the
|
Sets the
|
||||||
.Fa heartbeat
|
.Fa heartbeat
|
||||||
field.
|
field.
|
||||||
@ -184,7 +184,7 @@ Returns
|
|||||||
.Dv DC_STATUS_OK
|
.Dv DC_STATUS_OK
|
||||||
on success and another code on failure.
|
on success and another code on failure.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_parser_set_data 3
|
.Xr dc_parser_new 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
52
doc/man/dc_serial_device_free.3
Normal file
52
doc/man/dc_serial_device_free.3
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_SERIAL_DEVICE_FREE 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_serial_device_free
|
||||||
|
.Nd Destroy the serial device and free all resources.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/serial.h
|
||||||
|
.Ft void
|
||||||
|
.Fo dc_serial_device_free
|
||||||
|
.Fa "dc_serial_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Destroy the serial device and free all resources.
|
||||||
|
The serial
|
||||||
|
.Fa device
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_serial_iterator_new 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_serial_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
59
doc/man/dc_serial_device_get_name.3
Normal file
59
doc/man/dc_serial_device_get_name.3
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_SERIAL_DEVICE_GET_NAME 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_serial_device_get_name
|
||||||
|
.Nd Get the device name of the serial device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/serial.h
|
||||||
|
.Ft "const char *"
|
||||||
|
.Fo dc_serial_device_get_name
|
||||||
|
.Fa "dc_serial_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the device node of the serial device. Used when opening serial transport with
|
||||||
|
.Xr dc_serial_open 3 .
|
||||||
|
Requires a valid serial
|
||||||
|
.Fa device
|
||||||
|
of type
|
||||||
|
.Ft dc_serial_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_serial_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the device name of given serial
|
||||||
|
.Fa device
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_serial_open 3 ,
|
||||||
|
.Xr dc_serial_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
99
doc/man/dc_serial_iterator_new.3
Normal file
99
doc/man/dc_serial_iterator_new.3
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_SERIAL_ITERATOR_NEW 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_serial_iterator_new
|
||||||
|
.Nd Create an iterator to enumerate the serial devices.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/serial.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_serial_iterator_new
|
||||||
|
.Fa "dc_iterator_t **iterator"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Iterates through the available serial devices matching the given
|
||||||
|
.Fa descriptor .
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3
|
||||||
|
and a
|
||||||
|
.Fa descriptor
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_descriptor_iterator 3 .
|
||||||
|
.Pp
|
||||||
|
On returning
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the
|
||||||
|
.Fa iterator
|
||||||
|
will be set to an
|
||||||
|
.Ft dc_iterator_t
|
||||||
|
which can be used to iterate the available serial devices using
|
||||||
|
.Xr dc_iterator_next 3 .
|
||||||
|
.Pp
|
||||||
|
The value type of the iterator is of type
|
||||||
|
.Ft dc_serial_device_t .
|
||||||
|
This value can be used in functions to extract information about this specific serial device, namely
|
||||||
|
.Xr dc_serial_device_get_name 3
|
||||||
|
When done the serial device needs to be freed with
|
||||||
|
.Xr dc_serial_device_free 3 .
|
||||||
|
.Pp
|
||||||
|
After iterating the
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success, or another
|
||||||
|
.Ft dc_status_t
|
||||||
|
code on failure.
|
||||||
|
|
||||||
|
On
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the returned
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed when done using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_usbhid_iterator_new 3 ,
|
||||||
|
.Xr dc_irda_iterator_new 3 ,
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 ,
|
||||||
|
.Xr dc_serial_device_get_name 3 ,
|
||||||
|
.Xr dc_serial_device_free 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
80
doc/man/dc_serial_open.3
Normal file
80
doc/man/dc_serial_open.3
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_SERIAL_OPEN 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_serial_open
|
||||||
|
.Nd Opens an iostream for a serial device
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/serial.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_serial_open
|
||||||
|
.Fa "dc_iostream_t **iostream"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "const char *name"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Opens an iostream for a serial device.
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3
|
||||||
|
and a
|
||||||
|
.Fa name
|
||||||
|
device name, usually found through
|
||||||
|
.Xr dc_serial_iterator_new 3
|
||||||
|
with
|
||||||
|
.Xr dc_serial_device_get_name 3 .
|
||||||
|
.Pp
|
||||||
|
Upon returning
|
||||||
|
.Dv DC_STATUS_SUCCESS ,
|
||||||
|
the
|
||||||
|
.Fa iostream
|
||||||
|
pointer must be freed with
|
||||||
|
.Xr dc_iostream_close 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success or one of several error values on error.
|
||||||
|
On success, the
|
||||||
|
.Fa iostream
|
||||||
|
pointer is filled in with an open handle.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_iostream_close 3 ,
|
||||||
|
.Xr dc_usbhid_open 3 ,
|
||||||
|
.Xr dc_irda_open 3 ,
|
||||||
|
.Xr dc_bluetooth_open 3 ,
|
||||||
|
.Xr dc_serial_iterator_new 3 ,
|
||||||
|
.Xr dc_serial_device_get_name 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
52
doc/man/dc_usbhid_device_free.3
Normal file
52
doc/man/dc_usbhid_device_free.3
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_USBHID_DEVICE_FREE 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_usbhid_device_free
|
||||||
|
.Nd Destroy the USB HID device and free all resources.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/usbhid.h
|
||||||
|
.Ft void
|
||||||
|
.Fo dc_usbhid_device_free
|
||||||
|
.Fa "dc_usbhid_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Destroy the USB HID device and free all resources.
|
||||||
|
The usbhid
|
||||||
|
.Fa device
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
58
doc/man/dc_usbhid_device_get_pid.3
Normal file
58
doc/man/dc_usbhid_device_get_pid.3
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_USBHID_DEVICE_GET_PID 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_usbhid_device_get_pid
|
||||||
|
.Nd Get the product id (PID) of the USB HID device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/usbhid.h
|
||||||
|
.Ft "unsigned int"
|
||||||
|
.Fo dc_usbhid_device_get_pid
|
||||||
|
.Fa "dc_usbhid_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the product id (PID) of the USB HID device. Used for displaying.
|
||||||
|
Requires a valid usbhid
|
||||||
|
.Fa device
|
||||||
|
of type
|
||||||
|
.Ft dc_usbhid_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the product id (PID) of given
|
||||||
|
.Fa usbhid_device
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_usbhid_device_get_vid 3 ,
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
58
doc/man/dc_usbhid_device_get_vid.3
Normal file
58
doc/man/dc_usbhid_device_get_vid.3
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_USBHID_DEVICE_GET_VID 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_usbhid_device_get_vid
|
||||||
|
.Nd Get the vendor id (VID) of the USB HID device.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/usbhid.h
|
||||||
|
.Ft "unsigned int"
|
||||||
|
.Fo dc_usbhid_device_get_vid
|
||||||
|
.Fa "dc_usbhid_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Get the vendor id (VID) of the USB HID device. Used for displaying.
|
||||||
|
Requires a valid usbhid
|
||||||
|
.Fa device
|
||||||
|
of type
|
||||||
|
.Ft dc_usbhid_device_t
|
||||||
|
which can be retrieved using
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns the vendor id (VID) of given usbhid
|
||||||
|
.Fa device
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_usbhid_device_get_vid 3 ,
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
101
doc/man/dc_usbhid_iterator_new.3
Normal file
101
doc/man/dc_usbhid_iterator_new.3
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_USBHID_ITERATOR_NEW 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_usbhid_iterator_new
|
||||||
|
.Nd Create an iterator to enumerate the USB HID devices.
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/usbhid.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_usbhid_iterator_new
|
||||||
|
.Fa "dc_iterator_t **iterator"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "dc_descriptor_t *descriptor"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Iterates through the available USB HID devices matching the given
|
||||||
|
.Fa descriptor .
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3
|
||||||
|
and a
|
||||||
|
.Fa descriptor
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_descriptor_iterator 3 .
|
||||||
|
.Pp
|
||||||
|
On returning
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the
|
||||||
|
.Fa iterator
|
||||||
|
will be set to an
|
||||||
|
.Ft dc_iterator_t
|
||||||
|
which can be used to iterate the available USB HID devices using
|
||||||
|
.Xr dc_iterator_next 3 .
|
||||||
|
.Pp
|
||||||
|
The value type of the iterator is of type
|
||||||
|
.Ft dc_usbhid_device_t .
|
||||||
|
This value can be used in functions to extract information about this specific USB HID device, namely
|
||||||
|
.Xr dc_usbhid_device_get_pid 3
|
||||||
|
and
|
||||||
|
.Xr dc_usbhid_device_get_vid 3 .
|
||||||
|
When done the USB HID device needs to be freed with
|
||||||
|
.Xr dc_usbhid_device_free 3 .
|
||||||
|
.Pp
|
||||||
|
After iterating the
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success, or another
|
||||||
|
.Ft dc_status_t
|
||||||
|
code on failure.
|
||||||
|
|
||||||
|
On
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
the returned
|
||||||
|
.Fa iterator
|
||||||
|
needs to be freed when done using
|
||||||
|
.Xr dc_iterator_free 3 .
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 ,
|
||||||
|
.Xr dc_serial_iterator_new 3 ,
|
||||||
|
.Xr dc_irda_iterator_new 3 ,
|
||||||
|
.Xr dc_usbhid_device_get_pid 3 ,
|
||||||
|
.Xr dc_usbhid_device_get_vid 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
77
doc/man/dc_usbhid_open.3
Normal file
77
doc/man/dc_usbhid_open.3
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
.\"
|
||||||
|
.\" libdivecomputer
|
||||||
|
.\"
|
||||||
|
.\" Copyright (C) 2020 Vincent Hagen <vinnie@script4web.nl>
|
||||||
|
.\"
|
||||||
|
.\" This library is free software; you can redistribute it and/or
|
||||||
|
.\" modify it under the terms of the GNU Lesser General Public
|
||||||
|
.\" License as published by the Free Software Foundation; either
|
||||||
|
.\" version 2.1 of the License, or (at your option) any later version.
|
||||||
|
.\"
|
||||||
|
.\" This library 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
|
||||||
|
.\" Lesser General Public License for more details.
|
||||||
|
.\"
|
||||||
|
.\" You should have received a copy of the GNU Lesser General Public
|
||||||
|
.\" License along with this library; if not, write to the Free Software
|
||||||
|
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
.\" MA 02110-1301 USA
|
||||||
|
.\"
|
||||||
|
.Dd June 5, 2020
|
||||||
|
.Dt DC_USBHID_OPEN 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dc_usbhid_open
|
||||||
|
.Nd Opens an iostream for a USB HID device
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libdivecomputer
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In libdivecomputer/usbhid.h
|
||||||
|
.Ft dc_status_t
|
||||||
|
.Fo dc_usbhid_open
|
||||||
|
.Fa "dc_iostream_t **iostream"
|
||||||
|
.Fa "dc_context_t *context"
|
||||||
|
.Fa "dc_usbhid_device_t *device"
|
||||||
|
.Fc
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
Opens an iostream for a USB HID device.
|
||||||
|
Accepts a
|
||||||
|
.Fa context
|
||||||
|
opened with
|
||||||
|
.Xr dc_context_new 3
|
||||||
|
and a
|
||||||
|
.Fa device
|
||||||
|
usually found by searching through
|
||||||
|
.Xr dc_usbhid_iterator_new 3 .
|
||||||
|
.Pp
|
||||||
|
Upon returning
|
||||||
|
.Dv DC_STATUS_SUCCESS ,
|
||||||
|
the
|
||||||
|
.Fa iostream
|
||||||
|
pointer must be freed with
|
||||||
|
.Xr dc_iostream_close 3 .
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
Returns
|
||||||
|
.Dv DC_STATUS_SUCCESS
|
||||||
|
on success or one of several error values on error.
|
||||||
|
On success, the
|
||||||
|
.Fa iostream
|
||||||
|
pointer is filled in with an open handle.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_usbhid_iterator_new 3 ,
|
||||||
|
.Xr dc_iostream_close 3 ,
|
||||||
|
.Xr dc_serial_open 3 ,
|
||||||
|
.Xr dc_irda_open 3 ,
|
||||||
|
.Xr dc_bluetooth_open 3 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Lb libdivecomputer
|
||||||
|
library was written by
|
||||||
|
.An Jef Driesen ,
|
||||||
|
.Mt jef@libdivecomputer.org .
|
||||||
|
.br
|
||||||
|
This manpage is written by
|
||||||
|
.An Vincent Hagen ,
|
||||||
|
.Mt vinnie@script4web.nl .
|
||||||
@ -41,9 +41,8 @@ these steps:
|
|||||||
.Bl -enum
|
.Bl -enum
|
||||||
.It
|
.It
|
||||||
Create a new context with
|
Create a new context with
|
||||||
.Xr dc_context_new 3 .
|
.Xr dc_context_new 3
|
||||||
This supplies a parse context: logging, error handling, etc.
|
to initialize the library. Logging can be controlled with
|
||||||
Override the values with
|
|
||||||
.Xr dc_context_set_logfunc 3
|
.Xr dc_context_set_logfunc 3
|
||||||
and
|
and
|
||||||
.Xr dc_context_set_loglevel 3 .
|
.Xr dc_context_set_loglevel 3 .
|
||||||
@ -52,11 +51,28 @@ Find a descriptor for their dive computer by iterating through
|
|||||||
.Xr dc_descriptor_iterator 3
|
.Xr dc_descriptor_iterator 3
|
||||||
and searching by name, vendor, or product family.
|
and searching by name, vendor, or product family.
|
||||||
.It
|
.It
|
||||||
Open the hardware device to which the dive computer is connected with
|
Find the transport to use for the communication. To determine the supported transports use
|
||||||
.Xr dc_device_open 3 ,
|
.Xr dc_descriptor_get_transports 3 .
|
||||||
then invoke
|
.It
|
||||||
|
Find the hardware device corresponding to the connected dive computer by iterating through
|
||||||
|
.Xr dc_usbhid_iterator_new 3 ,
|
||||||
|
.Xr dc_serial_iterator_new 3 ,
|
||||||
|
.Xr dc_irda_iterator_new 3
|
||||||
|
or
|
||||||
|
.Xr dc_bluetooth_iterator_new 3 .
|
||||||
|
.It
|
||||||
|
Open the transport communcations with
|
||||||
|
.Xr dc_usbhid_open 3 ,
|
||||||
|
.Xr dc_serial_open 3 ,
|
||||||
|
.Xr dc_irda_open 3
|
||||||
|
or
|
||||||
|
.Xr dc_bluetooth_open 3 .
|
||||||
|
.It
|
||||||
|
Open a connection to the dive computer with
|
||||||
|
.Xr dc_device_open 3 .
|
||||||
|
Optionally use
|
||||||
.Xr dc_device_set_events 3 ,
|
.Xr dc_device_set_events 3 ,
|
||||||
.Xr dc_device_set_fingerprint 3 ,
|
.Xr dc_device_set_fingerprint 3
|
||||||
and
|
and
|
||||||
.Xr dc_device_set_cancel 3
|
.Xr dc_device_set_cancel 3
|
||||||
to set the logging events, last-seen fingerprint, and cancel routine,
|
to set the logging events, last-seen fingerprint, and cancel routine,
|
||||||
@ -66,13 +82,12 @@ Iterate over all dives with
|
|||||||
.Xr dc_device_foreach 3 .
|
.Xr dc_device_foreach 3 .
|
||||||
.It
|
.It
|
||||||
For each iterated dive, create a new parser with
|
For each iterated dive, create a new parser with
|
||||||
.Xr dc_parser_new 3
|
.Xr dc_parser_new 3 .
|
||||||
and set the parsed data with
|
|
||||||
.Xr dc_parser_set_data 3 .
|
|
||||||
.It
|
.It
|
||||||
Get attributes of the parsed dive with
|
Get attributes of the parsed dive with
|
||||||
.Xr dc_parser_get_field 3 ,
|
.Xr dc_parser_get_field 3 .
|
||||||
then iterate through the dive's samples (recorded data) with
|
.It
|
||||||
|
Iterate through the dive's samples (recorded data) with
|
||||||
.Xr dc_parser_samples_foreach 3 .
|
.Xr dc_parser_samples_foreach 3 .
|
||||||
.El
|
.El
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
@ -129,7 +144,10 @@ return
|
|||||||
.Dv DC_STATUS_SUCCESS .
|
.Dv DC_STATUS_SUCCESS .
|
||||||
.El
|
.El
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dc_buffer_new 3
|
.Xr dc_context_new 3 ,
|
||||||
|
.Xr dc_descriptor_iterator 3
|
||||||
|
.Xr dc_device_open 3
|
||||||
|
.Xr dc_parser_new 3
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
The
|
The
|
||||||
.Lb libdivecomputer
|
.Lb libdivecomputer
|
||||||
|
|||||||
@ -12,6 +12,7 @@ dctool_SOURCES = \
|
|||||||
dctool_help.c \
|
dctool_help.c \
|
||||||
dctool_version.c \
|
dctool_version.c \
|
||||||
dctool_list.c \
|
dctool_list.c \
|
||||||
|
dctool_scan.c \
|
||||||
dctool_download.c \
|
dctool_download.c \
|
||||||
dctool_dump.c \
|
dctool_dump.c \
|
||||||
dctool_parse.c \
|
dctool_parse.c \
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
* MA 02110-1301 USA
|
* MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@ -27,6 +28,12 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <libdivecomputer/serial.h>
|
||||||
|
#include <libdivecomputer/bluetooth.h>
|
||||||
|
#include <libdivecomputer/irda.h>
|
||||||
|
#include <libdivecomputer/usb.h>
|
||||||
|
#include <libdivecomputer/usbhid.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
@ -44,6 +51,11 @@ typedef struct backend_table_t {
|
|||||||
unsigned int model;
|
unsigned int model;
|
||||||
} backend_table_t;
|
} backend_table_t;
|
||||||
|
|
||||||
|
typedef struct transport_table_t {
|
||||||
|
const char *name;
|
||||||
|
dc_transport_t type;
|
||||||
|
} transport_table_t;
|
||||||
|
|
||||||
static const backend_table_t g_backends[] = {
|
static const backend_table_t g_backends[] = {
|
||||||
{"solution", DC_FAMILY_SUUNTO_SOLUTION, 0},
|
{"solution", DC_FAMILY_SUUNTO_SOLUTION, 0},
|
||||||
{"eon", DC_FAMILY_SUUNTO_EON, 0},
|
{"eon", DC_FAMILY_SUUNTO_EON, 0},
|
||||||
@ -54,14 +66,13 @@ static const backend_table_t g_backends[] = {
|
|||||||
{"aladin", DC_FAMILY_UWATEC_ALADIN, 0x3F},
|
{"aladin", DC_FAMILY_UWATEC_ALADIN, 0x3F},
|
||||||
{"memomouse", DC_FAMILY_UWATEC_MEMOMOUSE, 0},
|
{"memomouse", DC_FAMILY_UWATEC_MEMOMOUSE, 0},
|
||||||
{"smart", DC_FAMILY_UWATEC_SMART, 0x10},
|
{"smart", DC_FAMILY_UWATEC_SMART, 0x10},
|
||||||
{"meridian", DC_FAMILY_UWATEC_MERIDIAN, 0x20},
|
|
||||||
{"g2", DC_FAMILY_UWATEC_G2, 0x11},
|
|
||||||
{"sensus", DC_FAMILY_REEFNET_SENSUS, 1},
|
{"sensus", DC_FAMILY_REEFNET_SENSUS, 1},
|
||||||
{"sensuspro", DC_FAMILY_REEFNET_SENSUSPRO, 2},
|
{"sensuspro", DC_FAMILY_REEFNET_SENSUSPRO, 2},
|
||||||
{"sensusultra", DC_FAMILY_REEFNET_SENSUSULTRA, 3},
|
{"sensusultra", DC_FAMILY_REEFNET_SENSUSULTRA, 3},
|
||||||
{"vtpro", DC_FAMILY_OCEANIC_VTPRO, 0x4245},
|
{"vtpro", DC_FAMILY_OCEANIC_VTPRO, 0x4245},
|
||||||
{"veo250", DC_FAMILY_OCEANIC_VEO250, 0x424C},
|
{"veo250", DC_FAMILY_OCEANIC_VEO250, 0x424C},
|
||||||
{"atom2", DC_FAMILY_OCEANIC_ATOM2, 0x4342},
|
{"atom2", DC_FAMILY_OCEANIC_ATOM2, 0x4342},
|
||||||
|
{"i330r", DC_FAMILY_PELAGIC_I330R, 0x4744},
|
||||||
{"nemo", DC_FAMILY_MARES_NEMO, 0},
|
{"nemo", DC_FAMILY_MARES_NEMO, 0},
|
||||||
{"puck", DC_FAMILY_MARES_PUCK, 7},
|
{"puck", DC_FAMILY_MARES_PUCK, 7},
|
||||||
{"darwin", DC_FAMILY_MARES_DARWIN, 0},
|
{"darwin", DC_FAMILY_MARES_DARWIN, 0},
|
||||||
@ -71,6 +82,7 @@ static const backend_table_t g_backends[] = {
|
|||||||
{"ostc3", DC_FAMILY_HW_OSTC3, 0x0A},
|
{"ostc3", DC_FAMILY_HW_OSTC3, 0x0A},
|
||||||
{"edy", DC_FAMILY_CRESSI_EDY, 0x08},
|
{"edy", DC_FAMILY_CRESSI_EDY, 0x08},
|
||||||
{"leonardo", DC_FAMILY_CRESSI_LEONARDO, 1},
|
{"leonardo", DC_FAMILY_CRESSI_LEONARDO, 1},
|
||||||
|
{"goa", DC_FAMILY_CRESSI_GOA, 2},
|
||||||
{"n2ition3", DC_FAMILY_ZEAGLE_N2ITION3, 0},
|
{"n2ition3", DC_FAMILY_ZEAGLE_N2ITION3, 0},
|
||||||
{"cobalt", DC_FAMILY_ATOMICS_COBALT, 0},
|
{"cobalt", DC_FAMILY_ATOMICS_COBALT, 0},
|
||||||
{"predator", DC_FAMILY_SHEARWATER_PREDATOR, 2},
|
{"predator", DC_FAMILY_SHEARWATER_PREDATOR, 2},
|
||||||
@ -79,6 +91,30 @@ static const backend_table_t g_backends[] = {
|
|||||||
{"aqualand", DC_FAMILY_CITIZEN_AQUALAND, 0},
|
{"aqualand", DC_FAMILY_CITIZEN_AQUALAND, 0},
|
||||||
{"idive", DC_FAMILY_DIVESYSTEM_IDIVE, 0x03},
|
{"idive", DC_FAMILY_DIVESYSTEM_IDIVE, 0x03},
|
||||||
{"cochran", DC_FAMILY_COCHRAN_COMMANDER, 0},
|
{"cochran", DC_FAMILY_COCHRAN_COMMANDER, 0},
|
||||||
|
{"divecomputereu", DC_FAMILY_TECDIVING_DIVECOMPUTEREU, 0},
|
||||||
|
{"extreme", DC_FAMILY_MCLEAN_EXTREME, 0},
|
||||||
|
{"lynx", DC_FAMILY_LIQUIVISION_LYNX, 0},
|
||||||
|
{"sp2", DC_FAMILY_SPORASUB_SP2, 0},
|
||||||
|
{"excursion", DC_FAMILY_DEEPSIX_EXCURSION, 0},
|
||||||
|
{"screen", DC_FAMILY_SEAC_SCREEN, 0},
|
||||||
|
{"cosmiq", DC_FAMILY_DEEPBLU_COSMIQ, 0},
|
||||||
|
{"s1", DC_FAMILY_OCEANS_S1, 0},
|
||||||
|
{"freedom", DC_FAMILY_DIVESOFT_FREEDOM, 19},
|
||||||
|
|
||||||
|
// Not merged upstream yet
|
||||||
|
{"descentmk1", DC_FAMILY_GARMIN, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const transport_table_t g_transports[] = {
|
||||||
|
{"serial", DC_TRANSPORT_SERIAL},
|
||||||
|
{"usb", DC_TRANSPORT_USB},
|
||||||
|
{"usbhid", DC_TRANSPORT_USBHID},
|
||||||
|
{"irda", DC_TRANSPORT_IRDA},
|
||||||
|
{"bluetooth", DC_TRANSPORT_BLUETOOTH},
|
||||||
|
{"ble", DC_TRANSPORT_BLE},
|
||||||
|
|
||||||
|
// Not merged upstream yet
|
||||||
|
{"usbstorage",DC_TRANSPORT_USBSTORAGE},
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
@ -145,6 +181,41 @@ dctool_family_model (dc_family_t type)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dc_transport_t
|
||||||
|
dctool_transport_type (const char *name)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < C_ARRAY_SIZE (g_transports); ++i) {
|
||||||
|
if (strcmp (name, g_transports[i].name) == 0)
|
||||||
|
return g_transports[i].type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DC_TRANSPORT_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
dctool_transport_name (dc_transport_t type)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < C_ARRAY_SIZE (g_transports); ++i) {
|
||||||
|
if (g_transports[i].type == type)
|
||||||
|
return g_transports[i].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc_transport_t
|
||||||
|
dctool_transport_default (dc_descriptor_t *descriptor)
|
||||||
|
{
|
||||||
|
unsigned int transports = dc_descriptor_get_transports (descriptor);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < C_ARRAY_SIZE (g_transports); ++i) {
|
||||||
|
if (transports & g_transports[i].type)
|
||||||
|
return g_transports[i].type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DC_TRANSPORT_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dctool_event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *userdata)
|
dctool_event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *userdata)
|
||||||
{
|
{
|
||||||
@ -340,3 +411,188 @@ dctool_file_read (const char *filename)
|
|||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
dctool_usb_open (dc_iostream_t **out, dc_context_t *context, dc_descriptor_t *descriptor)
|
||||||
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
|
|
||||||
|
// Discover the usb device.
|
||||||
|
dc_iterator_t *iterator = NULL;
|
||||||
|
dc_usb_device_t *device = NULL;
|
||||||
|
dc_usb_iterator_new (&iterator, context, descriptor);
|
||||||
|
while (dc_iterator_next (iterator, &device) == DC_STATUS_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dc_iterator_free (iterator);
|
||||||
|
|
||||||
|
if (device == NULL) {
|
||||||
|
ERROR ("No dive computer found.");
|
||||||
|
status = DC_STATUS_NODEVICE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the usb device.
|
||||||
|
status = dc_usb_open (&iostream, context, device);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Failed to open the usb device.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = iostream;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
dc_usb_device_free (device);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
dctool_usbhid_open (dc_iostream_t **out, dc_context_t *context, dc_descriptor_t *descriptor)
|
||||||
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
|
|
||||||
|
// Discover the usbhid device.
|
||||||
|
dc_iterator_t *iterator = NULL;
|
||||||
|
dc_usbhid_device_t *device = NULL;
|
||||||
|
dc_usbhid_iterator_new (&iterator, context, descriptor);
|
||||||
|
while (dc_iterator_next (iterator, &device) == DC_STATUS_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dc_iterator_free (iterator);
|
||||||
|
|
||||||
|
if (device == NULL) {
|
||||||
|
ERROR ("No dive computer found.");
|
||||||
|
status = DC_STATUS_NODEVICE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the usbhid device.
|
||||||
|
status = dc_usbhid_open (&iostream, context, device);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Failed to open the usbhid device.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = iostream;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
dc_usbhid_device_free (device);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
dctool_irda_open (dc_iostream_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const char *devname)
|
||||||
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
|
unsigned int address = 0;
|
||||||
|
|
||||||
|
if (devname) {
|
||||||
|
// Use the address.
|
||||||
|
address = strtoul(devname, NULL, 0);
|
||||||
|
} else {
|
||||||
|
// Discover the device address.
|
||||||
|
dc_iterator_t *iterator = NULL;
|
||||||
|
dc_irda_device_t *device = NULL;
|
||||||
|
dc_irda_iterator_new (&iterator, context, descriptor);
|
||||||
|
while (dc_iterator_next (iterator, &device) == DC_STATUS_SUCCESS) {
|
||||||
|
address = dc_irda_device_get_address (device);
|
||||||
|
dc_irda_device_free (device);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dc_iterator_free (iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (address == 0) {
|
||||||
|
if (devname) {
|
||||||
|
ERROR ("No valid device address specified.");
|
||||||
|
} else {
|
||||||
|
ERROR ("No dive computer found.");
|
||||||
|
}
|
||||||
|
status = DC_STATUS_NODEVICE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the irda socket.
|
||||||
|
status = dc_irda_open (&iostream, context, address, 1);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Failed to open the irda socket.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = iostream;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
dctool_bluetooth_open (dc_iostream_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const char *devname)
|
||||||
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
|
dc_bluetooth_address_t address = 0;
|
||||||
|
|
||||||
|
if (devname) {
|
||||||
|
// Use the address.
|
||||||
|
address = dc_bluetooth_str2addr(devname);
|
||||||
|
} else {
|
||||||
|
// Discover the device address.
|
||||||
|
dc_iterator_t *iterator = NULL;
|
||||||
|
dc_bluetooth_device_t *device = NULL;
|
||||||
|
dc_bluetooth_iterator_new (&iterator, context, descriptor);
|
||||||
|
while (dc_iterator_next (iterator, &device) == DC_STATUS_SUCCESS) {
|
||||||
|
address = dc_bluetooth_device_get_address (device);
|
||||||
|
dc_bluetooth_device_free (device);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dc_iterator_free (iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (address == 0) {
|
||||||
|
if (devname) {
|
||||||
|
ERROR ("No valid device address specified.");
|
||||||
|
} else {
|
||||||
|
ERROR ("No dive computer found.");
|
||||||
|
}
|
||||||
|
status = DC_STATUS_NODEVICE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the bluetooth socket.
|
||||||
|
status = dc_bluetooth_open (&iostream, context, address, 0);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Failed to open the bluetooth socket.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = iostream;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
dctool_iostream_open (dc_iostream_t **iostream, dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname)
|
||||||
|
{
|
||||||
|
switch (transport) {
|
||||||
|
case DC_TRANSPORT_SERIAL:
|
||||||
|
return dc_serial_open (iostream, context, devname);
|
||||||
|
case DC_TRANSPORT_USB:
|
||||||
|
return dctool_usb_open(iostream, context, descriptor);
|
||||||
|
case DC_TRANSPORT_USBHID:
|
||||||
|
return dctool_usbhid_open(iostream, context, descriptor);
|
||||||
|
case DC_TRANSPORT_IRDA:
|
||||||
|
return dctool_irda_open (iostream, context, descriptor, devname);
|
||||||
|
case DC_TRANSPORT_BLUETOOTH:
|
||||||
|
return dctool_bluetooth_open (iostream, context, descriptor, devname);
|
||||||
|
default:
|
||||||
|
return DC_STATUS_UNSUPPORTED;
|
||||||
|
|
||||||
|
// Not merged upstream yet
|
||||||
|
case DC_TRANSPORT_USBSTORAGE:
|
||||||
|
return dc_usb_storage_open (iostream, context, devname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <libdivecomputer/context.h>
|
#include <libdivecomputer/context.h>
|
||||||
#include <libdivecomputer/descriptor.h>
|
#include <libdivecomputer/descriptor.h>
|
||||||
|
#include <libdivecomputer/iostream.h>
|
||||||
#include <libdivecomputer/device.h>
|
#include <libdivecomputer/device.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -42,6 +43,15 @@ dctool_family_name (dc_family_t type);
|
|||||||
unsigned int
|
unsigned int
|
||||||
dctool_family_model (dc_family_t type);
|
dctool_family_model (dc_family_t type);
|
||||||
|
|
||||||
|
dc_transport_t
|
||||||
|
dctool_transport_type (const char *name);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
dctool_transport_name (dc_transport_t type);
|
||||||
|
|
||||||
|
dc_transport_t
|
||||||
|
dctool_transport_default (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
void
|
void
|
||||||
dctool_event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *userdata);
|
dctool_event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *userdata);
|
||||||
|
|
||||||
@ -57,6 +67,9 @@ dctool_file_write (const char *filename, dc_buffer_t *buffer);
|
|||||||
dc_buffer_t *
|
dc_buffer_t *
|
||||||
dctool_file_read (const char *filename);
|
dctool_file_read (const char *filename);
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
dctool_iostream_open (dc_iostream_t **iostream, dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@ -24,10 +24,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -48,7 +50,7 @@
|
|||||||
#define RESET 1
|
#define RESET 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GLIBC__) || defined(__MINGW32__) || defined(BSD)
|
#if defined(__GLIBC__) || defined(__MINGW32__) || defined(BSD) || defined(__ANDROID__)
|
||||||
#define NOPERMUTATION "+"
|
#define NOPERMUTATION "+"
|
||||||
#else
|
#else
|
||||||
#define NOPERMUTATION ""
|
#define NOPERMUTATION ""
|
||||||
@ -58,6 +60,7 @@ static const dctool_command_t *g_commands[] = {
|
|||||||
&dctool_help,
|
&dctool_help,
|
||||||
&dctool_version,
|
&dctool_version,
|
||||||
&dctool_list,
|
&dctool_list,
|
||||||
|
&dctool_scan,
|
||||||
&dctool_download,
|
&dctool_download,
|
||||||
&dctool_dump,
|
&dctool_dump,
|
||||||
&dctool_parse,
|
&dctool_parse,
|
||||||
@ -239,7 +242,8 @@ main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Translate the help option into a command.
|
// Translate the help option into a command.
|
||||||
char *argv_help[] = {(char *) "help", NULL, NULL};
|
char helpcmd[] = "help";
|
||||||
|
char *argv_help[] = {helpcmd, NULL, NULL};
|
||||||
if (help || argv[0] == NULL) {
|
if (help || argv[0] == NULL) {
|
||||||
if (argv[0]) {
|
if (argv[0]) {
|
||||||
argv_help[1] = argv[0];
|
argv_help[1] = argv[0];
|
||||||
@ -275,14 +279,7 @@ main (int argc, char *argv[])
|
|||||||
dc_context_set_loglevel (context, loglevel);
|
dc_context_set_loglevel (context, loglevel);
|
||||||
dc_context_set_logfunc (context, logfunc, NULL);
|
dc_context_set_logfunc (context, logfunc, NULL);
|
||||||
|
|
||||||
if (command->config & DCTOOL_CONFIG_DESCRIPTOR) {
|
if (device != NULL || family != DC_FAMILY_NULL) {
|
||||||
// Check mandatory arguments.
|
|
||||||
if (device == NULL && family == DC_FAMILY_NULL) {
|
|
||||||
message ("No device name or family type specified.\n");
|
|
||||||
exitcode = EXIT_FAILURE;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search for a matching device descriptor.
|
// Search for a matching device descriptor.
|
||||||
status = dctool_descriptor_search (&descriptor, device, family, model);
|
status = dctool_descriptor_search (&descriptor, device, family, model);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
@ -304,6 +301,13 @@ main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check mandatory descriptor arguments.
|
||||||
|
if (command->config & DCTOOL_CONFIG_DESCRIPTOR && descriptor == NULL) {
|
||||||
|
message ("No device name or family type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Execute the command.
|
// Execute the command.
|
||||||
exitcode = command->run (argc, argv, context, descriptor);
|
exitcode = command->run (argc, argv, context, descriptor);
|
||||||
|
|
||||||
|
|||||||
@ -45,6 +45,7 @@ typedef struct dctool_command_t {
|
|||||||
extern const dctool_command_t dctool_help;
|
extern const dctool_command_t dctool_help;
|
||||||
extern const dctool_command_t dctool_version;
|
extern const dctool_command_t dctool_version;
|
||||||
extern const dctool_command_t dctool_list;
|
extern const dctool_command_t dctool_list;
|
||||||
|
extern const dctool_command_t dctool_scan;
|
||||||
extern const dctool_command_t dctool_download;
|
extern const dctool_command_t dctool_download;
|
||||||
extern const dctool_command_t dctool_dump;
|
extern const dctool_command_t dctool_dump;
|
||||||
extern const dctool_command_t dctool_parse;
|
extern const dctool_command_t dctool_parse;
|
||||||
|
|||||||
@ -24,9 +24,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -78,20 +80,12 @@ dive_cb (const unsigned char *data, unsigned int size, const unsigned char *fing
|
|||||||
|
|
||||||
// Create the parser.
|
// Create the parser.
|
||||||
message ("Creating the parser.\n");
|
message ("Creating the parser.\n");
|
||||||
rc = dc_parser_new (&parser, divedata->device);
|
rc = dc_parser_new (&parser, divedata->device, data, size);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error creating the parser.");
|
ERROR ("Error creating the parser.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the data.
|
|
||||||
message ("Registering the data.\n");
|
|
||||||
rc = dc_parser_set_data (parser, data, size);
|
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
|
||||||
ERROR ("Error registering the data.");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the dive data.
|
// Parse the dive data.
|
||||||
message ("Parsing the dive data.\n");
|
message ("Parsing the dive data.\n");
|
||||||
rc = dctool_output_write (divedata->output, parser, data, size, fingerprint, fsize);
|
rc = dctool_output_write (divedata->output, parser, data, size, fingerprint, fsize);
|
||||||
@ -152,18 +146,28 @@ event_cb (dc_device_t *device, dc_event_type_t event, const void *data, void *us
|
|||||||
}
|
}
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
download (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const char *cachedir, dc_buffer_t *fingerprint, dctool_output_t *output)
|
download (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname, const char *cachedir, dc_buffer_t *fingerprint, dctool_output_t *output)
|
||||||
{
|
{
|
||||||
dc_status_t rc = DC_STATUS_SUCCESS;
|
dc_status_t rc = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
dc_device_t *device = NULL;
|
dc_device_t *device = NULL;
|
||||||
dc_buffer_t *ofingerprint = NULL;
|
dc_buffer_t *ofingerprint = NULL;
|
||||||
|
|
||||||
// Open the device.
|
// Open the I/O stream.
|
||||||
message ("Opening the device (%s %s, %s).\n",
|
message ("Opening the I/O stream (%s, %s).\n",
|
||||||
dc_descriptor_get_vendor (descriptor),
|
dctool_transport_name (transport),
|
||||||
dc_descriptor_get_product (descriptor),
|
|
||||||
devname ? devname : "null");
|
devname ? devname : "null");
|
||||||
rc = dc_device_open (&device, context, descriptor, devname);
|
rc = dctool_iostream_open (&iostream, context, descriptor, transport, devname);
|
||||||
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Error opening the I/O stream.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the device.
|
||||||
|
message ("Opening the device (%s %s).\n",
|
||||||
|
dc_descriptor_get_vendor (descriptor),
|
||||||
|
dc_descriptor_get_product (descriptor));
|
||||||
|
rc = dc_device_open (&device, context, descriptor, iostream);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error opening the device.");
|
ERROR ("Error opening the device.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -236,6 +240,7 @@ download (dc_context_t *context, dc_descriptor_t *descriptor, const char *devnam
|
|||||||
cleanup:
|
cleanup:
|
||||||
dc_buffer_free (ofingerprint);
|
dc_buffer_free (ofingerprint);
|
||||||
dc_device_close (device);
|
dc_device_close (device);
|
||||||
|
dc_iostream_close (iostream);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,6 +252,7 @@ dctool_download_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
dc_buffer_t *fingerprint = NULL;
|
dc_buffer_t *fingerprint = NULL;
|
||||||
dctool_output_t *output = NULL;
|
dctool_output_t *output = NULL;
|
||||||
dctool_units_t units = DCTOOL_UNITS_METRIC;
|
dctool_units_t units = DCTOOL_UNITS_METRIC;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
// Default option values.
|
// Default option values.
|
||||||
unsigned int help = 0;
|
unsigned int help = 0;
|
||||||
@ -257,10 +263,11 @@ dctool_download_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
|
|
||||||
// Parse the command-line options.
|
// Parse the command-line options.
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
const char *optstring = "ho:p:c:f:u:";
|
const char *optstring = "ht:o:p:c:f:u:";
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
{"output", required_argument, 0, 'o'},
|
{"output", required_argument, 0, 'o'},
|
||||||
{"fingerprint", required_argument, 0, 'p'},
|
{"fingerprint", required_argument, 0, 'p'},
|
||||||
{"cache", required_argument, 0, 'c'},
|
{"cache", required_argument, 0, 'c'},
|
||||||
@ -276,6 +283,9 @@ dctool_download_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
filename = optarg;
|
filename = optarg;
|
||||||
break;
|
break;
|
||||||
@ -308,6 +318,13 @@ dctool_download_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert the fingerprint to binary.
|
// Convert the fingerprint to binary.
|
||||||
fingerprint = dctool_convert_hex2bin (fphex);
|
fingerprint = dctool_convert_hex2bin (fphex);
|
||||||
|
|
||||||
@ -328,7 +345,7 @@ dctool_download_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Download the dives.
|
// Download the dives.
|
||||||
status = download (context, descriptor, argv[0], cachedir, fingerprint, output);
|
status = download (context, descriptor, transport, argv[0], cachedir, fingerprint, output);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
message ("ERROR: %s\n", dctool_errmsg (status));
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
@ -352,6 +369,7 @@ const dctool_command_t dctool_download = {
|
|||||||
"Options:\n"
|
"Options:\n"
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
" -h, --help Show help message\n"
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
" -o, --output <filename> Output filename\n"
|
" -o, --output <filename> Output filename\n"
|
||||||
" -p, --fingerprint <data> Fingerprint data (hexadecimal)\n"
|
" -p, --fingerprint <data> Fingerprint data (hexadecimal)\n"
|
||||||
" -c, --cache <directory> Cache directory\n"
|
" -c, --cache <directory> Cache directory\n"
|
||||||
@ -359,6 +377,7 @@ const dctool_command_t dctool_download = {
|
|||||||
" -u, --units <units> Set units (metric or imperial)\n"
|
" -u, --units <units> Set units (metric or imperial)\n"
|
||||||
#else
|
#else
|
||||||
" -h Show help message\n"
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
" -o <filename> Output filename\n"
|
" -o <filename> Output filename\n"
|
||||||
" -p <fingerprint> Fingerprint data (hexadecimal)\n"
|
" -p <fingerprint> Fingerprint data (hexadecimal)\n"
|
||||||
" -c <directory> Cache directory\n"
|
" -c <directory> Cache directory\n"
|
||||||
|
|||||||
@ -24,9 +24,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -40,17 +42,27 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
dump (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, dc_buffer_t *fingerprint, dc_buffer_t *buffer)
|
dump (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname, dc_buffer_t *fingerprint, dc_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
dc_status_t rc = DC_STATUS_SUCCESS;
|
dc_status_t rc = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
dc_device_t *device = NULL;
|
dc_device_t *device = NULL;
|
||||||
|
|
||||||
// Open the device.
|
// Open the I/O stream.
|
||||||
message ("Opening the device (%s %s, %s).\n",
|
message ("Opening the I/O stream (%s, %s).\n",
|
||||||
dc_descriptor_get_vendor (descriptor),
|
dctool_transport_name (transport),
|
||||||
dc_descriptor_get_product (descriptor),
|
|
||||||
devname ? devname : "null");
|
devname ? devname : "null");
|
||||||
rc = dc_device_open (&device, context, descriptor, devname);
|
rc = dctool_iostream_open (&iostream, context, descriptor, transport, devname);
|
||||||
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Error opening the I/O stream.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the device.
|
||||||
|
message ("Opening the device (%s %s).\n",
|
||||||
|
dc_descriptor_get_vendor (descriptor),
|
||||||
|
dc_descriptor_get_product (descriptor));
|
||||||
|
rc = dc_device_open (&device, context, descriptor, iostream);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error opening the device.");
|
ERROR ("Error opening the device.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -93,6 +105,7 @@ dump (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, d
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
dc_device_close (device);
|
dc_device_close (device);
|
||||||
|
dc_iostream_close (iostream);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +116,7 @@ dctool_dump_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
dc_buffer_t *fingerprint = NULL;
|
dc_buffer_t *fingerprint = NULL;
|
||||||
dc_buffer_t *buffer = NULL;
|
dc_buffer_t *buffer = NULL;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
// Default option values.
|
// Default option values.
|
||||||
unsigned int help = 0;
|
unsigned int help = 0;
|
||||||
@ -111,10 +125,11 @@ dctool_dump_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
|
|
||||||
// Parse the command-line options.
|
// Parse the command-line options.
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
const char *optstring = "ho:p:";
|
const char *optstring = "ht:o:p:";
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
{"output", required_argument, 0, 'o'},
|
{"output", required_argument, 0, 'o'},
|
||||||
{"fingerprint", required_argument, 0, 'p'},
|
{"fingerprint", required_argument, 0, 'p'},
|
||||||
{0, 0, 0, 0 }
|
{0, 0, 0, 0 }
|
||||||
@ -127,6 +142,9 @@ dctool_dump_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
filename = optarg;
|
filename = optarg;
|
||||||
break;
|
break;
|
||||||
@ -147,6 +165,13 @@ dctool_dump_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert the fingerprint to binary.
|
// Convert the fingerprint to binary.
|
||||||
fingerprint = dctool_convert_hex2bin (fphex);
|
fingerprint = dctool_convert_hex2bin (fphex);
|
||||||
|
|
||||||
@ -154,7 +179,7 @@ dctool_dump_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
buffer = dc_buffer_new (0);
|
buffer = dc_buffer_new (0);
|
||||||
|
|
||||||
// Download the memory dump.
|
// Download the memory dump.
|
||||||
status = dump (context, descriptor, argv[0], fingerprint, buffer);
|
status = dump (context, descriptor, transport, argv[0], fingerprint, buffer);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
message ("ERROR: %s\n", dctool_errmsg (status));
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
@ -181,10 +206,12 @@ const dctool_command_t dctool_dump = {
|
|||||||
"Options:\n"
|
"Options:\n"
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
" -h, --help Show help message\n"
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
" -o, --output <filename> Output filename\n"
|
" -o, --output <filename> Output filename\n"
|
||||||
" -p, --fingerprint <data> Fingerprint data (hexadecimal)\n"
|
" -p, --fingerprint <data> Fingerprint data (hexadecimal)\n"
|
||||||
#else
|
#else
|
||||||
" -h Show help message\n"
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
" -o <filename> Output filename\n"
|
" -o <filename> Output filename\n"
|
||||||
" -p <fingerprint> Fingerprint data (hexadecimal)\n"
|
" -p <fingerprint> Fingerprint data (hexadecimal)\n"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -35,23 +37,34 @@
|
|||||||
#include <libdivecomputer/device.h>
|
#include <libdivecomputer/device.h>
|
||||||
#include <libdivecomputer/hw_ostc.h>
|
#include <libdivecomputer/hw_ostc.h>
|
||||||
#include <libdivecomputer/hw_ostc3.h>
|
#include <libdivecomputer/hw_ostc3.h>
|
||||||
|
#include <libdivecomputer/divesystem_idive.h>
|
||||||
|
|
||||||
#include "dctool.h"
|
#include "dctool.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
fwupdate (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const char *hexfile)
|
fwupdate (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname, const char *hexfile)
|
||||||
{
|
{
|
||||||
dc_status_t rc = DC_STATUS_SUCCESS;
|
dc_status_t rc = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
dc_device_t *device = NULL;
|
dc_device_t *device = NULL;
|
||||||
|
|
||||||
// Open the device.
|
// Open the I/O stream.
|
||||||
message ("Opening the device (%s %s, %s).\n",
|
message ("Opening the I/O stream (%s, %s).\n",
|
||||||
dc_descriptor_get_vendor (descriptor),
|
dctool_transport_name (transport),
|
||||||
dc_descriptor_get_product (descriptor),
|
|
||||||
devname ? devname : "null");
|
devname ? devname : "null");
|
||||||
rc = dc_device_open (&device, context, descriptor, devname);
|
rc = dctool_iostream_open (&iostream, context, descriptor, transport, devname);
|
||||||
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Error opening the I/O stream.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the device.
|
||||||
|
message ("Opening the device (%s %s).\n",
|
||||||
|
dc_descriptor_get_vendor (descriptor),
|
||||||
|
dc_descriptor_get_product (descriptor));
|
||||||
|
rc = dc_device_open (&device, context, descriptor, iostream);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error opening the device.");
|
ERROR ("Error opening the device.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -81,7 +94,10 @@ fwupdate (dc_context_t *context, dc_descriptor_t *descriptor, const char *devnam
|
|||||||
rc = hw_ostc_device_fwupdate (device, hexfile);
|
rc = hw_ostc_device_fwupdate (device, hexfile);
|
||||||
break;
|
break;
|
||||||
case DC_FAMILY_HW_OSTC3:
|
case DC_FAMILY_HW_OSTC3:
|
||||||
rc = hw_ostc3_device_fwupdate (device, hexfile);
|
rc = hw_ostc3_device_fwupdate (device, hexfile, false);
|
||||||
|
break;
|
||||||
|
case DC_FAMILY_DIVESYSTEM_IDIVE:
|
||||||
|
rc = divesystem_idive_device_fwupdate (device, hexfile);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rc = DC_STATUS_UNSUPPORTED;
|
rc = DC_STATUS_UNSUPPORTED;
|
||||||
@ -94,6 +110,7 @@ fwupdate (dc_context_t *context, dc_descriptor_t *descriptor, const char *devnam
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
dc_device_close (device);
|
dc_device_close (device);
|
||||||
|
dc_iostream_close (iostream);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +119,7 @@ dctool_fwupdate_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
{
|
{
|
||||||
int exitcode = EXIT_SUCCESS;
|
int exitcode = EXIT_SUCCESS;
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
// Default option values.
|
// Default option values.
|
||||||
unsigned int help = 0;
|
unsigned int help = 0;
|
||||||
@ -109,10 +127,11 @@ dctool_fwupdate_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
|
|
||||||
// Parse the command-line options.
|
// Parse the command-line options.
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
const char *optstring = "hf:";
|
const char *optstring = "ht:f:";
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
{"firmware", required_argument, 0, 'f'},
|
{"firmware", required_argument, 0, 'f'},
|
||||||
{0, 0, 0, 0 }
|
{0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
@ -124,6 +143,9 @@ dctool_fwupdate_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
case 'f':
|
case 'f':
|
||||||
filename = optarg;
|
filename = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
@ -141,6 +163,13 @@ dctool_fwupdate_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Check mandatory arguments.
|
// Check mandatory arguments.
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
message ("No firmware file specified.\n");
|
message ("No firmware file specified.\n");
|
||||||
@ -149,7 +178,7 @@ dctool_fwupdate_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update the firmware.
|
// Update the firmware.
|
||||||
status = fwupdate (context, descriptor, argv[0], filename);
|
status = fwupdate (context, descriptor, transport, argv[0], filename);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
message ("ERROR: %s\n", dctool_errmsg (status));
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
@ -171,9 +200,11 @@ const dctool_command_t dctool_fwupdate = {
|
|||||||
"Options:\n"
|
"Options:\n"
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
" -h, --help Show help message\n"
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
" -f, --firmware <filename> Firmware filename\n"
|
" -f, --firmware <filename> Firmware filename\n"
|
||||||
#else
|
#else
|
||||||
" -h Show help message\n"
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
" -f <filename> Firmware filename\n"
|
" -f <filename> Firmware filename\n"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -24,9 +24,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -52,17 +54,17 @@ parse (dc_buffer_t *buffer, dc_context_t *context, dc_descriptor_t *descriptor,
|
|||||||
|
|
||||||
// Create the parser.
|
// Create the parser.
|
||||||
message ("Creating the parser.\n");
|
message ("Creating the parser.\n");
|
||||||
rc = dc_parser_new2 (&parser, context, descriptor, devtime, systime);
|
rc = dc_parser_new2 (&parser, context, descriptor, data, size);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error creating the parser.");
|
ERROR ("Error creating the parser.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the data.
|
// Set the clock.
|
||||||
message ("Registering the data.\n");
|
message ("Setting the clock.\n");
|
||||||
rc = dc_parser_set_data (parser, data, size);
|
rc = dc_parser_set_clock (parser, devtime, systime);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) {
|
||||||
ERROR ("Error registering the data.");
|
ERROR ("Error setting the clock.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +154,7 @@ dctool_parse_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < argc; ++i) {
|
for (int i = 0; i < argc; ++i) {
|
||||||
// Read the input file.
|
// Read the input file.
|
||||||
buffer = dctool_file_read (argv[i]);
|
buffer = dctool_file_read (argv[i]);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
|
|||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -39,17 +41,27 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
doread (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, unsigned int address, dc_buffer_t *buffer)
|
doread (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname, unsigned int address, dc_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
dc_status_t rc = DC_STATUS_SUCCESS;
|
dc_status_t rc = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
dc_device_t *device = NULL;
|
dc_device_t *device = NULL;
|
||||||
|
|
||||||
// Open the device.
|
// Open the I/O stream.
|
||||||
message ("Opening the device (%s %s, %s).\n",
|
message ("Opening the I/O stream (%s, %s).\n",
|
||||||
dc_descriptor_get_vendor (descriptor),
|
dctool_transport_name (transport),
|
||||||
dc_descriptor_get_product (descriptor),
|
|
||||||
devname ? devname : "null");
|
devname ? devname : "null");
|
||||||
rc = dc_device_open (&device, context, descriptor, devname);
|
rc = dctool_iostream_open (&iostream, context, descriptor, transport, devname);
|
||||||
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Error opening the I/O stream.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the device.
|
||||||
|
message ("Opening the device (%s %s).\n",
|
||||||
|
dc_descriptor_get_vendor (descriptor),
|
||||||
|
dc_descriptor_get_product (descriptor));
|
||||||
|
rc = dc_device_open (&device, context, descriptor, iostream);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error opening the device.");
|
ERROR ("Error opening the device.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -82,6 +94,7 @@ doread (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
dc_device_close (device);
|
dc_device_close (device);
|
||||||
|
dc_iostream_close (iostream);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,6 +104,7 @@ dctool_read_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
int exitcode = EXIT_SUCCESS;
|
int exitcode = EXIT_SUCCESS;
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
dc_buffer_t *buffer = NULL;
|
dc_buffer_t *buffer = NULL;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
// Default option values.
|
// Default option values.
|
||||||
unsigned int help = 0;
|
unsigned int help = 0;
|
||||||
@ -100,10 +114,11 @@ dctool_read_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
|
|
||||||
// Parse the command-line options.
|
// Parse the command-line options.
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
const char *optstring = "ha:c:o:";
|
const char *optstring = "ht:a:c:o:";
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
{"address", required_argument, 0, 'a'},
|
{"address", required_argument, 0, 'a'},
|
||||||
{"count", required_argument, 0, 'c'},
|
{"count", required_argument, 0, 'c'},
|
||||||
{"output", required_argument, 0, 'o'},
|
{"output", required_argument, 0, 'o'},
|
||||||
@ -117,6 +132,9 @@ dctool_read_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
address = strtoul (optarg, NULL, 0);
|
address = strtoul (optarg, NULL, 0);
|
||||||
have_address = 1;
|
have_address = 1;
|
||||||
@ -142,6 +160,13 @@ dctool_read_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Check mandatory arguments.
|
// Check mandatory arguments.
|
||||||
if (!have_address || !have_count) {
|
if (!have_address || !have_count) {
|
||||||
message ("No memory address or byte count specified.\n");
|
message ("No memory address or byte count specified.\n");
|
||||||
@ -159,7 +184,7 @@ dctool_read_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read data from the internal memory.
|
// Read data from the internal memory.
|
||||||
status = doread (context, descriptor, argv[0], address, buffer);
|
status = doread (context, descriptor, transport, argv[0], address, buffer);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
message ("ERROR: %s\n", dctool_errmsg (status));
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
@ -185,11 +210,13 @@ const dctool_command_t dctool_read = {
|
|||||||
"Options:\n"
|
"Options:\n"
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
" -h, --help Show help message\n"
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
" -a, --address <address> Memory address\n"
|
" -a, --address <address> Memory address\n"
|
||||||
" -c, --count <count> Number of bytes\n"
|
" -c, --count <count> Number of bytes\n"
|
||||||
" -o, --output <filename> Output filename\n"
|
" -o, --output <filename> Output filename\n"
|
||||||
#else
|
#else
|
||||||
" -h Show help message\n"
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
" -a <address> Memory address\n"
|
" -a <address> Memory address\n"
|
||||||
" -c <count> Number of bytes\n"
|
" -c <count> Number of bytes\n"
|
||||||
" -o <filename> Output filename\n"
|
" -o <filename> Output filename\n"
|
||||||
|
|||||||
202
examples/dctool_scan.c
Normal file
202
examples/dctool_scan.c
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETOPT_H
|
||||||
|
#include <getopt.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libdivecomputer/context.h>
|
||||||
|
#include <libdivecomputer/descriptor.h>
|
||||||
|
#include <libdivecomputer/iterator.h>
|
||||||
|
#include <libdivecomputer/serial.h>
|
||||||
|
#include <libdivecomputer/irda.h>
|
||||||
|
#include <libdivecomputer/bluetooth.h>
|
||||||
|
#include <libdivecomputer/usb.h>
|
||||||
|
#include <libdivecomputer/usbhid.h>
|
||||||
|
|
||||||
|
#include "dctool.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
scan (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport)
|
||||||
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_iterator_t *iterator = NULL;
|
||||||
|
|
||||||
|
// Create the device iterator.
|
||||||
|
switch (transport) {
|
||||||
|
case DC_TRANSPORT_SERIAL:
|
||||||
|
status = dc_serial_iterator_new (&iterator, context, descriptor);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_IRDA:
|
||||||
|
status = dc_irda_iterator_new (&iterator, context, descriptor);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_BLUETOOTH:
|
||||||
|
status = dc_bluetooth_iterator_new (&iterator, context, descriptor);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_USB:
|
||||||
|
status = dc_usb_iterator_new (&iterator, context, descriptor);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_USBHID:
|
||||||
|
status = dc_usbhid_iterator_new (&iterator, context, descriptor);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
status = DC_STATUS_UNSUPPORTED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Failed to create the device iterator.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enumerate the devices.
|
||||||
|
void *device = NULL;
|
||||||
|
while ((status = dc_iterator_next (iterator, &device)) == DC_STATUS_SUCCESS) {
|
||||||
|
char buffer[DC_BLUETOOTH_SIZE];
|
||||||
|
switch (transport) {
|
||||||
|
case DC_TRANSPORT_SERIAL:
|
||||||
|
printf ("%s\n", dc_serial_device_get_name (device));
|
||||||
|
dc_serial_device_free (device);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_IRDA:
|
||||||
|
printf ("%08x\t%s\n", dc_irda_device_get_address (device), dc_irda_device_get_name (device));
|
||||||
|
dc_irda_device_free (device);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_BLUETOOTH:
|
||||||
|
printf ("%s\t%s\n",
|
||||||
|
dc_bluetooth_addr2str(dc_bluetooth_device_get_address (device), buffer, sizeof(buffer)),
|
||||||
|
dc_bluetooth_device_get_name (device));
|
||||||
|
dc_bluetooth_device_free (device);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_USB:
|
||||||
|
printf ("%04x:%04x\n", dc_usb_device_get_vid (device), dc_usb_device_get_pid (device));
|
||||||
|
dc_usb_device_free (device);
|
||||||
|
break;
|
||||||
|
case DC_TRANSPORT_USBHID:
|
||||||
|
printf ("%04x:%04x\n", dc_usbhid_device_get_vid (device), dc_usbhid_device_get_pid (device));
|
||||||
|
dc_usbhid_device_free (device);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (status != DC_STATUS_SUCCESS && status != DC_STATUS_DONE) {
|
||||||
|
ERROR ("Failed to enumerate the devices.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = DC_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
dc_iterator_free (iterator);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
dctool_scan_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t *descriptor)
|
||||||
|
{
|
||||||
|
int exitcode = EXIT_SUCCESS;
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
// Default option values.
|
||||||
|
unsigned int help = 0;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
|
// Parse the command-line options.
|
||||||
|
int opt = 0;
|
||||||
|
const char *optstring = "ht:";
|
||||||
|
#ifdef HAVE_GETOPT_LONG
|
||||||
|
struct option options[] = {
|
||||||
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
|
{0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
while ((opt = getopt_long (argc, argv, optstring, options, NULL)) != -1) {
|
||||||
|
#else
|
||||||
|
while ((opt = getopt (argc, argv, optstring)) != -1) {
|
||||||
|
#endif
|
||||||
|
switch (opt) {
|
||||||
|
case 'h':
|
||||||
|
help = 1;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
|
// Show help message.
|
||||||
|
if (help) {
|
||||||
|
dctool_command_showhelp (&dctool_scan);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan for supported devices.
|
||||||
|
status = scan (context, descriptor, transport);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
return exitcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dctool_command_t dctool_scan = {
|
||||||
|
dctool_scan_run,
|
||||||
|
DCTOOL_CONFIG_NONE,
|
||||||
|
"scan",
|
||||||
|
"Scan for supported devices",
|
||||||
|
"Usage:\n"
|
||||||
|
" dctool scan [options]\n"
|
||||||
|
"\n"
|
||||||
|
"Options:\n"
|
||||||
|
#ifdef HAVE_GETOPT_LONG
|
||||||
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
|
#else
|
||||||
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
|
#endif
|
||||||
|
};
|
||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -39,17 +41,27 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
do_timesync (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const dc_datetime_t *datetime)
|
do_timesync (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname, const dc_datetime_t *datetime)
|
||||||
{
|
{
|
||||||
dc_status_t rc = DC_STATUS_SUCCESS;
|
dc_status_t rc = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
dc_device_t *device = NULL;
|
dc_device_t *device = NULL;
|
||||||
|
|
||||||
// Open the device.
|
// Open the I/O stream.
|
||||||
message ("Opening the device (%s %s, %s).\n",
|
message ("Opening the I/O stream (%s, %s).\n",
|
||||||
dc_descriptor_get_vendor (descriptor),
|
dctool_transport_name (transport),
|
||||||
dc_descriptor_get_product (descriptor),
|
|
||||||
devname ? devname : "null");
|
devname ? devname : "null");
|
||||||
rc = dc_device_open (&device, context, descriptor, devname);
|
rc = dctool_iostream_open (&iostream, context, descriptor, transport, devname);
|
||||||
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Error opening the I/O stream.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the device.
|
||||||
|
message ("Opening the device (%s %s).\n",
|
||||||
|
dc_descriptor_get_vendor (descriptor),
|
||||||
|
dc_descriptor_get_product (descriptor));
|
||||||
|
rc = dc_device_open (&device, context, descriptor, iostream);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error opening the device.");
|
ERROR ("Error opening the device.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -82,6 +94,7 @@ do_timesync (dc_context_t *context, dc_descriptor_t *descriptor, const char *dev
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
dc_device_close (device);
|
dc_device_close (device);
|
||||||
|
dc_iostream_close (iostream);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,16 +103,18 @@ dctool_timesync_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
{
|
{
|
||||||
int exitcode = EXIT_SUCCESS;
|
int exitcode = EXIT_SUCCESS;
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
// Default option values.
|
// Default option values.
|
||||||
unsigned int help = 0;
|
unsigned int help = 0;
|
||||||
|
|
||||||
// Parse the command-line options.
|
// Parse the command-line options.
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
const char *optstring = "h";
|
const char *optstring = "ht:";
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
{0, 0, 0, 0 }
|
{0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
while ((opt = getopt_long (argc, argv, optstring, options, NULL)) != -1) {
|
while ((opt = getopt_long (argc, argv, optstring, options, NULL)) != -1) {
|
||||||
@ -110,6 +125,9 @@ dctool_timesync_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
@ -124,6 +142,13 @@ dctool_timesync_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the system time.
|
// Get the system time.
|
||||||
dc_datetime_t datetime = {0};
|
dc_datetime_t datetime = {0};
|
||||||
dc_ticks_t now = dc_datetime_now ();
|
dc_ticks_t now = dc_datetime_now ();
|
||||||
@ -134,7 +159,7 @@ dctool_timesync_run (int argc, char *argv[], dc_context_t *context, dc_descripto
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Synchronize the device clock.
|
// Synchronize the device clock.
|
||||||
status = do_timesync (context, descriptor, argv[0], &datetime);
|
status = do_timesync (context, descriptor, transport, argv[0], &datetime);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
message ("ERROR: %s\n", dctool_errmsg (status));
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
@ -155,8 +180,10 @@ const dctool_command_t dctool_timesync = {
|
|||||||
"\n"
|
"\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
" -h, --help Show help message\n"
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
#else
|
#else
|
||||||
" -h Show help message\n"
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -24,8 +24,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -39,17 +41,27 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
dowrite (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, unsigned int address, dc_buffer_t *buffer)
|
dowrite (dc_context_t *context, dc_descriptor_t *descriptor, dc_transport_t transport, const char *devname, unsigned int address, dc_buffer_t *buffer)
|
||||||
{
|
{
|
||||||
dc_status_t rc = DC_STATUS_SUCCESS;
|
dc_status_t rc = DC_STATUS_SUCCESS;
|
||||||
|
dc_iostream_t *iostream = NULL;
|
||||||
dc_device_t *device = NULL;
|
dc_device_t *device = NULL;
|
||||||
|
|
||||||
// Open the device.
|
// Open the I/O stream.
|
||||||
message ("Opening the device (%s %s, %s).\n",
|
message ("Opening the I/O stream (%s, %s).\n",
|
||||||
dc_descriptor_get_vendor (descriptor),
|
dctool_transport_name (transport),
|
||||||
dc_descriptor_get_product (descriptor),
|
|
||||||
devname ? devname : "null");
|
devname ? devname : "null");
|
||||||
rc = dc_device_open (&device, context, descriptor, devname);
|
rc = dctool_iostream_open (&iostream, context, descriptor, transport, devname);
|
||||||
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR ("Error opening the I/O stream.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the device.
|
||||||
|
message ("Opening the device (%s %s).\n",
|
||||||
|
dc_descriptor_get_vendor (descriptor),
|
||||||
|
dc_descriptor_get_product (descriptor));
|
||||||
|
rc = dc_device_open (&device, context, descriptor, iostream);
|
||||||
if (rc != DC_STATUS_SUCCESS) {
|
if (rc != DC_STATUS_SUCCESS) {
|
||||||
ERROR ("Error opening the device.");
|
ERROR ("Error opening the device.");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -82,6 +94,7 @@ dowrite (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
dc_device_close (device);
|
dc_device_close (device);
|
||||||
|
dc_iostream_close (iostream);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,6 +104,7 @@ dctool_write_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
int exitcode = EXIT_SUCCESS;
|
int exitcode = EXIT_SUCCESS;
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
dc_buffer_t *buffer = NULL;
|
dc_buffer_t *buffer = NULL;
|
||||||
|
dc_transport_t transport = dctool_transport_default (descriptor);
|
||||||
|
|
||||||
// Default option values.
|
// Default option values.
|
||||||
unsigned int help = 0;
|
unsigned int help = 0;
|
||||||
@ -100,10 +114,11 @@ dctool_write_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
|
|
||||||
// Parse the command-line options.
|
// Parse the command-line options.
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
const char *optstring = "ha:c:i:";
|
const char *optstring = "ht:a:c:i:";
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"transport", required_argument, 0, 't'},
|
||||||
{"address", required_argument, 0, 'a'},
|
{"address", required_argument, 0, 'a'},
|
||||||
{"count", required_argument, 0, 'c'},
|
{"count", required_argument, 0, 'c'},
|
||||||
{"input", required_argument, 0, 'i'},
|
{"input", required_argument, 0, 'i'},
|
||||||
@ -117,6 +132,9 @@ dctool_write_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
transport = dctool_transport_type (optarg);
|
||||||
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
address = strtoul (optarg, NULL, 0);
|
address = strtoul (optarg, NULL, 0);
|
||||||
have_address = 1;
|
have_address = 1;
|
||||||
@ -142,6 +160,13 @@ dctool_write_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the transport type.
|
||||||
|
if (transport == DC_TRANSPORT_NONE) {
|
||||||
|
message ("No valid transport type specified.\n");
|
||||||
|
exitcode = EXIT_FAILURE;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
// Check mandatory arguments.
|
// Check mandatory arguments.
|
||||||
if (!have_address) {
|
if (!have_address) {
|
||||||
message ("No memory address specified.\n");
|
message ("No memory address specified.\n");
|
||||||
@ -165,7 +190,7 @@ dctool_write_run (int argc, char *argv[], dc_context_t *context, dc_descriptor_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write data to the internal memory.
|
// Write data to the internal memory.
|
||||||
status = dowrite (context, descriptor, argv[0], address, buffer);
|
status = dowrite (context, descriptor, transport, argv[0], address, buffer);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
message ("ERROR: %s\n", dctool_errmsg (status));
|
message ("ERROR: %s\n", dctool_errmsg (status));
|
||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
@ -188,11 +213,13 @@ const dctool_command_t dctool_write = {
|
|||||||
"Options:\n"
|
"Options:\n"
|
||||||
#ifdef HAVE_GETOPT_LONG
|
#ifdef HAVE_GETOPT_LONG
|
||||||
" -h, --help Show help message\n"
|
" -h, --help Show help message\n"
|
||||||
|
" -t, --transport <name> Transport type\n"
|
||||||
" -a, --address <address> Memory address\n"
|
" -a, --address <address> Memory address\n"
|
||||||
" -c, --count <count> Number of bytes\n"
|
" -c, --count <count> Number of bytes\n"
|
||||||
" -i, --input <filename> Input filename\n"
|
" -i, --input <filename> Input filename\n"
|
||||||
#else
|
#else
|
||||||
" -h Show help message\n"
|
" -h Show help message\n"
|
||||||
|
" -t <transport> Transport type\n"
|
||||||
" -a <address> Memory address\n"
|
" -a <address> Memory address\n"
|
||||||
" -c <count> Number of bytes\n"
|
" -c <count> Number of bytes\n"
|
||||||
" -i <filename> Input filename\n"
|
" -i <filename> Input filename\n"
|
||||||
|
|||||||
@ -80,7 +80,7 @@ mktemplate_datetime (char *buffer, size_t size, dc_parser_t *parser)
|
|||||||
n = snprintf (buffer, size, "%04i%02i%02iT%02i%02i%02i",
|
n = snprintf (buffer, size, "%04i%02i%02iT%02i%02i%02i",
|
||||||
datetime.year, datetime.month, datetime.day,
|
datetime.year, datetime.month, datetime.day,
|
||||||
datetime.hour, datetime.minute, datetime.second);
|
datetime.hour, datetime.minute, datetime.second);
|
||||||
if (n < 0 || n >= size)
|
if (n < 0 || (size_t) n >= size)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
@ -92,7 +92,7 @@ mktemplate_number (char *buffer, size_t size, unsigned int number)
|
|||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
n = snprintf (buffer, size, "%04u", number);
|
n = snprintf (buffer, size, "%04u", number);
|
||||||
if (n < 0 || n >= size)
|
if (n < 0 || (size_t) n >= size)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
|||||||
@ -90,7 +90,7 @@ convert_volume (double value, dctool_units_t units)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sample_cb (dc_sample_type_t type, dc_sample_value_t value, void *userdata)
|
sample_cb (dc_sample_type_t type, const dc_sample_value_t *value, void *userdata)
|
||||||
{
|
{
|
||||||
static const char *events[] = {
|
static const char *events[] = {
|
||||||
"none", "deco", "rbt", "ascent", "ceiling", "workload", "transmitter",
|
"none", "deco", "rbt", "ascent", "ceiling", "workload", "transmitter",
|
||||||
@ -104,64 +104,80 @@ sample_cb (dc_sample_type_t type, dc_sample_value_t value, void *userdata)
|
|||||||
|
|
||||||
sample_data_t *sampledata = (sample_data_t *) userdata;
|
sample_data_t *sampledata = (sample_data_t *) userdata;
|
||||||
|
|
||||||
|
unsigned int seconds = 0, milliseconds = 0;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case DC_SAMPLE_TIME:
|
case DC_SAMPLE_TIME:
|
||||||
|
seconds = value->time / 1000;
|
||||||
|
milliseconds = value->time % 1000;
|
||||||
if (sampledata->nsamples++)
|
if (sampledata->nsamples++)
|
||||||
fprintf (sampledata->ostream, "</sample>\n");
|
fprintf (sampledata->ostream, "</sample>\n");
|
||||||
fprintf (sampledata->ostream, "<sample>\n");
|
fprintf (sampledata->ostream, "<sample>\n");
|
||||||
fprintf (sampledata->ostream, " <time>%02u:%02u</time>\n", value.time / 60, value.time % 60);
|
if (milliseconds) {
|
||||||
|
fprintf (sampledata->ostream, " <time>%02u:%02u.%03u</time>\n", seconds / 60, seconds % 60, milliseconds);
|
||||||
|
} else {
|
||||||
|
fprintf (sampledata->ostream, " <time>%02u:%02u</time>\n", seconds / 60, seconds % 60);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_DEPTH:
|
case DC_SAMPLE_DEPTH:
|
||||||
fprintf (sampledata->ostream, " <depth>%.2f</depth>\n",
|
fprintf (sampledata->ostream, " <depth>%.2f</depth>\n",
|
||||||
convert_depth(value.depth, sampledata->units));
|
convert_depth(value->depth, sampledata->units));
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_PRESSURE:
|
case DC_SAMPLE_PRESSURE:
|
||||||
fprintf (sampledata->ostream, " <pressure tank=\"%u\">%.2f</pressure>\n",
|
fprintf (sampledata->ostream, " <pressure tank=\"%u\">%.2f</pressure>\n",
|
||||||
value.pressure.tank,
|
value->pressure.tank,
|
||||||
convert_pressure(value.pressure.value, sampledata->units));
|
convert_pressure(value->pressure.value, sampledata->units));
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_TEMPERATURE:
|
case DC_SAMPLE_TEMPERATURE:
|
||||||
fprintf (sampledata->ostream, " <temperature>%.2f</temperature>\n",
|
fprintf (sampledata->ostream, " <temperature>%.2f</temperature>\n",
|
||||||
convert_temperature(value.temperature, sampledata->units));
|
convert_temperature(value->temperature, sampledata->units));
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_EVENT:
|
case DC_SAMPLE_EVENT:
|
||||||
if (value.event.type != SAMPLE_EVENT_GASCHANGE && value.event.type != SAMPLE_EVENT_GASCHANGE2) {
|
if (value->event.type != SAMPLE_EVENT_GASCHANGE && value->event.type != SAMPLE_EVENT_GASCHANGE2) {
|
||||||
fprintf (sampledata->ostream, " <event type=\"%u\" time=\"%u\" flags=\"%u\" value=\"%u\">%s</event>\n",
|
fprintf (sampledata->ostream, " <event type=\"%u\" time=\"%u\" flags=\"%u\" value=\"%u\">%s</event>\n",
|
||||||
value.event.type, value.event.time, value.event.flags, value.event.value, events[value.event.type]);
|
value->event.type, value->event.time, value->event.flags, value->event.value, events[value->event.type]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_RBT:
|
case DC_SAMPLE_RBT:
|
||||||
fprintf (sampledata->ostream, " <rbt>%u</rbt>\n", value.rbt);
|
fprintf (sampledata->ostream, " <rbt>%u</rbt>\n", value->rbt);
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_HEARTBEAT:
|
case DC_SAMPLE_HEARTBEAT:
|
||||||
fprintf (sampledata->ostream, " <heartbeat>%u</heartbeat>\n", value.heartbeat);
|
fprintf (sampledata->ostream, " <heartbeat>%u</heartbeat>\n", value->heartbeat);
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_BEARING:
|
case DC_SAMPLE_BEARING:
|
||||||
fprintf (sampledata->ostream, " <bearing>%u</bearing>\n", value.bearing);
|
fprintf (sampledata->ostream, " <bearing>%u</bearing>\n", value->bearing);
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_VENDOR:
|
case DC_SAMPLE_VENDOR:
|
||||||
fprintf (sampledata->ostream, " <vendor type=\"%u\" size=\"%u\">", value.vendor.type, value.vendor.size);
|
fprintf (sampledata->ostream, " <vendor type=\"%u\" size=\"%u\">", value->vendor.type, value->vendor.size);
|
||||||
for (unsigned int i = 0; i < value.vendor.size; ++i)
|
for (unsigned int i = 0; i < value->vendor.size; ++i)
|
||||||
fprintf (sampledata->ostream, "%02X", ((const unsigned char *) value.vendor.data)[i]);
|
fprintf (sampledata->ostream, "%02X", ((const unsigned char *) value->vendor.data)[i]);
|
||||||
fprintf (sampledata->ostream, "</vendor>\n");
|
fprintf (sampledata->ostream, "</vendor>\n");
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_SETPOINT:
|
case DC_SAMPLE_SETPOINT:
|
||||||
fprintf (sampledata->ostream, " <setpoint>%.2f</setpoint>\n", value.setpoint);
|
fprintf (sampledata->ostream, " <setpoint>%.2f</setpoint>\n", value->setpoint);
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_PPO2:
|
case DC_SAMPLE_PPO2:
|
||||||
fprintf (sampledata->ostream, " <ppo2>%.2f</ppo2>\n", value.ppo2);
|
if (value->ppo2.sensor != DC_SENSOR_NONE) {
|
||||||
|
fprintf (sampledata->ostream, " <ppo2 sensor=\"%u\">%.2f</ppo2>\n", value->ppo2.sensor, value->ppo2.value);
|
||||||
|
} else {
|
||||||
|
fprintf (sampledata->ostream, " <ppo2>%.2f</ppo2>\n", value->ppo2.value);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_CNS:
|
case DC_SAMPLE_CNS:
|
||||||
fprintf (sampledata->ostream, " <cns>%.1f</cns>\n", value.cns * 100.0);
|
fprintf (sampledata->ostream, " <cns>%.1f</cns>\n", value->cns * 100.0);
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_DECO:
|
case DC_SAMPLE_DECO:
|
||||||
fprintf (sampledata->ostream, " <deco time=\"%u\" depth=\"%.2f\">%s</deco>\n",
|
fprintf (sampledata->ostream, " <deco time=\"%u\" depth=\"%.2f\">%s</deco>\n",
|
||||||
value.deco.time,
|
value->deco.time,
|
||||||
convert_depth(value.deco.depth, sampledata->units),
|
convert_depth(value->deco.depth, sampledata->units),
|
||||||
decostop[value.deco.type]);
|
decostop[value->deco.type]);
|
||||||
|
if (value->deco.tts) {
|
||||||
|
fprintf (sampledata->ostream, " <tts>%u</tts>\n",
|
||||||
|
value->deco.tts);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DC_SAMPLE_GASMIX:
|
case DC_SAMPLE_GASMIX:
|
||||||
fprintf (sampledata->ostream, " <gasmix>%u</gasmix>\n", value.gasmix);
|
fprintf (sampledata->ostream, " <gasmix>%u</gasmix>\n", value->gasmix);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -238,7 +254,7 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
fprintf (output->ostream, "<datetime>%04i-%02i-%02i %02i:%02i:%02i %+03i:%02i</datetime>\n",
|
fprintf (output->ostream, "<datetime>%04i-%02i-%02i %02i:%02i:%02i %+03i:%02i</datetime>\n",
|
||||||
dt.year, dt.month, dt.day,
|
dt.year, dt.month, dt.day,
|
||||||
dt.hour, dt.minute, dt.second,
|
dt.hour, dt.minute, dt.second,
|
||||||
dt.timezone / 3600, (dt.timezone % 3600) / 60);
|
dt.timezone / 3600, (abs(dt.timezone) % 3600) / 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the divetime.
|
// Parse the divetime.
|
||||||
@ -265,6 +281,20 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
fprintf (output->ostream, "<maxdepth>%.2f</maxdepth>\n",
|
fprintf (output->ostream, "<maxdepth>%.2f</maxdepth>\n",
|
||||||
convert_depth(maxdepth, output->units));
|
convert_depth(maxdepth, output->units));
|
||||||
|
|
||||||
|
// Parse the avgdepth.
|
||||||
|
message ("Parsing the avgdepth.\n");
|
||||||
|
double avgdepth = 0.0;
|
||||||
|
status = dc_parser_get_field (parser, DC_FIELD_AVGDEPTH, 0, &avgdepth);
|
||||||
|
if (status != DC_STATUS_SUCCESS && status != DC_STATUS_UNSUPPORTED) {
|
||||||
|
ERROR ("Error parsing the avgdepth.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != DC_STATUS_UNSUPPORTED) {
|
||||||
|
fprintf (output->ostream, "<avgdepth>%.2f</avgdepth>\n",
|
||||||
|
convert_depth(avgdepth, output->units));
|
||||||
|
}
|
||||||
|
|
||||||
// Parse the temperature.
|
// Parse the temperature.
|
||||||
message ("Parsing the temperature.\n");
|
message ("Parsing the temperature.\n");
|
||||||
for (unsigned int i = 0; i < 3; ++i) {
|
for (unsigned int i = 0; i < 3; ++i) {
|
||||||
@ -308,11 +338,19 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
"<gasmix>\n"
|
"<gasmix>\n"
|
||||||
" <he>%.1f</he>\n"
|
" <he>%.1f</he>\n"
|
||||||
" <o2>%.1f</o2>\n"
|
" <o2>%.1f</o2>\n"
|
||||||
" <n2>%.1f</n2>\n"
|
" <n2>%.1f</n2>\n",
|
||||||
"</gasmix>\n",
|
|
||||||
gasmix.helium * 100.0,
|
gasmix.helium * 100.0,
|
||||||
gasmix.oxygen * 100.0,
|
gasmix.oxygen * 100.0,
|
||||||
gasmix.nitrogen * 100.0);
|
gasmix.nitrogen * 100.0);
|
||||||
|
if (gasmix.usage) {
|
||||||
|
const char *usage[] = {"none", "oxygen", "diluent", "sidemount"};
|
||||||
|
fprintf (output->ostream,
|
||||||
|
" <usage>%s</usage>\n",
|
||||||
|
usage[gasmix.usage]);
|
||||||
|
}
|
||||||
|
fprintf (output->ostream,
|
||||||
|
"</gasmix>\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the tanks.
|
// Parse the tanks.
|
||||||
@ -340,6 +378,12 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
" <gasmix>%u</gasmix>\n",
|
" <gasmix>%u</gasmix>\n",
|
||||||
tank.gasmix);
|
tank.gasmix);
|
||||||
}
|
}
|
||||||
|
if (tank.usage) {
|
||||||
|
const char *usage[] = {"none", "oxygen", "diluent", "sidemount"};
|
||||||
|
fprintf (output->ostream,
|
||||||
|
" <usage>%s</usage>\n",
|
||||||
|
usage[tank.usage]);
|
||||||
|
}
|
||||||
if (tank.type != DC_TANKVOLUME_NONE) {
|
if (tank.type != DC_TANKVOLUME_NONE) {
|
||||||
fprintf (output->ostream,
|
fprintf (output->ostream,
|
||||||
" <type>%s</type>\n"
|
" <type>%s</type>\n"
|
||||||
@ -372,6 +416,30 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
names[divemode]);
|
names[divemode]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse the deco model.
|
||||||
|
message ("Parsing the deco model.\n");
|
||||||
|
dc_decomodel_t decomodel = {DC_DECOMODEL_NONE};
|
||||||
|
status = dc_parser_get_field (parser, DC_FIELD_DECOMODEL, 0, &decomodel);
|
||||||
|
if (status != DC_STATUS_SUCCESS && status != DC_STATUS_UNSUPPORTED) {
|
||||||
|
ERROR ("Error parsing the deco model.");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != DC_STATUS_UNSUPPORTED) {
|
||||||
|
const char *names[] = {"none", "buhlmann", "vpm", "rgbm", "dciem"};
|
||||||
|
fprintf (output->ostream, "<decomodel>%s</decomodel>\n",
|
||||||
|
names[decomodel.type]);
|
||||||
|
if (decomodel.type == DC_DECOMODEL_BUHLMANN &&
|
||||||
|
(decomodel.params.gf.low != 0 || decomodel.params.gf.high != 0)) {
|
||||||
|
fprintf (output->ostream, "<gf>%u/%u</gf>\n",
|
||||||
|
decomodel.params.gf.low, decomodel.params.gf.high);
|
||||||
|
}
|
||||||
|
if (decomodel.conservatism) {
|
||||||
|
fprintf (output->ostream, "<conservatism>%d</conservatism>\n",
|
||||||
|
decomodel.conservatism);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Parse the salinity.
|
// Parse the salinity.
|
||||||
message ("Parsing the salinity.\n");
|
message ("Parsing the salinity.\n");
|
||||||
dc_salinity_t salinity = {DC_WATER_FRESH, 0.0};
|
dc_salinity_t salinity = {DC_WATER_FRESH, 0.0};
|
||||||
@ -382,8 +450,14 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (status != DC_STATUS_UNSUPPORTED) {
|
if (status != DC_STATUS_UNSUPPORTED) {
|
||||||
fprintf (output->ostream, "<salinity type=\"%u\">%.1f</salinity>\n",
|
const char *names[] = {"fresh", "salt"};
|
||||||
salinity.type, salinity.density);
|
if (salinity.density) {
|
||||||
|
fprintf (output->ostream, "<salinity density=\"%.1f\">%s</salinity>\n",
|
||||||
|
salinity.density, names[salinity.type]);
|
||||||
|
} else {
|
||||||
|
fprintf (output->ostream, "<salinity>%s</salinity>\n",
|
||||||
|
names[salinity.type]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the atmospheric pressure.
|
// Parse the atmospheric pressure.
|
||||||
@ -400,6 +474,24 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u
|
|||||||
convert_pressure(atmospheric, output->units));
|
convert_pressure(atmospheric, output->units));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message ("Parsing strings.\n");
|
||||||
|
int idx;
|
||||||
|
for (idx = 0; idx < 100; idx++) {
|
||||||
|
dc_field_string_t str = { NULL };
|
||||||
|
status = dc_parser_get_field(parser, DC_FIELD_STRING, idx, &str);
|
||||||
|
if (status != DC_STATUS_SUCCESS && status != DC_STATUS_UNSUPPORTED) {
|
||||||
|
ERROR ("Error parsing strings");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
if (status == DC_STATUS_UNSUPPORTED)
|
||||||
|
break;
|
||||||
|
if (!str.desc || !str.value)
|
||||||
|
break;
|
||||||
|
fprintf (output->ostream, "<extradata key='%s' value='%s' />\n",
|
||||||
|
str.desc, str.value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Parse the sample data.
|
// Parse the sample data.
|
||||||
message ("Parsing the sample data.\n");
|
message ("Parsing the sample data.\n");
|
||||||
status = dc_parser_samples_foreach (parser, sample_cb, &sampledata);
|
status = dc_parser_samples_foreach (parser, sample_cb, &sampledata);
|
||||||
|
|||||||
@ -26,6 +26,12 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#define strcasecmp _stricmp
|
||||||
|
#define strncasecmp _strnicmp
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
||||||
#define FUNCTION __func__
|
#define FUNCTION __func__
|
||||||
#else
|
#else
|
||||||
|
|||||||
@ -7,6 +7,14 @@ libdivecomputer_HEADERS = \
|
|||||||
descriptor.h \
|
descriptor.h \
|
||||||
iterator.h \
|
iterator.h \
|
||||||
iostream.h \
|
iostream.h \
|
||||||
|
ioctl.h \
|
||||||
|
serial.h \
|
||||||
|
bluetooth.h \
|
||||||
|
ble.h \
|
||||||
|
irda.h \
|
||||||
|
usb.h \
|
||||||
|
usbhid.h \
|
||||||
|
custom.h \
|
||||||
device.h \
|
device.h \
|
||||||
parser.h \
|
parser.h \
|
||||||
datetime.h \
|
datetime.h \
|
||||||
@ -23,4 +31,5 @@ libdivecomputer_HEADERS = \
|
|||||||
hw_ostc.h \
|
hw_ostc.h \
|
||||||
hw_frog.h \
|
hw_frog.h \
|
||||||
hw_ostc3.h \
|
hw_ostc3.h \
|
||||||
atomics_cobalt.h
|
atomics_cobalt.h \
|
||||||
|
divesystem_idive.h
|
||||||
|
|||||||
@ -36,9 +36,6 @@ atomics_cobalt_device_version (dc_device_t *device, unsigned char data[], unsign
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
atomics_cobalt_device_set_simulation (dc_device_t *device, unsigned int simulation);
|
atomics_cobalt_device_set_simulation (dc_device_t *device, unsigned int simulation);
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
atomics_cobalt_parser_set_calibration (dc_parser_t *parser, double atmospheric, double hydrostatic);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
54
include/libdivecomputer/ble.h
Normal file
54
include/libdivecomputer/ble.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_BLE_H
|
||||||
|
#define DC_BLE_H
|
||||||
|
|
||||||
|
#include "ioctl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the remote device name.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_BLE_GET_NAME DC_IOCTL_IOR('b', 0, DC_IOCTL_SIZE_VARIABLE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the bluetooth authentication PIN code.
|
||||||
|
*
|
||||||
|
* The data format is a NULL terminated string.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_BLE_GET_PINCODE DC_IOCTL_IOR('b', 1, DC_IOCTL_SIZE_VARIABLE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get/set the bluetooth authentication access code.
|
||||||
|
*
|
||||||
|
* The data format is a variable sized byte array.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_BLE_GET_ACCESSCODE DC_IOCTL_IOR('b', 2, DC_IOCTL_SIZE_VARIABLE)
|
||||||
|
#define DC_IOCTL_BLE_SET_ACCESSCODE DC_IOCTL_IOW('b', 2, DC_IOCTL_SIZE_VARIABLE)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_BLE_H */
|
||||||
135
include/libdivecomputer/bluetooth.h
Normal file
135
include/libdivecomputer/bluetooth.h
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_BLUETOOTH_H
|
||||||
|
#define DC_BLUETOOTH_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "iostream.h"
|
||||||
|
#include "iterator.h"
|
||||||
|
#include "descriptor.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The minimum number of bytes (including the terminating null byte) for
|
||||||
|
* formatting a bluetooth address as a string.
|
||||||
|
*/
|
||||||
|
#define DC_BLUETOOTH_SIZE 18
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bluetooth address (48 bits).
|
||||||
|
*/
|
||||||
|
#if defined (_WIN32) && !defined (__GNUC__)
|
||||||
|
typedef unsigned __int64 dc_bluetooth_address_t;
|
||||||
|
#else
|
||||||
|
typedef unsigned long long dc_bluetooth_address_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a bluetooth address to a string.
|
||||||
|
*
|
||||||
|
* The bluetooth address is formatted as XX:XX:XX:XX:XX:XX, where each
|
||||||
|
* XX is a hexadecimal number specifying an octet of the 48-bit address.
|
||||||
|
* The minimum size for the buffer is #DC_BLUETOOTH_SIZE bytes.
|
||||||
|
*
|
||||||
|
* @param[in] address A bluetooth address.
|
||||||
|
* @param[in] str The memory buffer to store the result.
|
||||||
|
* @param[in] size The size of the memory buffer.
|
||||||
|
* @returns The null-terminated string on success, or NULL on failure.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
dc_bluetooth_addr2str(dc_bluetooth_address_t address, char *str, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a string to a bluetooth address.
|
||||||
|
*
|
||||||
|
* The string is expected to be in the format XX:XX:XX:XX:XX:XX, where
|
||||||
|
* each XX is a hexadecimal number specifying an octet of the 48-bit
|
||||||
|
* address.
|
||||||
|
*
|
||||||
|
* @param[in] address A null-terminated string.
|
||||||
|
* @returns The bluetooth address on success, or zero on failure.
|
||||||
|
*/
|
||||||
|
dc_bluetooth_address_t
|
||||||
|
dc_bluetooth_str2addr(const char *address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque object representing a bluetooth device.
|
||||||
|
*/
|
||||||
|
typedef struct dc_bluetooth_device_t dc_bluetooth_device_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the address of the bluetooth device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid bluetooth device.
|
||||||
|
*/
|
||||||
|
dc_bluetooth_address_t
|
||||||
|
dc_bluetooth_device_get_address (dc_bluetooth_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the bluetooth device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid bluetooth device.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
dc_bluetooth_device_get_name (dc_bluetooth_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the bluetooth device and free all resources.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid bluetooth device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dc_bluetooth_device_free (dc_bluetooth_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the bluetooth devices.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] descriptor A valid device descriptor or NULL.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_bluetooth_iterator_new (dc_iterator_t **iterator, dc_context_t *context, dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open an bluetooth connection.
|
||||||
|
*
|
||||||
|
* @param[out] iostream A location to store the bluetooth connection.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] address The bluetooth device address.
|
||||||
|
* @param[in] port The bluetooth port number.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_bluetooth_open (dc_iostream_t **iostream, dc_context_t *context, dc_bluetooth_address_t address, unsigned int port);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_BLUETOOTH_H */
|
||||||
@ -51,6 +51,9 @@ dc_buffer_append (dc_buffer_t *buffer, const unsigned char data[], size_t size);
|
|||||||
int
|
int
|
||||||
dc_buffer_prepend (dc_buffer_t *buffer, const unsigned char data[], size_t size);
|
dc_buffer_prepend (dc_buffer_t *buffer, const unsigned char data[], size_t size);
|
||||||
|
|
||||||
|
int
|
||||||
|
dc_buffer_insert (dc_buffer_t *buffer, size_t offset, const unsigned char data[], size_t size);
|
||||||
|
|
||||||
int
|
int
|
||||||
dc_buffer_slice (dc_buffer_t *buffer, size_t offset, size_t size);
|
dc_buffer_slice (dc_buffer_t *buffer, size_t offset, size_t size);
|
||||||
|
|
||||||
|
|||||||
@ -41,6 +41,20 @@ typedef enum dc_status_t {
|
|||||||
DC_STATUS_CANCELLED = -10
|
DC_STATUS_CANCELLED = -10
|
||||||
} dc_status_t;
|
} dc_status_t;
|
||||||
|
|
||||||
|
typedef enum dc_transport_t {
|
||||||
|
DC_TRANSPORT_NONE = 0,
|
||||||
|
DC_TRANSPORT_SERIAL = (1 << 0),
|
||||||
|
DC_TRANSPORT_USB = (1 << 1),
|
||||||
|
DC_TRANSPORT_USBHID = (1 << 2),
|
||||||
|
DC_TRANSPORT_IRDA = (1 << 3),
|
||||||
|
DC_TRANSPORT_BLUETOOTH = (1 << 4),
|
||||||
|
DC_TRANSPORT_BLE = (1 << 5),
|
||||||
|
DC_TRANSPORT_USBSTORAGE= (1 << 6),
|
||||||
|
} dc_transport_t;
|
||||||
|
|
||||||
|
// Idiotic enums can't be queried
|
||||||
|
#define DC_TRANSPORT_USBSTORAGE DC_TRANSPORT_USBSTORAGE
|
||||||
|
|
||||||
typedef enum dc_family_t {
|
typedef enum dc_family_t {
|
||||||
DC_FAMILY_NULL = 0,
|
DC_FAMILY_NULL = 0,
|
||||||
/* Suunto */
|
/* Suunto */
|
||||||
@ -58,12 +72,13 @@ typedef enum dc_family_t {
|
|||||||
DC_FAMILY_UWATEC_ALADIN = (3 << 16),
|
DC_FAMILY_UWATEC_ALADIN = (3 << 16),
|
||||||
DC_FAMILY_UWATEC_MEMOMOUSE,
|
DC_FAMILY_UWATEC_MEMOMOUSE,
|
||||||
DC_FAMILY_UWATEC_SMART,
|
DC_FAMILY_UWATEC_SMART,
|
||||||
DC_FAMILY_UWATEC_MERIDIAN,
|
DC_FAMILY_UWATEC_MERIDIAN, /* Deprecated: integrated into the Uwatec Smart family. */
|
||||||
DC_FAMILY_UWATEC_G2,
|
DC_FAMILY_UWATEC_G2, /* Deprecated: integrated into the Uwatec Smart family. */
|
||||||
/* Oceanic */
|
/* Oceanic */
|
||||||
DC_FAMILY_OCEANIC_VTPRO = (4 << 16),
|
DC_FAMILY_OCEANIC_VTPRO = (4 << 16),
|
||||||
DC_FAMILY_OCEANIC_VEO250,
|
DC_FAMILY_OCEANIC_VEO250,
|
||||||
DC_FAMILY_OCEANIC_ATOM2,
|
DC_FAMILY_OCEANIC_ATOM2,
|
||||||
|
DC_FAMILY_PELAGIC_I330R,
|
||||||
/* Mares */
|
/* Mares */
|
||||||
DC_FAMILY_MARES_NEMO = (5 << 16),
|
DC_FAMILY_MARES_NEMO = (5 << 16),
|
||||||
DC_FAMILY_MARES_PUCK,
|
DC_FAMILY_MARES_PUCK,
|
||||||
@ -76,6 +91,7 @@ typedef enum dc_family_t {
|
|||||||
/* Cressi */
|
/* Cressi */
|
||||||
DC_FAMILY_CRESSI_EDY = (7 << 16),
|
DC_FAMILY_CRESSI_EDY = (7 << 16),
|
||||||
DC_FAMILY_CRESSI_LEONARDO,
|
DC_FAMILY_CRESSI_LEONARDO,
|
||||||
|
DC_FAMILY_CRESSI_GOA,
|
||||||
/* Zeagle */
|
/* Zeagle */
|
||||||
DC_FAMILY_ZEAGLE_N2ITION3 = (8 << 16),
|
DC_FAMILY_ZEAGLE_N2ITION3 = (8 << 16),
|
||||||
/* Atomic Aquatics */
|
/* Atomic Aquatics */
|
||||||
@ -91,6 +107,28 @@ typedef enum dc_family_t {
|
|||||||
DC_FAMILY_DIVESYSTEM_IDIVE = (13 << 16),
|
DC_FAMILY_DIVESYSTEM_IDIVE = (13 << 16),
|
||||||
/* Cochran */
|
/* Cochran */
|
||||||
DC_FAMILY_COCHRAN_COMMANDER = (14 << 16),
|
DC_FAMILY_COCHRAN_COMMANDER = (14 << 16),
|
||||||
|
/* Tecdiving */
|
||||||
|
DC_FAMILY_TECDIVING_DIVECOMPUTEREU = (15 << 16),
|
||||||
|
/* McLean */
|
||||||
|
DC_FAMILY_MCLEAN_EXTREME = (16 << 16),
|
||||||
|
/* Liquivision */
|
||||||
|
DC_FAMILY_LIQUIVISION_LYNX = (17 << 16),
|
||||||
|
/* Sporasub */
|
||||||
|
DC_FAMILY_SPORASUB_SP2 = (18 << 16),
|
||||||
|
/* Deep Six */
|
||||||
|
DC_FAMILY_DEEPSIX_EXCURSION = (19 << 16),
|
||||||
|
/* Seac Screen */
|
||||||
|
DC_FAMILY_SEAC_SCREEN = (20 << 16),
|
||||||
|
/* Deepblu Cosmiq */
|
||||||
|
DC_FAMILY_DEEPBLU_COSMIQ = (21 << 16),
|
||||||
|
/* Oceans S1 */
|
||||||
|
DC_FAMILY_OCEANS_S1 = (22 << 16),
|
||||||
|
/* Divesoft Freedom */
|
||||||
|
DC_FAMILY_DIVESOFT_FREEDOM = (23 << 16),
|
||||||
|
|
||||||
|
// Not merged upstream yet
|
||||||
|
/* Garmin */
|
||||||
|
DC_FAMILY_GARMIN = (100 << 16),
|
||||||
} dc_family_t;
|
} dc_family_t;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@ -53,6 +53,9 @@ dc_context_set_loglevel (dc_context_t *context, dc_loglevel_t loglevel);
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
dc_context_set_logfunc (dc_context_t *context, dc_logfunc_t logfunc, void *userdata);
|
dc_context_set_logfunc (dc_context_t *context, dc_logfunc_t logfunc, void *userdata);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
dc_context_get_transports (dc_context_t *context);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@ -22,9 +22,9 @@
|
|||||||
#ifndef DC_CUSTOM_H
|
#ifndef DC_CUSTOM_H
|
||||||
#define DC_CUSTOM_H
|
#define DC_CUSTOM_H
|
||||||
|
|
||||||
#include <libdivecomputer/common.h>
|
#include "common.h"
|
||||||
#include <libdivecomputer/context.h>
|
#include "context.h"
|
||||||
#include <libdivecomputer/iostream.h>
|
#include "iostream.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -32,16 +32,16 @@ extern "C" {
|
|||||||
|
|
||||||
typedef struct dc_custom_cbs_t {
|
typedef struct dc_custom_cbs_t {
|
||||||
dc_status_t (*set_timeout) (void *userdata, int timeout);
|
dc_status_t (*set_timeout) (void *userdata, int timeout);
|
||||||
dc_status_t (*set_latency) (void *userdata, unsigned int value);
|
|
||||||
dc_status_t (*set_halfduplex) (void *userdata, unsigned int value);
|
|
||||||
dc_status_t (*set_break) (void *userdata, unsigned int value);
|
dc_status_t (*set_break) (void *userdata, unsigned int value);
|
||||||
dc_status_t (*set_dtr) (void *userdata, unsigned int value);
|
dc_status_t (*set_dtr) (void *userdata, unsigned int value);
|
||||||
dc_status_t (*set_rts) (void *userdata, unsigned int value);
|
dc_status_t (*set_rts) (void *userdata, unsigned int value);
|
||||||
dc_status_t (*get_lines) (void *userdata, unsigned int *value);
|
dc_status_t (*get_lines) (void *userdata, unsigned int *value);
|
||||||
dc_status_t (*get_available) (void *userdata, size_t *value);
|
dc_status_t (*get_available) (void *userdata, size_t *value);
|
||||||
dc_status_t (*configure) (void *userdata, unsigned int baudrate, unsigned int databits, dc_parity_t parity, dc_stopbits_t stopbits, dc_flowcontrol_t flowcontrol);
|
dc_status_t (*configure) (void *userdata, unsigned int baudrate, unsigned int databits, dc_parity_t parity, dc_stopbits_t stopbits, dc_flowcontrol_t flowcontrol);
|
||||||
|
dc_status_t (*poll) (void *userdata, int timeout);
|
||||||
dc_status_t (*read) (void *userdata, void *data, size_t size, size_t *actual);
|
dc_status_t (*read) (void *userdata, void *data, size_t size, size_t *actual);
|
||||||
dc_status_t (*write) (void *userdata, const void *data, size_t size, size_t *actual);
|
dc_status_t (*write) (void *userdata, const void *data, size_t size, size_t *actual);
|
||||||
|
dc_status_t (*ioctl) (void *userdata, unsigned int request, void *data, size_t size);
|
||||||
dc_status_t (*flush) (void *userdata);
|
dc_status_t (*flush) (void *userdata);
|
||||||
dc_status_t (*purge) (void *userdata, dc_direction_t direction);
|
dc_status_t (*purge) (void *userdata, dc_direction_t direction);
|
||||||
dc_status_t (*sleep) (void *userdata, unsigned int milliseconds);
|
dc_status_t (*sleep) (void *userdata, unsigned int milliseconds);
|
||||||
@ -59,7 +59,7 @@ typedef struct dc_custom_cbs_t {
|
|||||||
* on failure.
|
* on failure.
|
||||||
*/
|
*/
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_custom_open (dc_iostream_t **iostream, dc_context_t *context, const dc_custom_cbs_t *callbacks, void *userdata);
|
dc_custom_open (dc_iostream_t **iostream, dc_context_t *context, dc_transport_t transport, const dc_custom_cbs_t *callbacks, void *userdata);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
@ -22,11 +22,13 @@
|
|||||||
#ifndef DC_DATETIME_H
|
#ifndef DC_DATETIME_H
|
||||||
#define DC_DATETIME_H
|
#define DC_DATETIME_H
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#define DC_TIMEZONE_NONE 0x80000000
|
#define DC_TIMEZONE_NONE INT_MIN
|
||||||
|
|
||||||
#if defined (_WIN32) && !defined (__GNUC__)
|
#if defined (_WIN32) && !defined (__GNUC__)
|
||||||
typedef __int64 dc_ticks_t;
|
typedef __int64 dc_ticks_t;
|
||||||
|
|||||||
@ -29,37 +29,95 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
typedef enum dc_transport_t {
|
/**
|
||||||
DC_TRANSPORT_NONE,
|
* Opaque object representing a supported dive computer.
|
||||||
DC_TRANSPORT_SERIAL,
|
*/
|
||||||
DC_TRANSPORT_USB,
|
|
||||||
DC_TRANSPORT_USBHID,
|
|
||||||
DC_TRANSPORT_IRDA,
|
|
||||||
DC_TRANSPORT_BLUETOOTH
|
|
||||||
} dc_transport_t;
|
|
||||||
|
|
||||||
typedef struct dc_descriptor_t dc_descriptor_t;
|
typedef struct dc_descriptor_t dc_descriptor_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the supported dive computers.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_descriptor_iterator (dc_iterator_t **iterator);
|
dc_descriptor_iterator (dc_iterator_t **iterator);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the device descriptor.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
dc_descriptor_free (dc_descriptor_t *descriptor);
|
dc_descriptor_free (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the vendor name of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The vendor name of the dive computer on success, or NULL on failure.
|
||||||
|
*/
|
||||||
const char *
|
const char *
|
||||||
dc_descriptor_get_vendor (dc_descriptor_t *descriptor);
|
dc_descriptor_get_vendor (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the product name of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The product name of the dive computer on success, or NULL on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
const char *
|
const char *
|
||||||
dc_descriptor_get_product (dc_descriptor_t *descriptor);
|
dc_descriptor_get_product (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the family type of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The family type of the dive computer on success, or DC_FAMILY_NULL
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
dc_family_t
|
dc_family_t
|
||||||
dc_descriptor_get_type (dc_descriptor_t *descriptor);
|
dc_descriptor_get_type (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the model number of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The model number of the dive computer on success, or zero on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
unsigned int
|
unsigned int
|
||||||
dc_descriptor_get_model (dc_descriptor_t *descriptor);
|
dc_descriptor_get_model (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
dc_transport_t
|
/**
|
||||||
dc_descriptor_get_transport (dc_descriptor_t *descriptor);
|
* Get all transports supported by the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns A bitmask with all the transports supported by the dive computer on
|
||||||
|
* success, or DC_TRANSPORT_NONE on failure.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
dc_descriptor_get_transports (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a low-level I/O device matches a supported dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @param[in] transport The transport type of the I/O device.
|
||||||
|
* @param[in] userdata A pointer to a transport specific data structure:
|
||||||
|
* - DC_TRANSPORT_SERIAL: Name of the device node (string)
|
||||||
|
* - DC_TRANSPORT_USB: USB VID/PID (#dc_usb_desc_t)
|
||||||
|
* - DC_TRANSPORT_USBHID: USB VID/PID (#dc_usbhid_desc_t)
|
||||||
|
* - DC_TRANSPORT_IRDA: IrDA device name (string)
|
||||||
|
* - DC_TRANSPORT_BLUETOOTH: Bluetooth device name (string)
|
||||||
|
* - DC_TRANSPORT_BLE: Bluetooth device name (string)
|
||||||
|
* @returns Non-zero if the device matches a supported dive computer, or zero if
|
||||||
|
* there is no match.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "descriptor.h"
|
#include "descriptor.h"
|
||||||
|
#include "iostream.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "datetime.h"
|
#include "datetime.h"
|
||||||
|
|
||||||
@ -70,7 +71,7 @@ typedef void (*dc_event_callback_t) (dc_device_t *device, dc_event_type_t event,
|
|||||||
typedef int (*dc_dive_callback_t) (const unsigned char *data, unsigned int size, const unsigned char *fingerprint, unsigned int fsize, void *userdata);
|
typedef int (*dc_dive_callback_t) (const unsigned char *data, unsigned int size, const unsigned char *fingerprint, unsigned int fsize, void *userdata);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const char *name);
|
dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, dc_iostream_t *iostream);
|
||||||
|
|
||||||
dc_family_t
|
dc_family_t
|
||||||
dc_device_get_type (dc_device_t *device);
|
dc_device_get_type (dc_device_t *device);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* libdivecomputer
|
* libdivecomputer
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Jef Driesen
|
* Copyright (C) 2019 Jef Driesen
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -19,21 +19,20 @@
|
|||||||
* MA 02110-1301 USA
|
* MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef UWATEC_MERIDIAN_H
|
#ifndef DC_DIVESYSTEM_IDIVE_H
|
||||||
#define UWATEC_MERIDIAN_H
|
#define DC_DIVESYSTEM_IDIVE_H
|
||||||
|
|
||||||
#include <libdivecomputer/context.h>
|
#include "common.h"
|
||||||
#include <libdivecomputer/device.h>
|
#include "device.h"
|
||||||
#include <libdivecomputer/parser.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
uwatec_meridian_device_open (dc_device_t **device, dc_context_t *context, const char *name);
|
divesystem_idive_device_fwupdate (dc_device_t *abstract, const char *filename);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
#endif /* UWATEC_MERIDIAN_H */
|
#endif /* DC_DIVESYSTEM_IDIVE_H */
|
||||||
@ -22,6 +22,8 @@
|
|||||||
#ifndef DC_HW_OSTC3_H
|
#ifndef DC_HW_OSTC3_H
|
||||||
#define DC_HW_OSTC3_H
|
#define DC_HW_OSTC3_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "datetime.h"
|
#include "datetime.h"
|
||||||
@ -55,7 +57,7 @@ dc_status_t
|
|||||||
hw_ostc3_device_config_reset (dc_device_t *abstract);
|
hw_ostc3_device_config_reset (dc_device_t *abstract);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
hw_ostc3_device_fwupdate (dc_device_t *abstract, const char *filename);
|
hw_ostc3_device_fwupdate (dc_device_t *abstract, const char *filename, bool forceUpdate);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
73
include/libdivecomputer/ioctl.h
Normal file
73
include/libdivecomputer/ioctl.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_IOCTL_H
|
||||||
|
#define DC_IOCTL_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ioctl direction bits.
|
||||||
|
*
|
||||||
|
* Note: WRITE means the application is writing and the driver is
|
||||||
|
* reading. READ means the application is reading and the driver is
|
||||||
|
* writing.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_DIR_NONE 0u
|
||||||
|
#define DC_IOCTL_DIR_READ 1u
|
||||||
|
#define DC_IOCTL_DIR_WRITE 2u
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ioctl variable size bits.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_SIZE_VARIABLE 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper macro to encode ioctl numbers.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_BASE(dir,type,nr,size) \
|
||||||
|
(((dir) << 30) | \
|
||||||
|
((size) << 16) | \
|
||||||
|
((type) << 8) | \
|
||||||
|
((nr) << 0))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to encode ioctl numbers.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_IO(type,nr) DC_IOCTL_BASE(DC_IOCTL_DIR_NONE, (type), (nr), 0)
|
||||||
|
#define DC_IOCTL_IOR(type,nr,size) DC_IOCTL_BASE(DC_IOCTL_DIR_READ, (type), (nr), (size))
|
||||||
|
#define DC_IOCTL_IOW(type,nr,size) DC_IOCTL_BASE(DC_IOCTL_DIR_WRITE, (type), (nr), (size))
|
||||||
|
#define DC_IOCTL_IORW(type,nr,size) DC_IOCTL_BASE(DC_IOCTL_DIR_READ | DC_IOCTL_DIR_WRITE, (type), (nr), (size))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to decode ioctl numbers.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_DIR(request) (((request) >> 30) & 0x0003)
|
||||||
|
#define DC_IOCTL_SIZE(request) (((request) >> 16) & 0x3FFF)
|
||||||
|
#define DC_IOCTL_TYPE(request) (((request) >> 8) & 0x00FF)
|
||||||
|
#define DC_IOCTL_NR(request) (((request) >> 0) & 0x00FF)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_IOCTL_H */
|
||||||
@ -22,6 +22,7 @@
|
|||||||
#ifndef DC_IOSTREAM_H
|
#ifndef DC_IOSTREAM_H
|
||||||
#define DC_IOSTREAM_H
|
#define DC_IOSTREAM_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <libdivecomputer/common.h>
|
#include <libdivecomputer/common.h>
|
||||||
#include <libdivecomputer/context.h>
|
#include <libdivecomputer/context.h>
|
||||||
|
|
||||||
@ -82,6 +83,15 @@ typedef enum dc_line_t {
|
|||||||
DC_LINE_RNG = 0x08, /**< Ring indicator */
|
DC_LINE_RNG = 0x08, /**< Ring indicator */
|
||||||
} dc_line_t;
|
} dc_line_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the transport type.
|
||||||
|
*
|
||||||
|
* @param[in] iostream A valid I/O stream.
|
||||||
|
* @returns The transport type of the I/O stream.
|
||||||
|
*/
|
||||||
|
dc_transport_t
|
||||||
|
dc_iostream_get_transport (dc_iostream_t *iostream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the read timeout.
|
* Set the read timeout.
|
||||||
*
|
*
|
||||||
@ -113,33 +123,6 @@ typedef enum dc_line_t {
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
dc_iostream_set_timeout (dc_iostream_t *iostream, int timeout);
|
dc_iostream_set_timeout (dc_iostream_t *iostream, int timeout);
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the receive latency.
|
|
||||||
*
|
|
||||||
* The effect of this setting is highly platform and driver specific. On
|
|
||||||
* Windows it does nothing at all, on Linux it controls the low latency
|
|
||||||
* flag (e.g. only zero vs non-zero latency), and on Mac OS X it sets
|
|
||||||
* the receive latency as requested.
|
|
||||||
*
|
|
||||||
* @param[in] iostream A valid I/O stream.
|
|
||||||
* @param[in] value The latency in milliseconds.
|
|
||||||
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
|
||||||
* on failure.
|
|
||||||
*/
|
|
||||||
dc_status_t
|
|
||||||
dc_iostream_set_latency (dc_iostream_t *iostream, unsigned int value);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the state of the half duplex emulation.
|
|
||||||
*
|
|
||||||
* @param[in] iostream A valid I/O stream.
|
|
||||||
* @param[in] value The half duplex state.
|
|
||||||
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
|
||||||
* on failure.
|
|
||||||
*/
|
|
||||||
dc_status_t
|
|
||||||
dc_iostream_set_halfduplex (dc_iostream_t *iostream, unsigned int value);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the state of the break condition.
|
* Set the state of the break condition.
|
||||||
*
|
*
|
||||||
@ -212,6 +195,36 @@ dc_iostream_get_available (dc_iostream_t *iostream, size_t *value);
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
dc_iostream_configure (dc_iostream_t *iostream, unsigned int baudrate, unsigned int databits, dc_parity_t parity, dc_stopbits_t stopbits, dc_flowcontrol_t flowcontrol);
|
dc_iostream_configure (dc_iostream_t *iostream, unsigned int baudrate, unsigned int databits, dc_parity_t parity, dc_stopbits_t stopbits, dc_flowcontrol_t flowcontrol);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Poll the I/O stream for available data.
|
||||||
|
*
|
||||||
|
* There are three distinct modes available:
|
||||||
|
*
|
||||||
|
* 1. Blocking (timeout < 0):
|
||||||
|
*
|
||||||
|
* The poll operation is blocked until one or more bytes have been
|
||||||
|
* received. If no bytes are received, the operation will block
|
||||||
|
* forever.
|
||||||
|
*
|
||||||
|
* 2. Non-blocking (timeout == 0):
|
||||||
|
*
|
||||||
|
* The poll operation returns immediately, even if no bytes have
|
||||||
|
* been received.
|
||||||
|
*
|
||||||
|
* 3. Timeout (timeout > 0):
|
||||||
|
*
|
||||||
|
* The poll operation is blocked until one or more bytes have been
|
||||||
|
* received. If no bytes are received within the specified amount of
|
||||||
|
* time, the operation will return with a timeout.
|
||||||
|
*
|
||||||
|
* @param[in] iostream A valid I/O stream.
|
||||||
|
* @param[in] timeout The timeout in milliseconds.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, #DC_STATUS_TIMEOUT on
|
||||||
|
* timeout, or another #dc_status_t code on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_iostream_poll (dc_iostream_t *iostream, int timeout);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read data from the I/O stream.
|
* Read data from the I/O stream.
|
||||||
*
|
*
|
||||||
@ -240,6 +253,19 @@ dc_iostream_read (dc_iostream_t *iostream, void *data, size_t size, size_t *actu
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
dc_iostream_write (dc_iostream_t *iostream, const void *data, size_t size, size_t *actual);
|
dc_iostream_write (dc_iostream_t *iostream, const void *data, size_t size, size_t *actual);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform an I/O stream specific request.
|
||||||
|
*
|
||||||
|
* @param[in] iostream A valid I/O stream.
|
||||||
|
* @param[in] request The request to perform.
|
||||||
|
* @param[in,out] data The request specific data.
|
||||||
|
* @param[in] size The size of the request specific data.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_iostream_ioctl (dc_iostream_t *iostream, unsigned int request, void *data, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flush the internal output buffer and wait until the data has been
|
* Flush the internal output buffer and wait until the data has been
|
||||||
* transmitted.
|
* transmitted.
|
||||||
@ -284,6 +310,9 @@ dc_iostream_sleep (dc_iostream_t *iostream, unsigned int milliseconds);
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
dc_iostream_close (dc_iostream_t *iostream);
|
dc_iostream_close (dc_iostream_t *iostream);
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
dc_usb_storage_open (dc_iostream_t **out, dc_context_t *context, const char *name);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
92
include/libdivecomputer/irda.h
Normal file
92
include/libdivecomputer/irda.h
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_IRDA_H
|
||||||
|
#define DC_IRDA_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "iostream.h"
|
||||||
|
#include "iterator.h"
|
||||||
|
#include "descriptor.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque object representing an IrDA device.
|
||||||
|
*/
|
||||||
|
typedef struct dc_irda_device_t dc_irda_device_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the address of the IrDA device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid IrDA device.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
dc_irda_device_get_address (dc_irda_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the IrDA device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid IrDA device.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
dc_irda_device_get_name (dc_irda_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the IrDA device and free all resources.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid IrDA device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dc_irda_device_free (dc_irda_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the IrDA devices.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] descriptor A valid device descriptor or NULL.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_irda_iterator_new (dc_iterator_t **iterator, dc_context_t *context, dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open an IrDA connection.
|
||||||
|
*
|
||||||
|
* @param[out] iostream A location to store the IrDA connection.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] address The IrDA device address.
|
||||||
|
* @param[in] lsap The IrDA LSAP number.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_irda_open (dc_iostream_t **iostream, dc_context_t *context, unsigned int address, unsigned int lsap);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_IRDA_H */
|
||||||
@ -46,9 +46,13 @@ typedef enum dc_sample_type_t {
|
|||||||
DC_SAMPLE_PPO2,
|
DC_SAMPLE_PPO2,
|
||||||
DC_SAMPLE_CNS,
|
DC_SAMPLE_CNS,
|
||||||
DC_SAMPLE_DECO,
|
DC_SAMPLE_DECO,
|
||||||
DC_SAMPLE_GASMIX
|
DC_SAMPLE_GASMIX,
|
||||||
|
DC_SAMPLE_TTS, // time to surface in seconds
|
||||||
} dc_sample_type_t;
|
} dc_sample_type_t;
|
||||||
|
|
||||||
|
// Make it easy to test support compile-time with "#ifdef DC_SAMPLE_TTS"
|
||||||
|
#define DC_SAMPLE_TTS DC_SAMPLE_TTS
|
||||||
|
|
||||||
typedef enum dc_field_type_t {
|
typedef enum dc_field_type_t {
|
||||||
DC_FIELD_DIVETIME,
|
DC_FIELD_DIVETIME,
|
||||||
DC_FIELD_MAXDEPTH,
|
DC_FIELD_MAXDEPTH,
|
||||||
@ -62,9 +66,14 @@ typedef enum dc_field_type_t {
|
|||||||
DC_FIELD_TEMPERATURE_MAXIMUM,
|
DC_FIELD_TEMPERATURE_MAXIMUM,
|
||||||
DC_FIELD_TANK_COUNT,
|
DC_FIELD_TANK_COUNT,
|
||||||
DC_FIELD_TANK,
|
DC_FIELD_TANK,
|
||||||
DC_FIELD_DIVEMODE
|
DC_FIELD_DIVEMODE,
|
||||||
|
DC_FIELD_DECOMODEL,
|
||||||
|
DC_FIELD_STRING,
|
||||||
} dc_field_type_t;
|
} dc_field_type_t;
|
||||||
|
|
||||||
|
// Make it easy to test support compile-time with "#ifdef DC_FIELD_STRING"
|
||||||
|
#define DC_FIELD_STRING DC_FIELD_STRING
|
||||||
|
|
||||||
typedef enum parser_sample_event_t {
|
typedef enum parser_sample_event_t {
|
||||||
SAMPLE_EVENT_NONE,
|
SAMPLE_EVENT_NONE,
|
||||||
SAMPLE_EVENT_DECOSTOP,
|
SAMPLE_EVENT_DECOSTOP,
|
||||||
@ -92,17 +101,41 @@ typedef enum parser_sample_event_t {
|
|||||||
SAMPLE_EVENT_HEADING,
|
SAMPLE_EVENT_HEADING,
|
||||||
SAMPLE_EVENT_TISSUELEVEL,
|
SAMPLE_EVENT_TISSUELEVEL,
|
||||||
SAMPLE_EVENT_GASCHANGE2, /* Deprecated: replaced by DC_SAMPLE_GASMIX. */
|
SAMPLE_EVENT_GASCHANGE2, /* Deprecated: replaced by DC_SAMPLE_GASMIX. */
|
||||||
|
SAMPLE_EVENT_STRING,
|
||||||
} parser_sample_event_t;
|
} parser_sample_event_t;
|
||||||
|
|
||||||
|
/* To let the compile know we have this */
|
||||||
|
#define SAMPLE_EVENT_STRING SAMPLE_EVENT_STRING
|
||||||
|
|
||||||
/* For backwards compatibility */
|
/* For backwards compatibility */
|
||||||
#define SAMPLE_EVENT_UNKNOWN SAMPLE_EVENT_FLOOR
|
#define SAMPLE_EVENT_UNKNOWN SAMPLE_EVENT_FLOOR
|
||||||
|
|
||||||
typedef enum parser_sample_flags_t {
|
typedef enum parser_sample_flags_t {
|
||||||
SAMPLE_FLAGS_NONE = 0,
|
SAMPLE_FLAGS_NONE = 0,
|
||||||
SAMPLE_FLAGS_BEGIN = (1 << 0),
|
SAMPLE_FLAGS_BEGIN = (1 << 0),
|
||||||
SAMPLE_FLAGS_END = (1 << 1)
|
SAMPLE_FLAGS_END = (1 << 1),
|
||||||
|
SAMPLE_FLAGS_SEVERITY_MASK = (7 << 2),
|
||||||
} parser_sample_flags_t;
|
} parser_sample_flags_t;
|
||||||
|
|
||||||
|
#define SAMPLE_FLAGS_SEVERITY_SHIFT 2
|
||||||
|
|
||||||
|
#define SAMPLE_FLAGS_SEVERITY_MISSING (0 << SAMPLE_FLAGS_SEVERITY_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_SEVERITY_STATE (1 << SAMPLE_FLAGS_SEVERITY_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_SEVERITY_INFO (2 << SAMPLE_FLAGS_SEVERITY_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_SEVERITY_WARN (3 << SAMPLE_FLAGS_SEVERITY_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_SEVERITY_ALARM (4 << SAMPLE_FLAGS_SEVERITY_SHIFT)
|
||||||
|
|
||||||
|
/* these are used for the types of TAGs in Shearwater PNF info events */
|
||||||
|
#define SAMPLE_FLAGS_TYPE_SHIFT 5
|
||||||
|
#define SAMPLE_FLAGS_TYPE_MASK (7 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_NONE (0 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_INTEREST (1 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_NAVPOINT (2 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_DANGER (3 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_ANIMAL (4 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_ISSUE (5 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
#define SAMPLE_FLAGS_TYPE_INJURY (6 << SAMPLE_FLAGS_TYPE_SHIFT)
|
||||||
|
|
||||||
typedef enum parser_sample_vendor_t {
|
typedef enum parser_sample_vendor_t {
|
||||||
SAMPLE_VENDOR_NONE,
|
SAMPLE_VENDOR_NONE,
|
||||||
SAMPLE_VENDOR_UWATEC_ALADIN,
|
SAMPLE_VENDOR_UWATEC_ALADIN,
|
||||||
@ -140,19 +173,31 @@ typedef struct dc_salinity_t {
|
|||||||
double density;
|
double density;
|
||||||
} dc_salinity_t;
|
} dc_salinity_t;
|
||||||
|
|
||||||
|
typedef enum dc_usage_t {
|
||||||
|
DC_USAGE_NONE, // Usage not specified
|
||||||
|
DC_USAGE_OXYGEN,
|
||||||
|
DC_USAGE_DILUENT,
|
||||||
|
DC_USAGE_OPEN_CIRCUIT,
|
||||||
|
} dc_usage_t;
|
||||||
|
|
||||||
typedef struct dc_gasmix_t {
|
typedef struct dc_gasmix_t {
|
||||||
double helium;
|
double helium;
|
||||||
double oxygen;
|
double oxygen;
|
||||||
double nitrogen;
|
double nitrogen;
|
||||||
|
dc_usage_t usage;
|
||||||
} dc_gasmix_t;
|
} dc_gasmix_t;
|
||||||
|
|
||||||
|
#define DC_SENSOR_NONE 0xFFFFFFFF
|
||||||
#define DC_GASMIX_UNKNOWN 0xFFFFFFFF
|
#define DC_GASMIX_UNKNOWN 0xFFFFFFFF
|
||||||
|
|
||||||
typedef enum dc_tankvolume_t {
|
typedef unsigned int dc_tankinfo_t;
|
||||||
DC_TANKVOLUME_NONE,
|
#define DC_TANKINFO_METRIC 1
|
||||||
DC_TANKVOLUME_METRIC,
|
#define DC_TANKINFO_IMPERIAL 2
|
||||||
DC_TANKVOLUME_IMPERIAL,
|
|
||||||
} dc_tankvolume_t;
|
// For backwards compatibility
|
||||||
|
#define DC_TANKVOLUME_NONE 0
|
||||||
|
#define DC_TANKVOLUME_METRIC DC_TANKINFO_METRIC
|
||||||
|
#define DC_TANKVOLUME_IMPERIAL DC_TANKINFO_IMPERIAL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tank volume
|
* Tank volume
|
||||||
@ -177,17 +222,65 @@ typedef enum dc_tankvolume_t {
|
|||||||
* divide by 1 ATM (Vair = Vwater * Pwork / Patm).
|
* divide by 1 ATM (Vair = Vwater * Pwork / Patm).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef enum dc_tank_usage_t {
|
||||||
|
DC_TANK_USAGE_NONE,
|
||||||
|
DC_TANK_USAGE_SIDEMOUNT,
|
||||||
|
} dc_tank_usage_t;
|
||||||
|
|
||||||
typedef struct dc_tank_t {
|
typedef struct dc_tank_t {
|
||||||
unsigned int gasmix; /* Gas mix index, or DC_GASMIX_UNKNOWN */
|
unsigned int gasmix; /* Gas mix index, or DC_GASMIX_UNKNOWN */
|
||||||
dc_tankvolume_t type; /* Tank type */
|
dc_tankinfo_t type; /* Tank type - metric/imperial and oc/cc */
|
||||||
double volume; /* Volume (liter) */
|
double volume; /* Volume (liter) */
|
||||||
double workpressure; /* Work pressure (bar) */
|
double workpressure; /* Work pressure (bar) */
|
||||||
double beginpressure; /* Begin pressure (bar) */
|
double beginpressure; /* Begin pressure (bar) */
|
||||||
double endpressure; /* End pressure (bar) */
|
double endpressure; /* End pressure (bar) */
|
||||||
|
dc_tank_usage_t usage;
|
||||||
} dc_tank_t;
|
} dc_tank_t;
|
||||||
|
|
||||||
|
typedef enum dc_decomodel_type_t {
|
||||||
|
DC_DECOMODEL_NONE,
|
||||||
|
DC_DECOMODEL_BUHLMANN,
|
||||||
|
DC_DECOMODEL_VPM,
|
||||||
|
DC_DECOMODEL_RGBM,
|
||||||
|
DC_DECOMODEL_DCIEM,
|
||||||
|
} dc_decomodel_type_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decompression model
|
||||||
|
*
|
||||||
|
* The type field contains the decompression algorithm.
|
||||||
|
*
|
||||||
|
* The (optional) conservatism field contains the personal adjustment
|
||||||
|
* setting of the algorithm. The exact interpretation depends on the
|
||||||
|
* dive computer, but the default value (zero) will typically correspond
|
||||||
|
* to the neutral setting, while a positive value is more conservative
|
||||||
|
* and a negative value more aggressive.
|
||||||
|
*
|
||||||
|
* The (optional) params field contains the parameters of the algorithm:
|
||||||
|
*
|
||||||
|
* DC_DECOMODEL_BUHLMANN: The Gradient Factor (GF) parameters low and
|
||||||
|
* high. For a pure Buhlmann algorithm (e.g. without GF enabled), both
|
||||||
|
* values are 100. If GF are enabled, but the actual parameter values
|
||||||
|
* are not available from the dive computer, both values are zero.
|
||||||
|
*/
|
||||||
|
typedef struct dc_decomodel_t {
|
||||||
|
dc_decomodel_type_t type;
|
||||||
|
int conservatism;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned int high;
|
||||||
|
unsigned int low;
|
||||||
|
} gf;
|
||||||
|
} params;
|
||||||
|
} dc_decomodel_t;
|
||||||
|
|
||||||
|
typedef struct dc_field_string_t {
|
||||||
|
const char *desc;
|
||||||
|
const char *value;
|
||||||
|
} dc_field_string_t;
|
||||||
|
|
||||||
typedef union dc_sample_value_t {
|
typedef union dc_sample_value_t {
|
||||||
unsigned int time;
|
unsigned int time; /* Milliseconds */
|
||||||
double depth;
|
double depth;
|
||||||
struct {
|
struct {
|
||||||
unsigned int tank;
|
unsigned int tank;
|
||||||
@ -199,6 +292,7 @@ typedef union dc_sample_value_t {
|
|||||||
unsigned int time;
|
unsigned int time;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
unsigned int value;
|
unsigned int value;
|
||||||
|
const char *name;
|
||||||
} event;
|
} event;
|
||||||
unsigned int rbt;
|
unsigned int rbt;
|
||||||
unsigned int heartbeat;
|
unsigned int heartbeat;
|
||||||
@ -209,31 +303,41 @@ typedef union dc_sample_value_t {
|
|||||||
const void *data;
|
const void *data;
|
||||||
} vendor;
|
} vendor;
|
||||||
double setpoint;
|
double setpoint;
|
||||||
double ppo2;
|
struct {
|
||||||
|
unsigned int sensor;
|
||||||
|
double value;
|
||||||
|
} ppo2;
|
||||||
double cns;
|
double cns;
|
||||||
struct {
|
struct {
|
||||||
unsigned int type;
|
unsigned int type;
|
||||||
unsigned int time;
|
unsigned int time;
|
||||||
double depth;
|
double depth;
|
||||||
|
unsigned int tts;
|
||||||
} deco;
|
} deco;
|
||||||
unsigned int gasmix; /* Gas mix index */
|
unsigned int gasmix; /* Gas mix index */
|
||||||
} dc_sample_value_t;
|
} dc_sample_value_t;
|
||||||
|
|
||||||
typedef struct dc_parser_t dc_parser_t;
|
typedef struct dc_parser_t dc_parser_t;
|
||||||
|
|
||||||
typedef void (*dc_sample_callback_t) (dc_sample_type_t type, dc_sample_value_t value, void *userdata);
|
typedef void (*dc_sample_callback_t) (dc_sample_type_t type, const dc_sample_value_t *value, void *userdata);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_parser_new (dc_parser_t **parser, dc_device_t *device);
|
dc_parser_new (dc_parser_t **parser, dc_device_t *device, const unsigned char data[], size_t size);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_parser_new2 (dc_parser_t **parser, dc_context_t *context, dc_descriptor_t *descriptor, unsigned int devtime, dc_ticks_t systime);
|
dc_parser_new2 (dc_parser_t **parser, dc_context_t *context, dc_descriptor_t *descriptor, const unsigned char data[], size_t size);
|
||||||
|
|
||||||
dc_family_t
|
dc_family_t
|
||||||
dc_parser_get_type (dc_parser_t *parser);
|
dc_parser_get_type (dc_parser_t *parser);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_parser_set_data (dc_parser_t *parser, const unsigned char *data, unsigned int size);
|
dc_parser_set_clock (dc_parser_t *parser, unsigned int devtime, dc_ticks_t systime);
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
dc_parser_set_atmospheric (dc_parser_t *parser, double atmospheric);
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
dc_parser_set_density (dc_parser_t *parser, double density);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_parser_get_datetime (dc_parser_t *parser, dc_datetime_t *datetime);
|
dc_parser_get_datetime (dc_parser_t *parser, dc_datetime_t *datetime);
|
||||||
|
|||||||
@ -35,9 +35,6 @@ extern "C" {
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
reefnet_sensus_device_get_handshake (dc_device_t *device, unsigned char data[], unsigned int size);
|
reefnet_sensus_device_get_handshake (dc_device_t *device, unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
reefnet_sensus_parser_set_calibration (dc_parser_t *parser, double atmospheric, double hydrostatic);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@ -38,9 +38,6 @@ reefnet_sensuspro_device_get_handshake (dc_device_t *device, unsigned char data[
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
reefnet_sensuspro_device_write_interval (dc_device_t *device, unsigned char interval);
|
reefnet_sensuspro_device_write_interval (dc_device_t *device, unsigned char interval);
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
reefnet_sensuspro_parser_set_calibration (dc_parser_t *parser, double atmospheric, double hydrostatic);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@ -56,9 +56,6 @@ reefnet_sensusultra_device_write_parameter (dc_device_t *device, reefnet_sensusu
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
reefnet_sensusultra_device_sense (dc_device_t *device, unsigned char data[], unsigned int size);
|
reefnet_sensusultra_device_sense (dc_device_t *device, unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
reefnet_sensusultra_parser_set_calibration (dc_parser_t *parser, double atmospheric, double hydrostatic);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
94
include/libdivecomputer/serial.h
Normal file
94
include/libdivecomputer/serial.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_SERIAL_H
|
||||||
|
#define DC_SERIAL_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "iostream.h"
|
||||||
|
#include "iterator.h"
|
||||||
|
#include "descriptor.h"
|
||||||
|
#include "ioctl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque object representing a serial device.
|
||||||
|
*/
|
||||||
|
typedef struct dc_serial_device_t dc_serial_device_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the device node of the serial device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid serial device.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
dc_serial_device_get_name (dc_serial_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the serial device and free all resources.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid serial device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dc_serial_device_free (dc_serial_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the serial devices.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] descriptor A valid device descriptor or NULL.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_serial_iterator_new (dc_iterator_t **iterator, dc_context_t *context, dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a serial connection.
|
||||||
|
*
|
||||||
|
* @param[out] iostream A location to store the serial connection.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] name The name of the device node.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_serial_open (dc_iostream_t **iostream, dc_context_t *context, const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the receive latency in milliseconds.
|
||||||
|
*
|
||||||
|
* The effect of this setting is highly platform and driver specific. On
|
||||||
|
* Windows it does nothing at all, on Linux it controls the low latency
|
||||||
|
* flag (e.g. only zero vs non-zero latency), and on Mac OS X it sets
|
||||||
|
* the receive latency as requested.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_SERIAL_SET_LATENCY DC_IOCTL_IOW('s', 0, sizeof(unsigned int))
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_SERIAL_H */
|
||||||
153
include/libdivecomputer/usb.h
Normal file
153
include/libdivecomputer/usb.h
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_USB_H
|
||||||
|
#define DC_USB_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "iostream.h"
|
||||||
|
#include "iterator.h"
|
||||||
|
#include "descriptor.h"
|
||||||
|
#include "ioctl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a USB control transfer.
|
||||||
|
*
|
||||||
|
* The parameters for the control transfer are specified in the
|
||||||
|
* #dc_usb_control_t data structure. If the control transfer requires
|
||||||
|
* additional data as in- or output, the buffer must be located
|
||||||
|
* immediately after the #dc_usb_control_t data structure, and the
|
||||||
|
* length of the buffer must be indicated in the #wLength field. The
|
||||||
|
* size of the ioctl request is the total size, including the size of
|
||||||
|
* the #dc_usb_control_t structure.
|
||||||
|
*/
|
||||||
|
#define DC_IOCTL_USB_CONTROL_READ DC_IOCTL_IOR('u', 0, DC_IOCTL_SIZE_VARIABLE)
|
||||||
|
#define DC_IOCTL_USB_CONTROL_WRITE DC_IOCTL_IOW('u', 0, DC_IOCTL_SIZE_VARIABLE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* USB control transfer.
|
||||||
|
*/
|
||||||
|
typedef struct dc_usb_control_t {
|
||||||
|
unsigned char bmRequestType;
|
||||||
|
unsigned char bRequest;
|
||||||
|
unsigned short wValue;
|
||||||
|
unsigned short wIndex;
|
||||||
|
unsigned short wLength;
|
||||||
|
} dc_usb_control_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint direction bits of the USB control transfer.
|
||||||
|
*/
|
||||||
|
typedef enum dc_usb_endpoint_t {
|
||||||
|
DC_USB_ENDPOINT_OUT = 0x00,
|
||||||
|
DC_USB_ENDPOINT_IN = 0x80
|
||||||
|
} dc_usb_endpoint_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request type bits of the USB control transfer.
|
||||||
|
*/
|
||||||
|
typedef enum dc_usb_request_t {
|
||||||
|
DC_USB_REQUEST_STANDARD = 0x00,
|
||||||
|
DC_USB_REQUEST_CLASS = 0x20,
|
||||||
|
DC_USB_REQUEST_VENDOR = 0x40,
|
||||||
|
DC_USB_REQUEST_RESERVED = 0x60
|
||||||
|
} dc_usb_request_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recipient bits of the USB control transfer.
|
||||||
|
*/
|
||||||
|
typedef enum dc_usb_recipient_t {
|
||||||
|
DC_USB_RECIPIENT_DEVICE = 0x00,
|
||||||
|
DC_USB_RECIPIENT_INTERFACE = 0x01,
|
||||||
|
DC_USB_RECIPIENT_ENDPOINT = 0x02,
|
||||||
|
DC_USB_RECIPIENT_OTHER = 0x03,
|
||||||
|
} dc_usb_recipient_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* USB device descriptor.
|
||||||
|
*/
|
||||||
|
typedef struct dc_usb_desc_t {
|
||||||
|
unsigned short vid;
|
||||||
|
unsigned short pid;
|
||||||
|
} dc_usb_desc_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque object representing a USB device.
|
||||||
|
*/
|
||||||
|
typedef struct dc_usb_device_t dc_usb_device_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the vendor id (VID) of the USB device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid USB device.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
dc_usb_device_get_vid (dc_usb_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the product id (PID) of the USB device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid USB device.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
dc_usb_device_get_pid (dc_usb_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the USB device and free all resources.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid USB device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dc_usb_device_free(dc_usb_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the USB devices.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] descriptor A valid device descriptor or NULL.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_usb_iterator_new (dc_iterator_t **iterator, dc_context_t *context, dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a USB connection.
|
||||||
|
*
|
||||||
|
* @param[out] iostream A location to store the USB connection.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] device A valid USB device.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_usb_open (dc_iostream_t **iostream, dc_context_t *context, dc_usb_device_t *device);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_USB_H */
|
||||||
99
include/libdivecomputer/usbhid.h
Normal file
99
include/libdivecomputer/usbhid.h
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* libdivecomputer
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Jef Driesen
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DC_USBHID_H
|
||||||
|
#define DC_USBHID_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "context.h"
|
||||||
|
#include "iostream.h"
|
||||||
|
#include "iterator.h"
|
||||||
|
#include "descriptor.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* USB HID device descriptor.
|
||||||
|
*/
|
||||||
|
typedef struct dc_usbhid_desc_t {
|
||||||
|
unsigned short vid;
|
||||||
|
unsigned short pid;
|
||||||
|
} dc_usbhid_desc_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque object representing a USB HID device.
|
||||||
|
*/
|
||||||
|
typedef struct dc_usbhid_device_t dc_usbhid_device_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the vendor id (VID) of the USB HID device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid USB HID device.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
dc_usbhid_device_get_vid (dc_usbhid_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the product id (PID) of the USB HID device.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid USB HID device.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
dc_usbhid_device_get_pid (dc_usbhid_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the USB HID device and free all resources.
|
||||||
|
*
|
||||||
|
* @param[in] device A valid USB HID device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dc_usbhid_device_free(dc_usbhid_device_t *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the USB HID devices.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] descriptor A valid device descriptor or NULL.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_usbhid_iterator_new (dc_iterator_t **iterator, dc_context_t *context, dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a USB HID connection.
|
||||||
|
*
|
||||||
|
* @param[out] iostream A location to store the USB HID connection.
|
||||||
|
* @param[in] context A valid context object.
|
||||||
|
* @param[in] device A valid USB HID device.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
dc_status_t
|
||||||
|
dc_usbhid_open (dc_iostream_t **iostream, dc_context_t *context, dc_usbhid_device_t *device);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
#endif /* DC_USBHID_H */
|
||||||
@ -1,895 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="libdivecomputer"
|
|
||||||
ProjectGUID="{CEA7215A-D6B5-4840-8086-3C854F371997}"
|
|
||||||
RootNamespace="libdivecomputer"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="196613"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBDIVECOMPUTER_EXPORTS;ENABLE_LOGGING;HAVE_AF_IRDA_H;HAVE_WS2BTH_H"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
CompileAs="2"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="ws2_32.lib"
|
|
||||||
LinkIncremental="2"
|
|
||||||
ModuleDefinitionFile="$(OutDir)/libdivecomputer.def"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBDIVECOMPUTER_EXPORTS;ENABLE_LOGGING;HAVE_AF_IRDA_H;HAVE_WS2BTH_H"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="2"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="ws2_32.lib"
|
|
||||||
LinkIncremental="1"
|
|
||||||
ModuleDefinitionFile="$(OutDir)/libdivecomputer.def"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\aes.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\array.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\atomics_cobalt.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\atomics_cobalt_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\bluetooth.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\buffer.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\checksum.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\citizen_aqualand.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\citizen_aqualand_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cochran_commander.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cochran_commander_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\common.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\context.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cressi_edy.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cressi_edy_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cressi_leonardo.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cressi_leonardo_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\custom.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\datetime.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\descriptor.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\device.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\diverite_nitekq.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\diverite_nitekq_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\divesystem_idive.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\divesystem_idive_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_frog.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_ostc.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_ostc3.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_ostc_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ihex.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\iostream.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\irda.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\iterator.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_common.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_darwin.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_darwin_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_iconhd.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_iconhd_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_nemo.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_nemo_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_puck.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_atom2.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_atom2_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_common.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_veo250.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_veo250_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_vtpro.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_vtpro_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\rbstream.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensus.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensus_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensuspro.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensuspro_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensusultra.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensusultra_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ringbuffer.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\serial_win32.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_common.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_petrel.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_predator.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_predator_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\socket.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_common.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_common2.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_d9.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_d9_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_eon.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_eon_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_eonsteel.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_eonsteel_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_solution.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_solution_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_vyper.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_vyper2.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_vyper_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\usbhid.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_aladin.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_g2.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_memomouse.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_memomouse_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_meridian.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_smart.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_smart_parser.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\version.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\zeagle_n2ition3.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\aes.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\array.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\atomics_cobalt.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\atomics_cobalt.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\bluetooth.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\buffer.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\checksum.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\citizen_aqualand.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cochran_commander.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\common-private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\context-private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\context.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cressi_edy.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\cressi_leonardo.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\custom.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\datetime.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\descriptor.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\device-private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\device.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\diverite_nitekq.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\divesystem_idive.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\hw_frog.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_frog.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\hw_ostc.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_ostc.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hw_ostc3.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\hw_ostc3.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ihex.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\iostream-private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\iostream.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\irda.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\iterator-private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\iterator.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_common.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_darwin.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_iconhd.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_nemo.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\mares_puck.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_atom2.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\oceanic_atom2.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_common.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_veo250.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\oceanic_veo250.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\oceanic_vtpro.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\oceanic_vtpro.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\parser-private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\parser.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\platform.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\rbstream.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensus.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\reefnet_sensus.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensuspro.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\reefnet_sensuspro.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\reefnet_sensusultra.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\reefnet_sensusultra.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\revision.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ringbuffer.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\serial.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_common.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_petrel.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\shearwater_predator.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\socket.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_common.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_common2.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\suunto_d9.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_d9.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\suunto_eon.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_eon.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_eonsteel.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_solution.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_vyper.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\suunto_vyper2.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\suunto_vyper2.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\units.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\usbhid.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_aladin.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_g2.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_memomouse.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_meridian.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uwatec_smart.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\libdivecomputer\version.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\zeagle_n2ition3.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\libdivecomputer.rc"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\libdivecomputer.symbols"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
CommandLine="echo EXPORTS > "$(OutDir)/libdivecomputer.def" && type "$(InputPath)" >> "$(OutDir)/libdivecomputer.def""
|
|
||||||
Outputs="$(OutDir)/libdivecomputer.def"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
CommandLine="echo EXPORTS > "$(OutDir)/libdivecomputer.def" && type "$(InputPath)" >> "$(OutDir)/libdivecomputer.def""
|
|
||||||
Outputs="$(OutDir)/libdivecomputer.def"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
||||||
@ -1,9 +1,9 @@
|
|||||||
AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
|
AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
|
||||||
AM_CFLAGS = $(LIBUSB_CFLAGS) $(HIDAPI_CFLAGS) $(BLUEZ_CFLAGS)
|
AM_CFLAGS = $(LIBUSB_CFLAGS) $(LIBMTP_CFLAGS) $(HIDAPI_CFLAGS) $(BLUEZ_CFLAGS)
|
||||||
|
|
||||||
lib_LTLIBRARIES = libdivecomputer.la
|
lib_LTLIBRARIES = libdivecomputer.la
|
||||||
|
|
||||||
libdivecomputer_la_LIBADD = $(LIBUSB_LIBS) $(HIDAPI_LIBS) $(BLUEZ_LIBS) -lm
|
libdivecomputer_la_LIBADD = $(LIBUSB_LIBS) $(LIBMTP_LIBS) $(HIDAPI_LIBS) $(BLUEZ_LIBS) -lm
|
||||||
libdivecomputer_la_LDFLAGS = \
|
libdivecomputer_la_LDFLAGS = \
|
||||||
-version-info $(DC_VERSION_LIBTOOL) \
|
-version-info $(DC_VERSION_LIBTOOL) \
|
||||||
-no-undefined \
|
-no-undefined \
|
||||||
@ -24,6 +24,7 @@ libdivecomputer_la_SOURCES = \
|
|||||||
device-private.h device.c \
|
device-private.h device.c \
|
||||||
parser-private.h parser.c \
|
parser-private.h parser.c \
|
||||||
datetime.c \
|
datetime.c \
|
||||||
|
timer.h timer.c \
|
||||||
suunto_common.h suunto_common.c \
|
suunto_common.h suunto_common.c \
|
||||||
suunto_common2.h suunto_common2.c \
|
suunto_common2.h suunto_common2.c \
|
||||||
suunto_solution.h suunto_solution.c suunto_solution_parser.c \
|
suunto_solution.h suunto_solution.c suunto_solution_parser.c \
|
||||||
@ -38,12 +39,11 @@ libdivecomputer_la_SOURCES = \
|
|||||||
uwatec_aladin.h uwatec_aladin.c \
|
uwatec_aladin.h uwatec_aladin.c \
|
||||||
uwatec_memomouse.h uwatec_memomouse.c uwatec_memomouse_parser.c \
|
uwatec_memomouse.h uwatec_memomouse.c uwatec_memomouse_parser.c \
|
||||||
uwatec_smart.h uwatec_smart.c uwatec_smart_parser.c \
|
uwatec_smart.h uwatec_smart.c uwatec_smart_parser.c \
|
||||||
uwatec_meridian.h uwatec_meridian.c \
|
|
||||||
uwatec_g2.h uwatec_g2.c \
|
|
||||||
oceanic_common.h oceanic_common.c \
|
oceanic_common.h oceanic_common.c \
|
||||||
oceanic_atom2.h oceanic_atom2.c oceanic_atom2_parser.c \
|
oceanic_atom2.h oceanic_atom2.c oceanic_atom2_parser.c \
|
||||||
oceanic_veo250.h oceanic_veo250.c oceanic_veo250_parser.c \
|
oceanic_veo250.h oceanic_veo250.c oceanic_veo250_parser.c \
|
||||||
oceanic_vtpro.h oceanic_vtpro.c oceanic_vtpro_parser.c \
|
oceanic_vtpro.h oceanic_vtpro.c oceanic_vtpro_parser.c \
|
||||||
|
pelagic_i330r.h pelagic_i330r.c \
|
||||||
mares_common.h mares_common.c \
|
mares_common.h mares_common.c \
|
||||||
mares_nemo.h mares_nemo.c mares_nemo_parser.c \
|
mares_nemo.h mares_nemo.c mares_nemo_parser.c \
|
||||||
mares_puck.h mares_puck.c \
|
mares_puck.h mares_puck.c \
|
||||||
@ -56,6 +56,7 @@ libdivecomputer_la_SOURCES = \
|
|||||||
aes.h aes.c \
|
aes.h aes.c \
|
||||||
cressi_edy.h cressi_edy.c cressi_edy_parser.c \
|
cressi_edy.h cressi_edy.c cressi_edy_parser.c \
|
||||||
cressi_leonardo.h cressi_leonardo.c cressi_leonardo_parser.c \
|
cressi_leonardo.h cressi_leonardo.c cressi_leonardo_parser.c \
|
||||||
|
cressi_goa.h cressi_goa.c cressi_goa_parser.c \
|
||||||
zeagle_n2ition3.h zeagle_n2ition3.c \
|
zeagle_n2ition3.h zeagle_n2ition3.c \
|
||||||
atomics_cobalt.h atomics_cobalt.c atomics_cobalt_parser.c \
|
atomics_cobalt.h atomics_cobalt.c atomics_cobalt_parser.c \
|
||||||
shearwater_common.h shearwater_common.c \
|
shearwater_common.h shearwater_common.c \
|
||||||
@ -64,26 +65,44 @@ libdivecomputer_la_SOURCES = \
|
|||||||
diverite_nitekq.h diverite_nitekq.c diverite_nitekq_parser.c \
|
diverite_nitekq.h diverite_nitekq.c diverite_nitekq_parser.c \
|
||||||
citizen_aqualand.h citizen_aqualand.c citizen_aqualand_parser.c \
|
citizen_aqualand.h citizen_aqualand.c citizen_aqualand_parser.c \
|
||||||
divesystem_idive.h divesystem_idive.c divesystem_idive_parser.c \
|
divesystem_idive.h divesystem_idive.c divesystem_idive_parser.c \
|
||||||
platform.h \
|
platform.h platform.c \
|
||||||
ringbuffer.h ringbuffer.c \
|
ringbuffer.h ringbuffer.c \
|
||||||
rbstream.h rbstream.c \
|
rbstream.h rbstream.c \
|
||||||
checksum.h checksum.c \
|
checksum.h checksum.c \
|
||||||
array.h array.c \
|
array.h array.c \
|
||||||
buffer.c \
|
buffer.c \
|
||||||
cochran_commander.h cochran_commander.c cochran_commander_parser.c
|
cochran_commander.h cochran_commander.c cochran_commander_parser.c \
|
||||||
|
tecdiving_divecomputereu.h tecdiving_divecomputereu.c tecdiving_divecomputereu_parser.c \
|
||||||
|
mclean_extreme.h mclean_extreme.c mclean_extreme_parser.c \
|
||||||
|
liquivision_lynx.h liquivision_lynx.c liquivision_lynx_parser.c \
|
||||||
|
sporasub_sp2.h sporasub_sp2.c sporasub_sp2_parser.c \
|
||||||
|
deepsix_excursion.h deepsix_excursion.c deepsix_excursion_parser.c \
|
||||||
|
seac_screen.h seac_screen.c seac_screen_parser.c \
|
||||||
|
deepblu_cosmiq.h deepblu_cosmiq.c deepblu_cosmiq_parser.c \
|
||||||
|
oceans_s1_common.h oceans_s1_common.c \
|
||||||
|
oceans_s1.h oceans_s1.c oceans_s1_parser.c \
|
||||||
|
divesoft_freedom.h divesoft_freedom.c divesoft_freedom_parser.c \
|
||||||
|
hdlc.h hdlc.c \
|
||||||
|
packet.h packet.c \
|
||||||
|
socket.h socket.c \
|
||||||
|
irda.c \
|
||||||
|
usb.c \
|
||||||
|
usbhid.c \
|
||||||
|
bluetooth.c \
|
||||||
|
custom.c
|
||||||
|
|
||||||
|
# Not merged upstream yet
|
||||||
|
libdivecomputer_la_SOURCES += \
|
||||||
|
usb_storage.c \
|
||||||
|
field-cache.h field-cache.c \
|
||||||
|
garmin.h garmin.c garmin_parser.c
|
||||||
|
|
||||||
if OS_WIN32
|
if OS_WIN32
|
||||||
libdivecomputer_la_SOURCES += serial.h serial_win32.c
|
libdivecomputer_la_SOURCES += serial_win32.c
|
||||||
else
|
else
|
||||||
libdivecomputer_la_SOURCES += serial.h serial_posix.c
|
libdivecomputer_la_SOURCES += serial_posix.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
libdivecomputer_la_SOURCES += socket.h socket.c
|
|
||||||
libdivecomputer_la_SOURCES += irda.h irda.c
|
|
||||||
libdivecomputer_la_SOURCES += usbhid.h usbhid.c
|
|
||||||
libdivecomputer_la_SOURCES += bluetooth.h bluetooth.c
|
|
||||||
libdivecomputer_la_SOURCES += custom.h custom.c
|
|
||||||
|
|
||||||
if OS_WIN32
|
if OS_WIN32
|
||||||
libdivecomputer_la_SOURCES += libdivecomputer.rc
|
libdivecomputer_la_SOURCES += libdivecomputer.rc
|
||||||
endif
|
endif
|
||||||
@ -94,7 +113,7 @@ libdivecomputer.exp: libdivecomputer.symbols
|
|||||||
$(AM_V_GEN) sed -e '/^$$/d' $< > $@
|
$(AM_V_GEN) sed -e '/^$$/d' $< > $@
|
||||||
|
|
||||||
.rc.lo:
|
.rc.lo:
|
||||||
$(AM_V_GEN) $(LIBTOOL) --silent --tag=CC --mode=compile $(RC) $(DEFS) $(DEFAULT_INCLUDES) $< -o $@
|
$(AM_V_GEN) $(LIBTOOL) --silent --tag=CC --mode=compile $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
libdivecomputer.lo: revision.h
|
libdivecomputer.lo: revision.h
|
||||||
|
|
||||||
|
|||||||
30
src/aes.c
30
src/aes.c
@ -1,4 +1,28 @@
|
|||||||
/*
|
/*
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
|
||||||
This is an implementation of the AES128 algorithm, specifically ECB and CBC mode.
|
This is an implementation of the AES128 algorithm, specifically ECB and CBC mode.
|
||||||
|
|
||||||
@ -74,7 +98,7 @@ typedef struct aes_state_t {
|
|||||||
|
|
||||||
#if defined(CBC) && CBC
|
#if defined(CBC) && CBC
|
||||||
// Initial Vector used only for CBC mode
|
// Initial Vector used only for CBC mode
|
||||||
uint8_t* Iv;
|
const uint8_t* Iv;
|
||||||
#endif
|
#endif
|
||||||
} aes_state_t;
|
} aes_state_t;
|
||||||
|
|
||||||
@ -518,7 +542,7 @@ void AES128_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length,
|
|||||||
|
|
||||||
if(iv != 0)
|
if(iv != 0)
|
||||||
{
|
{
|
||||||
state.Iv = (uint8_t*)iv;
|
state.Iv = iv;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < length; i += KEYLEN)
|
for(i = 0; i < length; i += KEYLEN)
|
||||||
@ -560,7 +584,7 @@ void AES128_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length,
|
|||||||
// If iv is passed as 0, we continue to encrypt without re-setting the Iv
|
// If iv is passed as 0, we continue to encrypt without re-setting the Iv
|
||||||
if(iv != 0)
|
if(iv != 0)
|
||||||
{
|
{
|
||||||
state.Iv = (uint8_t*)iv;
|
state.Iv = iv;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < length; i += KEYLEN)
|
for(i = 0; i < length; i += KEYLEN)
|
||||||
|
|||||||
26
src/aes.h
26
src/aes.h
@ -1,3 +1,29 @@
|
|||||||
|
/*
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
*/
|
||||||
#ifndef _AES_H_
|
#ifndef _AES_H_
|
||||||
#define _AES_H_
|
#define _AES_H_
|
||||||
|
|
||||||
|
|||||||
220
src/array.c
220
src/array.c
@ -160,6 +160,30 @@ array_convert_str2num (const unsigned char data[], unsigned int size)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
array_convert_bin2dec (const unsigned char data[], unsigned int size)
|
||||||
|
{
|
||||||
|
unsigned int value = 0;
|
||||||
|
for (unsigned int i = 0; i < size; ++i) {
|
||||||
|
value *= 100;
|
||||||
|
value += data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
array_convert_bcd2dec (const unsigned char data[], unsigned int size)
|
||||||
|
{
|
||||||
|
unsigned int value = 0;
|
||||||
|
for (unsigned int i = 0; i < size; ++i) {
|
||||||
|
value *= 100;
|
||||||
|
value += bcd2dec(data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint_be (const unsigned char data[], unsigned int n)
|
array_uint_be (const unsigned char data[], unsigned int n)
|
||||||
{
|
{
|
||||||
@ -167,7 +191,7 @@ array_uint_be (const unsigned char data[], unsigned int n)
|
|||||||
unsigned int value = 0;
|
unsigned int value = 0;
|
||||||
for (unsigned int i = 0; i < n; ++i) {
|
for (unsigned int i = 0; i < n; ++i) {
|
||||||
shift -= 8;
|
shift -= 8;
|
||||||
value |= data[i] << shift;
|
value |= (unsigned int) data[i] << shift;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -178,76 +202,170 @@ array_uint_le (const unsigned char data[], unsigned int n)
|
|||||||
unsigned int shift = 0;
|
unsigned int shift = 0;
|
||||||
unsigned int value = 0;
|
unsigned int value = 0;
|
||||||
for (unsigned int i = 0; i < n; ++i) {
|
for (unsigned int i = 0; i < n; ++i) {
|
||||||
value |= data[i] << shift;
|
value |= (unsigned int) data[i] << shift;
|
||||||
shift += 8;
|
shift += 8;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long long
|
||||||
|
array_uint64_be (const unsigned char data[])
|
||||||
|
{
|
||||||
|
return ((unsigned long long) data[0] << 56) |
|
||||||
|
((unsigned long long) data[1] << 48) |
|
||||||
|
((unsigned long long) data[2] << 40) |
|
||||||
|
((unsigned long long) data[3] << 32) |
|
||||||
|
((unsigned long long) data[4] << 24) |
|
||||||
|
((unsigned long long) data[5] << 16) |
|
||||||
|
((unsigned long long) data[6] << 8) |
|
||||||
|
((unsigned long long) data[7] << 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long
|
||||||
|
array_uint64_le (const unsigned char data[])
|
||||||
|
{
|
||||||
|
return ((unsigned long long) data[0] << 0) |
|
||||||
|
((unsigned long long) data[1] << 8) |
|
||||||
|
((unsigned long long) data[2] << 16) |
|
||||||
|
((unsigned long long) data[3] << 24) |
|
||||||
|
((unsigned long long) data[4] << 32) |
|
||||||
|
((unsigned long long) data[5] << 40) |
|
||||||
|
((unsigned long long) data[6] << 48) |
|
||||||
|
((unsigned long long) data[7] << 56);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint32_be (const unsigned char data[])
|
array_uint32_be (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3];
|
return ((unsigned int) data[0] << 24) |
|
||||||
|
((unsigned int) data[1] << 16) |
|
||||||
|
((unsigned int) data[2] << 8) |
|
||||||
|
((unsigned int) data[3] << 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint32_le (const unsigned char data[])
|
array_uint32_le (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24);
|
return ((unsigned int) data[0] << 0) |
|
||||||
|
((unsigned int) data[1] << 8) |
|
||||||
|
((unsigned int) data[2] << 16) |
|
||||||
|
((unsigned int) data[3] << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint32_word_be (const unsigned char data[])
|
array_uint32_word_be (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return data[1] + (data[0] << 8) + (data[3] << 16) + (data[2] << 24);
|
return ((unsigned int) data[0] << 8) |
|
||||||
|
((unsigned int) data[1] << 0) |
|
||||||
|
((unsigned int) data[2] << 24) |
|
||||||
|
((unsigned int) data[3] << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
array_uint32_le_set (unsigned char data[], const unsigned int input)
|
|
||||||
{
|
|
||||||
data[0] = input & 0xFF;
|
|
||||||
data[1] = (input >> 8) & 0xFF;
|
|
||||||
data[2] = (input >> 16) & 0xFF;
|
|
||||||
data[3] = (input >> 24) & 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint24_be (const unsigned char data[])
|
array_uint24_be (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return (data[0] << 16) + (data[1] << 8) + data[2];
|
return ((unsigned int) data[0] << 16) |
|
||||||
|
((unsigned int) data[1] << 8) |
|
||||||
|
((unsigned int) data[2] << 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
array_uint24_be_set (unsigned char data[], const unsigned int input)
|
|
||||||
{
|
|
||||||
data[0] = (input >> 16) & 0xFF;
|
|
||||||
data[1] = (input >> 8) & 0xFF;
|
|
||||||
data[2] = input & 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint24_le (const unsigned char data[])
|
array_uint24_le (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return data[0] + (data[1] << 8) + (data[2] << 16);
|
return ((unsigned int) data[0] << 0) |
|
||||||
|
((unsigned int) data[1] << 8) |
|
||||||
|
((unsigned int) data[2] << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short
|
unsigned short
|
||||||
array_uint16_be (const unsigned char data[])
|
array_uint16_be (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return (data[0] << 8) + data[1];
|
return ((unsigned int) data[0] << 8) |
|
||||||
|
((unsigned int) data[1] << 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned short
|
unsigned short
|
||||||
array_uint16_le (const unsigned char data[])
|
array_uint16_le (const unsigned char data[])
|
||||||
{
|
{
|
||||||
return data[0] + (data[1] << 8);
|
return ((unsigned int) data[0] << 0) |
|
||||||
|
((unsigned int) data[1] << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint64_be_set (unsigned char data[], const unsigned long long input)
|
||||||
|
{
|
||||||
|
data[0] = (input >> 56) & 0xFF;
|
||||||
|
data[1] = (input >> 48) & 0xFF;
|
||||||
|
data[2] = (input >> 40) & 0xFF;
|
||||||
|
data[3] = (input >> 32) & 0xFF;
|
||||||
|
data[4] = (input >> 24) & 0xFF;
|
||||||
|
data[5] = (input >> 16) & 0xFF;
|
||||||
|
data[6] = (input >> 8) & 0xFF;
|
||||||
|
data[7] = (input ) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint64_le_set (unsigned char data[], const unsigned long long input)
|
||||||
|
{
|
||||||
|
data[0] = (input ) & 0xFF;
|
||||||
|
data[1] = (input >> 8) & 0xFF;
|
||||||
|
data[2] = (input >> 16) & 0xFF;
|
||||||
|
data[3] = (input >> 24) & 0xFF;
|
||||||
|
data[4] = (input >> 32) & 0xFF;
|
||||||
|
data[5] = (input >> 40) & 0xFF;
|
||||||
|
data[6] = (input >> 48) & 0xFF;
|
||||||
|
data[7] = (input >> 56) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint32_be_set (unsigned char data[], const unsigned int input)
|
||||||
|
{
|
||||||
|
data[0] = (input >> 24) & 0xFF;
|
||||||
|
data[1] = (input >> 16) & 0xFF;
|
||||||
|
data[2] = (input >> 8) & 0xFF;
|
||||||
|
data[3] = (input ) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint32_le_set (unsigned char data[], const unsigned int input)
|
||||||
|
{
|
||||||
|
data[0] = (input ) & 0xFF;
|
||||||
|
data[1] = (input >> 8) & 0xFF;
|
||||||
|
data[2] = (input >> 16) & 0xFF;
|
||||||
|
data[3] = (input >> 24) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint24_be_set (unsigned char data[], const unsigned int input)
|
||||||
|
{
|
||||||
|
data[0] = (input >> 16) & 0xFF;
|
||||||
|
data[1] = (input >> 8) & 0xFF;
|
||||||
|
data[2] = (input ) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint24_le_set (unsigned char data[], const unsigned int input)
|
||||||
|
{
|
||||||
|
data[0] = (input ) & 0xFF;
|
||||||
|
data[1] = (input >> 8) & 0xFF;
|
||||||
|
data[2] = (input >> 16) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint16_be_set (unsigned char data[], const unsigned short input)
|
||||||
|
{
|
||||||
|
data[0] = (input >> 8) & 0xFF;
|
||||||
|
data[1] = (input ) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint16_le_set (unsigned char data[], const unsigned short input)
|
||||||
|
{
|
||||||
|
data[0] = (input ) & 0xFF;
|
||||||
|
data[1] = (input >> 8) & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char
|
unsigned char
|
||||||
@ -255,3 +373,45 @@ bcd2dec (unsigned char value)
|
|||||||
{
|
{
|
||||||
return ((value >> 4) & 0x0f) * 10 + (value & 0x0f);
|
return ((value >> 4) & 0x0f) * 10 + (value & 0x0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned char
|
||||||
|
dec2bcd (unsigned char value)
|
||||||
|
{
|
||||||
|
if (value >= 100)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unsigned char hi = value / 10;
|
||||||
|
unsigned char lo = value % 10;
|
||||||
|
return (hi << 4) | lo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When turning a two's-complement number with a certain number
|
||||||
|
* of bits into one with more bits, the sign bit must be repeated
|
||||||
|
* in all the extra bits.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
signextend (unsigned int value, unsigned int nbits)
|
||||||
|
{
|
||||||
|
if (nbits <= 0 || nbits > 32)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unsigned int signbit = 1U << (nbits - 1);
|
||||||
|
unsigned int mask = signbit - 1;
|
||||||
|
|
||||||
|
if ((value & signbit) == signbit)
|
||||||
|
return value | ~mask;
|
||||||
|
else
|
||||||
|
return value & mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
popcount (unsigned int value)
|
||||||
|
{
|
||||||
|
unsigned int count = 0;
|
||||||
|
while (value) {
|
||||||
|
value &= value - 1;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|||||||
53
src/array.h
53
src/array.h
@ -22,6 +22,8 @@
|
|||||||
#ifndef ARRAY_H
|
#ifndef ARRAY_H
|
||||||
#define ARRAY_H
|
#define ARRAY_H
|
||||||
|
|
||||||
|
#define C_ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
@ -52,12 +54,24 @@ array_convert_hex2bin (const unsigned char input[], unsigned int isize, unsigned
|
|||||||
unsigned int
|
unsigned int
|
||||||
array_convert_str2num (const unsigned char data[], unsigned int size);
|
array_convert_str2num (const unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
array_convert_bin2dec (const unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
array_convert_bcd2dec (const unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint_be (const unsigned char data[], unsigned int n);
|
array_uint_be (const unsigned char data[], unsigned int n);
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint_le (const unsigned char data[], unsigned int n);
|
array_uint_le (const unsigned char data[], unsigned int n);
|
||||||
|
|
||||||
|
unsigned long long
|
||||||
|
array_uint64_be (const unsigned char data[]);
|
||||||
|
|
||||||
|
unsigned long long
|
||||||
|
array_uint64_le (const unsigned char data[]);
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint32_be (const unsigned char data[]);
|
array_uint32_be (const unsigned char data[]);
|
||||||
|
|
||||||
@ -67,15 +81,9 @@ array_uint32_le (const unsigned char data[]);
|
|||||||
unsigned int
|
unsigned int
|
||||||
array_uint32_word_be (const unsigned char data[]);
|
array_uint32_word_be (const unsigned char data[]);
|
||||||
|
|
||||||
void
|
|
||||||
array_uint32_le_set (unsigned char data[], const unsigned int input);
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint24_be (const unsigned char data[]);
|
array_uint24_be (const unsigned char data[]);
|
||||||
|
|
||||||
void
|
|
||||||
array_uint24_be_set (unsigned char data[], const unsigned int input);
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
array_uint24_le (const unsigned char data[]);
|
array_uint24_le (const unsigned char data[]);
|
||||||
|
|
||||||
@ -85,9 +93,42 @@ array_uint16_be (const unsigned char data[]);
|
|||||||
unsigned short
|
unsigned short
|
||||||
array_uint16_le (const unsigned char data[]);
|
array_uint16_le (const unsigned char data[]);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint64_be_set (unsigned char data[], const unsigned long long input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint64_le_set (unsigned char data[], const unsigned long long input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint32_be_set (unsigned char data[], const unsigned int input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint32_le_set (unsigned char data[], const unsigned int input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint24_be_set (unsigned char data[], const unsigned int input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint24_le_set (unsigned char data[], const unsigned int input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint16_be_set (unsigned char data[], const unsigned short input);
|
||||||
|
|
||||||
|
void
|
||||||
|
array_uint16_le_set (unsigned char data[], const unsigned short input);
|
||||||
|
|
||||||
unsigned char
|
unsigned char
|
||||||
bcd2dec (unsigned char value);
|
bcd2dec (unsigned char value);
|
||||||
|
|
||||||
|
unsigned char
|
||||||
|
dec2bcd (unsigned char value);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
signextend (unsigned int value, unsigned int nbits);
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
popcount (unsigned int value);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@ -19,19 +19,10 @@
|
|||||||
* MA 02110-1301 USA
|
* MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h> // memcmp, memcpy
|
#include <string.h> // memcmp, memcpy
|
||||||
#include <stdlib.h> // malloc, free
|
#include <stdlib.h> // malloc, free
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB
|
#include <libdivecomputer/usb.h>
|
||||||
#ifdef _WIN32
|
|
||||||
#define NOGDI
|
|
||||||
#endif
|
|
||||||
#include <libusb-1.0/libusb.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "atomics_cobalt.h"
|
#include "atomics_cobalt.h"
|
||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
@ -41,7 +32,8 @@
|
|||||||
|
|
||||||
#define ISINSTANCE(device) dc_device_isinstance((device), &atomics_cobalt_device_vtable)
|
#define ISINSTANCE(device) dc_device_isinstance((device), &atomics_cobalt_device_vtable)
|
||||||
|
|
||||||
#define EXITCODE(rc) (rc == LIBUSB_ERROR_TIMEOUT ? DC_STATUS_TIMEOUT : DC_STATUS_IO)
|
#define COBALT1 0
|
||||||
|
#define COBALT2 2
|
||||||
|
|
||||||
#define VID 0x0471
|
#define VID 0x0471
|
||||||
#define PID 0x0888
|
#define PID 0x0888
|
||||||
@ -49,15 +41,15 @@
|
|||||||
|
|
||||||
#define FP_OFFSET 20
|
#define FP_OFFSET 20
|
||||||
|
|
||||||
#define SZ_MEMORY (29 * 64 * 1024)
|
#define SZ_HEADER 228
|
||||||
|
|
||||||
|
#define SZ_MEMORY1 (29 * 64 * 1024) // Cobalt 1
|
||||||
|
#define SZ_MEMORY2 (41 * 64 * 1024) // Cobalt 2
|
||||||
#define SZ_VERSION 14
|
#define SZ_VERSION 14
|
||||||
|
|
||||||
typedef struct atomics_cobalt_device_t {
|
typedef struct atomics_cobalt_device_t {
|
||||||
dc_device_t base;
|
dc_device_t base;
|
||||||
#ifdef HAVE_LIBUSB
|
dc_iostream_t *iostream;
|
||||||
libusb_context *context;
|
|
||||||
libusb_device_handle *handle;
|
|
||||||
#endif
|
|
||||||
unsigned int simulation;
|
unsigned int simulation;
|
||||||
unsigned char fingerprint[6];
|
unsigned char fingerprint[6];
|
||||||
unsigned char version[SZ_VERSION];
|
unsigned char version[SZ_VERSION];
|
||||||
@ -65,7 +57,6 @@ typedef struct atomics_cobalt_device_t {
|
|||||||
|
|
||||||
static dc_status_t atomics_cobalt_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size);
|
static dc_status_t atomics_cobalt_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size);
|
||||||
static dc_status_t atomics_cobalt_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata);
|
static dc_status_t atomics_cobalt_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata);
|
||||||
static dc_status_t atomics_cobalt_device_close (dc_device_t *abstract);
|
|
||||||
|
|
||||||
static const dc_device_vtable_t atomics_cobalt_device_vtable = {
|
static const dc_device_vtable_t atomics_cobalt_device_vtable = {
|
||||||
sizeof(atomics_cobalt_device_t),
|
sizeof(atomics_cobalt_device_t),
|
||||||
@ -76,22 +67,19 @@ static const dc_device_vtable_t atomics_cobalt_device_vtable = {
|
|||||||
NULL, /* dump */
|
NULL, /* dump */
|
||||||
atomics_cobalt_device_foreach, /* foreach */
|
atomics_cobalt_device_foreach, /* foreach */
|
||||||
NULL, /* timesync */
|
NULL, /* timesync */
|
||||||
atomics_cobalt_device_close /* close */
|
NULL /* close */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
atomics_cobalt_device_open (dc_device_t **out, dc_context_t *context)
|
atomics_cobalt_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LIBUSB
|
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
atomics_cobalt_device_t *device = NULL;
|
atomics_cobalt_device_t *device = NULL;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (out == NULL)
|
if (out == NULL)
|
||||||
return DC_STATUS_INVALIDARGS;
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB
|
|
||||||
// Allocate memory.
|
// Allocate memory.
|
||||||
device = (atomics_cobalt_device_t *) dc_device_allocate (context, &atomics_cobalt_device_vtable);
|
device = (atomics_cobalt_device_t *) dc_device_allocate (context, &atomics_cobalt_device_vtable);
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
@ -100,67 +88,30 @@ atomics_cobalt_device_open (dc_device_t **out, dc_context_t *context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the default values.
|
// Set the default values.
|
||||||
device->context = NULL;
|
device->iostream = iostream;
|
||||||
device->handle = NULL;
|
|
||||||
device->simulation = 0;
|
device->simulation = 0;
|
||||||
memset (device->fingerprint, 0, sizeof (device->fingerprint));
|
memset (device->fingerprint, 0, sizeof (device->fingerprint));
|
||||||
|
|
||||||
int rc = libusb_init (&device->context);
|
// Set the timeout for receiving data (2000 ms).
|
||||||
if (rc < 0) {
|
status = dc_iostream_set_timeout (device->iostream, TIMEOUT);
|
||||||
ERROR (context, "Failed to initialize usb support.");
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
status = DC_STATUS_IO;
|
ERROR (context, "Failed to set the timeout.");
|
||||||
goto error_free;
|
goto error_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
device->handle = libusb_open_device_with_vid_pid (device->context, VID, PID);
|
|
||||||
if (device->handle == NULL) {
|
|
||||||
ERROR (context, "Failed to open the usb device.");
|
|
||||||
status = DC_STATUS_IO;
|
|
||||||
goto error_usb_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = libusb_claim_interface (device->handle, 0);
|
|
||||||
if (rc < 0) {
|
|
||||||
ERROR (context, "Failed to claim the usb interface.");
|
|
||||||
status = DC_STATUS_IO;
|
|
||||||
goto error_usb_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = atomics_cobalt_device_version ((dc_device_t *) device, device->version, sizeof (device->version));
|
status = atomics_cobalt_device_version ((dc_device_t *) device, device->version, sizeof (device->version));
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
ERROR (context, "Failed to identify the dive computer.");
|
ERROR (context, "Failed to identify the dive computer.");
|
||||||
goto error_usb_close;
|
goto error_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
*out = (dc_device_t*) device;
|
*out = (dc_device_t*) device;
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
|
|
||||||
error_usb_close:
|
|
||||||
libusb_close (device->handle);
|
|
||||||
error_usb_exit:
|
|
||||||
libusb_exit (device->context);
|
|
||||||
error_free:
|
error_free:
|
||||||
dc_device_deallocate ((dc_device_t *) device);
|
dc_device_deallocate ((dc_device_t *) device);
|
||||||
return status;
|
return status;
|
||||||
#else
|
|
||||||
return DC_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
|
||||||
atomics_cobalt_device_close (dc_device_t *abstract)
|
|
||||||
{
|
|
||||||
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB
|
|
||||||
libusb_release_interface(device->handle, 0);
|
|
||||||
libusb_close (device->handle);
|
|
||||||
libusb_exit (device->context);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -198,6 +149,7 @@ atomics_cobalt_device_set_simulation (dc_device_t *abstract, unsigned int simula
|
|||||||
dc_status_t
|
dc_status_t
|
||||||
atomics_cobalt_device_version (dc_device_t *abstract, unsigned char data[], unsigned int size)
|
atomics_cobalt_device_version (dc_device_t *abstract, unsigned char data[], unsigned int size)
|
||||||
{
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
||||||
|
|
||||||
if (!ISINSTANCE (abstract))
|
if (!ISINSTANCE (abstract))
|
||||||
@ -206,31 +158,31 @@ atomics_cobalt_device_version (dc_device_t *abstract, unsigned char data[], unsi
|
|||||||
if (size < SZ_VERSION)
|
if (size < SZ_VERSION)
|
||||||
return DC_STATUS_INVALIDARGS;
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB
|
|
||||||
// Send the command to the dive computer.
|
// Send the command to the dive computer.
|
||||||
uint8_t bRequest = 0x01;
|
unsigned char bRequest = 0x01;
|
||||||
int rc = libusb_control_transfer (device->handle,
|
dc_usb_control_t control = {
|
||||||
LIBUSB_RECIPIENT_DEVICE | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT,
|
DC_USB_REQUEST_VENDOR | DC_USB_RECIPIENT_DEVICE | DC_USB_ENDPOINT_OUT, /* bmRequestType */
|
||||||
bRequest, 0, 0, NULL, 0, TIMEOUT);
|
bRequest, /* bRequest */
|
||||||
if (rc != LIBUSB_SUCCESS) {
|
0, /* wValue */
|
||||||
ERROR (abstract->context, "Failed to send the command.");
|
0, /* wIndex */
|
||||||
return EXITCODE(rc);
|
0, /* wLength */
|
||||||
}
|
};
|
||||||
|
|
||||||
HEXDUMP (abstract->context, DC_LOGLEVEL_INFO, "Write", &bRequest, 1);
|
status = dc_iostream_ioctl (device->iostream, DC_IOCTL_USB_CONTROL_WRITE, &control, sizeof(control));
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR (abstract->context, "Failed to send the command.");
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
// Receive the answer from the dive computer.
|
// Receive the answer from the dive computer.
|
||||||
int length = 0;
|
size_t length = 0;
|
||||||
unsigned char packet[SZ_VERSION + 2] = {0};
|
unsigned char packet[SZ_VERSION + 2] = {0};
|
||||||
rc = libusb_bulk_transfer (device->handle, 0x82,
|
status = dc_iostream_read (device->iostream, packet, sizeof(packet), &length);
|
||||||
packet, sizeof (packet), &length, TIMEOUT);
|
if (status != DC_STATUS_SUCCESS || length != sizeof (packet)) {
|
||||||
if (rc != LIBUSB_SUCCESS || length != sizeof (packet)) {
|
|
||||||
ERROR (abstract->context, "Failed to receive the answer.");
|
ERROR (abstract->context, "Failed to receive the answer.");
|
||||||
return EXITCODE(rc);
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
HEXDUMP (abstract->context, DC_LOGLEVEL_INFO, "Read", packet, length);
|
|
||||||
|
|
||||||
// Verify the checksum of the packet.
|
// Verify the checksum of the packet.
|
||||||
unsigned short crc = array_uint16_le (packet + SZ_VERSION);
|
unsigned short crc = array_uint16_le (packet + SZ_VERSION);
|
||||||
unsigned short ccrc = checksum_add_uint16 (packet, SZ_VERSION, 0x0);
|
unsigned short ccrc = checksum_add_uint16 (packet, SZ_VERSION, 0x0);
|
||||||
@ -242,16 +194,13 @@ atomics_cobalt_device_version (dc_device_t *abstract, unsigned char data[], unsi
|
|||||||
memcpy (data, packet, SZ_VERSION);
|
memcpy (data, packet, SZ_VERSION);
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
#else
|
|
||||||
return DC_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
atomics_cobalt_read_dive (dc_device_t *abstract, dc_buffer_t *buffer, int init, dc_event_progress_t *progress)
|
atomics_cobalt_read_dive (dc_device_t *abstract, dc_buffer_t *buffer, int init, dc_event_progress_t *progress)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LIBUSB
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
||||||
|
|
||||||
if (device_is_cancelled (abstract))
|
if (device_is_cancelled (abstract))
|
||||||
@ -263,36 +212,47 @@ atomics_cobalt_read_dive (dc_device_t *abstract, dc_buffer_t *buffer, int init,
|
|||||||
return DC_STATUS_NOMEMORY;
|
return DC_STATUS_NOMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adjust the maximum value to take into account the two byte checksum and
|
||||||
|
// the 8 byte serial number. Those extra bytes are not stored inside the
|
||||||
|
// dive header and are added dynamically during the data transfer. Since we
|
||||||
|
// don't know the total number of dives in advance, we can't calculate the
|
||||||
|
// total number of extra bytes and adjust the maximum on the fly.
|
||||||
|
if (progress) {
|
||||||
|
progress->maximum += 2 + 8;
|
||||||
|
}
|
||||||
|
|
||||||
// Send the command to the dive computer.
|
// Send the command to the dive computer.
|
||||||
uint8_t bRequest = 0;
|
unsigned char bRequest = 0;
|
||||||
if (device->simulation)
|
if (device->simulation)
|
||||||
bRequest = init ? 0x02 : 0x03;
|
bRequest = init ? 0x02 : 0x03;
|
||||||
else
|
else
|
||||||
bRequest = init ? 0x09 : 0x0A;
|
bRequest = init ? 0x09 : 0x0A;
|
||||||
int rc = libusb_control_transfer (device->handle,
|
|
||||||
LIBUSB_RECIPIENT_DEVICE | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT,
|
|
||||||
bRequest, 0, 0, NULL, 0, TIMEOUT);
|
|
||||||
if (rc != LIBUSB_SUCCESS) {
|
|
||||||
ERROR (abstract->context, "Failed to send the command.");
|
|
||||||
return EXITCODE(rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
HEXDUMP (abstract->context, DC_LOGLEVEL_INFO, "Write", &bRequest, 1);
|
dc_usb_control_t control = {
|
||||||
|
DC_USB_REQUEST_VENDOR | DC_USB_RECIPIENT_DEVICE | DC_USB_ENDPOINT_OUT, /* bmRequestType */
|
||||||
|
bRequest, /* bRequest */
|
||||||
|
0, /* wValue */
|
||||||
|
0, /* wIndex */
|
||||||
|
0, /* wLength */
|
||||||
|
};
|
||||||
|
|
||||||
|
status = dc_iostream_ioctl (device->iostream, DC_IOCTL_USB_CONTROL_WRITE, &control, sizeof(control));
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
ERROR (abstract->context, "Failed to send the command.");
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int nbytes = 0;
|
unsigned int nbytes = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
// Receive the answer from the dive computer.
|
// Receive the answer from the dive computer.
|
||||||
int length = 0;
|
size_t length = 0;
|
||||||
unsigned char packet[8 * 1024] = {0};
|
unsigned char packet[8 * 1024] = {0};
|
||||||
rc = libusb_bulk_transfer (device->handle, 0x82,
|
status = dc_iostream_read (device->iostream, packet, sizeof(packet), &length);
|
||||||
packet, sizeof (packet), &length, TIMEOUT);
|
if (status != DC_STATUS_SUCCESS && status != DC_STATUS_TIMEOUT) {
|
||||||
if (rc != LIBUSB_SUCCESS && rc != LIBUSB_ERROR_TIMEOUT) {
|
|
||||||
ERROR (abstract->context, "Failed to receive the answer.");
|
ERROR (abstract->context, "Failed to receive the answer.");
|
||||||
return EXITCODE(rc);
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
HEXDUMP (abstract->context, DC_LOGLEVEL_INFO, "Read", packet, length);
|
|
||||||
|
|
||||||
// Update and emit a progress event.
|
// Update and emit a progress event.
|
||||||
if (progress) {
|
if (progress) {
|
||||||
progress->current += length;
|
progress->current += length;
|
||||||
@ -339,9 +299,6 @@ atomics_cobalt_read_dive (dc_device_t *abstract, dc_buffer_t *buffer, int init,
|
|||||||
dc_buffer_slice (buffer, 0, nbytes - 2);
|
dc_buffer_slice (buffer, 0, nbytes - 2);
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
#else
|
|
||||||
return DC_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -350,9 +307,12 @@ atomics_cobalt_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
|
|||||||
{
|
{
|
||||||
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
atomics_cobalt_device_t *device = (atomics_cobalt_device_t *) abstract;
|
||||||
|
|
||||||
|
// Get the model number.
|
||||||
|
unsigned int model = array_uint16_le (device->version + 12);
|
||||||
|
|
||||||
// Enable progress notifications.
|
// Enable progress notifications.
|
||||||
dc_event_progress_t progress = EVENT_PROGRESS_INITIALIZER;
|
dc_event_progress_t progress = EVENT_PROGRESS_INITIALIZER;
|
||||||
progress.maximum = SZ_MEMORY + 2;
|
progress.maximum = (model == COBALT2 ? SZ_MEMORY2 : SZ_MEMORY1) + 2;
|
||||||
device_event_emit (abstract, DC_EVENT_PROGRESS, &progress);
|
device_event_emit (abstract, DC_EVENT_PROGRESS, &progress);
|
||||||
|
|
||||||
// Emit a vendor event.
|
// Emit a vendor event.
|
||||||
@ -389,6 +349,12 @@ atomics_cobalt_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
|
|||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (size < SZ_HEADER) {
|
||||||
|
ERROR (abstract->context, "Dive header is too small (%u).", size);
|
||||||
|
dc_buffer_free (buffer);
|
||||||
|
return DC_STATUS_DATAFORMAT;
|
||||||
|
}
|
||||||
|
|
||||||
if (memcmp (data + FP_OFFSET, device->fingerprint, sizeof (device->fingerprint)) == 0) {
|
if (memcmp (data + FP_OFFSET, device->fingerprint, sizeof (device->fingerprint)) == 0) {
|
||||||
dc_buffer_free (buffer);
|
dc_buffer_free (buffer);
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
@ -399,12 +365,6 @@ atomics_cobalt_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
|
|||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust the maximum value to take into account the two checksum bytes
|
|
||||||
// for the next dive. Since we don't know the total number of dives in
|
|
||||||
// advance, we can't calculate the total number of checksum bytes and
|
|
||||||
// adjust the maximum on the fly.
|
|
||||||
progress.maximum += 2;
|
|
||||||
|
|
||||||
ndives++;
|
ndives++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
#define ATOMICS_COBALT_H
|
#define ATOMICS_COBALT_H
|
||||||
|
|
||||||
#include <libdivecomputer/context.h>
|
#include <libdivecomputer/context.h>
|
||||||
|
#include <libdivecomputer/iostream.h>
|
||||||
#include <libdivecomputer/device.h>
|
#include <libdivecomputer/device.h>
|
||||||
#include <libdivecomputer/parser.h>
|
#include <libdivecomputer/parser.h>
|
||||||
#include <libdivecomputer/atomics_cobalt.h>
|
#include <libdivecomputer/atomics_cobalt.h>
|
||||||
@ -32,10 +33,10 @@ extern "C" {
|
|||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
atomics_cobalt_device_open (dc_device_t **device, dc_context_t *context);
|
atomics_cobalt_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream);
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
atomics_cobalt_parser_create (dc_parser_t **parser, dc_context_t *context);
|
atomics_cobalt_parser_create (dc_parser_t **parser, dc_context_t *context, const unsigned char data[], size_t size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <libdivecomputer/units.h>
|
#include <libdivecomputer/units.h>
|
||||||
|
|
||||||
@ -40,11 +46,10 @@ typedef struct atomics_cobalt_parser_t atomics_cobalt_parser_t;
|
|||||||
struct atomics_cobalt_parser_t {
|
struct atomics_cobalt_parser_t {
|
||||||
dc_parser_t base;
|
dc_parser_t base;
|
||||||
// Depth calibration.
|
// Depth calibration.
|
||||||
double atmospheric;
|
|
||||||
double hydrostatic;
|
double hydrostatic;
|
||||||
};
|
};
|
||||||
|
|
||||||
static dc_status_t atomics_cobalt_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size);
|
static dc_status_t atomics_cobalt_parser_set_density (dc_parser_t *abstract, double density);
|
||||||
static dc_status_t atomics_cobalt_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime);
|
static dc_status_t atomics_cobalt_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime);
|
||||||
static dc_status_t atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value);
|
static dc_status_t atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value);
|
||||||
static dc_status_t atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata);
|
static dc_status_t atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata);
|
||||||
@ -52,7 +57,9 @@ static dc_status_t atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract,
|
|||||||
static const dc_parser_vtable_t atomics_cobalt_parser_vtable = {
|
static const dc_parser_vtable_t atomics_cobalt_parser_vtable = {
|
||||||
sizeof(atomics_cobalt_parser_t),
|
sizeof(atomics_cobalt_parser_t),
|
||||||
DC_FAMILY_ATOMICS_COBALT,
|
DC_FAMILY_ATOMICS_COBALT,
|
||||||
atomics_cobalt_parser_set_data, /* set_data */
|
NULL, /* set_clock */
|
||||||
|
NULL, /* set_atmospheric */
|
||||||
|
atomics_cobalt_parser_set_density, /* set_density */
|
||||||
atomics_cobalt_parser_get_datetime, /* datetime */
|
atomics_cobalt_parser_get_datetime, /* datetime */
|
||||||
atomics_cobalt_parser_get_field, /* fields */
|
atomics_cobalt_parser_get_field, /* fields */
|
||||||
atomics_cobalt_parser_samples_foreach, /* samples_foreach */
|
atomics_cobalt_parser_samples_foreach, /* samples_foreach */
|
||||||
@ -61,7 +68,7 @@ static const dc_parser_vtable_t atomics_cobalt_parser_vtable = {
|
|||||||
|
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context)
|
atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context, const unsigned char data[], size_t size)
|
||||||
{
|
{
|
||||||
atomics_cobalt_parser_t *parser = NULL;
|
atomics_cobalt_parser_t *parser = NULL;
|
||||||
|
|
||||||
@ -69,15 +76,14 @@ atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context)
|
|||||||
return DC_STATUS_INVALIDARGS;
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
// Allocate memory.
|
// Allocate memory.
|
||||||
parser = (atomics_cobalt_parser_t *) dc_parser_allocate (context, &atomics_cobalt_parser_vtable);
|
parser = (atomics_cobalt_parser_t *) dc_parser_allocate (context, &atomics_cobalt_parser_vtable, data, size);
|
||||||
if (parser == NULL) {
|
if (parser == NULL) {
|
||||||
ERROR (context, "Failed to allocate memory.");
|
ERROR (context, "Failed to allocate memory.");
|
||||||
return DC_STATUS_NOMEMORY;
|
return DC_STATUS_NOMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the default values.
|
// Set the default values.
|
||||||
parser->atmospheric = 0.0;
|
parser->hydrostatic = DEF_DENSITY_SALT * GRAVITY;
|
||||||
parser->hydrostatic = 1025.0 * GRAVITY;
|
|
||||||
|
|
||||||
*out = (dc_parser_t*) parser;
|
*out = (dc_parser_t*) parser;
|
||||||
|
|
||||||
@ -86,22 +92,11 @@ atomics_cobalt_parser_create (dc_parser_t **out, dc_context_t *context)
|
|||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
atomics_cobalt_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size)
|
atomics_cobalt_parser_set_density (dc_parser_t *abstract, double density)
|
||||||
{
|
{
|
||||||
return DC_STATUS_SUCCESS;
|
atomics_cobalt_parser_t *parser = (atomics_cobalt_parser_t *) abstract;
|
||||||
}
|
|
||||||
|
|
||||||
|
parser->hydrostatic = density * GRAVITY;
|
||||||
dc_status_t
|
|
||||||
atomics_cobalt_parser_set_calibration (dc_parser_t *abstract, double atmospheric, double hydrostatic)
|
|
||||||
{
|
|
||||||
atomics_cobalt_parser_t *parser = (atomics_cobalt_parser_t*) abstract;
|
|
||||||
|
|
||||||
if (!ISINSTANCE (abstract))
|
|
||||||
return DC_STATUS_INVALIDARGS;
|
|
||||||
|
|
||||||
parser->atmospheric = atmospheric;
|
|
||||||
parser->hydrostatic = hydrostatic;
|
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -129,6 +124,9 @@ atomics_cobalt_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *dateti
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define BUFLEN 16
|
||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value)
|
atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value)
|
||||||
{
|
{
|
||||||
@ -142,11 +140,9 @@ atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, un
|
|||||||
dc_gasmix_t *gasmix = (dc_gasmix_t *) value;
|
dc_gasmix_t *gasmix = (dc_gasmix_t *) value;
|
||||||
dc_tank_t *tank = (dc_tank_t *) value;
|
dc_tank_t *tank = (dc_tank_t *) value;
|
||||||
|
|
||||||
double atmospheric = 0.0;
|
unsigned int atmospheric = array_uint16_le (p + 0x26);
|
||||||
if (parser->atmospheric)
|
char buf[BUFLEN];
|
||||||
atmospheric = parser->atmospheric;
|
dc_field_string_t *string = (dc_field_string_t *) value;
|
||||||
else
|
|
||||||
atmospheric = array_uint16_le (p + 0x26) * BAR / 1000.0;
|
|
||||||
|
|
||||||
unsigned int workpressure = 0;
|
unsigned int workpressure = 0;
|
||||||
|
|
||||||
@ -156,13 +152,14 @@ atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, un
|
|||||||
*((unsigned int *) value) = array_uint16_le (p + 0x58) * 60;
|
*((unsigned int *) value) = array_uint16_le (p + 0x58) * 60;
|
||||||
break;
|
break;
|
||||||
case DC_FIELD_MAXDEPTH:
|
case DC_FIELD_MAXDEPTH:
|
||||||
*((double *) value) = (array_uint16_le (p + 0x56) * BAR / 1000.0 - atmospheric) / parser->hydrostatic;
|
*((double *) value) = (signed int)(array_uint16_le (p + 0x56) - atmospheric) * (BAR / 1000.0) / parser->hydrostatic;
|
||||||
break;
|
break;
|
||||||
case DC_FIELD_GASMIX_COUNT:
|
case DC_FIELD_GASMIX_COUNT:
|
||||||
case DC_FIELD_TANK_COUNT:
|
case DC_FIELD_TANK_COUNT:
|
||||||
*((unsigned int *) value) = p[0x2a];
|
*((unsigned int *) value) = p[0x2a];
|
||||||
break;
|
break;
|
||||||
case DC_FIELD_GASMIX:
|
case DC_FIELD_GASMIX:
|
||||||
|
gasmix->usage = DC_USAGE_NONE;
|
||||||
gasmix->helium = p[SZ_HEADER + SZ_GASMIX * flags + 5] / 100.0;
|
gasmix->helium = p[SZ_HEADER + SZ_GASMIX * flags + 5] / 100.0;
|
||||||
gasmix->oxygen = p[SZ_HEADER + SZ_GASMIX * flags + 4] / 100.0;
|
gasmix->oxygen = p[SZ_HEADER + SZ_GASMIX * flags + 4] / 100.0;
|
||||||
gasmix->nitrogen = 1.0 - gasmix->oxygen - gasmix->helium;
|
gasmix->nitrogen = 1.0 - gasmix->oxygen - gasmix->helium;
|
||||||
@ -194,6 +191,7 @@ atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, un
|
|||||||
tank->gasmix = flags;
|
tank->gasmix = flags;
|
||||||
tank->beginpressure = array_uint16_le(p + 6) * PSI / BAR;
|
tank->beginpressure = array_uint16_le(p + 6) * PSI / BAR;
|
||||||
tank->endpressure = array_uint16_le(p + 14) * PSI / BAR;
|
tank->endpressure = array_uint16_le(p + 14) * PSI / BAR;
|
||||||
|
tank->usage = DC_TANK_USAGE_NONE;
|
||||||
break;
|
break;
|
||||||
case DC_FIELD_DIVEMODE:
|
case DC_FIELD_DIVEMODE:
|
||||||
switch(p[0x24]) {
|
switch(p[0x24]) {
|
||||||
@ -208,6 +206,32 @@ atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, un
|
|||||||
return DC_STATUS_DATAFORMAT;
|
return DC_STATUS_DATAFORMAT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case DC_FIELD_ATMOSPHERIC:
|
||||||
|
*((double *) value) = atmospheric / 1000.0;
|
||||||
|
break;
|
||||||
|
case DC_FIELD_STRING:
|
||||||
|
switch(flags) {
|
||||||
|
case 0: // Serialnr
|
||||||
|
string->desc = "Serial";
|
||||||
|
snprintf(buf, BUFLEN, "%c%c%c%c-%c%c%c%c", p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11]);
|
||||||
|
break;
|
||||||
|
case 1: // Program Version
|
||||||
|
string->desc = "Program Version";
|
||||||
|
snprintf(buf, BUFLEN, "%.2f", array_uint16_le(p + 30) / 100.0);
|
||||||
|
break;
|
||||||
|
case 2: // Boot Version
|
||||||
|
string->desc = "Boot Version";
|
||||||
|
snprintf(buf, BUFLEN, "%.2f", array_uint16_le(p + 32) / 100.0);
|
||||||
|
break;
|
||||||
|
case 3: // Nofly
|
||||||
|
string->desc = "NoFly Time";
|
||||||
|
snprintf(buf, BUFLEN, "%0u:%02u", p[0x52], p[0x53]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DC_STATUS_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
string->value = strdup(buf);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return DC_STATUS_UNSUPPORTED;
|
return DC_STATUS_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@ -239,11 +263,7 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
|
|||||||
if (size < header + SZ_SEGMENT * nsegments)
|
if (size < header + SZ_SEGMENT * nsegments)
|
||||||
return DC_STATUS_DATAFORMAT;
|
return DC_STATUS_DATAFORMAT;
|
||||||
|
|
||||||
double atmospheric = 0.0;
|
unsigned int atmospheric = array_uint16_le (data + 0x26);
|
||||||
if (parser->atmospheric)
|
|
||||||
atmospheric = parser->atmospheric;
|
|
||||||
else
|
|
||||||
atmospheric = array_uint16_le (data + 0x26) * BAR / 1000.0;
|
|
||||||
|
|
||||||
// Previous gas mix - initialize with impossible value
|
// Previous gas mix - initialize with impossible value
|
||||||
unsigned int gasmix_previous = 0xFFFFFFFF;
|
unsigned int gasmix_previous = 0xFFFFFFFF;
|
||||||
@ -269,19 +289,19 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
|
|||||||
|
|
||||||
// Time (seconds).
|
// Time (seconds).
|
||||||
time += interval;
|
time += interval;
|
||||||
sample.time = time;
|
sample.time = time * 1000;
|
||||||
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
|
if (callback) callback (DC_SAMPLE_TIME, &sample, userdata);
|
||||||
|
|
||||||
// Depth (1/1000 bar).
|
// Depth (1/1000 bar).
|
||||||
unsigned int depth = array_uint16_le (data + offset + 0);
|
unsigned int depth = array_uint16_le (data + offset + 0);
|
||||||
sample.depth = (depth * BAR / 1000.0 - atmospheric) / parser->hydrostatic;
|
sample.depth = (signed int)(depth - atmospheric) * (BAR / 1000.0) / parser->hydrostatic;
|
||||||
if (callback) callback (DC_SAMPLE_DEPTH, sample, userdata);
|
if (callback) callback (DC_SAMPLE_DEPTH, &sample, userdata);
|
||||||
|
|
||||||
// Pressure (1 psi).
|
// Pressure (1 psi).
|
||||||
unsigned int pressure = array_uint16_le (data + offset + 2);
|
unsigned int pressure = array_uint16_le (data + offset + 2);
|
||||||
sample.pressure.tank = tank;
|
sample.pressure.tank = tank;
|
||||||
sample.pressure.value = pressure * PSI / BAR;
|
sample.pressure.value = pressure * PSI / BAR;
|
||||||
if (callback) callback (DC_SAMPLE_PRESSURE, sample, userdata);
|
if (callback) callback (DC_SAMPLE_PRESSURE, &sample, userdata);
|
||||||
|
|
||||||
// Current gas mix
|
// Current gas mix
|
||||||
unsigned int gasmix = data[offset + 4];
|
unsigned int gasmix = data[offset + 4];
|
||||||
@ -297,14 +317,14 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
|
|||||||
return DC_STATUS_DATAFORMAT;
|
return DC_STATUS_DATAFORMAT;
|
||||||
}
|
}
|
||||||
sample.gasmix = idx;
|
sample.gasmix = idx;
|
||||||
if (callback) callback (DC_SAMPLE_GASMIX, sample, userdata);
|
if (callback) callback (DC_SAMPLE_GASMIX, &sample, userdata);
|
||||||
gasmix_previous = gasmix;
|
gasmix_previous = gasmix;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Temperature (1 °F).
|
// Temperature (1 °F).
|
||||||
unsigned int temperature = data[offset + 8];
|
unsigned int temperature = data[offset + 8];
|
||||||
sample.temperature = (temperature - 32.0) * (5.0 / 9.0);
|
sample.temperature = (temperature - 32.0) * (5.0 / 9.0);
|
||||||
if (callback) callback (DC_SAMPLE_TEMPERATURE, sample, userdata);
|
if (callback) callback (DC_SAMPLE_TEMPERATURE, &sample, userdata);
|
||||||
|
|
||||||
// violation status
|
// violation status
|
||||||
sample.event.type = 0;
|
sample.event.type = 0;
|
||||||
@ -314,15 +334,15 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
|
|||||||
unsigned int violation = data[offset + 11];
|
unsigned int violation = data[offset + 11];
|
||||||
if (violation & 0x01) {
|
if (violation & 0x01) {
|
||||||
sample.event.type = SAMPLE_EVENT_ASCENT;
|
sample.event.type = SAMPLE_EVENT_ASCENT;
|
||||||
if (callback) callback (DC_SAMPLE_EVENT, sample, userdata);
|
if (callback) callback (DC_SAMPLE_EVENT, &sample, userdata);
|
||||||
}
|
}
|
||||||
if (violation & 0x04) {
|
if (violation & 0x04) {
|
||||||
sample.event.type = SAMPLE_EVENT_CEILING;
|
sample.event.type = SAMPLE_EVENT_CEILING;
|
||||||
if (callback) callback (DC_SAMPLE_EVENT, sample, userdata);
|
if (callback) callback (DC_SAMPLE_EVENT, &sample, userdata);
|
||||||
}
|
}
|
||||||
if (violation & 0x08) {
|
if (violation & 0x08) {
|
||||||
sample.event.type = SAMPLE_EVENT_PO2;
|
sample.event.type = SAMPLE_EVENT_PO2;
|
||||||
if (callback) callback (DC_SAMPLE_EVENT, sample, userdata);
|
if (callback) callback (DC_SAMPLE_EVENT, &sample, userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NDL & deco
|
// NDL & deco
|
||||||
@ -337,7 +357,8 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
|
|||||||
sample.deco.type = DC_DECO_NDL;
|
sample.deco.type = DC_DECO_NDL;
|
||||||
sample.deco.time = ndl;
|
sample.deco.time = ndl;
|
||||||
sample.deco.depth = 0.0;
|
sample.deco.depth = 0.0;
|
||||||
if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
|
sample.deco.tts = 0;
|
||||||
|
if (callback) callback (DC_SAMPLE_DECO, &sample, userdata);
|
||||||
|
|
||||||
offset += SZ_SEGMENT;
|
offset += SZ_SEGMENT;
|
||||||
}
|
}
|
||||||
|
|||||||
615
src/bluetooth.c
615
src/bluetooth.c
@ -30,6 +30,7 @@
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifdef HAVE_WS2BTH_H
|
#ifdef HAVE_WS2BTH_H
|
||||||
#define BLUETOOTH
|
#define BLUETOOTH
|
||||||
|
#include <initguid.h>
|
||||||
#include <ws2bth.h>
|
#include <ws2bth.h>
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
@ -39,14 +40,18 @@
|
|||||||
#include <bluetooth/rfcomm.h>
|
#include <bluetooth/rfcomm.h>
|
||||||
#include <bluetooth/hci.h>
|
#include <bluetooth/hci.h>
|
||||||
#include <bluetooth/hci_lib.h>
|
#include <bluetooth/hci_lib.h>
|
||||||
|
#include <bluetooth/sdp.h>
|
||||||
|
#include <bluetooth/sdp_lib.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "bluetooth.h"
|
#include <libdivecomputer/bluetooth.h>
|
||||||
|
|
||||||
#include "common-private.h"
|
#include "common-private.h"
|
||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
|
#include "iterator-private.h"
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define DC_ADDRESS_FORMAT "%012I64X"
|
#define DC_ADDRESS_FORMAT "%012I64X"
|
||||||
@ -61,22 +66,49 @@
|
|||||||
|
|
||||||
#define ISINSTANCE(device) dc_iostream_isinstance((device), &dc_bluetooth_vtable)
|
#define ISINSTANCE(device) dc_iostream_isinstance((device), &dc_bluetooth_vtable)
|
||||||
|
|
||||||
|
struct dc_bluetooth_device_t {
|
||||||
|
dc_bluetooth_address_t address;
|
||||||
|
char name[248];
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef BLUETOOTH
|
#ifdef BLUETOOTH
|
||||||
|
static dc_status_t dc_bluetooth_iterator_next (dc_iterator_t *iterator, void *item);
|
||||||
|
static dc_status_t dc_bluetooth_iterator_free (dc_iterator_t *iterator);
|
||||||
|
|
||||||
|
typedef struct dc_bluetooth_iterator_t {
|
||||||
|
dc_iterator_t base;
|
||||||
|
dc_descriptor_t *descriptor;
|
||||||
|
#ifdef _WIN32
|
||||||
|
HANDLE hLookup;
|
||||||
|
#else
|
||||||
|
int fd;
|
||||||
|
inquiry_info *devices;
|
||||||
|
size_t count;
|
||||||
|
size_t current;
|
||||||
|
#endif
|
||||||
|
} dc_bluetooth_iterator_t;
|
||||||
|
|
||||||
|
static const dc_iterator_vtable_t dc_bluetooth_iterator_vtable = {
|
||||||
|
sizeof(dc_bluetooth_iterator_t),
|
||||||
|
dc_bluetooth_iterator_next,
|
||||||
|
dc_bluetooth_iterator_free,
|
||||||
|
};
|
||||||
|
|
||||||
static const dc_iostream_vtable_t dc_bluetooth_vtable = {
|
static const dc_iostream_vtable_t dc_bluetooth_vtable = {
|
||||||
sizeof(dc_socket_t),
|
sizeof(dc_socket_t),
|
||||||
dc_socket_set_timeout, /* set_timeout */
|
dc_socket_set_timeout, /* set_timeout */
|
||||||
dc_socket_set_latency, /* set_latency */
|
NULL, /* set_break */
|
||||||
dc_socket_set_halfduplex, /* set_halfduplex */
|
NULL, /* set_dtr */
|
||||||
dc_socket_set_break, /* set_break */
|
NULL, /* set_rts */
|
||||||
dc_socket_set_dtr, /* set_dtr */
|
NULL, /* get_lines */
|
||||||
dc_socket_set_rts, /* set_rts */
|
dc_socket_get_available, /* get_available */
|
||||||
dc_socket_get_lines, /* get_lines */
|
NULL, /* configure */
|
||||||
dc_socket_get_available, /* get_received */
|
dc_socket_poll, /* poll */
|
||||||
dc_socket_configure, /* configure */
|
|
||||||
dc_socket_read, /* read */
|
dc_socket_read, /* read */
|
||||||
dc_socket_write, /* write */
|
dc_socket_write, /* write */
|
||||||
dc_socket_flush, /* flush */
|
dc_socket_ioctl, /* ioctl */
|
||||||
dc_socket_purge, /* purge */
|
NULL, /* flush */
|
||||||
|
NULL, /* purge */
|
||||||
dc_socket_sleep, /* sleep */
|
dc_socket_sleep, /* sleep */
|
||||||
dc_socket_close, /* close */
|
dc_socket_close, /* close */
|
||||||
};
|
};
|
||||||
@ -105,11 +137,370 @@ dc_address_set (bdaddr_t *ba, dc_bluetooth_address_t address)
|
|||||||
shift += 8;
|
shift += 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
dc_bluetooth_sdp (uint8_t *port, dc_context_t *context, const bdaddr_t *ba)
|
||||||
|
{
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
sdp_session_t *session = NULL;
|
||||||
|
sdp_list_t *search = NULL, *attrid = NULL;
|
||||||
|
sdp_list_t *records = NULL;
|
||||||
|
uint8_t channel = 0;
|
||||||
|
|
||||||
|
// Connect to the SDP server on the remote device.
|
||||||
|
session = sdp_connect (BDADDR_ANY, ba, SDP_RETRY_IF_BUSY);
|
||||||
|
if (session == NULL) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specify the UUID of the serial port service with all attributes.
|
||||||
|
uuid_t uuid = {0};
|
||||||
|
uint32_t range = 0x0000FFFF;
|
||||||
|
sdp_uuid16_create (&uuid, SERIAL_PORT_SVCLASS_ID);
|
||||||
|
search = sdp_list_append (NULL, &uuid);
|
||||||
|
attrid = sdp_list_append (NULL, &range);
|
||||||
|
if (search == NULL || attrid == NULL) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a list of the service records with their attributes.
|
||||||
|
if (sdp_service_search_attr_req (session, search, SDP_ATTR_REQ_RANGE, attrid, &records) != 0) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go through each of the service records.
|
||||||
|
for (sdp_list_t *r = records; r; r = r->next ) {
|
||||||
|
sdp_record_t *record = (sdp_record_t *) r->data;
|
||||||
|
|
||||||
|
// Get a list of the protocol sequences.
|
||||||
|
sdp_list_t *protos = NULL;
|
||||||
|
if (sdp_get_access_protos (record, &protos) != 0 ) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the rfcomm port number.
|
||||||
|
int ch = sdp_get_proto_port (protos, RFCOMM_UUID);
|
||||||
|
|
||||||
|
sdp_list_foreach (protos, (sdp_list_func_t) sdp_list_free, NULL);
|
||||||
|
sdp_list_free (protos, NULL);
|
||||||
|
|
||||||
|
if (ch > 0) {
|
||||||
|
channel = ch;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel == 0) {
|
||||||
|
ERROR (context, "No serial port service found!");
|
||||||
|
status = DC_STATUS_IO;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
INFO (context, "SDP: channel=%u", channel);
|
||||||
|
|
||||||
|
*port = channel;
|
||||||
|
|
||||||
|
error:
|
||||||
|
sdp_list_free (records, (sdp_free_func_t) sdp_record_free);
|
||||||
|
sdp_list_free (attrid, NULL);
|
||||||
|
sdp_list_free (search, NULL);
|
||||||
|
sdp_close (session);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char *
|
||||||
|
dc_bluetooth_addr2str(dc_bluetooth_address_t address, char *str, size_t size)
|
||||||
|
{
|
||||||
|
if (str == NULL || size < DC_BLUETOOTH_SIZE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
int n = dc_platform_snprintf(str, size, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||||
|
(unsigned char)((address >> 40) & 0xFF),
|
||||||
|
(unsigned char)((address >> 32) & 0xFF),
|
||||||
|
(unsigned char)((address >> 24) & 0xFF),
|
||||||
|
(unsigned char)((address >> 16) & 0xFF),
|
||||||
|
(unsigned char)((address >> 8) & 0xFF),
|
||||||
|
(unsigned char)((address >> 0) & 0xFF));
|
||||||
|
if (n < 0 || (size_t) n >= size)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc_bluetooth_address_t
|
||||||
|
dc_bluetooth_str2addr(const char *str)
|
||||||
|
{
|
||||||
|
dc_bluetooth_address_t address = 0;
|
||||||
|
|
||||||
|
if (str == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unsigned char c = 0;
|
||||||
|
while ((c = *str++) != '\0') {
|
||||||
|
if (c == ':') {
|
||||||
|
continue;
|
||||||
|
} else if (c >= '0' && c <= '9') {
|
||||||
|
c -= '0';
|
||||||
|
} else if (c >= 'A' && c <= 'F') {
|
||||||
|
c -= 'A' - 10;
|
||||||
|
} else if (c >= 'a' && c <= 'f') {
|
||||||
|
c -= 'a' - 10;
|
||||||
|
} else {
|
||||||
|
return 0; /* Invalid character! */
|
||||||
|
}
|
||||||
|
|
||||||
|
address <<= 4;
|
||||||
|
address |= c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc_bluetooth_address_t
|
||||||
|
dc_bluetooth_device_get_address (dc_bluetooth_device_t *device)
|
||||||
|
{
|
||||||
|
if (device == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return device->address;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
dc_bluetooth_device_get_name (dc_bluetooth_device_t *device)
|
||||||
|
{
|
||||||
|
if (device == NULL || device->name[0] == '\0')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return device->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dc_bluetooth_device_free (dc_bluetooth_device_t *device)
|
||||||
|
{
|
||||||
|
free (device);
|
||||||
|
}
|
||||||
|
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_bluetooth_open (dc_iostream_t **out, dc_context_t *context)
|
dc_bluetooth_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descriptor_t *descriptor)
|
||||||
|
{
|
||||||
|
#ifdef BLUETOOTH
|
||||||
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
|
dc_bluetooth_iterator_t *iterator = NULL;
|
||||||
|
|
||||||
|
if (out == NULL)
|
||||||
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
|
iterator = (dc_bluetooth_iterator_t *) dc_iterator_allocate (context, &dc_bluetooth_iterator_vtable);
|
||||||
|
if (iterator == NULL) {
|
||||||
|
SYSERROR (context, S_ENOMEM);
|
||||||
|
return DC_STATUS_NOMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the socket library.
|
||||||
|
status = dc_socket_init (context);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
goto error_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
WSAQUERYSET wsaq;
|
||||||
|
memset(&wsaq, 0, sizeof (wsaq));
|
||||||
|
wsaq.dwSize = sizeof (wsaq);
|
||||||
|
wsaq.dwNameSpace = NS_BTH;
|
||||||
|
wsaq.lpcsaBuffer = NULL;
|
||||||
|
|
||||||
|
HANDLE hLookup = NULL;
|
||||||
|
if (WSALookupServiceBegin(&wsaq, LUP_CONTAINERS | LUP_FLUSHCACHE, &hLookup) != 0) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
if (errcode == WSASERVICE_NOT_FOUND) {
|
||||||
|
// No remote bluetooth devices found.
|
||||||
|
hLookup = NULL;
|
||||||
|
} else {
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error_socket_exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator->hLookup = hLookup;
|
||||||
|
#else
|
||||||
|
// Get the resource number for the first available bluetooth adapter.
|
||||||
|
int dev = hci_get_route (NULL);
|
||||||
|
if (dev < 0) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error_socket_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open a socket to the bluetooth adapter.
|
||||||
|
int fd = hci_open_dev (dev);
|
||||||
|
if (fd < 0) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error_socket_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform the bluetooth device discovery. The inquiry lasts for at
|
||||||
|
// most MAX_PERIODS * 1.28 seconds, and at most MAX_DEVICES devices
|
||||||
|
// will be returned.
|
||||||
|
inquiry_info *devices = NULL;
|
||||||
|
int ndevices = hci_inquiry (dev, MAX_PERIODS, MAX_DEVICES, NULL, &devices, IREQ_CACHE_FLUSH);
|
||||||
|
if (ndevices < 0) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
SYSERROR (context, errcode);
|
||||||
|
status = dc_socket_syserror(errcode);
|
||||||
|
goto error_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator->fd = fd;
|
||||||
|
iterator->devices = devices;
|
||||||
|
iterator->count = ndevices;
|
||||||
|
iterator->current = 0;
|
||||||
|
#endif
|
||||||
|
iterator->descriptor = descriptor;
|
||||||
|
|
||||||
|
*out = (dc_iterator_t *) iterator;
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
error_close:
|
||||||
|
hci_close_dev(fd);
|
||||||
|
#endif
|
||||||
|
error_socket_exit:
|
||||||
|
dc_socket_exit (context);
|
||||||
|
error_free:
|
||||||
|
dc_iterator_deallocate ((dc_iterator_t *) iterator);
|
||||||
|
return status;
|
||||||
|
#else
|
||||||
|
return DC_STATUS_UNSUPPORTED;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BLUETOOTH
|
||||||
|
static dc_status_t
|
||||||
|
dc_bluetooth_iterator_next (dc_iterator_t *abstract, void *out)
|
||||||
|
{
|
||||||
|
dc_bluetooth_iterator_t *iterator = (dc_bluetooth_iterator_t *) abstract;
|
||||||
|
dc_bluetooth_device_t *device = NULL;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (iterator->hLookup == NULL) {
|
||||||
|
return DC_STATUS_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char buf[4096];
|
||||||
|
LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
|
||||||
|
memset(pwsaResults, 0, sizeof(WSAQUERYSET));
|
||||||
|
pwsaResults->dwSize = sizeof(WSAQUERYSET);
|
||||||
|
pwsaResults->dwNameSpace = NS_BTH;
|
||||||
|
pwsaResults->lpBlob = NULL;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
DWORD dwSize = sizeof(buf);
|
||||||
|
if (WSALookupServiceNext (iterator->hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults) != 0) {
|
||||||
|
s_errcode_t errcode = S_ERRNO;
|
||||||
|
if (errcode == WSA_E_NO_MORE || errcode == WSAENOMORE) {
|
||||||
|
break; // No more results.
|
||||||
|
}
|
||||||
|
SYSERROR (abstract->context, errcode);
|
||||||
|
return dc_socket_syserror(errcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pwsaResults->dwNumberOfCsAddrs == 0 ||
|
||||||
|
pwsaResults->lpcsaBuffer == NULL ||
|
||||||
|
pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr == NULL) {
|
||||||
|
ERROR (abstract->context, "Invalid results returned");
|
||||||
|
return DC_STATUS_IO;
|
||||||
|
}
|
||||||
|
|
||||||
|
SOCKADDR_BTH *sa = (SOCKADDR_BTH *) pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr;
|
||||||
|
dc_bluetooth_address_t address = sa->btAddr;
|
||||||
|
const char *name = (char *) pwsaResults->lpszServiceInstanceName;
|
||||||
|
#else
|
||||||
|
while (iterator->current < iterator->count) {
|
||||||
|
inquiry_info *dev = &iterator->devices[iterator->current++];
|
||||||
|
|
||||||
|
dc_bluetooth_address_t address = dc_address_get (&dev->bdaddr);
|
||||||
|
|
||||||
|
// Get the user friendly name.
|
||||||
|
char buf[HCI_MAX_NAME_LENGTH], *name = buf;
|
||||||
|
int rc = hci_read_remote_name (iterator->fd, &dev->bdaddr, sizeof(buf), buf, 0);
|
||||||
|
if (rc < 0) {
|
||||||
|
name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Null terminate the string.
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s",
|
||||||
|
address, name ? name : "");
|
||||||
|
|
||||||
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_BLUETOOTH, name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
device = (dc_bluetooth_device_t *) malloc (sizeof(dc_bluetooth_device_t));
|
||||||
|
if (device == NULL) {
|
||||||
|
SYSERROR (abstract->context, S_ENOMEM);
|
||||||
|
return DC_STATUS_NOMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
device->address = address;
|
||||||
|
if (name) {
|
||||||
|
strncpy(device->name, name, sizeof(device->name) - 1);
|
||||||
|
device->name[sizeof(device->name) - 1] = '\0';
|
||||||
|
} else {
|
||||||
|
memset(device->name, 0, sizeof(device->name));
|
||||||
|
}
|
||||||
|
|
||||||
|
*(dc_bluetooth_device_t **) out = device;
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DC_STATUS_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
dc_bluetooth_iterator_free (dc_iterator_t *abstract)
|
||||||
|
{
|
||||||
|
dc_bluetooth_iterator_t *iterator = (dc_bluetooth_iterator_t *) abstract;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (iterator->hLookup) {
|
||||||
|
WSALookupServiceEnd (iterator->hLookup);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
bt_free(iterator->devices);
|
||||||
|
hci_close_dev(iterator->fd);
|
||||||
|
#endif
|
||||||
|
dc_socket_exit (abstract->context);
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
dc_bluetooth_open (dc_iostream_t **out, dc_context_t *context, dc_bluetooth_address_t address, unsigned int port)
|
||||||
{
|
{
|
||||||
#ifdef BLUETOOTH
|
#ifdef BLUETOOTH
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
@ -118,8 +509,10 @@ dc_bluetooth_open (dc_iostream_t **out, dc_context_t *context)
|
|||||||
if (out == NULL)
|
if (out == NULL)
|
||||||
return DC_STATUS_INVALIDARGS;
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
|
INFO (context, "Open: address=" DC_ADDRESS_FORMAT ", port=%u", address, port);
|
||||||
|
|
||||||
// Allocate memory.
|
// Allocate memory.
|
||||||
device = (dc_socket_t *) dc_iostream_allocate (context, &dc_bluetooth_vtable);
|
device = (dc_socket_t *) dc_iostream_allocate (context, &dc_bluetooth_vtable, DC_TRANSPORT_BLUETOOTH);
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
SYSERROR (context, S_ENOMEM);
|
SYSERROR (context, S_ENOMEM);
|
||||||
return DC_STATUS_NOMEMORY;
|
return DC_STATUS_NOMEMORY;
|
||||||
@ -135,10 +528,41 @@ dc_bluetooth_open (dc_iostream_t **out, dc_context_t *context)
|
|||||||
goto error_free;
|
goto error_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
SOCKADDR_BTH sa;
|
||||||
|
sa.addressFamily = AF_BTH;
|
||||||
|
sa.btAddr = address;
|
||||||
|
sa.port = port;
|
||||||
|
if (port == 0) {
|
||||||
|
sa.serviceClassId = SerialPortServiceClass_UUID;
|
||||||
|
} else {
|
||||||
|
memset(&sa.serviceClassId, 0, sizeof(sa.serviceClassId));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
struct sockaddr_rc sa;
|
||||||
|
sa.rc_family = AF_BLUETOOTH;
|
||||||
|
dc_address_set (&sa.rc_bdaddr, address);
|
||||||
|
if (port == 0) {
|
||||||
|
status = dc_bluetooth_sdp (&sa.rc_channel, context, &sa.rc_bdaddr);
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
goto error_close;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sa.rc_channel = port;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
status = dc_socket_connect (&device->base, (struct sockaddr *) &sa, sizeof (sa));
|
||||||
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
|
goto error_close;
|
||||||
|
}
|
||||||
|
|
||||||
*out = (dc_iostream_t *) device;
|
*out = (dc_iostream_t *) device;
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
error_close:
|
||||||
|
dc_socket_close (&device->base);
|
||||||
error_free:
|
error_free:
|
||||||
dc_iostream_deallocate ((dc_iostream_t *) device);
|
dc_iostream_deallocate ((dc_iostream_t *) device);
|
||||||
return status;
|
return status;
|
||||||
@ -146,168 +570,3 @@ error_free:
|
|||||||
return DC_STATUS_UNSUPPORTED;
|
return DC_STATUS_UNSUPPORTED;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
dc_bluetooth_discover (dc_iostream_t *abstract, dc_bluetooth_callback_t callback, void *userdata)
|
|
||||||
{
|
|
||||||
#ifdef BLUETOOTH
|
|
||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
if (!ISINSTANCE (abstract))
|
|
||||||
return DC_STATUS_INVALIDARGS;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
WSAQUERYSET wsaq;
|
|
||||||
memset(&wsaq, 0, sizeof (wsaq));
|
|
||||||
wsaq.dwSize = sizeof (wsaq);
|
|
||||||
wsaq.dwNameSpace = NS_BTH;
|
|
||||||
wsaq.lpcsaBuffer = NULL;
|
|
||||||
|
|
||||||
HANDLE hLookup;
|
|
||||||
if (WSALookupServiceBegin(&wsaq, LUP_CONTAINERS | LUP_FLUSHCACHE, &hLookup) != 0) {
|
|
||||||
s_errcode_t errcode = S_ERRNO;
|
|
||||||
if (errcode == WSASERVICE_NOT_FOUND) {
|
|
||||||
// No remote bluetooth devices found.
|
|
||||||
status = DC_STATUS_SUCCESS;
|
|
||||||
} else {
|
|
||||||
SYSERROR (abstract->context, errcode);
|
|
||||||
status = dc_socket_syserror(errcode);
|
|
||||||
}
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char buf[4096];
|
|
||||||
LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
|
|
||||||
memset(pwsaResults, 0, sizeof(WSAQUERYSET));
|
|
||||||
pwsaResults->dwSize = sizeof(WSAQUERYSET);
|
|
||||||
pwsaResults->dwNameSpace = NS_BTH;
|
|
||||||
pwsaResults->lpBlob = NULL;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
DWORD dwSize = sizeof(buf);
|
|
||||||
if (WSALookupServiceNext (hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults) != 0) {
|
|
||||||
s_errcode_t errcode = S_ERRNO;
|
|
||||||
if (errcode == WSA_E_NO_MORE || errcode == WSAENOMORE) {
|
|
||||||
break; // No more results.
|
|
||||||
}
|
|
||||||
SYSERROR (abstract->context, errcode);
|
|
||||||
status = dc_socket_syserror(errcode);
|
|
||||||
goto error_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pwsaResults->dwNumberOfCsAddrs == 0 ||
|
|
||||||
pwsaResults->lpcsaBuffer == NULL ||
|
|
||||||
pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr == NULL) {
|
|
||||||
ERROR (abstract->context, "Invalid results returned");
|
|
||||||
status = DC_STATUS_IO;
|
|
||||||
goto error_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
SOCKADDR_BTH *sa = (SOCKADDR_BTH *) pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr;
|
|
||||||
dc_bluetooth_address_t address = sa->btAddr;
|
|
||||||
const char *name = (char *) pwsaResults->lpszServiceInstanceName;
|
|
||||||
|
|
||||||
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s", address, name);
|
|
||||||
|
|
||||||
if (callback) callback (address, name, userdata);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
error_close:
|
|
||||||
WSALookupServiceEnd (hLookup);
|
|
||||||
#else
|
|
||||||
// Get the resource number for the first available bluetooth adapter.
|
|
||||||
int dev = hci_get_route (NULL);
|
|
||||||
if (dev < 0) {
|
|
||||||
s_errcode_t errcode = S_ERRNO;
|
|
||||||
SYSERROR (abstract->context, errcode);
|
|
||||||
status = dc_socket_syserror(errcode);
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open a socket to the bluetooth adapter.
|
|
||||||
int fd = hci_open_dev (dev);
|
|
||||||
if (fd < 0) {
|
|
||||||
s_errcode_t errcode = S_ERRNO;
|
|
||||||
SYSERROR (abstract->context, errcode);
|
|
||||||
status = dc_socket_syserror(errcode);
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allocate a buffer to store the results of the discovery.
|
|
||||||
inquiry_info *devices = (inquiry_info *) malloc (MAX_DEVICES * sizeof(inquiry_info));
|
|
||||||
if (devices == NULL) {
|
|
||||||
s_errcode_t errcode = S_ERRNO;
|
|
||||||
SYSERROR (abstract->context, errcode);
|
|
||||||
status = dc_socket_syserror(errcode);
|
|
||||||
goto error_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the bluetooth device discovery. The inquiry lasts for at
|
|
||||||
// most MAX_PERIODS * 1.28 seconds, and at most MAX_DEVICES devices
|
|
||||||
// will be returned.
|
|
||||||
int ndevices = hci_inquiry (dev, MAX_PERIODS, MAX_DEVICES, NULL, &devices, IREQ_CACHE_FLUSH);
|
|
||||||
if (ndevices < 0) {
|
|
||||||
s_errcode_t errcode = S_ERRNO;
|
|
||||||
SYSERROR (abstract->context, errcode);
|
|
||||||
status = dc_socket_syserror(errcode);
|
|
||||||
goto error_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < ndevices; ++i) {
|
|
||||||
dc_bluetooth_address_t address = dc_address_get (&devices[i].bdaddr);
|
|
||||||
|
|
||||||
// Get the user friendly name.
|
|
||||||
char buf[HCI_MAX_NAME_LENGTH], *name = buf;
|
|
||||||
int rc = hci_read_remote_name (fd, &devices[i].bdaddr, sizeof(buf), buf, 0);
|
|
||||||
if (rc < 0) {
|
|
||||||
name = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s", address, name);
|
|
||||||
|
|
||||||
if (callback) callback (address, name, userdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
error_free:
|
|
||||||
free(devices);
|
|
||||||
error_close:
|
|
||||||
hci_close_dev(fd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
error_exit:
|
|
||||||
return status;
|
|
||||||
#else
|
|
||||||
return DC_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
dc_bluetooth_connect (dc_iostream_t *abstract, dc_bluetooth_address_t address, unsigned int port)
|
|
||||||
{
|
|
||||||
#ifdef BLUETOOTH
|
|
||||||
dc_socket_t *device = (dc_socket_t *) abstract;
|
|
||||||
|
|
||||||
if (!ISINSTANCE (abstract))
|
|
||||||
return DC_STATUS_INVALIDARGS;
|
|
||||||
|
|
||||||
INFO (abstract->context, "Connect: address=" DC_ADDRESS_FORMAT ", port=%d", address, port);
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
SOCKADDR_BTH sa;
|
|
||||||
sa.addressFamily = AF_BTH;
|
|
||||||
sa.btAddr = address;
|
|
||||||
sa.port = port;
|
|
||||||
memset(&sa.serviceClassId, 0, sizeof(sa.serviceClassId));
|
|
||||||
#else
|
|
||||||
struct sockaddr_rc sa;
|
|
||||||
sa.rc_family = AF_BLUETOOTH;
|
|
||||||
sa.rc_channel = port;
|
|
||||||
dc_address_set (&sa.rc_bdaddr, address);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return dc_socket_connect (&device->base, (struct sockaddr *) &sa, sizeof (sa));
|
|
||||||
#else
|
|
||||||
return DC_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user