From 4658db7045ab13c15bc2df50522309c9acb212ac Mon Sep 17 00:00:00 2001 From: mpmedia Date: Wed, 27 May 2026 12:20:35 -0500 Subject: [PATCH] fix: decode base64-encoded file content --- serialport/src/main/cpp/SerialPort.c | 372 ++++++++++++++++++--------- 1 file changed, 247 insertions(+), 125 deletions(-) diff --git a/serialport/src/main/cpp/SerialPort.c b/serialport/src/main/cpp/SerialPort.c index 9d8e3a7..2bef180 100644 --- a/serialport/src/main/cpp/SerialPort.c +++ b/serialport/src/main/cpp/SerialPort.c @@ -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== \ No newline at end of file +/* + * 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 +#include +#include +#include +#include +#include +#include + +#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, "", "()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); +} +