You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1080 lines
31 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <jni.h>
#include <string>
#include "SpiPort.h"
#include "SpiLib.h"
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <android/log.h>
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <time.h>
#include "GPIOControl.h"
#include "serialComm.h"
#include "SensorsProtocol.h"
#include "WeatherComm.h"
#if 0
#define BYTE u_char;
// 串口参数
typedef struct
{
int baudrate; /* 波特率*/
int databit; /* 数据位*/
char stopbit[8]; /* 停止位*/
char parity; /* 校验位*/
char pathname[128];/* 串口文件名及路径*/
} SERIAL_PARAM;
typedef struct
{
int m_iRevStatus; /* */
int m_iRecvLen; /* */
int m_iNeedRevLength; /* */
int iRecvTime; /* */
int RevCmdFlag;
unsigned char m_au8RecvBuf[128];/* */
} SIO_PARAM_SERIAL_DEF;
extern SIO_PARAM_SERIAL_DEF serialport;
extern float weatherpntmsg[10];
#endif
int istop=1;
//set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin )
class NrsecSpiPort : public SpiPort {
public:
NrsecSpiPort(const std::string& path) : SpiPort(path) {
}
bool Open()
{
if (!SpiPort::Open())
{
return false;
}
uint8_t mode = SPI_MODE_3;
uint8_t bits = 8;
uint32_t speed = 33000000;
uint8_t lsb = 1;
// const char *device = "/dev/spidev32766.1";
if (ioctl(m_fd, SPI_IOC_WR_MODE, &mode) == -1 ||
ioctl(m_fd, SPI_IOC_WR_BITS_PER_WORD, &bits) == -1 ||
ioctl(m_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1 ||
ioctl(m_fd, SPI_IOC_WR_LSB_FIRST, &lsb) == -1)
{
Close();
return false;
}
return true;
}
bool GenKeyPair(int keyIdx) {
unsigned char header[] = {0x80, 0xb2, 0x00, (unsigned char)keyIdx, 0x00 };
int bytesWriten = Write(header, sizeof(header));
unsigned char buffer[2] = { 0 };
int bytesRead = Read(buffer, sizeof(buffer));
if (bytesRead > 0) {
int aa = 0;
} else {
int bb = 0;
}
return true;
}
};
#if 0
static void set_baudrate (struct termios *opt, unsigned int baudrate)
{
cfsetispeed(opt, baudrate);
cfsetospeed(opt, baudrate);
}
static 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;
}
}
static 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;
}
}
static void set_stopbit (struct termios *opt, const char *stopbit)
{
if (strcmp(stopbit, "1") == 0)
{
opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */
}
else if(0 == strcmp(stopbit, "1.5"))
{
opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */
}
else if(0 == strcmp (stopbit,"2"))
{
opt->c_cflag |= CSTOPB; /*2 位停止位 */
}
else
{
opt->c_cflag &= ~CSTOPB; /*1 位停止位 */
}
}
int set_port_attr (int fd, int baudrate, int databit, const char *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_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));
}
#define MAX_STRING_LEN 32
#define IOT_PARAM_WRITE 0xAE
#define IOT_PARAM_READ 0xAF
typedef struct
{
int cmd;
int value;
int result;
long value2;
char str[MAX_STRING_LEN];
}IOT_PARAM;
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args)
#endif
void setInt(int cmd, int value)
{
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
IOT_PARAM param;
param.cmd = cmd;
param.value = value;
// LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value);
if( fd > 0 )
{
int res = ioctl(fd, IOT_PARAM_WRITE, &param);
// LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
close(fd);
}
return;
}
static void setRS485Enable(bool z) {
setInt(CMD_SET_485_EN_STATE, z ? 1 : 0);
}
static void set485WriteMode() {
setInt(CMD_SET_485_STATE, 1);
}
static void set485ReadMode() {
setInt(CMD_SET_485_STATE, 0);
}
static void set12VEnable(bool z) {
setInt(CMD_SET_12V_EN_STATE, z ? 1 : 0);
}
static void setCam3V3Enable(bool enabled)
{
setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0);
}
static void InitPLZ()
{
SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM];
memset(sensorParam, 0, sizeof(sensorParam));
#if 0 //云台
sensorParam[0].SensorsType = PELCO_D_PROTOCOL;
sensorParam[0].baudrate = 9600;
sensorParam[0].databit = 8;
sensorParam[0].stopbit = 1;
sensorParam[0].parity = 'n';
sensorParam[0].IsNoInsta = 1;
sensorParam[0].devaddr = 1;
memset(sensorParam[0].pathname, 0, sizeof(sensorParam[0].pathname));
sprintf(sensorParam[0].pathname, "/dev/ttyS0");
#else //球基
sensorParam[3].SensorsType = PELCO_D_PROTOCOL;
sensorParam[3].baudrate = 38400;
sensorParam[3].databit = 8;
sensorParam[3].stopbit = 1;
sensorParam[3].parity = 0;
sensorParam[3].IsNoInsta = 1;
//devparam[3].PowerPort = 15;
sensorParam[3].CameraChannel = 1;
sensorParam[3].devaddr = 0;
memset(sensorParam[3].pathname, 0, sizeof(sensorParam[3].pathname));
sprintf(sensorParam[3].pathname, "/dev/ttyS1");
#endif
Gm_InitSerialComm(sensorParam, "/sdcard/photo/");
}
#if 0
static void setCam3V3Enable(bool enabled)
{
setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0);
}
/*********************************************************************************
* 气象数据处理 *
**********************************************************************************/
void PortDataProcess( void )
{
float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/;
//WORD uDevAddr;
unsigned char cmdidx;
int i, j, aipnt, datanum;
SIO_PARAM_SERIAL_DEF *pPortParam;
char szbuf[64];
pPortParam = &serialport;
//取出装置地址,开始处理地址+++
if(0x02 == pPortParam->m_au8RecvBuf[5])
{
//pPortParam->devaddr = pPortParam->m_au8RecvBuf[4];
return;
}
cmdidx = pPortParam->m_au8RecvBuf[5];
#if 0
aipnt = pPortParam->SameTypeDevIdx;
uDevAddr = serialport->m_au8RecvBuf[4];
if(0 == srdt.IsReadWireTem)
{
if(uDevAddr != pPortParam->devaddr)
return;
}
#endif
fvalua = &fvalue;
datanum = pPortParam->m_au8RecvBuf[6];
if((0x08 != cmdidx) && (0x09 != cmdidx))
return;
for(i = 0, j=7; (i<datanum) && (j<6+pPortParam->m_au8RecvBuf[1]); i++, j+=5 )
{
if(0x08 == cmdidx)
fvalue = (pPortParam->m_au8RecvBuf[j+1]<<24)+(pPortParam->m_au8RecvBuf[j+2]<<16)
+(pPortParam->m_au8RecvBuf[j+3]<<8)+pPortParam->m_au8RecvBuf[j+4];
else
{
*(u_char *)fvalua = pPortParam->m_au8RecvBuf[j+4];
*((u_char *)fvalua+1) = pPortParam->m_au8RecvBuf[j+3];
*((u_char *)fvalua+2) = pPortParam->m_au8RecvBuf[j+2];
*((u_char *)fvalua+3) = pPortParam->m_au8RecvBuf[j+1];
}
switch(pPortParam->m_au8RecvBuf[j])
{
case 1: /*温度*/
weatherpntmsg[0] = fvalue;
LOGE("温度:%0.3f ", fvalue);
break;
case 2: /*气压*/
weatherpntmsg[5] = fvalue;
LOGE("气压:%0.3f ", fvalue);
break;
case 3: /*湿度*/
weatherpntmsg[1] = fvalue;
LOGE("湿度:%0.3f ", fvalue);
break;
case 4: /*雨量*/
break;
case 5: /*日照*/
break;
case 6: /*风速*/
weatherpntmsg[2] = fvalue;
LOGE("风速:%0.3f ", fvalue);
break;
case 7: /*风向*/
weatherpntmsg[3] = fvalue;
LOGE("风向:%0.3f ", fvalue);
break;
case 8: /*拉力*/
case 9: /*倾角传感器X轴倾角*/
case 10: /*倾角传感器Y轴倾角*/
case 11: /*测温球导线温度*/
case 12: /*测温球内部温度*/
break;
case 13: /*测温球导线X轴倾角*/
break;
case 14: /*测温球导线Y轴倾角*/
break;
case 15: /*测温球导线电流*/
break;
case 16: /*测温球电池电压*/
break;
case 17: /*A相泄漏电流平均值*/
break;
case 18: /*A相泄漏电流最大值*/
break;
case 19: /*A相超过3mA的脉冲频次*/
break;
case 20: /*A相超过10mA的脉冲频次*/
break;
case 21: /*B相泄漏电流平均值*/
break;
case 22: /*B相泄漏电流最大值*/
break;
case 23: /*B相超过3mA的脉冲频次*/
break;
case 24: /*B相超过10mA的脉冲频次*/
case 25: /*C相泄漏电流平均值*/
case 26: /*C相泄漏电流最大值*/
case 27: /*C相超过3mA的脉冲频次*/
case 28: /*C相超过10mA的脉冲频次*/
break;
}
}
}
//***************************************************************
//* 按照协议格式化接收数据 *
//***************************************************************
void RecvData(u_char *buf, int len)// 规约读数据处理
{
int i, ictime;
//WORD crc, check;
SIO_PARAM_SERIAL_DEF *pPortParam;
pPortParam = &serialport;
ictime = (int)time(NULL);
if(pPortParam->m_iRecvLen == 0)
{
pPortParam->iRecvTime = ictime;
}
else
{
if((ictime-pPortParam->iRecvTime > 6) || (ictime - pPortParam->iRecvTime < 0))
pPortParam->iRecvTime = ictime;
else if(ictime - pPortParam->iRecvTime > 2)
{
pPortParam->m_iRecvLen = 0;
pPortParam->m_iRevStatus = 0;
}
}
for(i=0; i<len; i++)
{
switch(pPortParam->m_iRevStatus)
{
case 0: // 0x68
pPortParam->m_iRecvLen = 0;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(0x68 == buf[i])
pPortParam->m_iRevStatus++;
else
pPortParam->m_iRevStatus = 18;
break;
case 1: // len1
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iRevStatus++;
break;
case 2: // len2
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2])
{
pPortParam->m_iRevStatus++;
pPortParam->m_iNeedRevLength = buf[i]+5;
}
else
pPortParam->m_iRevStatus = 18;
break;
case 3: // 0x68
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iNeedRevLength--;
if(0x68 == buf[i])
pPortParam->m_iRevStatus++;
else
pPortParam->m_iRevStatus = 18;
break;
case 4: // 正确接收数据
pPortParam->m_iNeedRevLength--;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(pPortParam->m_iNeedRevLength > 0)
break;
if(buf[i] != 0x16)
{
pPortParam->m_iRevStatus=18;
break;
}
//if(CheckLpcError(serialport->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE)
{
PortDataProcess();
pPortParam->m_iRevStatus = 0;
pPortParam->RevCmdFlag = 1;
}
pPortParam->m_iRecvLen = 0;
break;
case 255:// 错误接收数据
default:
if(buf[i] == 0x68)
{
pPortParam->m_iRevStatus = 1;
pPortParam->m_iRecvLen = 1;
pPortParam->m_au8RecvBuf[0] = buf[i];
}
else if(buf[i] == 0x16)
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iRevStatus = 0;
pPortParam->m_iRecvLen = 0;
}
else
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(pPortParam->m_iRecvLen > 200)
{
pPortParam->m_iRecvLen = 0;
}
}
break;
}
}
}
//int inum =0;
//int itimecnt=0;
int weather_comm(SERIAL_PARAM weatherport)
{
int fd = -1;
int len, i,ret, ictime, iruntime, isendtime, irecvtime, icnt=0;
unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x01,0x09,0x0a,0x16};
char recvbuf[256], szbuf[512];
//char serial_description[] = "/dev/ttyS0";
#if 0
DIR *dir = opendir("/dev");
if (dir == NULL) {
LOGE("_test_ opendir");
return -1;
}
// 读取目录项
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 过滤出串口设备,通常以"ttyS"或"ttyUSB"开头
if ((strncmp(entry->d_name, "ttyS2", 5) == 0) ||
(strncmp(entry->d_name, "ttyS0", 5) == 0)) {
LOGE("_test_ Found serial port: %s\n", entry->d_name);
}
}
// 关闭目录
closedir(dir);
#endif
serialport.RevCmdFlag = 1;
serialport.m_iRecvLen = 0;
serialport.m_iRevStatus = 0;
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
ictime = (int)time(NULL);
for(;;)
{
if(fd < 0)
{
fd = open(weatherport.pathname, O_RDWR | O_NDELAY);
//fd = open(weatherport.pathname, O_RDWR | O_NOCTTY);
if(fd < 0)
{
LOGE("_test_ open serial error \n");
perror(weatherport.pathname);
return -1;
}
ret= set_port_attr (fd, weatherport.baudrate,weatherport.databit,weatherport.stopbit,weatherport.parity,0,0 );/*9600 8n1 */
if(ret < 0)
{
LOGE("_test_ set uart arrt faile \n");
return -1;
}
}
usleep(10000);
iruntime = (int)time(NULL);
if((iruntime - ictime > 120) || (iruntime - ictime < 0))
ictime = iruntime;
if(iruntime - ictime > 19)
{
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "气象采样时间=%d,停止采样!", iruntime-ictime);
LOGE("%s", szbuf);
break;
}
if(1 == serialport.RevCmdFlag)
{
set485WriteMode();
len = write(fd, sendbuf, sizeof(sendbuf));/* 向串囗发送字符串 */
serialport.RevCmdFlag = 0;
isendtime = time(NULL);
if (len < 0) {
LOGE("write data error \n");
return -1;
} else {
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "Send");
for (i = 0; i < len; i++) {
sprintf(szbuf, "%s %02X", szbuf, sendbuf[i]);
}
LOGE("%s", szbuf);
//icnt = 0;
//inum++;
}
tcdrain(fd);
//usleep(50000);
}
else
{
irecvtime = time(NULL);
if((irecvtime-isendtime > 6) ||(irecvtime - isendtime < 0))
isendtime = irecvtime;
if (irecvtime-isendtime > 1)
{
LOGE("传感器超过%d秒未应答", irecvtime-isendtime);
serialport.RevCmdFlag = 1;
serialport.m_iRecvLen = 0;
serialport.m_iRevStatus = 0;
close(fd);
//set12VEnable(false);
//setCam3V3Enable(false);
//setRS485Enable(false);
fd = -1;
continue;
}
}
set485ReadMode();
memset(recvbuf, 0, sizeof(recvbuf));
len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */
if (len < 0) {
LOGE("serial read error \n");
continue;
}
if(0 == len)
{
//icnt++;
continue;
}
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "Recv");
for (i = 0; i < len; i++) {
sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]);
}
__android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf);
RecvData((u_char*)recvbuf, len);
//LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt);
icnt = 0;
//serialport.RevCmdFlag =1;
}
close(fd);
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
//exit(-1);
return(0);
}
int serial_port_comm()
{
SERIAL_PARAM portparm;
#if 1
memset(portparm.pathname, 0, sizeof(portparm.pathname));
sprintf(portparm.pathname, "/dev/ttyS0");
portparm.parity = 'N';
portparm.databit = 8;
portparm.baudrate = B9600;
memset(portparm.stopbit, 0, sizeof(portparm.stopbit));
sprintf(portparm.stopbit, "1");
#endif
//itimecnt = (int)time(NULL);
for(;;)
weather_comm(portparm);
return 0;
}
#endif
extern "C" JNIEXPORT jstring JNICALL
Java_com_xinyingpower_testcomm_MainActivity_testSpi(
JNIEnv* env,
jobject /*this*/, jint port) {
//testSpi();
SpiLIb a;
unsigned char newkey[32]={0xaf,0x0c,0xa9,0x40,0x1f,0xe6,0xee,0x0f,0x4c,
0xfb,0xf7,0x17,0x71,0xde,0x61,0x59
,0x0a,0x05,0x77,
0xfa,0xe7,0xd1,0x8d,0x10,0x3a,0x79,0x23,0xf2,0xb3,
0x6d,0xea,0x8e
// ,0xe0,0x64,0xe7,0x5d,0x49,0x84,0xe4,
// 0x5f,0xc9,0x07,0x03,0x52,0x33,0x79,0x87,0xd4,0x62,
// 0x62,0xc0,0xcc,0xf0,0xd6,0x85,0x20,0x7f,0x7a,0xe8,
// 0xc8,0xed,0x12,0xdb,0xdc
};
unsigned char outpub[32],outsign[64], *outen = new unsigned char [256];
unsigned char pucid[16]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
string b="C=CN,ST=jiangsu,L=nanjing,O=GDD,OU=nari,CN=test001";
//a.SM2keypair(0x00);
//a.SM3Hash(newkey,16, outpub);
//a.sm3hash_tosm2(newkey,16,outpub,newkey,pucid,16);
//a.SM2Sign(0x00,outpub,outsign);
//a.SM2VerifySign(0x00,outpub,outsign);
//if(i < wen, i++)
//lxy modify modify
//LOGE("_test_ setRS485Enable true");
//setRS485Enable(true);
//set12VEnable(true);
//serial_port_comm();
//GM_StartSerialComm();
testComm();
//GM_StartSerialCameraPhoto(1, 0);
//lxy modify modify
//LOGE("_test_ setRS485Enable false");
//setRS485Enable(false);
return env->NewStringUTF("");
#if 0
DIR *dir = opendir("/dev");
if (dir == NULL) {
perror("opendir");
//return env->NewStringUTF("error");
//return -1;
}
// 读取目录项
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 过滤出串口设备,通常以"ttyS"或"ttyUSB"开头
if ((strncmp(entry->d_name, "ttyS2", 5) == 0) ||
(strncmp(entry->d_name, "ttyS0", 5) == 0)) {
printf("Found serial port: %s\n", entry->d_name);
}
}
// 关闭目录
closedir(dir);
#endif
a.SM2cert(0x00,0x00,b,outen);
for (int i = 0; i < 32; i++) {
//sprintf(output, " %02x ", rxbuf[i]);
__android_log_print(ANDROID_LOG_INFO, "SPi", "%02x", outen[i]);
}
// a.SM2decoder(0x00,outen,outpub);
//
// for (int i = 0; i < 64; i++) {
// //sprintf(output, " %02x ", rxbuf[i]);
// __android_log_print(ANDROID_LOG_INFO, "SPi", "%02x", outpub[i]);
// }
//a.SM3Hash(0x00,0x10,newkey);
//testVersion();
return env->NewStringUTF("End");
// NrsecSpiPort spi("/dev/mtkgpioctrl");
NrsecSpiPort spi("/dev/spidevSE");
// NrsecSpiPort spi("/dev/spidev0.0");
if (!spi.Open()) {
return env->NewStringUTF(spi.GetLog().c_str());
}
spi.GenKeyPair(0);
unsigned char header[] = { 0x00, 0x5b, 0x00, 0x00, 0x40 };
int bytesWriten = spi.Write(header, sizeof(header));
unsigned char buffer[1024] = { 0 };
int bytesRead = spi.Read(buffer, 1);
if (bytesRead > 0) {
int aa = 0;
} else {
int bb = 0;
}
int len = buffer[0];
bytesRead += spi.Read(&buffer[1], len);
spi.Close();
std::string result;
char buf[32] = { 0 };
for (int idx = 0; idx < 32; idx++)
{
sprintf(buf, "%X ", buffer[idx]);
result += buf;
}
return env->NewStringUTF(result.c_str());
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_setInt(
JNIEnv* env,
jobject /*this*/, jint cmd, jint val) {
setInt(cmd, val);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnOn(
JNIEnv* env,
jobject /*this*/) {
setRS485Enable(true);
set12VEnable(true);
setCam3V3Enable(true);
setInt(CMD_SET_485_ENABLE, 1);
setInt(CMD_SET_3V3_PWR_ENABLE, 1);
setInt(CMD_SET_PTZ_PWR_ENABLE, 1);
setInt(CMD_SET_PIC1_POWER, 1);
setInt(CMD_SET_485_en4, 1);
InitPLZ();
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnOff(
JNIEnv* env,
jobject /*this*/) {
setRS485Enable(false);
set12VEnable(false);
setCam3V3Enable(false);
setInt(CMD_SET_485_ENABLE, 0);
setInt(CMD_SET_3V3_PWR_ENABLE, 0);
setInt(CMD_SET_PTZ_PWR_ENABLE, 0);
setInt(CMD_SET_PIC1_POWER, 0);
setInt(CMD_SET_485_en4, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnLeft(
JNIEnv* env,
jobject /*this*/) {
CameraPhotoCmd(0, 1, MOVE_LEFT, 0, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnRight(
JNIEnv* env,
jobject /*this*/) {
CameraPhotoCmd(0, 1, MOVE_RIGHT, 0, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnUp(
JNIEnv* env,
jobject /*this*/) {
CameraPhotoCmd(0, 1, MOVE_UP, 0, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnDown(
JNIEnv* env,
jobject /*this*/) {
CameraPhotoCmd(0, 1, MOVE_DOWN, 0, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_zoomIn(
JNIEnv* env,
jobject /*this*/) {
CameraPhotoCmd(0, 1, ZOOM_TELE, 0, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_zoomOut(
JNIEnv* env,
jobject /*this*/) {
CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_setSpeed(
JNIEnv* env,
jobject /*this*/, jint speed) {
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_setPreset(
JNIEnv* env,
jobject /*this*/, jint preset) {
CameraPhotoCmd(0, 1, SAVE_PRESETNO, 0, preset);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_gotoPreset(
JNIEnv* env,
jobject /*this*/, jint preset) {
CameraPhotoCmd(0, 1, MOVE_PRESETNO, 0, preset);
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnOnWipers(
JNIEnv* env,
jobject /*this*/) {
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnOffWipers(
JNIEnv* env,
jobject /*this*/) {
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnOnLight(
JNIEnv* env,
jobject /*this*/) {
}
extern "C" JNIEXPORT void JNICALL
Java_com_xinyingpower_testcomm_MainActivity_turnOffLight(
JNIEnv* env,
jobject /*this*/) {
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// lxy add
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#if 0
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;
}
}
char* jstring2str(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("UTF-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //new char[alen+1];
memcpy(rtn,ba,alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr,ba,0);
return (char*)rtn;
}
int g_fd = -1;
int serial_open(char *devPath, speed_t baudrate ) {
int ret = 0;
setRS485Enable(true);
int fd = open("/dev/ttyS0", O_RDWR |O_NOCTTY |O_NONBLOCK);
LOGE("_test_ serial_open fd=%d \n",fd);
if(fd < 0)
{
LOGE("_test_ open serial error \n");
return 0;
}
//ret= set_port_attr (fd, baudrate,8,"1",'N',150,0 );/*9600 8n1 */
ret= set_port_attr (fd, baudrate,8,"1",'N',150,0 );/*9600 8n1 */
if(ret < 0)
{
LOGE("_test_ set serial param fail \n");
return 0;
}
g_fd = fd;
return 1;
}
void serial_close()
{
LOGE("_test_ serial_close fd=%d \n",g_fd);
if(g_fd != -1)
{
close(g_fd);
setRS485Enable(false);
}
g_fd = -1;
}
int serial_write(char *sendbuf, int length)
{
int len = 0;
if(g_fd < 0)
return 0;
set485WriteMode();
len = write(g_fd, sendbuf, length);/* 向串囗发送字符串 */
LOGE("_test_ serial_write len=%d \n",len);
if (len < 0)
{
LOGE("_test_ write data error \n");
return 0;
}
return len;
}
int serial_read(char *readbuf,int length)
{
int len = 0;
if(g_fd < 0)
return 0;
set485ReadMode();
memset(readbuf, 0, length);
len = read(g_fd, readbuf, length);/* 在串口读取字符串 */
LOGE("_test_ serial_read len=%d \n",len);
if (len < 0)
{
//LOGE("_test_ read error \n");
return 0;
}
return len;
}
extern "C" JNIEXPORT jboolean JNICALL Java_com_xinyingpower_testcomm_MainActivity_openSerial
(JNIEnv* env, jobject, jstring dev, jint baudrate) {
char *devPath = jstring2str(env, dev);
LOGE("_test open serial path=%s, baudrate=%d\n", devPath, baudrate);
speed_t speed = getBaudrate(baudrate);
int res = serial_open(devPath, speed);
return res == 1 ? JNI_TRUE: JNI_FALSE;
}
extern "C" JNIEXPORT void JNICALL Java_com_xinyingpower_testcomm_MainActivity_closeSerial
(JNIEnv* env, jobject) {
serial_close();
}
extern "C" JNIEXPORT jint JNICALL Java_com_xinyingpower_testcomm_MainActivity_writeSerial
(JNIEnv *env, jobject , jbyteArray jstr) {
jsize len = env->GetArrayLength(jstr);
if (len <= 0)
return 0;
jbyte *jdata = env->GetByteArrayElements(jstr, 0);
int res = serial_write((char*)jdata, len);
env->ReleaseByteArrayElements(jstr, jdata, 0);
return res;
}
extern "C" JNIEXPORT jint JNICALL Java_com_xinyingpower_testcomm_MainActivity_readSerial
(JNIEnv *env, jobject, jbyteArray out)
{
jsize outlen = env->GetArrayLength(out);
//LOGE("_test readSerial outlen=%d\n", outlen);
if(outlen <= 0)
return 0;
jbyte* outData = env->GetByteArrayElements(out, 0);
char* outbuf = (char*)outData;
int res = serial_read(outbuf, outlen);
//LOGE("_test serial_read res=%d\n", res);
env->ReleaseByteArrayElements(out, outData, 0);
return res;
}
#endif