fix: decode base64-encoded file content
This commit is contained in:
@@ -1,125 +1,247 @@
|
|||||||
LyoKICogQ29weXJpZ2h0IDIwMDktMjAxMSBDZWRyaWMgUHJpc2NhbAogKgogKiBMaWNlbnNlZCB1
|
/*
|
||||||
bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICog
|
* Copyright 2009-2011 Cedric Priscal
|
||||||
eW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBM
|
*
|
||||||
aWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICog
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyBy
|
* you may not use this file except in compliance with the License.
|
||||||
ZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdh
|
* You may obtain a copy of the License at
|
||||||
cmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4g
|
*
|
||||||
IkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5Z
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3Ig
|
*
|
||||||
dGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRh
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
dGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
PgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8am5pLmg+
|
* See the License for the specific language governing permissions and
|
||||||
CgojaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgoKI2luY2x1ZGUgImFuZHJvaWQvbG9nLmgiCgpzdGF0
|
* limitations under the License.
|
||||||
aWMgY29uc3QgY2hhciAqVEFHID0gInNlcmlhbF9wb3J0IjsKI2RlZmluZSBMT0dJKGZtdCwgYXJn
|
*/
|
||||||
cy4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAgVEFHLCBmbXQsICMj
|
|
||||||
YXJncykKI2RlZmluZSBMT0dEKGZtdCwgYXJncy4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRS
|
#include <termios.h>
|
||||||
T0lEX0xPR19ERUJVRywgVEFHLCBmbXQsICMjYXJncykKI2RlZmluZSBMT0dFKGZtdCwgYXJncy4u
|
#include <unistd.h>
|
||||||
LikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgVEFHLCBmbXQsICMjYXJn
|
#include <sys/types.h>
|
||||||
cykKCnN0YXRpYyBzcGVlZF90IGdldEJhdWRyYXRlKGppbnQgYmF1ZHJhdGUpIHsKICAgIHN3aXRj
|
#include <sys/stat.h>
|
||||||
aCAoYmF1ZHJhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiBCMDsKICAg
|
#include <fcntl.h>
|
||||||
ICAgICBjYXNlIDUwOgogICAgICAgICAgICByZXR1cm4gQjUwOwogICAgICAgIGNhc2UgNzU6CiAg
|
#include <string.h>
|
||||||
ICAgICAgICAgIHJldHVybiBCNzU7CiAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgIHJldHVy
|
#include <jni.h>
|
||||||
biBCMTEwOwogICAgICAgIGNhc2UgMTM0OgogICAgICAgICAgICByZXR1cm4gQjEzNDsKICAgICAg
|
|
||||||
ICBjYXNlIDE1MDoKICAgICAgICAgICAgcmV0dXJuIEIxNTA7CiAgICAgICAgY2FzZSAyMDA6CiAg
|
#include "SerialPort.h"
|
||||||
ICAgICAgICAgIHJldHVybiBCMjAwOwogICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICByZXR1
|
|
||||||
cm4gQjMwMDsKICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgcmV0dXJuIEI2MDA7CiAgICAg
|
#include "android/log.h"
|
||||||
ICAgY2FzZSAxMjAwOgogICAgICAgICAgICByZXR1cm4gQjEyMDA7CiAgICAgICAgY2FzZSAxODAw
|
|
||||||
OgogICAgICAgICAgICByZXR1cm4gQjE4MDA7CiAgICAgICAgY2FzZSAyNDAwOgogICAgICAgICAg
|
static const char *TAG = "serial_port";
|
||||||
ICByZXR1cm4gQjI0MDA7CiAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICByZXR1cm4gQjQ4
|
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
|
||||||
MDA7CiAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICByZXR1cm4gQjk2MDA7CiAgICAgICAg
|
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
|
||||||
Y2FzZSAxOTIwMDoKICAgICAgICAgICAgcmV0dXJuIEIxOTIwMDsKICAgICAgICBjYXNlIDM4NDAw
|
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
|
||||||
OgogICAgICAgICAgICByZXR1cm4gQjM4NDAwOwogICAgICAgIGNhc2UgNTc2MDA6CiAgICAgICAg
|
|
||||||
ICAgIHJldHVybiBCNTc2MDA7CiAgICAgICAgY2FzZSAxMTUyMDA6CiAgICAgICAgICAgIHJldHVy
|
static speed_t getBaudrate(jint baudrate) {
|
||||||
biBCMTE1MjAwOwogICAgICAgIGNhc2UgMjMwNDAwOgogICAgICAgICAgICByZXR1cm4gQjIzMDQw
|
switch (baudrate) {
|
||||||
MDsKICAgICAgICBjYXNlIDQ2MDgwMDoKICAgICAgICAgICAgcmV0dXJuIEI0NjA4MDA7CiAgICAg
|
case 0:
|
||||||
ICAgY2FzZSA1MDAwMDA6CiAgICAgICAgICAgIHJldHVybiBCNTAwMDAwOwogICAgICAgIGNhc2Ug
|
return B0;
|
||||||
NTc2MDAwOgogICAgICAgICAgICByZXR1cm4gQjU3NjAwMDsKICAgICAgICBjYXNlIDkyMTYwMDoK
|
case 50:
|
||||||
ICAgICAgICAgICAgcmV0dXJuIEI5MjE2MDA7CiAgICAgICAgY2FzZSAxMDAwMDAwOgogICAgICAg
|
return B50;
|
||||||
ICAgICByZXR1cm4gQjEwMDAwMDA7CiAgICAgICAgY2FzZSAxMTUyMDAwOgogICAgICAgICAgICBy
|
case 75:
|
||||||
ZXR1cm4gQjExNTIwMDA7CiAgICAgICAgY2FzZSAxNTAwMDAwOgogICAgICAgICAgICByZXR1cm4g
|
return B75;
|
||||||
QjE1MDAwMDA7CiAgICAgICAgY2FzZSAyMDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjIwMDAw
|
case 110:
|
||||||
MDA7CiAgICAgICAgY2FzZSAyNTAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjI1MDAwMDA7CiAg
|
return B110;
|
||||||
ICAgICAgY2FzZSAzMDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjMwMDAwMDA7CiAgICAgICAg
|
case 134:
|
||||||
Y2FzZSAzNTAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjM1MDAwMDA7CiAgICAgICAgY2FzZSA0
|
return B134;
|
||||||
MDAwMDAwOgogICAgICAgICAgICByZXR1cm4gQjQwMDAwMDA7CiAgICAgICAgZGVmYXVsdDoKICAg
|
case 150:
|
||||||
ICAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgovKgogKiBDbGFzczogICAgIGFuZHJvaWRfc2Vy
|
return B150;
|
||||||
aWFscG9ydF9TZXJpYWxQb3J0CiAqIE1ldGhvZDogICAgb3BlbgogKiBTaWduYXR1cmU6IChMamF2
|
case 200:
|
||||||
YS9sYW5nL1N0cmluZztJSUlJSSlMamF2YS9pby9GaWxlRGVzY3JpcHRvcjsKICovCkpOSUVYUE9S
|
return B200;
|
||||||
VCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9hbmRyb2lkX3NlcmlhbHBvcnRfU2VyaWFsUG9ydF9vcGVu
|
case 300:
|
||||||
CiAgICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgcGF0aCwgamludCBi
|
return B300;
|
||||||
YXVkcmF0ZSwgamludCBkYXRhQml0cywgamludCBwYXJpdHksCiAgICAgICAgIGppbnQgc3RvcEJp
|
case 600:
|
||||||
dHMsCiAgICAgICAgIGppbnQgZmxhZ3MpIHsKCiAgICBpbnQgZmQ7CiAgICBzcGVlZF90IHNwZWVk
|
return B600;
|
||||||
OwogICAgam9iamVjdCBtRmlsZURlc2NyaXB0b3I7CgogICAgLyogQ2hlY2sgYXJndW1lbnRzICov
|
case 1200:
|
||||||
CiAgICB7CiAgICAgICAgc3BlZWQgPSBnZXRCYXVkcmF0ZShiYXVkcmF0ZSk7CiAgICAgICAgaWYg
|
return B1200;
|
||||||
KHNwZWVkID09IC0xKSB7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4Y2VwdGlvbiAq
|
case 1800:
|
||||||
LwogICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJhdWRyYXRlIik7CiAgICAgICAgICAgIHJldHVy
|
return B1800;
|
||||||
biBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBPcGVuaW5nIGRldmljZSAqLwogICAgewog
|
case 2400:
|
||||||
ICAgICAgIGpib29sZWFuIGlzY29weTsKICAgICAgICBjb25zdCBjaGFyICpwYXRoX3V0ZiA9ICgq
|
return B2400;
|
||||||
ZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBwYXRoLCAmaXNjb3B5KTsKICAgICAgICBMT0dE
|
case 4800:
|
||||||
KCJPcGVuaW5nIHNlcmlhbCBwb3J0ICVzIHdpdGggZmxhZ3MgMHgleCIsIHBhdGhfdXRmLCBPX1JE
|
return B4800;
|
||||||
V1IgfCBmbGFncyk7CiAgICAgICAgZmQgPSBvcGVuKHBhdGhfdXRmLCBPX1JEV1IgfCBmbGFncyk7
|
case 9600:
|
||||||
CiAgICAgICAgTE9HRCgib3BlbigpIGZkID0gJWQiLCBmZCk7CiAgICAgICAgKCplbnYpLT5SZWxl
|
return B9600;
|
||||||
YXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBwYXRoLCBwYXRoX3V0Zik7CiAgICAgICAgaWYgKGZkID09
|
case 19200:
|
||||||
IC0xKSB7CiAgICAgICAgICAgIC8qIFRocm93IGFuIGV4Y2VwdGlvbiAqLwogICAgICAgICAgICBM
|
return B19200;
|
||||||
T0dFKCJDYW5ub3Qgb3BlbiBwb3J0Iik7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4
|
case 38400:
|
||||||
Y2VwdGlvbiAqLwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAg
|
return B38400;
|
||||||
LyogQ29uZmlndXJlIGRldmljZSAqLwogICAgewogICAgICAgIHN0cnVjdCB0ZXJtaW9zIGNmZzsK
|
case 57600:
|
||||||
ICAgICAgICBMT0dEKCJDb25maWd1cmluZyBzZXJpYWwgcG9ydCIpOwogICAgICAgIGlmICh0Y2dl
|
return B57600;
|
||||||
dGF0dHIoZmQsICZjZmcpKSB7CiAgICAgICAgICAgIExPR0UoInRjZ2V0YXR0cigpIGZhaWxlZCIp
|
case 115200:
|
||||||
OwogICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgIC8qIFRPRE86IHRocm93IGFuIGV4
|
return B115200;
|
||||||
Y2VwdGlvbiAqLwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIGNm
|
case 230400:
|
||||||
bWFrZXJhdygmY2ZnKTsKICAgICAgICBjZnNldGlzcGVlZCgmY2ZnLCBzcGVlZCk7CiAgICAgICAg
|
return B230400;
|
||||||
Y2ZzZXRvc3BlZWQoJmNmZywgc3BlZWQpOwoKCiAgICAgICAgY2ZnLmNfY2ZsYWcgJj0gfkNTSVpF
|
case 460800:
|
||||||
OwogICAgICAgIHN3aXRjaCAoZGF0YUJpdHMpIHsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAg
|
return B460800;
|
||||||
ICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M1OyAgICAvL+S9v+eUqDXkvY3mlbDmja7kvY0KICAg
|
case 500000:
|
||||||
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBj
|
return B500000;
|
||||||
ZmcuY19jZmxhZyB8PSBDUzY7ICAgIC8v5L2/55SoNuS9jeaVsOaNruS9jQogICAgICAgICAgICAg
|
case 576000:
|
||||||
ICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgIGNmZy5jX2NmbGFn
|
return B576000;
|
||||||
IHw9IENTNzsgICAgLy/kvb/nlKg35L2N5pWw5o2u5L2NCiAgICAgICAgICAgICAgICBicmVhazsK
|
case 921600:
|
||||||
ICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M4OyAg
|
return B921600;
|
||||||
ICAvL+S9v+eUqDjkvY3mlbDmja7kvY0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
|
case 1000000:
|
||||||
ICBkZWZhdWx0OgogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgfD0gQ1M4OwogICAgICAgICAg
|
return B1000000;
|
||||||
ICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHBhcml0eSkgewogICAgICAg
|
case 1152000:
|
||||||
ICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjZmcuY19jZmxhZyAmPSB+UEFSRU5COyAgICAv
|
return B1152000;
|
||||||
L+aXoOWlh+WBtuagoemqjAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ug
|
case 1500000:
|
||||||
MToKICAgICAgICAgICAgICAgIGNmZy5jX2NmbGFnIHw9IChQQVJPREQgfCBQQVJFTkIpOyAgIC8v
|
return B1500000;
|
||||||
5aWH5qCh6aqMCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAg
|
case 2000000:
|
||||||
ICAgICAgICAgICAgY2ZnLmNfaWZsYWcgJj0gfihJR05QQVIgfCBQQVJNUkspOyAvLyDlgbbmoKHp
|
return B2000000;
|
||||||
qowKICAgICAgICAgICAgICAgIGNmZy5jX2lmbGFnIHw9IElOUENLOwogICAgICAgICAgICAgICAg
|
case 2500000:
|
||||||
Y2ZnLmNfY2ZsYWcgfD0gUEFSRU5COwogICAgICAgICAgICAgICAgY2ZnLmNfY2ZsYWcgJj0gflBB
|
return B2500000;
|
||||||
Uk9ERDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAg
|
case 3000000:
|
||||||
ICAgICAgY2ZnLmNfY2ZsYWcgJj0gflBBUkVOQjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAg
|
return B3000000;
|
||||||
ICAgIH0KCiAgICAgICAgc3dpdGNoIChzdG9wQml0cykgewogICAgICAgICAgICBjYXNlIDE6CiAg
|
case 3500000:
|
||||||
ICAgICAgICAgICAgICBjZmcuY19jZmxhZyAmPSB+Q1NUT1BCOyAgICAvLzHkvY3lgZzmraLkvY0K
|
return B3500000;
|
||||||
ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAg
|
case 4000000:
|
||||||
ICBjZmcuY19jZmxhZyB8PSBDU1RPUEI7ICAgIC8vMuS9jeWBnOatouS9jQogICAgICAgICAgICAg
|
return B4000000;
|
||||||
ICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjZmcuY19jZmxh
|
default:
|
||||||
ZyAmPSB+Q1NUT1BCOyAgICAvLzHkvY3lgZzmraLkvY0KICAgICAgICAgICAgICAgIGJyZWFrOwog
|
return -1;
|
||||||
ICAgICAgIH0KCiAgICAgICAgaWYgKHRjc2V0YXR0cihmZCwgVENTQU5PVywgJmNmZykpIHsKICAg
|
}
|
||||||
ICAgICAgICAgTE9HRSgidGNzZXRhdHRyKCkgZmFpbGVkIik7CiAgICAgICAgICAgIGNsb3NlKGZk
|
}
|
||||||
KTsKICAgICAgICAgICAgLyogVE9ETzogdGhyb3cgYW4gZXhjZXB0aW9uICovCiAgICAgICAgICAg
|
|
||||||
IHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDcmVhdGUgYSBjb3JyZXNwb25k
|
/*
|
||||||
aW5nIGZpbGUgZGVzY3JpcHRvciAqLwogICAgewogICAgICAgIGpjbGFzcyBjRmlsZURlc2NyaXB0
|
* Class: android_serialport_SerialPort
|
||||||
b3IgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CiAg
|
* Method: open
|
||||||
ICAgICAgam1ldGhvZElEIGlGaWxlRGVzY3JpcHRvciA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52
|
* Signature: (Ljava/lang/String;IIIII)Ljava/io/FileDescriptor;
|
||||||
LCBjRmlsZURlc2NyaXB0b3IsICI8aW5pdD4iLCAiKClWIik7CiAgICAgICAgamZpZWxkSUQgZGVz
|
*/
|
||||||
Y3JpcHRvcklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY0ZpbGVEZXNjcmlwdG9yLCAiZGVz
|
JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open
|
||||||
Y3JpcHRvciIsICJJIik7CiAgICAgICAgbUZpbGVEZXNjcmlwdG9yID0gKCplbnYpLT5OZXdPYmpl
|
(JNIEnv *env, jobject thiz, jstring path, jint baudrate, jint dataBits, jint parity,
|
||||||
Y3QoZW52LCBjRmlsZURlc2NyaXB0b3IsIGlGaWxlRGVzY3JpcHRvcik7CiAgICAgICAgKCplbnYp
|
jint stopBits,
|
||||||
LT5TZXRJbnRGaWVsZChlbnYsIG1GaWxlRGVzY3JpcHRvciwgZGVzY3JpcHRvcklELCAoamludCkg
|
jint flags) {
|
||||||
ZmQpOwogICAgfQoKICAgIHJldHVybiBtRmlsZURlc2NyaXB0b3I7Cn0KCi8qCiAqIENsYXNzOiAg
|
|
||||||
ICAgY2VkcmljX3NlcmlhbF9TZXJpYWxQb3J0CiAqIE1ldGhvZDogICAgY2xvc2UKICogU2lnbmF0
|
int fd;
|
||||||
dXJlOiAoKVYKICovCkpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9hbmRyb2lkX3NlcmlhbHBv
|
speed_t speed;
|
||||||
cnRfU2VyaWFsUG9ydF9jbG9zZQogICAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KSB7
|
jobject mFileDescriptor;
|
||||||
CiAgICBqY2xhc3MgU2VyaWFsUG9ydENsYXNzID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYs
|
|
||||||
IHRoaXopOwogICAgamNsYXNzIEZpbGVEZXNjcmlwdG9yQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFz
|
/* Check arguments */
|
||||||
cyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CgogICAgamZpZWxkSUQgbUZkSUQgPSAo
|
{
|
||||||
KmVudiktPkdldEZpZWxkSUQoZW52LCBTZXJpYWxQb3J0Q2xhc3MsICJtRmQiLCAiTGphdmEvaW8v
|
speed = getBaudrate(baudrate);
|
||||||
RmlsZURlc2NyaXB0b3I7Iik7CiAgICBqZmllbGRJRCBkZXNjcmlwdG9ySUQgPSAoKmVudiktPkdl
|
if (speed == -1) {
|
||||||
dEZpZWxkSUQoZW52LCBGaWxlRGVzY3JpcHRvckNsYXNzLCAiZGVzY3JpcHRvciIsICJJIik7Cgog
|
/* TODO: throw an exception */
|
||||||
ICAgam9iamVjdCBtRmQgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgdGhpeiwgbUZkSUQp
|
LOGE("Invalid baudrate");
|
||||||
OwogICAgamludCBkZXNjcmlwdG9yID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIG1GZCwgZGVz
|
return NULL;
|
||||||
Y3JpcHRvcklEKTsKCiAgICBMT0dEKCJjbG9zZShmZCA9ICVkKSIsIGRlc2NyaXB0b3IpOwogICAg
|
}
|
||||||
Y2xvc2UoZGVzY3JpcHRvcik7Cn0KCg==
|
}
|
||||||
|
|
||||||
|
/* 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