diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index e3d8e0fa..bae4d66c 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1439,14 +1439,14 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< bool res = false; - if (photoInfo.usbCamera) + if (mPhotoInfo.cameraType == IDevice::CAM_TYPE_USB) { TurnOnOtg(NULL); } TurnOnCameraPower(NULL); res = true; - if (mPhotoInfo.mediaType == 0 && mPhotoInfo.usingSysCamera == 0) + if (mPhotoInfo.mediaType == 0 && (mPhotoInfo.cameraType == IDevice::CAM_TYPE_MIPI || mPhotoInfo.cameraType == IDevice::CAM_TYPE_USB)) { mCamera = new CPhoneCamera(this, photoInfo.width, photoInfo.height, params); // mCamera = new CJpegCamera(this, photoInfo.width, photoInfo.height, mPath, params); @@ -1475,7 +1475,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } } } - else if (mPhotoInfo.usingSysCamera == 1) + else if (mPhotoInfo.cameraType == IDevice::CAM_TYPE_SYSTEM) { JNIEnv* env = NULL; bool didAttachThread = false; @@ -1496,6 +1496,14 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< { m_vm->DetachCurrentThread(); } + } + if (mPhotoInfo.mediaType == 0 && mPhotoInfo.cameraType == IDevice::CAM_TYPE_NET) + { + + } + if (mPhotoInfo.mediaType == 0 && mPhotoInfo.cameraType == IDevice::CAM_TYPE_SERIAL) + { + } else { diff --git a/app/src/main/cpp/SensorPort.cpp b/app/src/main/cpp/SensorPort.cpp new file mode 100644 index 00000000..5e66654c --- /dev/null +++ b/app/src/main/cpp/SensorPort.cpp @@ -0,0 +1,52 @@ + +#include +#include +#include +#include +#include +#include + +#include "SerialPort.h" + +#include "android/log.h" + +#ifdef DEPENDING_GPIO +#include "GPIOControl.h" +#endif + +namespace ns_sp +{ + + + SensorPort::SensorPort(const SERIAL_PARAM& serialParam) : m_devparam(serialParam) + { + memset(&serialport, 0, sizeof(SIO_PARAM_SERIAL_DEF)); + } + + bool SensorPort::Startup() + { + bool res = Open(m_devparam.pathname, m_devparam.baudrate, m_devparam.stopbit, m_devparam.databit, m_devparam.parity, 0, 0); + + if (!res) + { + return res; + } + + std::vector cmd; + + res = MakeCmdData(cmd); + + if (!res) + { + Close(); + return res; + } + + + recv (); + + OnRecvData(data, dataLength); + + return res; + } +} diff --git a/app/src/main/cpp/SensorPort.h b/app/src/main/cpp/SensorPort.h new file mode 100644 index 00000000..7fae897f --- /dev/null +++ b/app/src/main/cpp/SensorPort.h @@ -0,0 +1,332 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class android_serialport_SerialPort */ + +#ifndef __SENSOR_PORT_H__ +#define __SENSOR_PORT_H__ + +#include +#include + +namespace ns_sp +{ + +#ifndef LOBYTE +#define LOBYTE(w) ((unsigned char)(w)) +#endif + +#ifndef HIBYTE +#define HIBYTE(w) ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF)) +#endif + +#ifndef LOWORD +#define LOWORD(l) ((uint16_t)(l)) +#endif + +#ifndef HIWORD +#define HIWORD(l) ((uint16_t)((uint32_t)(l) >> 16)) +#endif + +#define MAX_STRING_LEN 32 +#define IOT_PARAM_WRITE 0xAE +#define IOT_PARAM_READ 0xAF + +#define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ +#define MAX_SERIAL_PORT_NUM 5 +#define MAX_DEV_VALUE_NUM 12 /* 一台装置最大的采样值数量*/ + +#define WEATHER_PROTOCOL 1 /* 温湿度协议序号*/ +#define WIND_PROTOCOL 2 /* 风速风向协议序号*/ +#define SLANT_PROTOCOL 3 /* 倾斜角协议序号*/ +#define RALLY_PROTOCOL 4 /* 拉力协议序号*/ +#define PELCO_P_PROTOCOL 5 /* 摄像机Pelco_P协议序号*/ +#define PELCO_D_PROTOCOL 6 /* 摄像机Pelco_D协议序号*/ +#define SERIALCAMERA_PROTOCOL 8 /* 串口摄像机协议序号*/ +#define RESERVE2_PROTOCOL 17 /* 备用2协议序号*/ +#define RESERVE4_PROTOCOL 19 /* 备用4协议序号*/ +#define RESERVE5_PROTOCOL 20 /* 备用5协议序号*/ +#define INVALID_PROTOCOL 21 /* 无效协议序号*/ + +#define AirTempNo 0 /* 空气温度数据存储序号*/ +#define HumidityNo 1 /* 相对湿度数据存储序号*/ +#define WindSpeedNo 2 /* 风速数据存储序号*/ +#define WindDirectionNo 3 /* 风向数据存储序号*/ +#define RainfallNo 4 /* 雨量数据存储序号*/ +#define AtmosNo 5 /* 大气压数据存储序号*/ +#define OpticalRadiationNo 6 /* 日照(光辐射)数据存储序号*/ + +#define SER_IDLE 0 /* 传感器处于空闲状态,未启动采样*/ +#define SER_SAMPLE 1 /* 正在采样过程中*/ +#define SAMPLINGSUCCESS 2 /* 采样结束,正常读取到数据*/ +#define SER_STARTSAMPLE 3 /* 启动采样*/ +#define SER_SAMPLEFAIL -1 /* 采样失败,未采集到数据,传感器故障或未接*/ +#define PHOTO_SAVE_SUCC 5 /* 图片保存成功*/ + +#define WEATHER_DATA_NUM 8 /* 气象数据最大数量(一般最多是6要素)*/ +#define RALLY_DATA_NUM 2 /* 拉力数据最大数量(一般是1个)*/ +#define SLANTANGLE_DATA_NUM 3 /* 倾角数据最大数量(一般只有X轴和Y轴值)*/ + +#define PTZ_MOVETIME 1 // 云台移动等待时间为1秒 +#define MAX_CHANNEL_NUM 2 /* 视频通道最大通道*/ +#define MAX_PHOTO_FRAME_LEN 1024 /* 图片数据一包最大长度*/ +#define MAX_PHOTO_PACKET_NUM 1024 /* 图片最大包数(图片最大定为1MB)*/ + +#define RECVDATA_MAXLENTH 2048 /* 接收数据缓冲区最大值*/ +#define TIMER_CNT 50 // Poll命令定时器时间 5 ms +#define SENDDATA_MAXLENTH RECVDATA_MAXLENTH /* 正常发送数据缓冲区最大值*/ + +// 摄像机控制命令宏定义 +#define Cmd_Cancel 0x00000000 // 关闭功能 +#define SET_PRESETNO 0x00030000 // 设置预置点 +#define MOVE_TO_PRESETNO 0x00070000 // 调用预置点 + +/* 摄像机PELCO-P控制命令宏定义*/ +#define P_Auto_Scan 0x20000000 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define P_IRIS_CLOSE 0x08000000 /* 光圈缩小(1 有效)*/ +#define P_IRIS_OPEN 0x04000000 /* 光圈放大(1 有效)*/ +#define P_FOCUS_NEAR 0x02000000 /* 近距离聚焦(1 有效)*/ +#define P_FOCUS_FAR 0x01000000 /* 远距离聚焦(1 有效)*/ +#define P_ZOOM_WIDE 0x00400000 /* 远离物体(1 有效)*/ +#define P_ZOOM_TELE 0x00200000 /* 接近物体(1 有效)*/ +#define P_MOVE_DOWN 0x0010001f /* 向下移动镜头(1 有效)*/ +#define P_MOVE_UP 0x0008001f /* 向上移动镜头(1 有效)*/ +#define P_MOVE_LEFT 0x00041f00 /* 向左移动镜头(1 有效)*/ +#define P_MOVE_RIGHT 0x00021f00 /* 向右移动镜头(1 有效)*/ + +// 摄像机PELCO-D控制命令宏定义 +#define D_Auto_Scan 0x10000000 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define D_IRIS_CLOSE 0x04000000 /* 光圈缩小(1 有效)*/ +#define D_IRIS_OPEN 0x02000000 /* 光圈放大(1 有效)*/ +#define D_FOCUS_NEAR 0x01000000 /* 近距离聚焦(1 有效)*/ +#define D_FOCUS_FAR 0x00800000 /* 远距离聚焦(1 有效)*/ +#define D_ZOOM_WIDE 0x00400000 /* 远离物体(1 有效)*/ +#define D_ZOOM_TELE 0x00200000 /* 接近物体(1 有效)*/ +#define D_MOVE_DOWN 0x0010002d /* 向下移动镜头(1 有效)*/ +#define D_MOVE_UP 0x0008002d /* 向上移动镜头(1 有效)*/ +#define D_MOVE_LEFT 0x00042d00 /* 向左移动镜头(1 有效)*/ +#define D_MOVE_RIGHT 0x00022d00 /* 向右移动镜头(1 有效)*/ + +/* 摄像机下发命令宏定义*/ +#define Take_Photo 0 /* 拍照*/ +#define Stop_Baud 10000 /* 设置球机波特率*/ +#define Stop_Cmd 10005 /* 取消或停止指令*/ +#define Auto_Scan 10006 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ +#define IRIS_CLOSE 10007 /* 光圈缩小(1 有效)*/ +#define IRIS_OPEN 10008 /* 光圈放大(1 有效)*/ +#define FOCUS_NEAR 10009 /* 近距离聚焦(1 有效)*/ +#define FOCUS_FAR 10010 /* 远距离聚焦(1 有效)*/ +#define ZOOM_WIDE 10011 /* 远离物体(1 有效)*/ +#define ZOOM_TELE 10012 /* 接近物体(1 有效)*/ +#define MOVE_DOWN 10013 /* 向下移动镜头(1 有效)*/ +#define MOVE_UP 10014 /* 向上移动镜头(1 有效)*/ +#define MOVE_LEFT 10015 /* 向左移动镜头(1 有效)*/ +#define MOVE_RIGHT 10016 /* 向右移动镜头(1 有效)*/ +#define MOVE_PRESETNO 10017 // 调用预置点 +#define SAVE_PRESETNO 10018 // 设置预置点 +#define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ +#define SERIAL_CAMERA 2 /* 串口摄像机a*/ + +#define COLLECT_DATA 0 /* 调试使用*/ + +#define HexCharToInt( c ) (((c) >= '0') && ((c) <= '9') ? (c) - '0' : ((c) >= 'a') && ((c) <= 'f') ? (c) - 'a' + 10 :((c) >= 'A') && ((c) <= 'F') ? (c) - 'A' + 10 : 0 ) + + typedef struct + { + int cmd; + int value; + int result; + int64_t value2; + char str[MAX_STRING_LEN]; + }IOT_PARAM; + +//SDS包类型结构 + typedef struct + { + uint8_t PortIdx; // 信息类型 + uint16_t MsgType; // 信息类型 + int MsgLen; // 信息长度 + uint8_t MsgData[RECVDATA_MAXLENTH]; + } RTUMSG; + + typedef struct + { + float fFactor; // 数据系数 + float EuValueDelta; // 数据工程值偏移 + } AI_PARAM; + + typedef struct + { + AI_PARAM AiParam; // 数据点配置参数 + int AiState; // 数据标识(-1:采样失败;0:没有采样;1:正在采样;2:采样结束;3:启动采样;) + float EuValue; // 数据工程值 + } AI_DEF; + + typedef struct + { + uint8_t AiState; // 数据标识(-1:采样失败;0:没有采样;1:正在采样;2:采样结束;3:启动采样;) + float EuValue; // 数据工程值 + } Data_DEF; + + typedef struct + { + int imagelen; // 整个图片大小 + int phototime; // 拍照时间 + uint8_t presetno; // 拍照预置点 + char photoname[512]; // 图片存储名称和路径 + int state;// 标识(-1:拍照失败;0:没有拍照;1:正在取图;2:拍照成功;3:启动拍照;) + } IMAGE_DEF; + + typedef struct + { + int imagelen; // 整个图片大小 + int imagenum; // 整个图片的总包数 + int phototime; // 拍照时间 + uint8_t presetno; // 拍照预置点 + char photoname[512]; // 图片存储名称和路径 + uint8_t buf[MAX_PHOTO_PACKET_NUM][MAX_PHOTO_FRAME_LEN]; // 图片数据缓存 + int ilen[MAX_PHOTO_PACKET_NUM]; // 相对应的每包图片数据的长度 + int state;// 标识(-1:拍照失败;0:没有拍照;1:正在取图;2:拍照成功;3:启动拍照;) + } PHOTO_DEF; + +// 上层调用采集传感器参数 + typedef struct SENSOR_PARAM + { + unsigned int baudrate; /* 波特率*/ + int databit; /* 数据位*/ + float stopbit; /* 停止位*/ + char parity; /* 校验位*/ + char pathname[64]; /* 串口文件名及路径*/ + //int commNo; /* 约定的串口序号,例如我们PC机上显示的COM1。。。*/ + uint8_t SensorsType; /* 传感器类型索引,大于 0*/ + int devaddr; /* 装置(传感器)使用的地址*/ + uint8_t IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ + uint8_t CameraChannel; /* 像机的通道号*/ + uint8_t Phase; /* 传感器所安装相别,指拉力和倾角11表示A1....*/ + } SENSOR_PARAM; + +// 需要配置的串口装置参数 + typedef struct SERIAL_PARAM + { + unsigned int baudrate; /* 波特率*/ + int databit; /* 数据位*/ + int stopbit; /* 停止位*/ + char parity; /* 校验位*/ + char pathname[64]; /* 串口文件名及路径*/ + int commid; /* 串口序号 注意:从0开始*/ + uint8_t ProtocolIdx; /* 规约索引,大于 0*/ + int devaddr; /* 装置使用的地址*/ + uint8_t IsNoInsta; /* 装置没有安装或者已经坏了(1:正常, 0:无效,坏了或没有安装)*/ + uint8_t CameraChannel; /* 像机的通道号*/ + uint8_t Phase; /* 传感器所安装相别,指拉力和倾角11表示A1....*/ + } SERIAL_PARAM; + + typedef struct + { + int m_iRevStatus; /* */ + int m_iRecvLen; /* */ + int m_iNeedRevLength; /* */ + int iRecvTime; /* */ + uint8_t m_au8RecvBuf[RECVDATA_MAXLENTH];/* */ + uint8_t PollCmd[SENDDATA_MAXLENTH]; + int cmdlen; // 发送缓冲区命令长度 + //******************** Poll Cmd **************************** + uint8_t Retry; /* 重试命令次数 */ + uint8_t RetryCnt; /* 重试命令计数*/ + int64_t RetryTime; /* 重试命令时间 */ + int64_t RetryTimeCnt; /* 重试命令时间计数*/ + int64_t WaitTime; /* 命令间隔时间 */ + int64_t WaitTimeCnt; /* 命令间隔时间计数*/ + uint8_t ForceWaitFlag; /* 强制等待标志*/ + uint16_t ForceWaitCnt; /* 强制等待计数*/ + uint8_t ReSendCmdFlag; /* 重发命令标志 */ + uint8_t SendCmdFlag; /* 命令发送标志 */ + uint8_t RevCmdFlag; /* 命令正常接收标志*/ + //********************************************************** + int64_t lsendtime; /* 命令发送绝对时间计时(毫秒)*/ + } SIO_PARAM_SERIAL_DEF; + +//串口相关装置所有参数集中定义 + typedef struct + { + //******************** 端口基本信息 ************************ + uint8_t IsNeedSerial; /* 是否需要使用串口通讯*/ + int CmdWaitTime; /* 没有使用*/ + uint8_t UseSerialidx; /* 使用的串口序号*/ + int SerialCmdidx; /* 正在使用的串口发送命令的命令序号(-1:表示没有命令发送) + 摄像机使用命令序号存储*/ + int enrecvtime; /* 发送加密命令后接收到应答计时*/ + int64_t FirstCmdTimeCnt; /* 串口读取数据起始时间*/ + uint8_t nextcmd; /* 第二次发送读取气象雨量命令 */ + uint8_t SameTypeDevIdx; /* 相同类型装置顺序排列序号(从0开始)*/ + uint8_t uOpenPowerFlag; /* 传感器上电标志(0:不需要打开; 1:需要打开)*/ + int recvdatacnt; /* 接收到有效数据*/ + PHOTO_DEF image; /* 临时存储图片数据*/ + AI_DEF aiValue[MAX_DEV_VALUE_NUM]; /* 传感器采样值*/ + } SERIAL_DEV_DEF; + + //串口相关装置所有参数集中定义 + typedef struct + { + uint8_t clcyesampling; /* 正在进行采样(0:没有进行采样;1:正在进行采样;)*/ + uint8_t camerauseserial; /* 摄像机使用那个串口*/ + uint32_t PtzCmdType; /* 云台指令类型*/ + int usecameradevidx; /* 有像机指令需要执行*/ + /* 执行指令的装置序号(-1:表示没有需要执行的指令;)*/ + int SendStopPtzCmdTimeCnt; /* 发送云台停止指令*/ + uint8_t serialstatus[MAX_SERIAL_PORT_NUM]; /* 串口是否可以使用状态分别对应串口1、2、3*/ + SERIAL_DEV_DEF ms_dev[MAX_SERIAL_DEV_NUM]; /* 装置所接传感器数量*/ + int UseingSerialdev[MAX_SERIAL_PORT_NUM]; /* 正在使用串口通讯的装置序号(-1,表示串口空闲)*/ + int curdevidx[MAX_SERIAL_PORT_NUM]; /* 当前正在通讯的装置序号(-1表示没有装置需要通讯)*/ + uint8_t IsReadWireTem; /* 是否在开始读取测温数据(0:表示没有;1:是)*/ + //int proruntime; /* 程序运行时间*/ + int IsSleep; /* 是否使程序休眠(1:不休眠;2:休眠)*/ + int tempsamplingstartime; /* 测温启动距离采样启动时间间隔*/ + int tempsamplingsucctime; /* 测温启动距离采样成功时间间隔*/ + int samplingtimeSec; /* 高速采样数据秒级时间控制*/ + int SectimesamplingCnt[3]; /* 高速采样数据秒级采样数*/ + int SunshineSensorsFault; /* 控制日照传感器故障发送*/ + int TempSensorsFault; /* 控制测温传感器故障发送*/ + int FirstSensorsFault; /* 第一次检测传感器故障发送*/ + int SensorsIsUse; /* 传感器是否启用与自检位置匹配*/ + int sequsampling; /* 顺序采样控制序号-1:无采样;其他对应相应装置序号*/ + + int imagepacketnum; /* 串口摄像机拍照图片总包数*/ + int historyimagenum[MAX_CHANNEL_NUM]; /* 球机保存的历史图片数量*/ +#if 1 + //int sendflag; /* 临时上送泄露电流值标志*/ + int sendphototime; /* 临时上送图片数据统计*/ + int sendphotocmdcnt; /* 一次拍照过程中发送拍照指令计数*/ + int photographtime; /* 图片拍摄的时间*/ + int iLastGetPhotoNo; /* 设置串口摄像机参数时暂存拍照命令序号*/ + uint8_t bImageSize; /* 用于临时存储接收上层命令的图片大小*/ + uint8_t presetno; /* 用于临时存储接收上层命令的预置点*/ + char filedir[512]; /* 用于摄像机拍照之后暂时存放的路径*/ +#endif + uint8_t errorPhotoNoCnt; /* 串口摄像机拍照时回应错误包号计数(如:召第6包回应第3包)*/ + uint8_t RephotographCnt; /* 串口摄像机重拍计数(只在读照片数据应答出错时才重拍)*/ + } SRDT_DEF; + + + + class SensorPort : public CSerialPort + { + public: + SensorPort(const SERIAL_PARAM& serialParam, ); + + bool Startup(); + + virtual bool MakeCmdData(std::vector& cmd); + + virtual size_t OnRecvData(const uint8_t* data, size_t dataLength); + + protected: + + SIO_PARAM_SERIAL_DEF serialport; + SERIAL_PARAM m_devparam; + + }; + +} + + +#endif // __SENSOR_PORT_H__ diff --git a/app/src/main/cpp/SensorPortImpl.h b/app/src/main/cpp/SensorPortImpl.h new file mode 100644 index 00000000..197f0e8d --- /dev/null +++ b/app/src/main/cpp/SensorPortImpl.h @@ -0,0 +1,29 @@ +#ifndef __SENSOR_PORT_IMPL_H__ +#define __SENSOR_PORT_IMPL_H__ + +#include "SensorPort.h" + +namespace ns_sp +{ + class ShxyBaseSensorPort : public SensorPort + { + public: + virtual bool MakeCmdData(std::vector& cmd); + virtual size_t OnRecvData(const uint8_t* data, size_t dataLength); + + }; + + class WeatherSensorPort : public ShxyBaseSensorPort + { + public: + virtual bool MakeCmdData(std::vector& cmd); + virtual size_t OnRecvData(const uint8_t* data, size_t dataLength); + + }; + + + + +} + +#endif // __SENSOR_PORT_IMPL_H__ diff --git a/app/src/main/cpp/SerialPort.cpp b/app/src/main/cpp/SerialPort.cpp index 1fc29e11..95b6a04c 100644 --- a/app/src/main/cpp/SerialPort.cpp +++ b/app/src/main/cpp/SerialPort.cpp @@ -59,7 +59,19 @@ static speed_t getBaudrate(int baudrate) } */ -bool CSerialPort::Open(const char* path, speed_t baudrate, int stopBits, int dataBits, int parity, int flowCon, int flags) +CSerialPort::CSerialPort() : fd(-1) +{ +} + +CSerialPort::~CSerialPort() +{ + if (fd != -1) + { + close(fd); + } +} + +bool CSerialPort::Open(const char* path, speed_t baudrate, int dataBits, int stopBits, int parity, int vtime, int vmin) { if (baudrate == -1) { return false; @@ -74,89 +86,70 @@ bool CSerialPort::Open(const char* path, speed_t baudrate, int stopBits, int dat } /* Configure device */ + if (SetAttributes(baudrate, dataBits, stopBits, parity, vtime, vmin)) { - struct termios cfg; - if (tcgetattr(fd, &cfg)) - { - close(fd); - return false; - } - - cfmakeraw(&cfg); - cfsetispeed(&cfg, baudrate); - cfsetospeed(&cfg, baudrate); - - cfg.c_cflag &= ~CSIZE; - switch (dataBits) { - case CS5: - case CS6: - case CS7: - case CS8: - cfg.c_cflag |= dataBits; //使用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; - } + LOGE("tcsetattr() failed"); + close(fd); + /* TODO: throw an exception */ + return false; + } - switch (stopBits) { - case 1: - cfg.c_cflag &= ~CSTOPB; //1位停止位 - break; - case 2: - cfg.c_cflag |= CSTOPB; //2位停止位 - break; - default: - break; - } + return true; +} - // hardware flow control - switch (flowCon) { - case 0: - cfg.c_cflag &= ~CRTSCTS; //不使用流控 - break; - case 1: - cfg.c_cflag |= CRTSCTS; //硬件流控 - break; - case 2: - cfg.c_cflag |= IXON | IXOFF | IXANY; //软件流控 - break; - default: - cfg.c_cflag &= ~CRTSCTS; - break; - } +void CSerialPort::Close() +{ + if (fd > 0) + { + close(fd); + fd = -1; + } +} +int CSerialPort::SetAttributes(unsigned int baudrate, int databit, int stopbit, char parity, int vtime, int vmin) +{ + struct termios opt; + tcgetattr(fd, &opt); + set_baudrate(&opt, baudrate); + //opt.c_cflag |= CLOCAL|CREAD; /*|CRTSCTS */ + opt.c_lflag &= ~(ICANON | ECHO |ECHOE |ISIG); + set_data_bit(&opt, databit); + set_parity(&opt, parity); + set_stopbit(&opt, stopbit); + opt.c_iflag &=~(INLCR|ICRNL); + opt.c_iflag &=~(IXON);/* 流控*/ + opt.c_oflag = 0; + //opt.c_lflag |= 0; + opt.c_oflag &= ~OPOST; + opt.c_cc[VTIME] = vtime; + opt.c_cc[VMIN] = vmin; + tcflush (fd, TCIFLUSH); + return (tcsetattr (fd, TCSANOW, &opt)); +} - if (tcsetattr(fd, TCSANOW, &cfg)) { - LOGE("tcsetattr() failed"); - close(fd); - /* TODO: throw an exception */ - return false; - } +size_t CSerialPort::Send(const uint8_t* data, size_t dataLength) +{ + if (fd < 0) + { + return -1; } - - return true; + size_t bytesWritten = write(fd, data, dataLength); + return bytesWritten; } -void CSerialPort::Close() +size_t CSerialPort::Recv(uint8_t* buffer, size_t bufferLength) { - close(fd); + if (fd < 0) + { + return -1; + } + + size_t bytesRead = read(fd, buffer, bufferLength);/* 在串口读取字符串 */ + + return bytesRead; +#if 0 + // sprintf(buf, "收到串口%d, %d字节数据:", j + 1, recvlen); + // BytestreamLOG(j, buf, recvbuf, recvlen, 'I'); +#endif + // SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); } \ No newline at end of file diff --git a/app/src/main/cpp/SerialPort.h b/app/src/main/cpp/SerialPort.h index 1f194cf1..5c9e48e9 100644 --- a/app/src/main/cpp/SerialPort.h +++ b/app/src/main/cpp/SerialPort.h @@ -6,14 +6,107 @@ #define __SERIALPORT_H__ #include +#include + +inline void set_baudrate (struct termios *opt, unsigned int baudrate) +{ + cfsetispeed(opt, baudrate); + cfsetospeed(opt, baudrate); +} + +inline void set_data_bit (struct termios *opt, unsigned int databit) +{ + opt->c_cflag &= ~CSIZE; + switch (databit) + { + case 8: + opt->c_cflag |= CS8; + break; + case 7: + opt->c_cflag |= CS7; + break; + case 6: + opt->c_cflag |= CS6; + break; + case 5: + opt->c_cflag |= CS5; + break; + default: + opt->c_cflag |= CS8; + break; + } +} + +inline void set_parity (struct termios *opt, char parity) +{ + switch (parity) + { + case 'N':/* 无校验 */ + case 'n': + opt->c_cflag &= ~PARENB; + break; + case 'E':/*偶校验*/ + case 'e': + opt->c_cflag |= PARENB; + opt->c_cflag &= ~PARODD; + break; + case 'O':/* 奇校验 */ + case 'o': + opt->c_cflag |= PARENB; + opt->c_cflag |= ~PARODD; + break; + default: /*其它选择为无校验 */ + opt->c_cflag &= ~PARENB; + break; + } +} + +inline void set_stopbit (struct termios *opt, const int stopbit) +{ + switch (stopbit) + { + case 10: + opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */ + break; + case 15: + opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */ + break; + case 20: + opt->c_cflag |= CSTOPB; /*2 位停止位 */ + break; + default: + opt->c_cflag &= ~CSTOPB; /*1 位停止位 */ + break; + } +} + +inline int64_t get_msec() +{ + struct timeval tv; + int64_t time_in_msec = 0; + + gettimeofday(&tv, NULL); + time_in_msec = tv.tv_sec; + time_in_msec *= 1000; + time_in_msec += tv.tv_usec / 1000; + + return time_in_msec; +} class CSerialPort { public: - bool Open(const char* path, speed_t baudrate, int stopBits, int dataBits, int parity, int flowCon, int flags); + CSerialPort(); + ~CSerialPort(); + bool Open(const char* path, speed_t baudrate, int dataBits, int stopBits, int parity, int vtime, int vmin); void Close(); + int SetAttributes(unsigned int baudrate, int databit, int stopbit, char parity, int vtime, int vmin); + + size_t Send(const uint8_t* data, size_t dataLength); + size_t Recv(uint8_t* data, size_t dataLength); + private: int fd;