fix: decode base64-encoded file content
This commit is contained in:
@@ -1,125 +1,247 @@
|
||||
LyoKICogQ29weXJpZ2h0IDIwMDktMjAxMSBDZWRyaWMgUHJpc2NhbAogKgogKiBMaWNlbnNlZCB1
|
||||
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICog
|
||||
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
|
||||
aWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICog
|
||||
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyBy
|
||||
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
|
||||
cmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
|
||||
IkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5Z
|
||||
IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
|
||||
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRh
|
||||
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1
|
||||
ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o
|
||||
PgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8am5pLmg+
|
||||
CgojaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgoKI2luY2x1ZGUgImFuZHJvaWQvbG9nLmgiCgpzdGF0
|
||||
aWMgY29uc3QgY2hhciAqVEFHID0gInNlcmlhbF9wb3J0IjsKI2RlZmluZSBMT0dJKGZtdCwgYXJn
|
||||
cy4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAgVEFHLCBmbXQsICMj
|
||||
YXJncykKI2RlZmluZSBMT0dEKGZtdCwgYXJncy4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRS
|
||||
T0lEX0xPR19ERUJVRywgVEFHLCBmbXQsICMjYXJncykKI2RlZmluZSBMT0dFKGZtdCwgYXJncy4u
|
||||
LikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgVEFHLCBmbXQsICMjYXJn
|
||||
cykKCnN0YXRpYyBzcGVlZF90IGdldEJhdWRyYXRlKGppbnQgYmF1ZHJhdGUpIHsKICAgIHN3aXRj
|
||||
aCAoYmF1ZHJhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiBCMDsKICAg
|
||||
ICAgICBjYXNlIDUwOgogICAgICAgICAgICByZXR1cm4gQjUwOwogICAgICAgIGNhc2UgNzU6CiAg
|
||||
ICAgICAgICAgIHJldHVybiBCNzU7CiAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgIHJldHVy
|
||||
biBCMTEwOwogICAgICAgIGNhc2UgMTM0OgogICAgICAgICAgICByZXR1cm4gQjEzNDsKICAgICAg
|
||||
ICBjYXNlIDE1MDoKICAgICAgICAgICAgcmV0dXJuIEIxNTA7CiAgICAgICAgY2FzZSAyMDA6CiAg
|
||||
ICAgICAgICAgIHJldHVybiBCMjAwOwogICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICByZXR1
|
||||
cm4gQjMwMDsKICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgcmV0dXJuIEI2MDA7CiAgICAg
|
||||
ICAgY2FzZSAxMjAwOgogICAgICAgICAgICByZXR1cm4gQjEyMDA7CiAgICAgICAgY2FzZSAxODAw
|
||||
OgogICAgICAgICAgICByZXR1cm4gQjE4MDA7CiAgICAgICAgY2FzZSAyNDAwOgogICAgICAgICAg
|
||||
ICByZXR1cm4gQjI0MDA7CiAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICByZXR1cm4gQjQ4
|
||||
MDA7CiAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICByZXR1cm4gQjk2MDA7CiAgICAgICAg
|
||||
Y2FzZSAxOTIwMDoKICAgICAgICAgICAgcmV0dXJuIEIxOTIwMDsKICAgICAgICBjYXNlIDM4NDAw
|
||||
OgogICAgICAgICAgICByZXR1cm4gQjM4NDAwOwogICAgICAgIGNhc2UgNTc2MDA6CiAgICAgICAg
|
||||
ICAgIHJldHVybiBCNTc2MDA7CiAgICAgICAgY2FzZSAxMTUyMDA6CiAgICAgICAgICAgIHJldHVy
|
||||
biBCMTE1MjAwOwogICAgICAgIGNhc2UgMjMwNDAwOgogICAgICAgICAgICByZXR1cm4gQjIzMDQw
|
||||
MDsKICAgICAgICBjYXNlIDQ2MDgwMDoKICAgICAgICAgICAgcmV0dXJuIEI0NjA4MDA7CiAgICAg
|
||||
ICAgY2FzZSA1MDAwMDA6CiAgICAgICAgICAgIHJldHVybiBCNTAwMDAwOwogICAgICAgIGNhc2Ug
|
||||
NTc2MDAwOgogICAgICAgICAgICByZXR1cm4gQjU3NjAwMDsKICAgICAgICBjYXNlIDkyMTYwMDoK
|
||||
ICAgICAgICAgICAgcmV0dXJuIEI5MjE2MDA7CiAgICAgICAgY2FzZSAxMDAwMDAwOgogICAgICAg
|
||||
ICAgICByZXR1cm4gQjEwMDAwMDA7CiAgICAgICAgY2FzZSAxMTUyMDAwOgogICAgICAgICAgICBy
|
||||
ZXR1cm4gQjExNTIwMDA7CiAgICAgICAgY2FzZSAxNTAwMDAwOgogICAgICAgICAgICByZXR1cm4g
|
||||
QjE1MDAwMDA7CiAgICAgICAgY2FzZSAyMDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjIwMDAw
|
||||
MDA7CiAgICAgICAgY2FzZSAyNTAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjI1MDAwMDA7CiAg
|
||||
ICAgICAgY2FzZSAzMDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjMwMDAwMDA7CiAgICAgICAg
|
||||
Y2FzZSAzNTAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjM1MDAwMDA7CiAgICAgICAgY2FzZSA0
|
||||
MDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjQwMDAwMDA7CiAgICAgICAgZGVmYXVsdDoKICAg
|
||||
ICAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgovKgogKiBDbGFzczogICAgIGFuZHJvaWRfc2Vy
|
||||
aWFscG9ydF9TZXJpYWxQb3J0CiAqIE1ldGhvZDogICAgb3BlbgogKiBTaWduYXR1cmU6IChMamF2
|
||||
YS9sYW5nL1N0cmluZztJSUlJSSlMamF2YS9pby9GaWxlRGVzY3JpcHRvcjsKICovCkpOSUVYUE9S
|
||||
VCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9hbmRyb2lkX3NlcmlhbHBvcnRfU2VyaWFsUG9ydF9vcGVu
|
||||
CiAgICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgcGF0aCwgamludCBi
|
||||
YXVkcmF0ZSwgamludCBkYXRhQml0cywgamludCBwYXJpdHksCiAgICAgICAgIGppbnQgc3RvcEJp
|
||||
dHMsCiAgICAgICAgIGppbnQgZmxhZ3MpIHsKCiAgICBpbnQgZmQ7CiAgICBzcGVlZF90IHNwZWVk
|
||||
OwogICAgam9iamVjdCBtRmlsZURlc2NyaXB0b3I7CgogICAgLyogQ2hlY2sgYXJndW1lbnRzICov
|
||||
CiAgICB7CiAgICAgICAgc3BlZWQgPSBnZXRCYXVkcmF0ZShiYXVkcmF0ZSk7CiAgICAgICAgaWYg
|
||||
KHNwZWVkID09IC0xKSB7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4Y2VwdGlvbiAq
|
||||
LwogICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJhdWRyYXRlIik7CiAgICAgICAgICAgIHJldHVy
|
||||
biBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBPcGVuaW5nIGRldmljZSAqLwogICAgewog
|
||||
ICAgICAgIGpib29sZWFuIGlzY29weTsKICAgICAgICBjb25zdCBjaGFyICpwYXRoX3V0ZiA9ICgq
|
||||
ZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBwYXRoLCAmaXNjb3B5KTsKICAgICAgICBMT0dE
|
||||
KCJPcGVuaW5nIHNlcmlhbCBwb3J0ICVzIHdpdGggZmxhZ3MgMHgleCIsIHBhdGhfdXRmLCBPX1JE
|
||||
V1IgfCBmbGFncyk7CiAgICAgICAgZmQgPSBvcGVuKHBhdGhfdXRmLCBPX1JEV1IgfCBmbGFncyk7
|
||||
CiAgICAgICAgTE9HRCgib3BlbigpIGZkID0gJWQiLCBmZCk7CiAgICAgICAgKCplbnYpLT5SZWxl
|
||||
YXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBwYXRoLCBwYXRoX3V0Zik7CiAgICAgICAgaWYgKGZkID09
|
||||
IC0xKSB7CiAgICAgICAgICAgIC8qIFRocm93IGFuIGV4Y2VwdGlvbiAqLwogICAgICAgICAgICBM
|
||||
T0dFKCJDYW5ub3Qgb3BlbiBwb3J0Iik7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4
|
||||
Y2VwdGlvbiAqLwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAg
|
||||
LyogQ29uZmlndXJlIGRldmljZSAqLwogICAgewogICAgICAgIHN0cnVjdCB0ZXJtaW9zIGNmZzsK
|
||||
ICAgICAgICBMT0dEKCJDb25maWd1cmluZyBzZXJpYWwgcG9ydCIpOwogICAgICAgIGlmICh0Y2dl
|
||||
dGF0dHIoZmQsICZjZmcpKSB7CiAgICAgICAgICAgIExPR0UoInRjZ2V0YXR0cigpIGZhaWxlZCIp
|
||||
OwogICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4
|
||||
Y2VwdGlvbiAqLwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIGNm
|
||||
bWFrZXJhdygmY2ZnKTsKICAgICAgICBjZnNldGlzcGVlZCgmY2ZnLCBzcGVlZCk7CiAgICAgICAg
|
||||
Y2ZzZXRvc3BlZWQoJmNmZywgc3BlZWQpOwoKCiAgICAgICAgY2ZnLmNfY2ZsYWcgJj0gfkNTSVpF
|
||||
OwogICAgICAgIHN3aXRjaCAoZGF0YUJpdHMpIHsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAg
|
||||
ICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M1OyAgICAvL+S9v+eUqDXkvY3mlbDmja7kvY0KICAg
|
||||
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBj
|
||||
ZmcuY19jZmxhZyB8PSBDUzY7ICAgIC8v5L2/55SoNuS9jeaVsOaNruS9jQogICAgICAgICAgICAg
|
||||
ICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgIGNmZy5jX2NmbGFn
|
||||
IHw9IENTNzsgICAgLy/kvb/nlKg35L2N5pWw5o2u5L2NCiAgICAgICAgICAgICAgICBicmVhazsK
|
||||
ICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M4OyAg
|
||||
ICAvL+S9v+eUqDjkvY3mlbDmja7kvY0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
|
||||
ICBkZWZhdWx0OgogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M4OwogICAgICAgICAg
|
||||
ICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHBhcml0eSkgewogICAgICAg
|
||||
ICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjZmcuY19jZmxhZyAmPSB+UEFSRU5COyAgICAv
|
||||
L+aXoOWlh+WBtuagoemqjAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ug
|
||||
MToKICAgICAgICAgICAgICAgIGNmZy5jX2NmbGFnIHw9IChQQVJPREQgfCBQQVJFTkIpOyAgIC8v
|
||||
5aWH5qCh6aqMCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAg
|
||||
ICAgICAgICAgICAgY2ZnLmNfaWZsYWcgJj0gfihJR05QQVIgfCBQQVJNUkspOyAvLyDlgbbmoKHp
|
||||
qowKICAgICAgICAgICAgICAgIGNmZy5jX2lmbGFnIHw9IElOUENLOwogICAgICAgICAgICAgICAg
|
||||
Y2ZnLmNfY2ZsYWcgfD0gUEFSRU5COwogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgJj0gflBB
|
||||
Uk9ERDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAg
|
||||
ICAgICAgY2ZnLmNfY2ZsYWcgJj0gflBBUkVOQjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAg
|
||||
ICAgIH0KCiAgICAgICAgc3dpdGNoIChzdG9wQml0cykgewogICAgICAgICAgICBjYXNlIDE6CiAg
|
||||
ICAgICAgICAgICAgICBjZmcuY19jZmxhZyAmPSB+Q1NUT1BCOyAgICAvLzHkvY3lgZzmraLkvY0K
|
||||
ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAg
|
||||
ICBjZmcuY19jZmxhZyB8PSBDU1RPUEI7ICAgIC8vMuS9jeWBnOatouS9jQogICAgICAgICAgICAg
|
||||
ICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjZmcuY19jZmxh
|
||||
ZyAmPSB+Q1NUT1BCOyAgICAvLzHkvY3lgZzmraLkvY0KICAgICAgICAgICAgICAgIGJyZWFrOwog
|
||||
ICAgICAgIH0KCiAgICAgICAgaWYgKHRjc2V0YXR0cihmZCwgVENTQU5PVywgJmNmZykpIHsKICAg
|
||||
ICAgICAgICAgTE9HRSgidGNzZXRhdHRyKCkgZmFpbGVkIik7CiAgICAgICAgICAgIGNsb3NlKGZk
|
||||
KTsKICAgICAgICAgICAgLyogVE9ETzogdGhyb3cgYW4gZXhjZXB0aW9uICovCiAgICAgICAgICAg
|
||||
IHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDcmVhdGUgYSBjb3JyZXNwb25k
|
||||
aW5nIGZpbGUgZGVzY3JpcHRvciAqLwogICAgewogICAgICAgIGpjbGFzcyBjRmlsZURlc2NyaXB0
|
||||
b3IgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CiAg
|
||||
ICAgICAgam1ldGhvZElEIGlGaWxlRGVzY3JpcHRvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52
|
||||
LCBjRmlsZURlc2NyaXB0b3IsICI8aW5pdD4iLCAiKClWIik7CiAgICAgICAgamZpZWxkSUQgZGVz
|
||||
Y3JpcHRvcklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY0ZpbGVEZXNjcmlwdG9yLCAiZGVz
|
||||
Y3JpcHRvciIsICJJIik7CiAgICAgICAgbUZpbGVEZXNjcmlwdG9yID0gKCplbnYpLT5OZXdPYmpl
|
||||
Y3QoZW52LCBjRmlsZURlc2NyaXB0b3IsIGlGaWxlRGVzY3JpcHRvcik7CiAgICAgICAgKCplbnYp
|
||||
LT5TZXRJbnRGaWVsZChlbnYsIG1GaWxlRGVzY3JpcHRvciwgZGVzY3JpcHRvcklELCAoamludCkg
|
||||
ZmQpOwogICAgfQoKICAgIHJldHVybiBtRmlsZURlc2NyaXB0b3I7Cn0KCi8qCiAqIENsYXNzOiAg
|
||||
ICAgY2VkcmljX3NlcmlhbF9TZXJpYWxQb3J0CiAqIE1ldGhvZDogICAgY2xvc2UKICogU2lnbmF0
|
||||
dXJlOiAoKVYKICovCkpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9hbmRyb2lkX3NlcmlhbHBv
|
||||
cnRfU2VyaWFsUG9ydF9jbG9zZQogICAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KSB7
|
||||
CiAgICBqY2xhc3MgU2VyaWFsUG9ydENsYXNzID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYs
|
||||
IHRoaXopOwogICAgamNsYXNzIEZpbGVEZXNjcmlwdG9yQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFz
|
||||
cyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CgogICAgamZpZWxkSUQgbUZkSUQgPSAo
|
||||
KmVudiktPkdldEZpZWxkSUQoZW52LCBTZXJpYWxQb3J0Q2xhc3MsICJtRmQiLCAiTGphdmEvaW8v
|
||||
RmlsZURlc2NyaXB0b3I7Iik7CiAgICBqZmllbGRJRCBkZXNjcmlwdG9ySUQgPSAoKmVudiktPkdl
|
||||
dEZpZWxkSUQoZW52LCBGaWxlRGVzY3JpcHRvckNsYXNzLCAiZGVzY3JpcHRvciIsICJJIik7Cgog
|
||||
ICAgam9iamVjdCBtRmQgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgdGhpeiwgbUZkSUQp
|
||||
OwogICAgamludCBkZXNjcmlwdG9yID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIG1GZCwgZGVz
|
||||
Y3JpcHRvcklEKTsKCiAgICBMT0dEKCJjbG9zZShmZCA9ICVkKSIsIGRlc2NyaXB0b3IpOwogICAg
|
||||
Y2xvc2UoZGVzY3JpcHRvcik7Cn0KCg==
|
||||
/*
|
||||
* Copyright 2009-2011 Cedric Priscal
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include "SerialPort.h"
|
||||
|
||||
#include "android/log.h"
|
||||
|
||||
static const char *TAG = "serial_port";
|
||||
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
|
||||
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
|
||||
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
|
||||
|
||||
static speed_t getBaudrate(jint baudrate) {
|
||||
switch (baudrate) {
|
||||
case 0:
|
||||
return B0;
|
||||
case 50:
|
||||
return B50;
|
||||
case 75:
|
||||
return B75;
|
||||
case 110:
|
||||
return B110;
|
||||
case 134:
|
||||
return B134;
|
||||
case 150:
|
||||
return B150;
|
||||
case 200:
|
||||
return B200;
|
||||
case 300:
|
||||
return B300;
|
||||
case 600:
|
||||
return B600;
|
||||
case 1200:
|
||||
return B1200;
|
||||
case 1800:
|
||||
return B1800;
|
||||
case 2400:
|
||||
return B2400;
|
||||
case 4800:
|
||||
return B4800;
|
||||
case 9600:
|
||||
return B9600;
|
||||
case 19200:
|
||||
return B19200;
|
||||
case 38400:
|
||||
return B38400;
|
||||
case 57600:
|
||||
return B57600;
|
||||
case 115200:
|
||||
return B115200;
|
||||
case 230400:
|
||||
return B230400;
|
||||
case 460800:
|
||||
return B460800;
|
||||
case 500000:
|
||||
return B500000;
|
||||
case 576000:
|
||||
return B576000;
|
||||
case 921600:
|
||||
return B921600;
|
||||
case 1000000:
|
||||
return B1000000;
|
||||
case 1152000:
|
||||
return B1152000;
|
||||
case 1500000:
|
||||
return B1500000;
|
||||
case 2000000:
|
||||
return B2000000;
|
||||
case 2500000:
|
||||
return B2500000;
|
||||
case 3000000:
|
||||
return B3000000;
|
||||
case 3500000:
|
||||
return B3500000;
|
||||
case 4000000:
|
||||
return B4000000;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: android_serialport_SerialPort
|
||||
* Method: open
|
||||
* Signature: (Ljava/lang/String;IIIII)Ljava/io/FileDescriptor;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open
|
||||
(JNIEnv *env, jobject thiz, jstring path, jint baudrate, jint dataBits, jint parity,
|
||||
jint stopBits,
|
||||
jint flags) {
|
||||
|
||||
int fd;
|
||||
speed_t speed;
|
||||
jobject mFileDescriptor;
|
||||
|
||||
/* Check arguments */
|
||||
{
|
||||
speed = getBaudrate(baudrate);
|
||||
if (speed == -1) {
|
||||
/* TODO: throw an exception */
|
||||
LOGE("Invalid baudrate");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Opening device */
|
||||
{
|
||||
jboolean iscopy;
|
||||
const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
|
||||
LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags);
|
||||
fd = open(path_utf, O_RDWR | flags);
|
||||
LOGD("open() fd = %d", fd);
|
||||
(*env)->ReleaseStringUTFChars(env, path, path_utf);
|
||||
if (fd == -1) {
|
||||
/* Throw an exception */
|
||||
LOGE("Cannot open port");
|
||||
/* TODO: throw an exception */
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Configure device */
|
||||
{
|
||||
struct termios cfg;
|
||||
LOGD("Configuring serial port");
|
||||
if (tcgetattr(fd, &cfg)) {
|
||||
LOGE("tcgetattr() failed");
|
||||
close(fd);
|
||||
/* TODO: throw an exception */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cfmakeraw(&cfg);
|
||||
cfsetispeed(&cfg, speed);
|
||||
cfsetospeed(&cfg, speed);
|
||||
|
||||
|
||||
cfg.c_cflag &= ~CSIZE;
|
||||
switch (dataBits) {
|
||||
case 5:
|
||||
cfg.c_cflag |= CS5; //使用5位数据位
|
||||
break;
|
||||
case 6:
|
||||
cfg.c_cflag |= CS6; //使用6位数据位
|
||||
break;
|
||||
case 7:
|
||||
cfg.c_cflag |= CS7; //使用7位数据位
|
||||
break;
|
||||
case 8:
|
||||
cfg.c_cflag |= CS8; //使用8位数据位
|
||||
break;
|
||||
default:
|
||||
cfg.c_cflag |= CS8;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (parity) {
|
||||
case 0:
|
||||
cfg.c_cflag &= ~PARENB; //无奇偶校验
|
||||
break;
|
||||
case 1:
|
||||
cfg.c_cflag |= (PARODD | PARENB); //奇校验
|
||||
break;
|
||||
case 2:
|
||||
cfg.c_iflag &= ~(IGNPAR | PARMRK); // 偶校验
|
||||
cfg.c_iflag |= INPCK;
|
||||
cfg.c_cflag |= PARENB;
|
||||
cfg.c_cflag &= ~PARODD;
|
||||
break;
|
||||
default:
|
||||
cfg.c_cflag &= ~PARENB;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (stopBits) {
|
||||
case 1:
|
||||
cfg.c_cflag &= ~CSTOPB; //1位停止位
|
||||
break;
|
||||
case 2:
|
||||
cfg.c_cflag |= CSTOPB; //2位停止位
|
||||
break;
|
||||
default:
|
||||
cfg.c_cflag &= ~CSTOPB; //1位停止位
|
||||
break;
|
||||
}
|
||||
|
||||
if (tcsetattr(fd, TCSANOW, &cfg)) {
|
||||
LOGE("tcsetattr() failed");
|
||||
close(fd);
|
||||
/* TODO: throw an exception */
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Create a corresponding file descriptor */
|
||||
{
|
||||
jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor");
|
||||
jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "<init>", "()V");
|
||||
jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I");
|
||||
mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor);
|
||||
(*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint) fd);
|
||||
}
|
||||
|
||||
return mFileDescriptor;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: cedric_serial_SerialPort
|
||||
* Method: close
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close
|
||||
(JNIEnv *env, jobject thiz) {
|
||||
jclass SerialPortClass = (*env)->GetObjectClass(env, thiz);
|
||||
jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor");
|
||||
|
||||
jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd", "Ljava/io/FileDescriptor;");
|
||||
jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I");
|
||||
|
||||
jobject mFd = (*env)->GetObjectField(env, thiz, mFdID);
|
||||
jint descriptor = (*env)->GetIntField(env, mFd, descriptorID);
|
||||
|
||||
LOGD("close(fd = %d)", descriptor);
|
||||
close(descriptor);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user