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.
TermApp/app/src/main/cpp/SensorsProtocol.cpp

3997 lines
110 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 <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <linux/spi/spidev.h>
#include <android/log.h>
#include <stdio.h>
//#include <io.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>
#include <termios.h>
#include <asm/termbits.h>
#include <time.h>
#include "GPIOControl.h"
#include "SerialComm.h"
#include <sys/time.h>
#include <pthread.h>
#include <AndroidHelper.h>
#include <Client/SensorsProtocol.h>
//#include "Eint.h"
#include <algorithm>
pthread_mutex_t serial_mutex = PTHREAD_MUTEX_INITIALIZER; // 定义一个互斥锁
pthread_mutex_t camera_mutex = PTHREAD_MUTEX_INITIALIZER; // 定义一个互斥锁
SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM];
SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM];
SRDT_DEF srdt;
AI_DEF weatherpntmsg[WEATHER_DATA_NUM];
AI_DEF rallypntmsg[6][RALLY_DATA_NUM];
AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM];
#if 0
/*********************************************************************************
* 气象数据处理 *
**********************************************************************************/
static void PortDataProcess(void)
{
float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/;
//uint16_t 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;
}
}
}
/***************************************************************
* 按照协议格式化接收数据 *
***************************************************************/
static void RecvData(u_char *buf, int len)// 规约读数据处理
{
int i, ictime;
//uint16_t 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;
}
}
}
static int64_t get_msec(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
int64_t time_in_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000;
return time_in_msec;
}
//int inum =0;
//int itimecnt=0;
static int weather_comm(SERIAL_PARAM weatherport)
{
int fd = -1;
int len, i, ret, icnt = 0;
int64_t ictime, iruntime, isendtime, irecvtime;
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);
sleep(2);
//ictime = (int)time(NULL);
ictime = get_msec();
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);
iruntime = get_msec();
if ((iruntime - ictime > 120000) || (iruntime - ictime < 0))
ictime = iruntime;
if (iruntime - ictime > 20000)
{
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "气象采样时间=%0.3f秒,停止采样!", (iruntime - ictime) / 1000.0);
LOGE("%s", szbuf);
break;
}
if (1 == serialport.RevCmdFlag)
{
set485WriteMode();
len = write(fd, sendbuf, sizeof(sendbuf));/* 向串囗发送字符串 */
serialport.RevCmdFlag = 0;
LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime);
//isendtime = time(NULL);
isendtime = get_msec();
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);
irecvtime = get_msec();
if ((irecvtime - isendtime > 6000) || (irecvtime - isendtime < 0))
isendtime = irecvtime;
if (irecvtime - isendtime > 300)
{
LOGE("传感器超过%ld毫秒未应答", irecvtime - isendtime);
serialport.RevCmdFlag = 1;
serialport.m_iRecvLen = 0;
serialport.m_iRevStatus = 0;
close(fd);
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;
//struct timeval tv;
//gettimeofday(&tv, NULL);
//int64_t time_in_microseconds = tv.tv_sec * 1000000 + tv.tv_usec;
//LOGE("Current time in microseconds: %ld\n", time_in_microseconds);
#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 int Gm_SetSerialPortParam(int commid);
static speed_t getBaudrate(unsigned int 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 B9600;
}
}
static 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;
}
/*
打开串口电源
*/
void Gm_OpenSerialPower()
{
/*由传送的主站的地方来控制串口电源,这里不实现*/;
}
// 关闭串口电源
void Gm_CloseSerialPower()
{
}
// 关闭传感器电源
void Gm_CloseSensorsPower()
{
//char iIoNo;
//char szbuf[128];
int igpio;
//sprintf(szbuf, "Close Sensors port %d Power!", port);
/* 关闭电源*/
//switch(port)
/* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/
/* set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
#if 0
setInt(CMD_SET_WTH_POWER, 0);
setInt(CMD_SET_PULL_POWER, 0);
setInt(CMD_SET_ANGLE_POWER, 0);
setInt(CMD_SET_OTHER_POWER, 0);
setInt(CMD_SET_PIC1_POWER, 0);
sleep(3);
igpio = getInt(CMD_SET_WTH_POWER);
igpio = getInt(CMD_SET_PULL_POWER);
igpio = getInt(CMD_SET_ANGLE_POWER);
igpio = getInt(CMD_SET_OTHER_POWER);
igpio = getInt(CMD_SET_PIC1_POWER);
#endif
#if 1
setInt(CMD_SET_SPI_POWER, 1);
setInt(CMD_SET_485_EN0, 1);
setInt(CMD_SET_485_EN1, 1);
setInt(CMD_SET_485_EN2, 1);
setInt(CMD_SET_485_EN3, 1);
setInt(CMD_SET_485_EN4, 1);
#else
setInt(CMD_SET_SPI_POWER, 0);
setInt(CMD_SET_485_EN0, 0);
setInt(CMD_SET_485_EN1, 0);
setInt(CMD_SET_485_EN2, 0);
setInt(CMD_SET_485_EN3, 0);
setInt(CMD_SET_485_EN4, 0);
sleep(3);
igpio = getInt(CMD_SET_SPI_POWER);
igpio = getInt(CMD_SET_485_EN0);
igpio = getInt(CMD_SET_485_EN1);
igpio = getInt(CMD_SET_485_EN2);
igpio = getInt(CMD_SET_485_EN3);
igpio = getInt(CMD_SET_485_EN4);
#endif
*/
}
// 打开传感器电源
void Gm_OpenSensorsPower()
{
//char iIoNo;
/* int igpio;
char szbuf[128];
//if(0 == port)
// return;
//sprintf(szbuf, "Open Sensors port %d Power!", port);
//set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
#if 0
setInt(CMD_SET_WTH_POWER, 0);
setInt(CMD_SET_PULL_POWER, 0);
setInt(CMD_SET_ANGLE_POWER, 0);
setInt(CMD_SET_OTHER_POWER, 0);
setInt(CMD_SET_PIC1_POWER, 0);
#else
setInt(CMD_SET_WTH_POWER, 1);
setInt(CMD_SET_PULL_POWER, 1);
setInt(CMD_SET_ANGLE_POWER, 1);
setInt(CMD_SET_OTHER_POWER, 1);
setInt(CMD_SET_PIC1_POWER, 1);
//sleep(3);
igpio = getInt(CMD_SET_WTH_POWER);
igpio = getInt(CMD_SET_PULL_POWER);
igpio = getInt(CMD_SET_ANGLE_POWER);
igpio = getInt(CMD_SET_OTHER_POWER);
igpio = getInt(CMD_SET_PIC1_POWER);
#endif
#if 1
setInt(CMD_SET_SPI_POWER, 1);
setInt(CMD_SET_485_EN0, 1);
setInt(CMD_SET_485_EN1, 1);
setInt(CMD_SET_485_EN2, 1);
setInt(CMD_SET_485_EN3, 1);
setInt(CMD_SET_485_EN4, 1);
//sleep(3);
igpio = getInt(CMD_SET_SPI_POWER);
igpio = getInt(CMD_SET_485_EN0);
igpio = getInt(CMD_SET_485_EN1);
igpio = getInt(CMD_SET_485_EN2);
igpio = getInt(CMD_SET_485_EN3);
igpio = getInt(CMD_SET_485_EN4);
#else
setInt(CMD_SET_485_EN0, 0);
setInt(CMD_SET_485_EN1, 0);
setInt(CMD_SET_485_EN2, 0);
setInt(CMD_SET_485_EN3, 0);
setInt(CMD_SET_485_EN4, 0);
#endif
// 打开电源
//switch(port)
*/
}
// 查询传感器电源状态
char Gm_GetSensorsPowerState(int port)
{
char iIoNo, cstate = 0;
//char szbuf[128];
/* 查询电源状态*/
//switch(port)
return cstate;
}
void BytestreamLOG(int commid, char* describe, u_char* buf, int len, char flag)
{
int i;
char szbuf[8192];
memset(szbuf, 0, sizeof(szbuf));
if (NULL != describe)
strncpy(szbuf, describe, strlen(describe));
for (i = 0; i < len; i++)
{
::sprintf(szbuf, "%s %02X", szbuf, buf[i]);
}
SaveLogTofile(commid, szbuf);
switch (flag)
{
case 'E':
ALOGE("%s", szbuf);
break;
case 'I':
ALOGI("%s", szbuf);
break;
case 'D':
ALOGD("%s", szbuf);
break;
case 'V':
ALOGI("%s", szbuf);
break;
case 'W':
ALOGW("%s", szbuf);
break;
default:
ALOGI("%s", szbuf);
break;
}
}
// 打开串口通讯
void Gm_OpenSerialPort(int devidx)
{
int fd = -1;
char szbuf[512];
if ((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM))
return;
memset(szbuf, 0, sizeof(szbuf));
if (serialport[devparam[devidx].commid].fd <= 0)
{
fd = ::open(devparam[devidx].pathname, O_RDWR | O_NDELAY);
if (fd < 0)
{
sprintf(szbuf, "装置%d 打开串口%d %s失败fd=%d", devidx+1, devparam[devidx].pathname, devparam[devidx].commid+1, fd);
DebugLog(devparam[devidx].commid, szbuf, 'E');
return;
}
sprintf(szbuf, "装置%d 打开串口%d %s成功fd=%d", devidx + 1, devparam[devidx].commid + 1, devparam[devidx].pathname, fd);
DebugLog(devparam[devidx].commid, szbuf, 'I');
serialport[devparam[devidx].commid].fd = fd;
Gm_SetSerialPortParam(devparam[devidx].commid);
return;
}
sprintf(szbuf, "装置%d 串口%d %s已经打开fd=%d", devidx + 1, devparam[devidx].commid + 1, devparam[devidx].pathname, serialport[devparam[devidx].commid].fd);
DebugLog(devparam[devidx].commid, szbuf, 'I');
}
// 关闭串口通讯
void Gm_CloseSerialPort()
{
int i;
for (i = 1; i < MAX_SERIAL_PORT_NUM; i++)
{
if (serialport[i].fd > 0)
{
close(serialport[i].fd);
serialport[i].fd = -1;
}
}
}
/*******************************************************************************
函数名称: int GM_SerialComSend(const uint8_t * cSendBuf, uint32_t nSendLen, int commid)
功能说明:串口发送数据 返回实际发送的字节数
输入参数:
输出参数:
其它说明:
*********************************************************************************/
int GM_SerialComSend(unsigned char * cSendBuf, size_t nSendLen, int commid)
{
int i, len;
char szbuf[512];
memset(szbuf, 0, sizeof(szbuf));
len = write(serialport[commid].fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */
//serialport[commid].RevCmdFlag = 0;
//LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime);
//isendtime = time(NULL);
//isendtime = get_msec();
if (len < 0)
{
sprintf(szbuf, "write data error ");
DebugLog(commid, szbuf, 'E');
return -1;
}
else if (len > 0)
{
;
}
return len;
}
int Gm_SetSerialPortParam(int commid)
{
int ret;
char szbuf[128];
SERIAL_PARAM *pPortParam = NULL;
pPortParam = &devparam[srdt.curdevidx[commid]];
ret = set_port_attr(serialport[commid].fd, pPortParam->baudrate, pPortParam->databit, pPortParam->stopbit, pPortParam->parity, 0, 0);/*9600 8n1 */
if (ret < 0)
{
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "串口%d 波特率等参数设置错误!", commid + 1);
DebugLog(commid, szbuf, 'E');
return -1;
}
return ret;
}
void Gm_InitSerialComm_Test()
{
int i, j;
SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM];
#if 0
srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
for (i = 0; i < MAX_SERIAL_PORT_NUM; i++)
{
//***************** 串行端口信息 ************************
//g_serialparam[i].Baud = 1200;
//g_serialparam[i].dataBits = 8;
//g_serialparam[i].stopBits = 1;
//g_serialparam[i].parity = 0;
//******************** Poll Cmd ****************************
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
j = TIMER_CNT;
serialport[i].RetryTime = 300 / TIMER_CNT;
j = 1500 / TIMER_CNT;
serialport[i].WaitTime = 0;
memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
}
//g_serialparam[1].Baud = 1200;
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
devparam[i].IsNoInsta = 0;
#endif
//if(NULL == sensorParam)
// return;
memset(sensorParam, 0, sizeof(sensorParam));
//#if COLLECT_DATA
sensorParam[0].SensorsType = WEATHER_PROTOCOL;
sensorParam[0].baudrate = 9600;
sensorParam[0].databit = 8;
//memset(devparam[0].stopbit, 0, sizeof(devparam[0].stopbit));
//sprintf(devparam[0].stopbit, "1");
sensorParam[0].stopbit = 1;
sensorParam[0].parity = 'n';
sensorParam[0].IsNoInsta = 1;
sensorParam[0].devaddr = 4;
memset(sensorParam[0].pathname, 0, sizeof(sensorParam[0].pathname));
strcpy(sensorParam[0].pathname, "/dev/ttysWK3");
sensorParam[1].SensorsType = WEATHER_PROTOCOL;
sensorParam[1].baudrate = 9600;
sensorParam[1].databit = 8;
//memset(devparam[1].stopbit, 0, sizeof(devparam[1].stopbit));
//sprintf(devparam[1].stopbit, "1");
sensorParam[1].stopbit = 1;
sensorParam[1].parity = 0;
sensorParam[1].IsNoInsta = 1;
sensorParam[1].devaddr = 1;
memset(sensorParam[1].pathname, 0, sizeof(sensorParam[1].pathname));
strcpy(sensorParam[1].pathname, "/dev/ttysWK3");
sensorParam[2].SensorsType = RALLY_PROTOCOL;
sensorParam[2].baudrate = 9600;
sensorParam[2].databit = 8;
//memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit));
//sprintf(devparam[2].stopbit, "1");
sensorParam[2].stopbit = 1;
sensorParam[2].parity = 0;
sensorParam[2].IsNoInsta = 1;
//sensorParam[2].PowerPort = 3;
//sensorParam[2].devaddr = 13;
sensorParam[2].devaddr = 13;
memset(sensorParam[2].pathname, 0, sizeof(sensorParam[2].pathname));
strcpy(sensorParam[2].pathname, "/dev/ttysWK1");
sensorParam[5].SensorsType = RALLY_PROTOCOL;
sensorParam[5].baudrate = 9600;
sensorParam[5].databit = 8;
//memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit));
//sprintf(devparam[2].stopbit, "1");
sensorParam[5].stopbit = 1;
sensorParam[5].parity = 0;
sensorParam[5].IsNoInsta = 1;
sensorParam[5].devaddr = 10;
memset(sensorParam[5].pathname, 0, sizeof(sensorParam[3].pathname));
strcpy(sensorParam[5].pathname, "/dev/ttysWK1");
sensorParam[4].SensorsType = RALLY_PROTOCOL;
sensorParam[4].baudrate = 9600;
sensorParam[4].databit = 8;
//memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit));
//sprintf(devparam[2].stopbit, "1");
sensorParam[4].stopbit = 1;
sensorParam[4].parity = 0;
sensorParam[4].IsNoInsta = 1;
//sensorParam[2].PowerPort = 3;
//sensorParam[2].devaddr = 13;
sensorParam[4].devaddr = 12;
memset(sensorParam[4].pathname, 0, sizeof(sensorParam[4].pathname));
strcpy(sensorParam[4].pathname, "/dev/ttysWK1");
sensorParam[6].SensorsType = SLANT_PROTOCOL;
sensorParam[6].baudrate = 9600;
sensorParam[6].databit = 8;
//memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
//sprintf(devparam[13].stopbit, "1");
sensorParam[6].stopbit = 1;
sensorParam[6].parity = 0;
//devparam[13].PowerPort = 4;
sensorParam[6].IsNoInsta = 1;
sensorParam[6].devaddr = 2;
memset(sensorParam[6].pathname, 0, sizeof(sensorParam[6].pathname));
strcpy(sensorParam[6].pathname, "/dev/ttysWK0");
sensorParam[7].SensorsType = SLANT_PROTOCOL;
sensorParam[7].baudrate = 9600;
sensorParam[7].databit = 8;
//memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
//sprintf(devparam[13].stopbit, "1");
sensorParam[7].stopbit = 1;
sensorParam[7].parity = 0;
//devparam[13].PowerPort = 4;
sensorParam[7].IsNoInsta = 1;
sensorParam[7].devaddr = 3;
memset(sensorParam[7].pathname, 0, sizeof(sensorParam[7].pathname));
strcpy(sensorParam[7].pathname, "/dev/ttysWK0");
sensorParam[13].SensorsType = SLANT_PROTOCOL;
sensorParam[13].baudrate = 9600;
sensorParam[13].databit = 8;
//memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
//sprintf(devparam[13].stopbit, "1");
sensorParam[13].stopbit = 1;
sensorParam[13].parity = 0;
//devparam[13].PowerPort = 4;
sensorParam[13].IsNoInsta = 1;
sensorParam[13].devaddr = 5;
memset(sensorParam[13].pathname, 0, sizeof(sensorParam[13].pathname));
strcpy(sensorParam[13].pathname, "/dev/ttysWK0");
#if 0
devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200;
devparam[14].databit = 8;
devparam[14].stopbit = 1;
devparam[14].parity = 0;
devparam[14].IsNoInsta = 1;
//devparam[14].PowerPort = 2;
devparam[14].devaddr = 3;
devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL;
//#endif
devparam[15].ProtocolIdx = WIND_PROTOCOL;
devparam[15].baudrate = 9600;
devparam[15].databit = 8;
devparam[15].stopbit = 1;
devparam[15].parity = 0;
devparam[15].IsNoInsta = 1;
devparam[15].PowerPort = 14;
devparam[15].devaddr = 1;
#endif
//#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));
strcpy(sensorParam[3].pathname, "/dev/ttyS1");
//#endif
Gm_InitSerialComm(sensorParam, "/sdcard/photo/");
}
uint8_t getdevtype(int devno)
{
return devparam[devno].ProtocolIdx;
}
// 初始化所有串口及所接传感器的配置
void Gm_InitSerialComm(SENSOR_PARAM *sensorParam, char *filedir)
{
int i;
char szbuf[128];
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
memset(&devparam[i], 0, sizeof(SERIAL_PARAM));
memset(&srdt, 0, sizeof(srdt));
srdt.camerauseserial = -1;
}
for (i = 0; i < MAX_SERIAL_PORT_NUM; i++)
{
memset(&serialport[i], 0, sizeof(SIO_PARAM_SERIAL_DEF));
serialport[i].fd = -1;
serialport[i].lsendtime = get_msec();
}
if (NULL == sensorParam)
return;
//memset(sensorParam, 0, sizeof(sensorParam));
//Gm_InitSerialComm_Test(sensorParam);
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
devparam[i].IsNoInsta = sensorParam[i].IsNoInsta;
if (0 == sensorParam[i].IsNoInsta)
continue;
devparam[i].ProtocolIdx = sensorParam[i].SensorsType;
devparam[i].devaddr = sensorParam[i].devaddr;
devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate);
memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname));
devparam[i].databit = sensorParam[i].databit;
devparam[i].stopbit = (int)(sensorParam[i].stopbit * 10);
devparam[i].CameraChannel = sensorParam[i].CameraChannel;
devparam[i].Phase = sensorParam[i].Phase;
}
#if 1
//******************** 端口基本信息 ************************
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
memset(szbuf, 0, sizeof(szbuf));
switch (sensorParam[i].SensorsType)
{
case 0:
sprintf(szbuf, "传感器%d没有接!", i + 1);
break;
case WEATHER_PROTOCOL:
sprintf(szbuf, "传感器%d接的是气象传感器!", i + 1);
break;
case SERIALCAMERA_PROTOCOL:
sprintf(szbuf, "传感器%d接的是串口摄像机!", i + 1);
break;
case PELCO_P_PROTOCOL:
sprintf(szbuf, "传感器%d接的是PELCO_P摄像机!", i + 1);
break;
case SLANT_PROTOCOL:
sprintf(szbuf, "传感器%d接的是倾角!", i + 1);
break;
case WIND_PROTOCOL:
sprintf(szbuf, "传感器%d接的是风速风向传感器", i + 1);
break;
case RALLY_PROTOCOL:
sprintf(szbuf, "传感器%d接的是拉力!", i + 1);
break;
case PELCO_D_PROTOCOL:
sprintf(szbuf, "传感器%d接的是PELCO_D摄像机!", i + 1);
break;
case RESERVE5_PROTOCOL:
sprintf(szbuf, "传感器%d接的是加密芯片", i + 1);
break;
default:
sprintf(szbuf, "传感器%d没有接!", i + 1);
break;
}
sprintf(szbuf, "%s 地址%d!", szbuf, sensorParam[i].devaddr);
if (0 == sensorParam[i].IsNoInsta)
sprintf(szbuf, "%s", "没有启用!");
else
{
sprintf(szbuf, "%s 已启用!", szbuf);
DebugLog(8, szbuf, 'I');
}
}
if (NULL == filedir)
return;
memset(srdt.filedir, 0, sizeof(srdt.filedir));
memmove(srdt.filedir, filedir, std::min<size_t>(sizeof(srdt.filedir), strlen(filedir)));
FindDevUseSerialCommNo();
#if 0
//Collect_sensor_data();
//#else
for (;;)
{
CameraPhotoCmd(sensorParam, 1, 0, 6, 1);
sleep(5);
//CameraPhotoCmd(sensorParam, 1, 10017, 0, 1);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, MOVE_LEFT, 0, 0);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, MOVE_DOWN, 0, 0);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, MOVE_RIGHT, 0, 0);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, MOVE_UP, 0, 0);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, 10017, 0, 2);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, ZOOM_TELE, 0, 0);
//sleep(5);
//CameraPhotoCmd(sensorParam, 1, ZOOM_WIDE, 0, 0);
//sleep(5);
}
#endif
#endif
}
void testComm()
{
int i;
char szbuf[128];
//SENSOR_PARAM sensorParam[MAX_SERIAL_DEV_NUM];
//memset(sensorParam, 0, sizeof(sensorParam));
Gm_InitSerialComm_Test();
for (;;)
{
#if COLLECT_DATA
Collect_sensor_data();
#else
sleep(15);
CameraPhotoCmd(time(NULL), 1, 0, 6, 1, "/dev/ttyS0",38400, 1);
sleep(5);
CameraPhotoCmd(time(NULL), 1, 10017, 0, 2, "/dev/ttyS1",38400, 1);
sleep(5);
CameraPhotoCmd(0, 1, MOVE_LEFT, 0, 0, "/dev/ttyS1",38400, 1);
sleep(5);
CameraPhotoCmd(0, 1, MOVE_DOWN, 0, 0, "/dev/ttyS1",38400, 1);
sleep(5);
CameraPhotoCmd(0, 1, MOVE_RIGHT, 0, 0, "/dev/ttyS1",38400, 1);
sleep(5);
CameraPhotoCmd(0, 1, MOVE_UP, 0, 0, "/dev/ttyS1",38400, 1);
sleep(5);
CameraPhotoCmd(0, 1, 10017, 0, 1, "/dev/ttyS1",38400, 1);
sleep(5);
sleep(5);
//CameraPhotoCmd(0, 1, ZOOM_WIDE, 0, 0);
//sleep(5);
//CameraPhotoCmd(time(NULL), 1, 0, 6, 2);
//sleep(5);
#endif
}
#if 1
//******************** 端口基本信息 ************************
/*for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
memset(szbuf, 0, sizeof(szbuf));
switch (sensorParam[i].SensorsType)
{
case 0:
sprintf(szbuf, "传感器%d没有接!", i + 1);
break;
case WEATHER_PROTOCOL:
sprintf(szbuf, "传感器%d接的是气象传感器!", i + 1);
break;
case SERIALCAMERA_PROTOCOL:
sprintf(szbuf, "传感器%d接的是串口摄像机!", i + 1);
break;
case PELCO_P_PROTOCOL:
sprintf(szbuf, "传感器%d接的是PELCO_P摄像机!", i + 1);
break;
case SLANT_PROTOCOL:
sprintf(szbuf, "传感器%d接的是倾角!", i + 1);
break;
case WIND_PROTOCOL:
sprintf(szbuf, "传感器%d接的是风速风向传感器", i + 1);
break;
case RALLY_PROTOCOL:
sprintf(szbuf, "传感器%d接的是拉力!", i + 1);
break;
case PELCO_D_PROTOCOL:
sprintf(szbuf, "传感器%d接的是PELCO_D摄像机!", i + 1);
break;
case RESERVE5_PROTOCOL:
sprintf(szbuf, "传感器%d接的是加密芯片", i + 1);
break;
default:
sprintf(szbuf, "传感器%d没有接!", i + 1);
break;
}
//LOGI("%s", szbuf);
sprintf(szbuf, "%s 地址%d!", szbuf, sensorParam[i].devaddr);
//LOGI("%s", szbuf);
if (0 == sensorParam[i].IsNoInsta)
sprintf(szbuf, "没有启用!");
else
{
sprintf(szbuf, "%s 已启用!", szbuf);
LOGI("%s", szbuf);
}
}*/
//for(;;)
{
//CameraPhotoCmd(time(NULL), 1, 0, 6, 1);
//sleep(5);
}
#endif
}
// 通过传感器名称来确定使用的串口号
void FindDevUseSerialCommNo()
{
int i;
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
if (0 == devparam[i].IsNoInsta)
continue;
switch (devparam[i].ProtocolIdx)
{
case WEATHER_PROTOCOL:
case WIND_PROTOCOL:
//memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
//sprintf(devparam[i].pathname, "/dev/swk3");
devparam[i].commid = 3;
break;
case SLANT_PROTOCOL:
//memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
//sprintf(devparam[i].pathname, "/dev/swk2");
devparam[i].commid = 2;
break;
case RALLY_PROTOCOL:
//memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
//sprintf(devparam[i].pathname, "/dev/swk1");
devparam[i].commid = 1;
break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
//memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定//具体串口分配暂时默认使用串口1</dev/ttyS0>*/
//sprintf(devparam[i].pathname, "/dev/ttyS1");
devparam[i].commid = 0;
srdt.camerauseserial = 0;
break;
default:
devparam[i].IsNoInsta = 0;
break;
}
}
}
void GM_StartSerialComm()
{
int i, j, commid;
char szbuf[64], logbuf[128];
//int64_t polltime=0;
// 此处不能对轮询设备标识清零否则如果先起摄像机就会导致poll乱掉
//memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx));
//Gm_OpenSerialPower(); /* 不在这使用*/
//FindDevUseSerialCommNo();
// 初始化串口使用状态(需要考虑不同时间启用了摄像机使用)
for (i = 0; i < MAX_SERIAL_PORT_NUM; i++)
{
if (i == srdt.camerauseserial)
continue;
serialport[i].Retry = 0;
serialport[i].RetryTime = 800;
serialport[i].WaitTime = 20;
serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1;
memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
}
#if 0/* 简化插入使用摄像机过程,摄像机使用单独的串口*/
else
{
for (i = 0; i < MAX_SERIAL_PORT_NUM; i++)
{
for (j = 0; j < MAX_SERIAL_DEV_NUM; j++)
{
if (((PELCO_D_PROTOCOL == devparam[i].ProtocolIdx) || (PELCO_P_PROTOCOL == devparam[i].ProtocolIdx)\
|| (SERIALCAMERA_PROTOCOL == devparam[i].ProtocolIdx)) && (1 == devparam[i].IsNoInsta))
break;
}
if (j < MAX_SERIAL_DEV_NUM)
continue;
serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1;
ClearCmdAllFlag(i);
}
}
#endif
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
memset(srdt.ms_dev[i].aiValue, 0, sizeof(AI_DEF)*MAX_DEV_VALUE_NUM);
memset(weatherpntmsg, 0, sizeof(AI_DEF)*WEATHER_DATA_NUM);
if (0 == devparam[i].IsNoInsta)
{
srdt.ms_dev[i].IsNeedSerial = 0;
continue;
}
memset(szbuf, 0, sizeof(szbuf));
switch (devparam[i].ProtocolIdx)
{
case WEATHER_PROTOCOL: // 气象
sprintf(szbuf, "%s", "气象");
srdt.ms_dev[i].IsNeedSerial = 1;
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
srdt.ms_dev[i].recvdatacnt = 0;
for (j = 0; j < WEATHER_DATA_NUM; j++)
{
srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE;
weatherpntmsg[j].AiState = SER_STARTSAMPLE;
sprintf(szbuf, "init weather_state%d=%d", j, weatherpntmsg[j].AiState);
DebugLog(8, szbuf, 'I');
}
break;
case RALLY_PROTOCOL: /* 拉力*/
sprintf(szbuf, "%s", "拉力");
srdt.ms_dev[i].IsNeedSerial = 1;
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
srdt.ms_dev[i].recvdatacnt = 0;
for (j = 0; j < RALLY_DATA_NUM; j++)
srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE;
break;
case WIND_PROTOCOL: /* 风速风向*/
sprintf(szbuf, "%s", "风速风向");
srdt.ms_dev[i].IsNeedSerial = 1;
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
for (j = 0; j < WEATHER_DATA_NUM; j++)
{
srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE;
weatherpntmsg[j].AiState = SER_STARTSAMPLE;
sprintf(szbuf, "init weather_state%d=%d", j, weatherpntmsg[j].AiState);
DebugLog(8, szbuf, 'I');
}
break;
case SLANT_PROTOCOL: /* 倾角*/
sprintf(szbuf, "%s", "倾角");
srdt.ms_dev[i].IsNeedSerial = 1;
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
srdt.ms_dev[i].recvdatacnt = 0;
for (j = 0; j < SLANTANGLE_DATA_NUM; j++)
srdt.ms_dev[i].aiValue[j].AiState = SER_STARTSAMPLE;
break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
sprintf(szbuf, "%s", "摄像机");
srdt.ms_dev[i].IsNeedSerial = 0;
break;
default:
srdt.ms_dev[i].IsNeedSerial = 0;
sprintf(szbuf, "%s", "无效传感器");
break;
}
// 测试查询传感器电源状态
#if 0
LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
sleep(1);
LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGV("485 state=%d", getInt(CMD_SET_485_EN_STATE));
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
sleep(1);
LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
#endif
// 打开传感器电源
// 打开对应的485电源
// 打开串口通讯
memset(logbuf, 0, sizeof(logbuf));
if (1 == srdt.ms_dev[i].IsNeedSerial)
{
sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i + 1, devparam[i].IsNoInsta, szbuf);
DebugLog(8, logbuf, 'I');
Gm_OpenSensorsPower();
Gm_OpenSerialPort(i);
}
}
DebugLog(8, "启动数据采样!", 'I');
/* 直接使用循环进行采样处理*/
//polltime = get_msec();
for (;;)
{
usleep(10);
//LOGW("polltime=%ldms", get_msec()-polltime);
//polltime = get_msec();
if (GM_SerialTimer() < 0)
{
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
DebugLog(8, "退出采样流程!", 'V');
sleep(5);
//GM_StartSerialComm();
break;
}
}
return;
}
int GM_SerialTimer(void)
{
int flag = -1;
GM_AllSerialComRecv();
GM_IsCloseSensors();
Gm_FindAllSensorsCommand();
GM_AllSerialComRecv();
flag = GM_CloseTimer();
return flag;
}
/********************************************************************************
函数名称: void Gm_FindAllSensorsCommand()
功能说明:轮询所有串口和传感器是否需要生成下发命令
输入参数:
输出参数:
其它说明:
*********************************************************************************/
void Gm_FindAllSensorsCommand()
{
int i, j, curidx, flag;
//Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/
for (j = 1; j < MAX_SERIAL_PORT_NUM; j++)
{
// 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理
SendCmdFormPollCmdBuf(j);
// 串口已经被占用则直接跳过
curidx = srdt.curdevidx[j];
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
curidx = (curidx + 1) % MAX_SERIAL_DEV_NUM;
if (j != devparam[curidx].commid)
continue;
if (srdt.ms_dev[curidx].IsNeedSerial == 0)
continue;
if (serialport[devparam[curidx].commid].fd < 0)
Gm_OpenSerialPort(curidx);
if (serialport[devparam[curidx].commid].cmdlen > 0)
break;
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
//LOGE("3.3V state= %d", getInt(CMD_SET_CAM_3V3_EN_STATE));
//LOGE("485 state=%d", getInt(CMD_SET_485_EN_STATE));
flag = -1;
switch (devparam[curidx].ProtocolIdx)
{
case WEATHER_PROTOCOL: /* 温湿度气压*/
case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/
case SLANT_PROTOCOL: /* 倾角*/
flag = FindNextShxyProtocolCommand(curidx);
break;
case RESERVE2_PROTOCOL:
break;
case RESERVE5_PROTOCOL:
break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
break;
break;
}
if (flag == -1)
continue;
srdt.curdevidx[j] = curidx;
break;
}
// 发送缓冲区中命令 生成了命令之后紧接着进行命令发送
SendCmdFormPollCmdBuf(j);
}
}
/********************************************************************************
函数名称: void GM_IsCloseSensors()
功能说明:检查所有传感器是否采集完毕,采集完毕的关闭传感器电源
输入参数:
输出参数:
其它说明:
*********************************************************************************/
void GM_IsCloseSensors()
{
int i, j;
char buf[256];
int64_t lctime;
lctime = get_msec();
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
if (srdt.ms_dev[i].IsNeedSerial == 0)
continue;
memset(buf, 0, sizeof(buf));
switch (devparam[i].ProtocolIdx)
{
case WEATHER_PROTOCOL: /* 气象*/
case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/
case SLANT_PROTOCOL: /* 倾角*/
if ((lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 50 * 1000) || (lctime - srdt.ms_dev[i].FirstCmdTimeCnt < 0))
{
srdt.ms_dev[i].FirstCmdTimeCnt = lctime;
break;
}
if (lctime - srdt.ms_dev[i].FirstCmdTimeCnt > 15 * 1000)
{
srdt.ms_dev[i].IsNeedSerial = 0;
// 关闭传感器电源
sprintf(buf, "读取装置%d数据%0.3f秒,关闭装置%d电源!", i + 1, (get_msec() - srdt.ms_dev[i].FirstCmdTimeCnt) / 1000.0, i + 1);
DebugLog(devparam[i].commid, buf, 'I');
for (j = 0; j < MAX_DEV_VALUE_NUM; j++)
{
if (SER_STARTSAMPLE == srdt.ms_dev[i].aiValue[j].AiState)
srdt.ms_dev[i].aiValue[j].AiState = SER_SAMPLEFAIL;
else if (SER_SAMPLE == srdt.ms_dev[i].aiValue[j].AiState)
srdt.ms_dev[i].aiValue[j].AiState = SAMPLINGSUCCESS;
}
if((devparam[i].ProtocolIdx == WIND_PROTOCOL) || (WEATHER_PROTOCOL == devparam[i].ProtocolIdx))
{
for (j = 0; j < WEATHER_DATA_NUM; j++)
{
if (SER_STARTSAMPLE == weatherpntmsg[j].AiState)
weatherpntmsg[j].AiState = SER_SAMPLEFAIL;
else if (SER_SAMPLE == weatherpntmsg[j].AiState)
weatherpntmsg[j].AiState = SAMPLINGSUCCESS;
sprintf(buf, "over weather_state%d=%d", j, weatherpntmsg[j].AiState);
DebugLog(8, buf, 'I');
}
}
}
break;
case PELCO_D_PROTOCOL: /* 摄像机类型*/
case PELCO_P_PROTOCOL: /* 摄像机类型*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
if (-1 == srdt.ms_dev[i].SerialCmdidx)
{
if ((SER_STARTSAMPLE == srdt.ms_dev[i].image.state) || (SER_SAMPLE == srdt.ms_dev[i].image.state))
srdt.ms_dev[i].image.state = SER_SAMPLEFAIL;
else if (PHOTO_SAVE_SUCC == srdt.ms_dev[i].image.state)
srdt.ms_dev[i].image.state = SAMPLINGSUCCESS;
srdt.ms_dev[i].IsNeedSerial = 0;
sprintf(buf, "通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel);
DebugLog(devparam[i].commid, buf, 'I');
}
break;
}
}
}
/********************************************************************************
函数名称: void GM_AllSerialComRecv()
功能说明:检查所有串口是否有数据接收,有则启动接收
输入参数:
输出参数:
其它说明:
*********************************************************************************/
void GM_AllSerialComRecv()
{
int i, j, recvlen;
u_char recvbuf[RECVDATA_MAXLENTH];
char buf[256];
for (j = 0; j < MAX_SERIAL_PORT_NUM; j++)
{
memset(recvbuf, 0, sizeof(recvbuf));
if (serialport[j].fd <= 0)
continue;
//for(;;)
recvlen = read(serialport[j].fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */
if (recvlen < 1)
continue;
#if 1
sprintf(buf, "收到串口%d, %d字节数据:", j + 1, recvlen);
BytestreamLOG(j, buf, recvbuf, recvlen, 'I');
#endif
SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen);
}
}
/********************************************************************************
函数名称: int GM_CloseTimer()
功能说明:
输入参数:
输出参数:
其它说明:
*********************************************************************************/
int GM_CloseTimer()
{
int i, j, iretime;
char buf[256];
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
if ((srdt.ms_dev[i].IsNeedSerial == 1)
&& ((0 < devparam[i].ProtocolIdx) && (INVALID_PROTOCOL > devparam[i].ProtocolIdx)))
break;
}
if (i < MAX_SERIAL_DEV_NUM)
{
return 1; // 寻找
}
else // 关闭所有串口及电源
{
Gm_CloseSerialPort();
//for (j = 0; j < MAX_SERIAL_DEV_NUM; j++)
//Gm_CloseSensorsPower();
for (j = 1; j < MAX_SERIAL_PORT_NUM; j++)
ClearCmdFormPollCmdBuf(j);
sprintf(buf, "%s", "关闭串口定时器!");
DebugLog(8, buf, 'I');
return -1;
}
}
void SerialDataProcess(int devidx, u_char *buf, int len)
{
switch (devparam[devidx].ProtocolIdx)
{
case WEATHER_PROTOCOL: /* 气象*/
case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/
case SLANT_PROTOCOL: /* 倾角*/
ShxyProtocolRecvData(devidx, buf, len);
break;
case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/
break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
break;
}
}
void DebugLog(int commid, char *szbuf, char flag)
{
if (NULL == szbuf)
return;
SaveLogTofile(commid, szbuf);
switch (flag)
{
case 'E':
ALOGE("%s", szbuf);
break;
case 'I':
ALOGI("%s", szbuf);
break;
case 'D':
ALOGD("%s", szbuf);
break;
case 'V':
ALOGI("%s", szbuf);
break;
case 'W':
ALOGW("%s", szbuf);
break;
default:
ALOGI("%s", szbuf);
break;
}
}
int SaveLogTofile(int commid, char *szbuf)
{
int status;
time_t now;
char filename[512], filedir[512], buf[128];
FILE *fp = NULL;
struct tm t0;
struct timeval tv;
if (NULL == szbuf)
return -1;
now = time(NULL);
localtime_r(&now, &t0);
gettimeofday(&tv, NULL);
memset(filedir, 0, sizeof(filedir));
strcpy(filedir, "/sdcard/log/");
if (access(filedir, 0) == 0)
;//LOGI("文件路径已经存在!");
else
{
status = mkdir(filedir, S_IRWXU | S_IRWXG | S_IRWXO);
if (status < 0)
return -1;
}
// 写入文件到sdcard
memset(filename, 0, sizeof(filename));
sprintf(filename, "%s%d-%d-%d-COM%d.log", filedir, t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, commid + 1);
fp = fopen(filename, "a+");
if (NULL == fp)
return -1;
memset(buf, 0, sizeof(buf));
sprintf(buf, "%d-%d-%d %d:%d:%d-%d ", t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, t0.tm_hour, t0.tm_min, t0.tm_sec, (int)(tv.tv_usec / 1000));
fwrite(buf, 1, strlen(buf), fp);
fwrite(szbuf, 1, strlen(szbuf), fp);
memset(buf, 0, sizeof(buf));
strcpy(buf, "\n");
fwrite(buf, 1, strlen(buf), fp);
fclose(fp);
return 1;
}
int SaveImageDataTofile(SIO_PARAM_SERIAL_DEF *curserial)
{
u_char *image = NULL, *tempphoto = NULL;
int i, status;
size_t len;
char filename[512]/*, filedir[512]*/, szbuf[128];
FILE *fp = NULL;
image = (u_char*)malloc(curserial->image.imagelen);
if (NULL == image)
return -1;
tempphoto = image;
for (i = 0; i < curserial->image.imagenum; ++i) {
memmove(tempphoto, &curserial->image.buf[i], (size_t)curserial->image.ilen[i]);
tempphoto += (size_t)curserial->image.ilen[i];
}
memset(szbuf, 0, sizeof(szbuf));
//memset(filedir, 0, sizeof(filedir));
//sprintf(filedir, "/sdcard/photo/");
if (access(srdt.filedir, 0) == 0)
{
sprintf(szbuf, "文件路径%s已经存在", srdt.filedir);
DebugLog(0, szbuf, 'I');
}
else
{
status = mkdir(srdt.filedir, S_IRWXU | S_IRWXG | S_IRWXO);
if (status < 0)
return -1;
}
// 写入文件到sdcard
memset(curserial->image.photoname, 0, sizeof(curserial->image.photoname));
sprintf(curserial->image.photoname, "%s1-%d-%d.jpg", srdt.filedir, curserial->image.presetno, curserial->image.phototime);
fp = fopen(curserial->image.photoname, "wb+");
if (NULL == fp)
return -1;
len = fwrite(image, 1, curserial->image.imagelen, fp);
fclose(fp);
free(image);
image = NULL;
if (len < curserial->image.imagelen)
return -1;
else
{
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "写入图片文件%s成功", curserial->image.photoname);
DebugLog(0, szbuf, 'I');
return 1;
}
}
/*******************************************************************
* 读 摄像机 数据 *
*******************************************************************/
void CameraRecvData(SIO_PARAM_SERIAL_DEF *pPortParam, u_char *buf, int len)
{
int i;
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];
pPortParam->m_iRevStatus++;
pPortParam->m_iNeedRevLength = pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] * 256 + buf[i] + 5;
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 (pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen - 2] ==
CalLpc(&pPortParam->m_au8RecvBuf[4], pPortParam->m_iRecvLen - 6))
{
CameraPhotoPortDataProcess(pPortParam);
pPortParam->m_iRevStatus = 0;
pPortParam->RevCmdFlag = 1;
}
else
{
pPortParam->m_iRevStatus = 0;
}
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;
}
}
}
/*********************************************************************************
CameraPhoto 端口数据处理
**********************************************************************************/
void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial)
{
RTUMSG rtumsg;
int img_file_size, packetnum, iNo, packsize, i = 0, presetno, iphototime, pidx;
char szbuf[128];
uint16_t uDevAddr, datalen=0;
uint8_t cmdidx, recvend;
memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData));
memcpy((void*)rtumsg.MsgData, (void*)curserial->m_au8RecvBuf, curserial->m_iRecvLen);
rtumsg.MsgLen = curserial->m_iRecvLen;
//rtumsg.PortIdx = devparam[devno].commid;
cmdidx = curserial->m_au8RecvBuf[5];
uDevAddr = curserial->m_au8RecvBuf[4];
//sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
datalen = rtumsg.MsgData[1]*256+rtumsg.MsgData[2];
if (uDevAddr != curserial->cameraaddr)
return;
memset(szbuf, 0, sizeof(szbuf));
switch (cmdidx)
{
case 0x10: /* 拍照应答*/
if (0xFF == rtumsg.MsgData[6])
{
srdt.RephotographCnt++;
if (srdt.RephotographCnt > 2)
{
curserial->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt);
DebugLog(0, szbuf, 'E');
}
break;
}
i = 6;
memset(&curserial->image, 0, sizeof(curserial->image));
iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24);
srdt.photographtime = iphototime;
curserial->image.phototime = iphototime;
i = 10;
img_file_size = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24);
packetnum = rtumsg.MsgData[i + 5] + (rtumsg.MsgData[i + 4] << 8);
curserial->image.imagelen = img_file_size;
curserial->image.imagenum = packetnum;
srdt.historyimagenum[0] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8);
sprintf(szbuf, "有%d张历史图片!", srdt.historyimagenum[0]);
DebugLog(0, szbuf, 'V');
presetno = (int)rtumsg.MsgData[i + 8];
curserial->image.presetno = presetno;
curserial->image.state = SER_SAMPLE;
curserial->RevCmdFlag = 1;
curserial->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0;
break;
case 0x11: /* 图片数据包*/
i = 6;
iNo = rtumsg.MsgData[i + 1] + rtumsg.MsgData[i] * 256;
if((0xFF == rtumsg.MsgData[i+2]) && (3 == datalen))
{
curserial->SerialCmdidx = iNo + 1;
break;
}
packsize = rtumsg.MsgData[i + 3] + rtumsg.MsgData[i + 2] * 256;
memmove(&curserial->image.buf[iNo - 1], &rtumsg.MsgData[i + 4], packsize);
curserial->image.ilen[iNo - 1] = packsize;
sprintf(szbuf, "收到第%d(总%d包)包长=%d", iNo, curserial->image.imagenum, packsize);
DebugLog(0, szbuf, 'V');
curserial->RevCmdFlag = 1;
curserial->FirstCmdTimeCnt = get_msec();
if (iNo == curserial->SerialCmdidx)
{
if (iNo == curserial->image.imagenum)
{ /* 检查是否有漏包*/
for (pidx = 0; pidx < curserial->image.imagenum; pidx++)
{
if (curserial->image.ilen[pidx] < 1)
break;
}
if (pidx < curserial->image.imagenum)
{
iNo = pidx;
recvend = 0;
}
else
{
if ((1 == SaveImageDataTofile(curserial)) && (SER_SAMPLE == curserial->image.state))
{
curserial->image.state = PHOTO_SAVE_SUCC;
}
recvend = 1;
memset(&serialport[0].image, 0, sizeof(PHOTO_DEF));
memmove((void *)&serialport[0].image, (void*)&curserial->image, sizeof(PHOTO_DEF));
}
}
else
recvend = 0;
if (packsize > MAX_PHOTO_FRAME_LEN)
recvend = 0xFF;
if (1 == recvend)
{
curserial->SerialCmdidx = 10002;/* 图片读取完成*/
}
else if (0xFF == recvend)
{
curserial->SerialCmdidx = -1;
}
else
{
if ((iNo > curserial->image.imagenum) || (0 >= curserial->image.imagenum))
{
curserial->SerialCmdidx = -1;
}
else
curserial->SerialCmdidx = iNo + 1;
}
srdt.errorPhotoNoCnt = 0;
break;
}
srdt.errorPhotoNoCnt++;
sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!",
curserial->SerialCmdidx, iNo, srdt.errorPhotoNoCnt);
DebugLog(0, szbuf, 'E');
if (srdt.errorPhotoNoCnt > 5)
{
curserial->SerialCmdidx = 0;
srdt.RephotographCnt++;
if (srdt.RephotographCnt > 2)
{
curserial->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!", srdt.RephotographCnt);
DebugLog(0, szbuf, 'E');
}
}
break;
case 0x03:
//sprintf(szbuf, "设置波特率%d成功", curserial->baud);
//DebugLog(devparam[devno].commid, szbuf, 'D');
curserial->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
curserial->RevCmdFlag = 1;
curserial->FirstCmdTimeCnt = get_msec();
break;
case 0x15:
if (0xFF == rtumsg.MsgData[6])
{
curserial->SerialCmdidx = -1;
strcpy(szbuf, "没有历史图片!结束读取图片!");
DebugLog(0, szbuf, 'I');
break;
}
i = 6;
iphototime = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24);
srdt.photographtime = iphototime;
curserial->image.phototime = iphototime;
i = 10;
img_file_size = rtumsg.MsgData[i + 3] + (rtumsg.MsgData[i + 2] << 8) + (rtumsg.MsgData[i + 1] << 16) + (rtumsg.MsgData[i] << 24);
packetnum = rtumsg.MsgData[i + 5] + (rtumsg.MsgData[i + 4] << 8);
curserial->image.imagelen = img_file_size;
curserial->image.imagenum = packetnum;
//srdt.imagepacketnum = packetnum;
srdt.historyimagenum[0] = rtumsg.MsgData[i + 7] + (rtumsg.MsgData[i + 6] << 8);
presetno = rtumsg.MsgData[i + 8];
curserial->image.presetno = presetno;
sprintf(szbuf, "读取历史图片,还有%d张历史图片!", srdt.historyimagenum[0]);
DebugLog(0, szbuf, 'I');
curserial->RevCmdFlag = 1;
curserial->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0;
break;
case 0x16:
if (0xFF == rtumsg.MsgData[10])
{
curserial->SerialCmdidx = -1;
strcpy(szbuf, "摄像机图片保存失败!");
DebugLog(0, szbuf, 'E');
}
curserial->SerialCmdidx = -1;
if (0 == rtumsg.MsgData[10])
{
if (0 == srdt.historyimagenum[0])
{
;
}
else
{
curserial->SerialCmdidx = 10003;/* 暂时不实现*/
}
}
curserial->FirstCmdTimeCnt = get_msec();
curserial->RevCmdFlag = 1;
break;
default:
curserial->RevCmdFlag = 1;
break;
}
}
/*********************************************************************************
发送命令
**********************************************************************************/
void SendCmdFormPollCmdBuf(int port)
{
char buf[128];
int len, ret;
int64_t lctime;
SIO_PARAM_SERIAL_DEF *pPortParam;
if(port < 1)
return;
pPortParam = &serialport[port];
memset(buf, 0, sizeof(buf));
lctime = get_msec();
if (pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt)
{
pPortParam->ForceWaitCnt--;
return;
}
if (pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0))
{
//pPortParam->RetryTimeCnt++;
if ((lctime - pPortParam->RetryTimeCnt > 3 * pPortParam->RetryTime) || (lctime - pPortParam->RetryTimeCnt < 0))
{
pPortParam->RetryTimeCnt = lctime;
return;
}
if (lctime - pPortParam->RetryTimeCnt < pPortParam->RetryTime)
//if(pPortParam->RetryTimeCnt < pPortParam->RetryTime)
{
return;
}
pPortParam->RetryTimeCnt = lctime;
pPortParam->RetryCnt++;
if (pPortParam->RetryCnt > pPortParam->Retry)
{
ClearCmdFormPollCmdBuf(port);
}
else
{
pPortParam->SendCmdFlag = 0;
pPortParam->RevCmdFlag = 0;
pPortParam->ReSendCmdFlag = 1;
}
}
if (pPortParam->SendCmdFlag && pPortParam->RevCmdFlag)
{
// 清除当前命令
ClearCmdFormPollCmdBuf(port);
}
if (pPortParam->WaitTime > 0)
{
if ((lctime - pPortParam->WaitTimeCnt > 30 * pPortParam->WaitTime) || (lctime - pPortParam->WaitTimeCnt < 0))
{
pPortParam->WaitTimeCnt = lctime;
return;
}
if (lctime - pPortParam->WaitTimeCnt < pPortParam->WaitTime)
{
return;
}
}
pPortParam->WaitTimeCnt = lctime;
if (pPortParam->ReSendCmdFlag)
len = pPortParam->cmdlen;
else
{
len = pPortParam->cmdlen;
pPortParam->RetryCnt = 0;
}
if (len == 0)
return;
serialport[devparam[srdt.curdevidx[port]].commid].m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态
serialport[devparam[srdt.curdevidx[port]].commid].m_iRevStatus = 0;
if (serialport[port].fd < 0)
return;
ret = Gm_SetSerialPortParam(port);
if (ret < 0)
return;
len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen - 2, port);
if (len < 1)
{
sprintf(buf, "串口%d, 发送命令失败! fd = %d", port + 1, serialport[port].fd);
DebugLog(port, buf, 'E');
}
else
{
sprintf(buf, "发送串口%d 装置%d命令:", port + 1, srdt.curdevidx[port] + 1);
BytestreamLOG(port, buf, &pPortParam->PollCmd[2], len, 'D');
sprintf(buf, "sendtimeconst= %lld", lctime - pPortParam->lsendtime);
DebugLog(port, buf, 'W');
pPortParam->lsendtime = lctime;
}
pPortParam->SendCmdFlag = 1;
pPortParam->ReSendCmdFlag = 0;
pPortParam->RevCmdFlag = 0;
pPortParam->RetryTimeCnt = lctime;
pPortParam->ForceWaitCnt = pPortParam->PollCmd[0] * 256 + pPortParam->PollCmd[1] + TIMER_CNT - 1;
pPortParam->ForceWaitCnt /= TIMER_CNT;
if (pPortParam->ForceWaitCnt)
{
pPortParam->ForceWaitFlag = 1;
}
}
void ClearCmdAllFlag(int commid)
{
if ((commid < 0) || (commid >= MAX_SERIAL_PORT_NUM))
return;
serialport[commid].RetryCnt = 0;
serialport[commid].RetryTimeCnt = get_msec();
serialport[commid].WaitTimeCnt = get_msec();
serialport[commid].ForceWaitFlag = 0;
serialport[commid].ForceWaitCnt = 0;
serialport[commid].SendCmdFlag = 0;
serialport[commid].RevCmdFlag = 0;
serialport[commid].ReSendCmdFlag = 0;
}
void ClearCmdFormPollCmdBuf(int port)
{
//int len, idx;
SIO_PARAM_SERIAL_DEF *pPortParam;
if ((port < 0) || (port >= MAX_SERIAL_PORT_NUM))
return;
pPortParam = &serialport[port];
pPortParam->cmdlen = 0;
memset(pPortParam->PollCmd, 0, sizeof(pPortParam->PollCmd));
srdt.serialstatus[port] = 0;
// 清除指令下发标识
ClearCmdAllFlag(port);
}
void ClearCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam)
{
pPortParam->cmdlen = 0;
memset(pPortParam->PollCmd, 0, sizeof(pPortParam->PollCmd));
//srdt.serialstatus[port] = 0;
// 清除指令下发标识
ClearCameraCmdAllFlag(pPortParam);
}
void ClearCameraCmdAllFlag(SIO_PARAM_SERIAL_DEF *pPortParam)
{
pPortParam->RetryCnt = 0;
pPortParam->RetryTimeCnt = get_msec();
pPortParam->WaitTimeCnt = get_msec();
pPortParam->ForceWaitFlag = 0;
pPortParam->ForceWaitCnt = 0;
pPortParam->SendCmdFlag = 0;
pPortParam->RevCmdFlag = 0;
pPortParam->ReSendCmdFlag = 0;
}
// 下发串口拍照指令控制
int FindNextCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam)
{
int imagesize = 3, cmdno;
uint8_t channel, imagequality = 90, presetno;
uint16_t packetsize;
int64_t lcurtime;
uint8_t cmdidx = 0x10;
char szbuf[128];
//如果命令缓冲区仍有命令,则退出本函数
if (-1 == pPortParam->SerialCmdidx)/* 下发拍照指令*/
return -1;
channel = 1;
cmdno = pPortParam->SerialCmdidx;
lcurtime = get_msec();
if ((1 > cmdno) || (10000 <= cmdno)) {
if (lcurtime - pPortParam->FirstCmdTimeCnt < 300)
return -1;
}
switch (cmdno)
{
case 0:/* 下发拍照指令*/
if (lcurtime - pPortParam->FirstCmdTimeCnt < 3800)
return -1;
if ((lcurtime - pPortParam->FirstCmdTimeCnt > 3 * 35 * 1000) || (lcurtime - pPortParam->FirstCmdTimeCnt < 0))
{
pPortParam->FirstCmdTimeCnt = lcurtime;
return -1;
}
if (lcurtime - pPortParam->FirstCmdTimeCnt > 35 * 1000)
{
pPortParam->SerialCmdidx = -1;
strcpy(szbuf, "串口摄像机未接或故障!结束拍照!");
DebugLog(0, szbuf, 'I');
return -1;
}
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "time=%lldms", lcurtime - pPortParam->FirstCmdTimeCnt);
DebugLog(0, szbuf, 'I');
packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN;
srdt.sendphotocmdcnt++;
srdt.imagepacketnum = 0;
srdt.errorPhotoNoCnt = 0;
cmdidx = 0x10;
imagesize = srdt.bImageSize;
break;
case 10000: /* 下发设置串口波特率命令*/
#if 0
switch (devparam[devidx].baudrate)
{
case B9600:
imagesize = 0x07;
break;
case B19200:
imagesize = 0x08;
break;
case B38400:
imagesize = 0x09;
break;
default:
sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!");
DebugLog(devparam[devidx].commid, szbuf, 'I');
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return -1;
}
if (lcurtime - pPortParam->FirstCmdTimeCnt > 15 * 1000)
{
pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "设置串口摄像机参数时15秒未收到摄像机应答!退出设置!");
DebugLog(devparam[devidx].commid, szbuf, 'I');
return -1;
}
cmdidx = 0x03;
packetsize = 0xFFFF;
#endif
break;
case 10001: /* 通知摄像机图片读取完成或存储16H*/
case 10002:
cmdidx = 0x16;
if (10001 == cmdno)
packetsize = 1;
else
packetsize = 0;
imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/
break;
case 10003: /* 读取历史图片15H*/
cmdidx = 0x15;
packetsize = (uint16_t)MAX_PHOTO_FRAME_LEN;
break;
case 10005: /* 关闭功能*/
//Gm_CtrlPtzCmd(1, P_MOVE_LEFT);
//sleep(2);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
//sleep(20);
return 1;
case 10006: /* 自动扫描功能控制(1/0 打开/关闭该功能)*/
Gm_CtrlPtzCmd(pPortParam, P_Auto_Scan);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10007: /* 光圈缩小(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_IRIS_CLOSE);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10008: /* 光圈放大(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_IRIS_OPEN);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10009: /* 近距离聚焦(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_FOCUS_NEAR);
usleep(500000);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10010: /* 远距离聚焦(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_FOCUS_FAR);
usleep(500000);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10011: /* 远离物体(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_ZOOM_WIDE);
usleep(500000);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10012: /* 接近物体(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_ZOOM_TELE);
usleep(500000);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10013: /* 向下移动镜头(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_MOVE_DOWN);
sleep(1);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10014: /* 向上移动镜头(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_MOVE_UP);
sleep(1);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10015: /* 向左移动镜头(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_MOVE_LEFT);
sleep(1);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10016: /* 向右移动镜头(1 有效)*/
Gm_CtrlPtzCmd(pPortParam, P_MOVE_RIGHT);
sleep(1);
Gm_CtrlPtzCmd(pPortParam, Cmd_Cancel);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
case 10017: /* 调用预置点*/
//srdt.presetno = 2;
Gm_CtrlPtzCmd(pPortParam, MOVE_TO_PRESETNO + srdt.presetno);
sleep(2);
if (0 == srdt.IsSleep)
{
pPortParam->SerialCmdidx = 10017;
srdt.IsSleep++;
return 1;
}
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
srdt.IsSleep = 0;
return 1;
case 10018: /* 设置预置点*/
Gm_CtrlPtzCmd(pPortParam, SET_PRESETNO + srdt.presetno);
usleep(100000);
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
srdt.iLastGetPhotoNo = -1;
return 1;
default:
imagesize = 0xFF;
packetsize = (uint16_t)pPortParam->SerialCmdidx;
cmdidx = 0x11;
#if 0
if (0 == srdt.IsSleep)
{
srdt.IsSleep++;
testComm();
}
#endif
if (lcurtime - pPortParam->FirstCmdTimeCnt > 35 * 1000)
{
pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!", packetsize);
DebugLog(0, szbuf, 'I');
return -1;
}
break;
}
MakeCameraPhotoCommand(pPortParam, cmdidx, imagesize, packetsize, imagequality, srdt.sendphototime);
return 1;
}
/*********************************************************************************
生成 CameraPhoto命令
**********************************************************************************/
void MakeCameraPhotoCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint8_t cmdidx, int OneParam, uint16_t TwoParam, uint8_t Threep, int phototime)
{
int i, icurtime;
u_char *sendbuf;
//char szbuf[128];
sendbuf = pPortParam->PollCmd;
icurtime = phototime;
i = 0;
sendbuf[i++] = 0x00; /* 强制等待时间*/
sendbuf[i++] = 0x00; /* 强制等待时间*/
sendbuf[i++] = 0x68; /* 起始字符*/
sendbuf[i++] = (uint8_t)0x00; /* length */
sendbuf[i++] = (uint8_t)0x00; /* length */
sendbuf[i++] = 0x68; /* 起始字符*/
sendbuf[i++] = (uint8_t)pPortParam->cameraaddr;/* 传感器地址*/
sendbuf[i++] = cmdidx; /* 命令字*/
switch (cmdidx)
{
case 0x02: /* */
sendbuf[i - 2] = 0xFF;
break;
case 0x03: /*设置传感器通讯参数03H*/
sendbuf[i++] = 0x00; /* 波特率*/
sendbuf[i++] = 0x00;
sendbuf[i++] = 0x00;
sendbuf[i++] = (uint8_t)OneParam;
sendbuf[i++] = 0x08; /* 数据位*/
sendbuf[i++] = 0x00; /* 校验位*/
sendbuf[i++] = 0x01; /* 停止位*/
break;
case 0x010: /* 拍摄图片并指定大小分包10H*/
sendbuf[i++] = OneParam; /* 图片大小Resolution*/
sendbuf[i++] = HIBYTE(TwoParam);/*包大小PackageSize*/
sendbuf[i++] = LOBYTE(TwoParam);
sendbuf[i++] = HIBYTE(HIWORD(icurtime + 8 * 60 * 60));/* 请求拍摄图片时间PhotoTime*/
sendbuf[i++] = LOBYTE(HIWORD(icurtime + 8 * 60 * 60));
sendbuf[i++] = HIBYTE(LOWORD(icurtime + 8 * 60 * 60));
sendbuf[i++] = LOBYTE(LOWORD(icurtime + 8 * 60 * 60));
sendbuf[i++] = Threep;/*图像质量ImageQuality*/
sendbuf[i++] = srdt.presetno;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点PresetNo*/
break;
case 0x11: /* 获取指定包数据11H*/
sendbuf[i++] = HIBYTE(TwoParam);/*图片包号PackageNo*/
sendbuf[i++] = LOBYTE(TwoParam);
break;
case 0x15: /* 读取历史图片15H*/
sendbuf[i++] = HIBYTE(TwoParam);/*包大小PackageSize*/
sendbuf[i++] = LOBYTE(TwoParam);
break;
case 0x16: /* 通知摄像机图片读取完成或存储16H*/
sendbuf[i++] = HIBYTE(HIWORD(OneParam));/* 需要保存或删除的图片拍摄时间*/
sendbuf[i++] = LOBYTE(HIWORD(OneParam));
sendbuf[i++] = HIBYTE(LOWORD(OneParam));
sendbuf[i++] = LOBYTE(LOWORD(OneParam));
sendbuf[i++] = (uint8_t)TwoParam; /* 是否需要保存*/
break;
}
sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6);
i += 1;
sendbuf[i++] = 0x16; /* 信息尾*/
sendbuf[3] = (uint8_t)((i - 10) >> 8);
sendbuf[4] = (uint8_t)(i - 10);
pPortParam->cmdlen = i;
//return;
}
// 准备发送云台指令
int Gm_CtrlPtzCmd(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t ptzcmd)
{
switch (ptzcmd)
{
case P_Auto_Scan:
srdt.PtzCmdType = D_Auto_Scan;
break;
case P_IRIS_CLOSE:
srdt.PtzCmdType = D_IRIS_CLOSE;
break;
case P_IRIS_OPEN:
srdt.PtzCmdType = D_IRIS_OPEN;
break;
case P_FOCUS_NEAR:
srdt.PtzCmdType = D_FOCUS_NEAR;
break;
case P_FOCUS_FAR:
srdt.PtzCmdType = D_FOCUS_FAR;
break;
case P_ZOOM_WIDE:
srdt.PtzCmdType = D_ZOOM_WIDE;
break;
case P_ZOOM_TELE:
srdt.PtzCmdType = D_ZOOM_TELE;
break;
case P_MOVE_DOWN:
srdt.PtzCmdType = D_MOVE_DOWN;
break;
case P_MOVE_UP:
srdt.PtzCmdType = D_MOVE_UP;
break;
case P_MOVE_LEFT:
srdt.PtzCmdType = D_MOVE_LEFT;
break;
case P_MOVE_RIGHT:
srdt.PtzCmdType = D_MOVE_RIGHT;
break;
}
if (serialport[srdt.camerauseserial].cmdlen > 0)
return -1;
Gm_SendPelco_DCommand(pPortParam,ptzcmd);
return 1;
}
// 发送转动摄像机云台命令定时器
#if 0
int Gm_Camera_Timer()
{
char szbuf[128];
if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx)
{
switch (srdt.PtzCmdType)
{
case P_Auto_Scan:
srdt.PtzCmdType = D_Auto_Scan;
break;
case P_IRIS_CLOSE:
srdt.PtzCmdType = D_IRIS_CLOSE;
break;
case P_IRIS_OPEN:
srdt.PtzCmdType = D_IRIS_OPEN;
break;
case P_FOCUS_NEAR:
srdt.PtzCmdType = D_FOCUS_NEAR;
break;
case P_FOCUS_FAR:
srdt.PtzCmdType = D_FOCUS_FAR;
break;
case P_ZOOM_WIDE:
srdt.PtzCmdType = D_ZOOM_WIDE;
break;
case P_ZOOM_TELE:
srdt.PtzCmdType = D_ZOOM_TELE;
break;
case P_MOVE_DOWN:
srdt.PtzCmdType = D_MOVE_DOWN;
break;
case P_MOVE_UP:
srdt.PtzCmdType = D_MOVE_UP;
break;
case P_MOVE_LEFT:
srdt.PtzCmdType = D_MOVE_LEFT;
break;
case P_MOVE_RIGHT:
srdt.PtzCmdType = D_MOVE_RIGHT;
break;
}
}
if (srdt.SendStopPtzCmdTimeCnt == -1)
{
if (serialport[srdt.camerauseserial].cmdlen > 0)
return -1;
if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx)
Gm_SendPelco_DCommand(srdt.PtzCmdType);
else
Gm_SendPelco_pCommand(srdt.PtzCmdType);
if ((SET_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000))
|| (MOVE_TO_PRESETNO == (srdt.PtzCmdType & 0xFFFF0000)))
{
//srdt.sampling &= 0xFD;
return 1;
}
srdt.PtzCmdType = Cmd_Cancel;
srdt.SendStopPtzCmdTimeCnt = 0;
}
return 1;
#if 0
//if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000/TIMER_CNT)
{
if (serialport[srdt.camerauseserial].cmdlen > 0)
return -1;
if (PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx)
Gm_SendPelco_DCommand(srdt.PtzCmdType);
else
Gm_SendPelco_pCommand(srdt.PtzCmdType);
srdt.SendStopPtzCmdTimeCnt = -1;
//srdt.sampling &= 0xFD;
return 1;
}
//else
// srdt.SendStopPtzCmdTimeCnt ++;
//return -1;
#endif
}
#endif
/********************************************************************************
* 生成 PELCO_P 命令 *
*********************************************************************************/
void Gm_SendPelco_pCommand(uint32_t cmdtype)
{
int len;
uint8_t commandbuf[32];
char buf[128];
len = 0;
commandbuf[len++] = (uint8_t)0xA0;
commandbuf[len++] = (uint8_t)devparam[srdt.usecameradevidx].devaddr;
commandbuf[len++] = (uint8_t)(cmdtype >> 24);
commandbuf[len++] = (uint8_t)(cmdtype >> 16);
commandbuf[len++] = (uint8_t)(cmdtype >> 8);
commandbuf[len++] = (uint8_t)(cmdtype);
commandbuf[len++] = (uint8_t)0xAF;
commandbuf[len] = (uint8_t)Gm_Pelco_pXORCheck(commandbuf, len);
len++;
serialport[srdt.camerauseserial].cmdlen = len;
//Gm_SetSerialPortParam(srdt.camerauseserial);
//unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16};
//len = GM_SerialComSend(sendbuf, sizeof(sendbuf), srdt.camerauseserial);
len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial);
if (len < 1)
{
DebugLog(srdt.camerauseserial, "发送Pelco_p命令失败", 'E');
}
else
{
sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:",
srdt.camerauseserial + 1, devparam[srdt.usecameradevidx].CameraChannel);
BytestreamLOG(srdt.camerauseserial, buf, commandbuf, len, 'D');
}
ClearCmdFormPollCmdBuf(srdt.camerauseserial);
}
uint8_t Gm_Pelco_pXORCheck(uint8_t *msg, int len)
{
int i;
uint8_t checkvalue = 0;
if (len <= 0)
return checkvalue;
checkvalue = msg[0];
for (i = 1; i < len; i++)
checkvalue ^= msg[i];
return checkvalue;
}
/********************************************************************************
* 生成 PELCO_D 命令 *
*********************************************************************************/
void Gm_SendPelco_DCommand(SIO_PARAM_SERIAL_DEF *pPortParam, uint32_t cmdtype)
{
int len;
uint8_t commandbuf[32];
char buf[128];
len = 0;
#if 1 /* Pelco_D*/
commandbuf[len++] = (uint8_t)0xFF;
commandbuf[len++] = (uint8_t)pPortParam->cameraaddr;
commandbuf[len++] = (uint8_t)(cmdtype >> 24);
commandbuf[len++] = (uint8_t)(cmdtype >> 16);
commandbuf[len++] = (uint8_t)(cmdtype >> 8);
commandbuf[len++] = (uint8_t)(cmdtype);
commandbuf[len] = (uint8_t)Gm_Pelco_DCheck(commandbuf, len);
#endif
len++;
pPortParam->cmdlen = len;
//Gm_SetSerialPortParam(srdt.camerauseserial);
len = GM_CameraComSend(commandbuf, len, pPortParam->fd);
if (len < 1)
{
DebugLog(0, "发送Pelco_D命令失败", 'E');
}
else
{
strcpy(buf, "发送像机Pelco_D命令:");
BytestreamLOG(0, buf, commandbuf, len, 'D');
}
ClearCameraCmdFormPollCmdBuf(pPortParam);
}
// 计算Pelco_D校验
uint8_t Gm_Pelco_DCheck(uint8_t *msg, int len)
{
int i;
uint8_t checkvalue = 0;
if (len <= 0)
return checkvalue;
checkvalue = 0;
for (i = 1; i < len; i++)
checkvalue += msg[i];
return checkvalue;
}
/*********************************************************************************
寻找并生成下一条倾角命令
**********************************************************************************/
int FindNextShxyProtocolCommand(int devidx)
{
int cmdno = 0;
//如果命令缓冲区仍有命令,则退出本函数
if ((devparam[devidx].commid + 1 < 1) || (devparam[devidx].commid + 1 > MAX_SERIAL_PORT_NUM))
return -1;
if (get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt < 3 * 1000)
{
return -1;
}
//if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx)
// return -1;
switch (cmdno)
{
case 0: /* 正常采集数据*/
MakeShxyProtocolPollCommand(devidx, 0x09);
srdt.curdevidx[devparam[devidx].commid] = devidx;
return 1;
case 1: /* 测试读取地址*/
MakeShxyProtocolPollCommand(devidx, 0x02);
srdt.curdevidx[devparam[devidx].commid] = devidx;
return 1;
default:
break;
}
return -1;
}
/*********************************************************************************
生成下发命令
**********************************************************************************/
void MakeShxyProtocolPollCommand(int portno, uint8_t cmdidx)
{
int i, length = 0;
int newaddr = 9, baud = 9600, stopbit = 1, parity = 0;
//char buf[128];
u_char *sendbuf;
sendbuf = serialport[devparam[portno].commid].PollCmd;
/* 测试变量*/
cmdidx = cmdidx;
i = 0;
sendbuf[i++] = 0x00; // 强制等待时间
sendbuf[i++] = 0x00; //
sendbuf[i++] = 0x68; // 起始字符
sendbuf[i++] = (uint8_t)0x00; // length
sendbuf[i++] = (uint8_t)0x00; // length
sendbuf[i++] = 0x68;
sendbuf[i++] = (uint8_t)devparam[portno].devaddr; // 传感器地址
sendbuf[i++] = cmdidx; // 命令信息0x06
switch (cmdidx)
{
case 1: /* 设置传感器新地址*/
sendbuf[i++] = newaddr;
length = 1;
break;
case 2: /* 广播读地址*/
sendbuf[6] = 0xFF;
break;
case 3: /* 设置串口参数*/
sendbuf[i++] = (u_char)(baud >> 24);
sendbuf[i++] = (u_char)(baud >> 16);
sendbuf[i++] = (u_char)(baud >> 8);
sendbuf[i++] = (u_char)baud;
sendbuf[i++] = 8;
sendbuf[i++] = parity;
sendbuf[i++] = stopbit;
length = 7;
break;
default:
break;
}
sendbuf[i] = CalLpc((u_char *)&sendbuf[6], i - 6);
i += 1;
sendbuf[3] = length;
sendbuf[4] = length;
sendbuf[i++] = 0x16; // 信息尾
serialport[devparam[portno].commid].cmdlen = i;
}
unsigned char CalLpc(unsigned char *msg, int len)
{
int i;
u_char retval = 0;
for (i = 0; i < len; i++)
retval += msg[i];
return retval;
}
/***************************************************************
* 读上海欣影传感器协议数据 *
***************************************************************/
void ShxyProtocolRecvData(int devno, u_char *buf, int len)// 规约读数据处理
{
int i, ictime;
//uint16_t crc, check;
//SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *pPortParam;
if ((devno < 0) || (devno > MAX_SERIAL_DEV_NUM))
{
return;
}
pPortParam = &serialport[devparam[devno].commid];
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 (CheckShxyProtocolLpcError(pPortParam->m_au8RecvBuf, pPortParam->m_iRecvLen) == 1)
{
ShxyProtocolDataProcess(devno);
pPortParam->m_iRevStatus = 0;
pPortParam->RevCmdFlag = 1;
}
else
{
pPortParam->m_iRevStatus = 0;
}
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 CheckShxyProtocolLpcError(u_char* msg, int len)
{
int bRetval = 0;
int iCheckLen;
if (0x68 == msg[0])
{
if (msg[0] != msg[3])
return bRetval;
if (msg[len - 1] != 0x16)
return bRetval;
if (msg[1] != msg[2])
return bRetval;
iCheckLen = msg[1];
if (CalLpc(&msg[4], iCheckLen + 2) != msg[len - 2])
return bRetval;
bRetval = 1;
}
return bRetval;
}
/*********************************************************************************
上海欣影传感器协议数据处理
**********************************************************************************/
void ShxyProtocolDataProcess(int devno)
{
float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/;
uint16_t uDevAddr;
uint8_t cmdidx;
int i, j, aipnt, datanum;
SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *curserial;
char szbuf[64];
pPortParam = &srdt.ms_dev[devno];
curserial = &serialport[devparam[devno].commid];
//取出装置地址,开始处理地址+++
if (0x02 == curserial->m_au8RecvBuf[5])
{
devparam[devno].devaddr = curserial->m_au8RecvBuf[4];
return;
}
cmdidx = curserial->m_au8RecvBuf[5];
aipnt = pPortParam->SameTypeDevIdx;
uDevAddr = curserial->m_au8RecvBuf[4];
fvalua = &fvalue;
memset(szbuf, 0, sizeof(szbuf));
if (0x06 == cmdidx)
{
if (0x08 != curserial->m_au8RecvBuf[1])
return;
pPortParam->recvdatacnt++;
if (pPortParam->recvdatacnt < 2)
return;
// ++++++++++++++++++++++++++++
//g_SelfTest.SensorsFault |= (0x800<<aipnt);
*(uint8_t*)fvalua = curserial->m_au8RecvBuf[9];
*((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[8];
*((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[7];
*((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[6];
if ((fvalue < -59) || (fvalue > 59))
{
frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0;
pPortParam->aiValue[0].EuValue *= (1 + frnb);
}
else
pPortParam->aiValue[0].EuValue = fvalue;
pPortParam->aiValue[0].AiState = SER_SAMPLE;
//slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\
// +slantpntmsg[aipnt][0].AiParam.EuValueDelta;
//slantpntmsg[aipnt][0].AiState = 1;
//if ((gDisSunRain & 0x20) == 0x20)
{
sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue);
//DebugLog(devparam[devno].commid, szbuf, 'V');
}
//XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue;
//srdt.SectimesamplingCnt[0] += 1;
*(uint8_t*)fvalua = curserial->m_au8RecvBuf[13];
*((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[12];
*((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[11];
*((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[10];
//if ((gDisSunRain & 0x20) == 0x20)
{
sprintf(szbuf, "%sY =%0.3f ", szbuf, fvalue);
DebugLog(devparam[devno].commid, szbuf, 'V');
}
if ((fvalue < -59) || (fvalue > 59))
{
frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0;
pPortParam->aiValue[1].EuValue *= (1 + frnb);
//slantpntmsg[aipnt][1].EuValue *= (1+frnb);
}
else
pPortParam->aiValue[1].EuValue = fvalue;
pPortParam->aiValue[1].AiState = SER_SAMPLE;
/*slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\
+slantpntmsg[aipnt][1].AiParam.EuValueDelta;
slantpntmsg[aipnt][1].AiState = 1;*/
//YslantSec[aipnt][srdt.SectimesamplingCnt[1]] = (short)slantpntmsg[aipnt][1].EuValue;
srdt.SectimesamplingCnt[1] += 1;
}
datanum = curserial->m_au8RecvBuf[6];
if ((0x08 != cmdidx) && (0x09 != cmdidx))
return;
for (i = 0, j = 7; (i < datanum) && (j < 6 + curserial->m_au8RecvBuf[1]); i++, j += 5)
{
if (0x08 == cmdidx)
fvalue = (curserial->m_au8RecvBuf[j + 1] << 24) + (curserial->m_au8RecvBuf[j + 2] << 16)
+ (curserial->m_au8RecvBuf[j + 3] << 8) + curserial->m_au8RecvBuf[j + 4];
else
{
*(uint8_t*)fvalua = curserial->m_au8RecvBuf[j + 4];
*((uint8_t*)fvalua + 1) = curserial->m_au8RecvBuf[j + 3];
*((uint8_t*)fvalua + 2) = curserial->m_au8RecvBuf[j + 2];
*((uint8_t*)fvalua + 3) = curserial->m_au8RecvBuf[j + 1];
}
switch (curserial->m_au8RecvBuf[j])
{
case 1: /*温度*/
if ((fvalue < -40) || (fvalue > 85))
{
frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0;
pPortParam->aiValue[AirTempNo].EuValue *= (1 + frnb);
weatherpntmsg[AirTempNo].EuValue *= (1 + frnb);
//weatherpntmsg[AirTempNo].AiState = SER_SAMPLE;
}
else
{
pPortParam->aiValue[AirTempNo].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor + pPortParam->aiValue[0].AiParam.EuValueDelta;*/
weatherpntmsg[AirTempNo].EuValue = fvalue;/*weatherpntmsg[AirTempNo].AiParam.fFactor + weatherpntmsg[AirTempNo].AiParam.EuValueDelta;*/
}
pPortParam->aiValue[AirTempNo].AiState = SER_SAMPLE;
weatherpntmsg[AirTempNo].AiState = SER_SAMPLE;
//g_SelfTest.SensorsFault |= (0x01);
//if ((gDisSunRain & 0x80) == 0x80)
{
sprintf(szbuf, "ID:%d 温度:%0.3f ", devparam[devno].devaddr, fvalue);
//DebugLog(devparam[devno].commid, szbuf, 'V');
}
break;
case 2: /*气压*/
if ((fvalue < 550) || (fvalue > 1060))
{
frnb = (GeneratingRandomNumber() % 41 - 20) / 10000.0;
pPortParam->aiValue[AtmosNo].EuValue *= (1 + frnb);
weatherpntmsg[AtmosNo].EuValue *= (1 + frnb);
}
else
{
pPortParam->aiValue[AtmosNo].EuValue = fvalue;/*pPortParam->aiValue[5].AiParam.fFactor + pPortParam->aiValue[5].AiParam.EuValueDelta;*/
weatherpntmsg[AtmosNo].EuValue = fvalue;/*weatherpntmsg[AtmosNo].AiParam.fFactor + weatherpntmsg[AtmosNo].AiParam.EuValueDelta;*/
}
pPortParam->aiValue[AtmosNo].AiState = SER_SAMPLE;
weatherpntmsg[AtmosNo].AiState = SER_SAMPLE;
//g_SelfTest.SensorsFault |= (0x10);
//if ((gDisSunRain & 0x80) == 0x80)
{
sprintf(szbuf, "气压:%0.3f ", fvalue);
DebugLog(devparam[devno].commid, szbuf, 'V');
}
break;
case 3: /*湿度*/
if ((fvalue < 0) || (fvalue > 100))
{
frnb = (GeneratingRandomNumber() % 41 - 20) / 1000.0;
pPortParam->aiValue[HumidityNo].EuValue *= (1 + frnb);
weatherpntmsg[HumidityNo].EuValue *= (1 + frnb);
}
else
{
pPortParam->aiValue[HumidityNo].EuValue = fvalue;/*pPortParam->aiValue[1].AiParam.fFactor + pPortParam->aiValue[1].AiParam.EuValueDelta;*/
weatherpntmsg[HumidityNo].EuValue = fvalue;/*weatherpntmsg[HumidityNo].AiParam.fFactor + weatherpntmsg[HumidityNo].AiParam.EuValueDelta;*/
}
pPortParam->aiValue[HumidityNo].AiState = SER_SAMPLE;
weatherpntmsg[HumidityNo].AiState = SER_SAMPLE;
//g_SelfTest.SensorsFault |= (0x02);
//if ((gDisSunRain & 0x80) == 0x80)
{
sprintf(szbuf, "%s湿度:%0.3f ", szbuf, fvalue);
DebugLog(devparam[devno].commid, szbuf, 'V');
}
break;
case 4: /*雨量*/
break;
case 5: /*日照*/
break;
case 6: /*风速*/
if ((fvalue < 0) || (fvalue > 80))
{
frnb = (GeneratingRandomNumber() % 41 - 20) / 1000.0;
pPortParam->aiValue[WindSpeedNo].EuValue *= (1 + frnb);
weatherpntmsg[WindSpeedNo].EuValue *= (1 + frnb);
}
else
{
pPortParam->aiValue[WindSpeedNo].EuValue = fvalue;/*pPortParam->aiValue[2].AiParam.fFactor + pPortParam->aiValue[2].AiParam.EuValueDelta;*/
weatherpntmsg[WindSpeedNo].EuValue = fvalue;/*weatherpntmsg[WindSpeedNo].AiParam.fFactor + weatherpntmsg[WindSpeedNo].AiParam.EuValueDelta;*/
}
pPortParam->aiValue[WindSpeedNo].AiState = SER_SAMPLE;
weatherpntmsg[WindSpeedNo].AiState = SER_SAMPLE;
//g_SelfTest.SensorsFault |= (0x04);
//if ((gDisSunRain & 0x10) == 0x10)
{
//fwind = fvalue/1000*0.95;
//if(fvalue/1000 > 25)
// fwind -= 1.2;
//sprintf(szbuf, "风速:%0.3f ", fwind);
sprintf(szbuf, "ID:%d 风速:%0.3f ", devparam[devno].devaddr, fvalue);
}
break;
case 7: /*风向*/
if ((fvalue / 1000 < 0) || (fvalue / 1000 > 359.99))
{
frnb = (GeneratingRandomNumber() % 41 - 20) / 1000.0;
pPortParam->aiValue[WindDirectionNo].EuValue *= (1 + frnb);
weatherpntmsg[WindDirectionNo].EuValue *= (1 + frnb);
}
else
{
pPortParam->aiValue[WindDirectionNo].EuValue = fvalue;/*pPortParam->aiValue[3].AiParam.fFactor + pPortParam->aiValue[3].AiParam.EuValueDelta;*/
weatherpntmsg[WindDirectionNo].EuValue = fvalue;/*weatherpntmsg[WindDirectionNo].AiParam.fFactor + weatherpntmsg[WindDirectionNo].AiParam.EuValueDelta;*/
}
pPortParam->aiValue[WindDirectionNo].AiState = SER_SAMPLE;
weatherpntmsg[WindDirectionNo].AiState = SER_SAMPLE;
//g_SelfTest.SensorsFault |= (0x08);
//if ((gDisSunRain & 0x10) == 0x10)
{
sprintf(szbuf, "%s 风向:%0.3f ", szbuf, fvalue);
DebugLog(devparam[devno].commid, szbuf, 'V');
}
break;
case 8: /*拉力*/
pPortParam->recvdatacnt++;
if (pPortParam->recvdatacnt < 2)
break;
pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\
+pPortParam->aiValue[0].AiParam.EuValueDelta;*/
//rallypntmsg[aipnt][0].EuValue = fvalue*rallypntmsg[aipnt][0].AiParam.fFactor\
// +rallypntmsg[aipnt][0].AiParam.EuValueDelta;
pPortParam->aiValue[0].AiState = SER_SAMPLE;
//rallypntmsg[aipnt][0].AiState = 1;
sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue);
DebugLog(devparam[devno].commid, szbuf, 'V');
//}
break;
case 9: /*倾角传感器X轴倾角*/
if ((fvalue < -59) || (fvalue > 59))
{
frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0;
pPortParam->aiValue[0].EuValue *= (1 + frnb);
//slantpntmsg[aipnt][0].EuValue *= (1+frnb);
}
else
{
pPortParam->aiValue[0].EuValue = fvalue;/*pPortParam->aiValue[0].AiParam.fFactor\
+pPortParam->aiValue[0].AiParam.EuValueDelta;*/
//slantpntmsg[aipnt][0].EuValue = fvalue*slantpntmsg[aipnt][0].AiParam.fFactor\
//+slantpntmsg[aipnt][0].AiParam.EuValueDelta;
}
pPortParam->aiValue[0].AiState = SER_SAMPLE;
//slantpntmsg[aipnt][0].AiState = 1;
sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue);
break;
case 10: /*倾角传感器Y轴倾角*/
sprintf(szbuf, "%s Y =%0.3f ", szbuf, fvalue);
DebugLog(devparam[devno].commid, szbuf, 'V');
if ((fvalue < -59) || (fvalue > 59))
{
frnb = (GeneratingRandomNumber() % 101 - 50) / 1000.0;
pPortParam->aiValue[1].EuValue *= (1 + frnb);
}
else
{
pPortParam->aiValue[1].EuValue = fvalue;/*pPortParam->aiValue[1].AiParam.fFactor\
+pPortParam->aiValue[1].AiParam.EuValueDelta;*/
}
pPortParam->aiValue[1].AiState = SER_SAMPLE;
//slantpntmsg[aipnt][1].AiState = 1;
break;
}
}
}
void delete_old_files(const char *path, int days)
{
struct stat file_stat;
struct tm *file_tm;
time_t now = time(NULL);
DIR *dir = opendir(path);
struct dirent *entry;
char szbuf[1024];
char fullpath[256];
memset(szbuf, 0, sizeof(szbuf));
if (!dir)
{
sprintf(szbuf, "delete_old_files opendir %s error ", path);
DebugLog(8, szbuf, 'E');
return;
}
while ((entry = readdir(dir)))
{
memset(szbuf, 0, sizeof(szbuf));
if (entry->d_type == DT_REG)
{ // 只处理普通文件
snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name);
if (stat(fullpath, &file_stat) == -1)
{
perror("stat");
strcpy(szbuf, "stat");
DebugLog(8, szbuf, 'E');
continue;
}
localtime_r(&(file_stat.st_mtime), file_tm);
//file_tm = localtime(&(file_stat.st_mtime));
if (difftime(now, mktime(file_tm)) > days * 24 * 60 * 60)
{
if (unlink(fullpath) == -1)
{ // 删除文件
perror("unlink");
}
}
}
}
closedir(dir);
}
/*********************************************************************************
把16进制和10进制ASCII字符串转换成int整数
*********************************************************************************/
int ATOI(char *buf)
{
int i, ilen, iRetVal;
if (NULL == buf)
return 0;
ilen = strlen(buf);
if (ilen > 2)
{
if ((buf[0] == '0') && ((buf[1] == 'x') || (buf[1] == 'X')))
{
iRetVal = 0;
for (i = 2; i < ilen; i++)
{
iRetVal = (iRetVal << 4) + HexCharToInt(buf[i]);
}
}
else
{
iRetVal = atoi(buf);
}
}
else
{
iRetVal = atoi(buf);
}
return iRetVal;
}
#if 0
// 控制关闭传感器电源
void Gm_CtrlCloseSensorsPower(int devidx)
{
if ((devidx < 0) || (devidx > MAX_SERIAL_DEV_NUM - 1))
return;
srdt.ms_dev[devidx].uOpenPowerFlag = CLOSEPOWER;
}
// 检查传感器电源是否应该关闭或打开
void Gm_CheckSensorsPower(void)
{
int i, j;
for (i = 0; i < MAX_SERIAL_DEV_NUM - 2; i++)
{
if ((1 > srdt.ms_dev[i].ProtocolIdx) || (INVALID_PROTOCOL <= srdt.ms_dev[i].ProtocolIdx))
continue;
if ((PELCO_P_PROTOCOL == srdt.ms_dev[i].ProtocolIdx) || (PELCO_D_PROTOCOL == srdt.ms_dev[i].ProtocolIdx)
|| (SERIALCAMERA_PROTOCOL == srdt.ms_dev[i].ProtocolIdx))
continue;
// 需要传感器处于上电状态
for (j = 0; j < MAX_SERIAL_DEV_NUM - 2; j++)
{
if ((srdt.ms_dev[i].PowerPort == srdt.ms_dev[j].PowerPort) && (srdt.ms_dev[j].uOpenPowerFlag == OPENPOWER))
break;
}
if (j < MAX_SERIAL_DEV_NUM - 2)
continue;
}
}
#endif
int GeneratingRandomNumber(void)
{
int ictime, randomdate;
/* 生成随机数n-m -> rand()%(m-n+1)+n*/
ictime = (int)time(NULL);
srand((uint32_t)ictime);
randomdate = rand();
return randomdate;
}
/* 串口启动接口函数 开始*/
void Collect_sensor_data()
{
#if 0
int i;
for (i = 0; i < MAX_SERIAL_DEV_NUM; i++)
{
devparam[i].IsNoInsta = sensorParam[i].IsNoInsta;
if (0 == sensorParam[i].IsNoInsta)
continue;
devparam[i].ProtocolIdx = sensorParam[i].SensorsType;
devparam[i].devaddr = sensorParam[i].devaddr;
devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate);
memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
memmove(devparam[i].pathname, sensorParam[i].pathname, sizeof(devparam[i].pathname));
devparam[i].databit = sensorParam[i].databit;
devparam[i].stopbit = (int)(sensorParam[i].stopbit * 10);
devparam[i].CameraChannel = sensorParam[i].CameraChannel;
devparam[i].Phase = sensorParam[i].Phase;
}
#endif
#if 1
pthread_mutex_lock(&serial_mutex); // 加锁
static int ideletefile = 0;
char logbuf[64];
time_t now;
struct tm t0;
const char *path = "/sdcard/log"; // 指定目录路径
int days = 15; // 删除15天前的log文件
sprintf(logbuf, "进入程序时间:%lld, ideletefile=%d", get_msec(), ideletefile);
DebugLog(8, logbuf, 'I');
now = time(NULL);
localtime_r(&now, &t0);
if ((0 == t0.tm_hour) && (0 == ideletefile))
{
delete_old_files(path, days);
ideletefile++;
}
if (0 < t0.tm_hour)
ideletefile = 0;
#endif
GM_StartSerialComm();
pthread_mutex_unlock(&serial_mutex); // 解锁
}
int Gm_SetCameraSerialPortParam(int fd, unsigned int baud)
{
int ret;
char szbuf[128];
ret = set_port_attr(fd, baud, 8, 1, 'n', 0, 0);/*9600 8n1 */
if (ret < 0)
{
memset(szbuf, 0, sizeof(szbuf));
strcpy(szbuf, "摄像机串口波特率等参数设置错误!");
DebugLog(0, szbuf, 'E');
return -1;
}
return ret;
}
int Gm_OpenCameraSerial(SIO_PARAM_SERIAL_DEF *pPortParam, char *serfile, unsigned int baud)
{
int fd = -1;
char szbuf[512];
unsigned int serbaud;
memset(szbuf, 0, sizeof(szbuf));
if (pPortParam->fd <= 0)
{
fd = ::open(serfile, O_RDWR | O_NDELAY);
if (fd < 0)
{
sprintf(szbuf, "摄像机串口%s打开失败fd=%d", serfile, fd);
DebugLog(0, szbuf, 'E');
return -1;
}
sprintf(szbuf, "摄像机打开串口%s成功fd=%d 波特率:%d", serfile, fd, baud);
DebugLog(0, szbuf, 'I');
pPortParam->fd = fd;
serbaud = getBaudrate(baud);
Gm_SetCameraSerialPortParam(fd, serbaud);
return 0;
}
sprintf(szbuf, "摄像机串口%s已经打开fd=%d", serfile, pPortParam->fd);
DebugLog(0, szbuf, 'I');
return 0;
}
int GM_CameraComSend(unsigned char * cSendBuf, size_t nSendLen, int fd)
{
int i, len;
char szbuf[512];
memset(szbuf, 0, sizeof(szbuf));
len = write(fd, cSendBuf, (size_t)nSendLen);/* 向串囗发送字符串 */
if (len < 0)
{
strcpy(szbuf, "write data error ");
DebugLog(0, szbuf, 'E');
return -1;
}
else if (len > 0)
{
;
}
return len;
}
void SendCameraCmdFormPollCmdBuf(SIO_PARAM_SERIAL_DEF *pPortParam)
{
char buf[128];
int len, ret;
int64_t lctime;
memset(buf, 0, sizeof(buf));
lctime = get_msec();
if (pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt)
{
pPortParam->ForceWaitCnt--;
return;
}
if (pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0))
{
//pPortParam->RetryTimeCnt++;
if ((lctime - pPortParam->RetryTimeCnt > 3 * pPortParam->RetryTime) || (lctime - pPortParam->RetryTimeCnt < 0))
{
pPortParam->RetryTimeCnt = lctime;
return;
}
if (lctime - pPortParam->RetryTimeCnt < pPortParam->RetryTime)
{
return;
}
pPortParam->RetryTimeCnt = lctime;
pPortParam->RetryCnt++;
if (pPortParam->RetryCnt > pPortParam->Retry)
{
ClearCameraCmdFormPollCmdBuf(pPortParam);
}
else
{
pPortParam->SendCmdFlag = 0;
pPortParam->RevCmdFlag = 0;
pPortParam->ReSendCmdFlag = 1;
}
}
if (pPortParam->SendCmdFlag && pPortParam->RevCmdFlag)
{
// 清除当前命令
ClearCameraCmdFormPollCmdBuf(pPortParam);
}
if (pPortParam->WaitTime > 0)
{
if ((lctime - pPortParam->WaitTimeCnt > 30 * pPortParam->WaitTime) || (lctime - pPortParam->WaitTimeCnt < 0))
{
pPortParam->WaitTimeCnt = lctime;
return;
}
if (lctime - pPortParam->WaitTimeCnt < pPortParam->WaitTime)
{
return;
}
}
pPortParam->WaitTimeCnt = lctime;
if (pPortParam->ReSendCmdFlag)
len = pPortParam->cmdlen;
else
{
len = pPortParam->cmdlen;
pPortParam->RetryCnt = 0;
}
if (len == 0)
return;
pPortParam->m_iRecvLen = 0; // 当发送一条新指令时,清除接收状态
pPortParam->m_iRevStatus = 0;
if (pPortParam->fd < 0)
return;
len = GM_CameraComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen - 2, pPortParam->fd);
if (len < 1)
{
strcpy(buf, "摄像机串口, 发送命令失败!");
DebugLog(0, buf, 'E');
}
else
{
strcpy(buf, "摄像机串口命令:");
BytestreamLOG(0, buf, &pPortParam->PollCmd[2], len, 'D');
sprintf(buf, "sendtimeconst= %lld", (long long)(lctime - pPortParam->lsendtime));
DebugLog(0, buf, 'W');
pPortParam->lsendtime = lctime;
}
pPortParam->SendCmdFlag = 1;
pPortParam->ReSendCmdFlag = 0;
pPortParam->RevCmdFlag = 0;
pPortParam->RetryTimeCnt = lctime;
pPortParam->ForceWaitCnt = pPortParam->PollCmd[0] * 256 + pPortParam->PollCmd[1] + TIMER_CNT - 1;
pPortParam->ForceWaitCnt /= TIMER_CNT;
if (pPortParam->ForceWaitCnt)
{
pPortParam->ForceWaitFlag = 1;
}
}
void Gm_FindCameraCommand(SIO_PARAM_SERIAL_DEF *pPortParam)
{
int flag;
// 发送缓冲区中命令 接收到了应答报文,紧接着进行缓冲区清理
SendCameraCmdFormPollCmdBuf(pPortParam);
// 串口已经被占用则直接跳过
if (pPortParam->cmdlen > 0)
return;
flag = -1;
flag = FindNextCameraPhotoCommand(pPortParam);
if (flag == -1)
return;
// 发送缓冲区中命令 生成了命令之后紧接着进行命令发送
SendCameraCmdFormPollCmdBuf(pPortParam);
}
int GM_IsCloseCamera(SIO_PARAM_SERIAL_DEF *pPortParam)
{
int i, j;
char buf[256];
int64_t lctime;
lctime = get_msec();
memset(buf, 0, sizeof(buf));
if (-1 == pPortParam->SerialCmdidx)
{
if ((SER_STARTSAMPLE == pPortParam->image.state) || (SER_SAMPLE == pPortParam->image.state))
pPortParam->image.state = SER_SAMPLEFAIL;
else if (PHOTO_SAVE_SUCC == pPortParam->image.state)
pPortParam->image.state = SAMPLINGSUCCESS;
strcpy(buf, "通道1摄像机使用完毕!可以关闭摄像机电源!");
DebugLog(0, buf, 'I');
if(pPortParam->fd >= 0)
{
close(pPortParam->fd);
pPortParam->fd = -1;
}
}
return pPortParam->SerialCmdidx;
}
void GM_CameraSerialComRecv(SIO_PARAM_SERIAL_DEF *pPortParam)
{
int i, recvlen;
u_char recvbuf[RECVDATA_MAXLENTH];
char buf[256];
int64_t t0, t1;
t0 = get_msec();
memset(recvbuf, 0, sizeof(recvbuf));
if (pPortParam->fd <= 0)
return;
i=0;
recvlen = 0;
for(;;)
{
i += recvlen;
recvlen = read(pPortParam->fd, &recvbuf[i], sizeof(recvbuf)-i);/* 在串口读取字符串 */
t1 = get_msec();
if(t1-t0 >= 350)
break;
}
recvlen = i;
if (recvlen < 1)
return;
#if 1
sprintf(buf, "收到Camera, %d字节数据:", recvlen);
BytestreamLOG(0, buf, recvbuf, recvlen, 'I');
#endif
CameraRecvData(pPortParam, recvbuf, recvlen);
}
int GM_CameraSerialTimer(SIO_PARAM_SERIAL_DEF *pPortParam)
{
int flag = -1;
GM_CameraSerialComRecv(pPortParam);
Gm_FindCameraCommand(pPortParam);
//GM_CameraSerialComRecv(pPortParam);
flag = GM_IsCloseCamera(pPortParam);
return flag;
}
#if 1
// 启动使用串口拍照
int GM_StartSerialCameraPhoto(int phototime, unsigned char channel, int cmdidx, unsigned char bImageSize, unsigned char presetno, char *serfile, unsigned int baud, int addr)
{
int flag = 0;
char szbuf[128], logbuf[128];
SIO_PARAM_SERIAL_DEF *cameraport;
cameraport = (SIO_PARAM_SERIAL_DEF*)malloc(sizeof(SIO_PARAM_SERIAL_DEF));
srdt.RephotographCnt = 0;
cameraport->cameraaddr = addr;
cameraport->Retry = 0;
cameraport->RetryTime = 2000;
cameraport->WaitTime = 0;
cameraport->m_iRevStatus = 0;
cameraport->m_iRecvLen = 0;
cameraport->m_iNeedRevLength = 0;
cameraport->fd = -1;
memset(cameraport->m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCameraCmdFormPollCmdBuf(cameraport);
flag = Gm_OpenCameraSerial(cameraport, serfile, baud);
#if 1
memset(szbuf, 0, sizeof(szbuf));
srdt.iLastGetPhotoNo = -1;
if (0 == cmdidx)
cameraport->image.state = SER_STARTSAMPLE;
if ((0 == cmdidx) && (srdt.presetno > 0))
{
cameraport->SerialCmdidx = 10017;
srdt.iLastGetPhotoNo = cmdidx;
}
else
cameraport->SerialCmdidx = cmdidx;
cameraport->FirstCmdTimeCnt = get_msec();
srdt.sendphotocmdcnt = 0;
//sprintf(szbuf, "摄像机");
//flag = 1;
//if (1 == srdt.ms_dev[i].IsNeedSerial)
//{
//sprintf(logbuf, "装置%d, IsNoInsta=%d, 类型:%s", i + 1, devparam[i].IsNoInsta, szbuf);
//DebugLog(8, logbuf, 'I');
//Gm_OpenSensorsPower();
//Gm_OpenCameraSerial(&cameraport);
//}
#endif
if(-1 == flag)
{
if(NULL != cameraport)
{
free(cameraport);
cameraport = NULL;
}
return -1;
}
if (0x00 == flag)
{
sprintf(szbuf, "摄像机启动串口定时器!");
DebugLog(8, szbuf, 'I');
for (;;)
{
usleep(10);
//LOGW("polltime=%ldms", get_msec()-polltime);
//polltime = get_msec();
if (GM_CameraSerialTimer(cameraport) < 0)
{
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
DebugLog(8, "退出操作摄像机流程!", 'V');
sleep(3);
break;
}
}
}
if(NULL != cameraport)
{
free(cameraport);
cameraport = NULL;
}
return 0;
}
#endif
int CameraPhotoCmd(int phototime, unsigned char channel, int cmdidx, unsigned char bImageSize, unsigned char presetno, char *serfile, unsigned int baud, int addr)
{
pthread_mutex_lock(&camera_mutex);
int flag = 0;
srdt.bImageSize = bImageSize;
srdt.presetno = presetno;
srdt.sendphototime = phototime;
flag = GM_StartSerialCameraPhoto(phototime, channel, cmdidx, bImageSize, presetno, serfile, baud, addr);
pthread_mutex_unlock(&camera_mutex); // 解锁
return flag;
}
/* 串口启动接口函数 结束*/
/* 数据和图片采集数据返回函数 开始*/
int GetWeatherData(Data_DEF *data, int datano)
{
int i;
char logbuf[512], szbuf[128];
if (NULL == data)
return -1;
if ((AirTempNo > datano) || (datano > OpticalRadiationNo))
return -1;
data->EuValue = weatherpntmsg[datano].EuValue;
data->AiState = weatherpntmsg[datano].AiState;
memset(szbuf, 0, sizeof(szbuf));
switch (datano)
{
case AirTempNo:
sprintf(szbuf, "温度");
break;
case HumidityNo:
sprintf(szbuf, "湿度");
break;
case WindSpeedNo:
sprintf(szbuf, "风速");
break;
case WindDirectionNo:
sprintf(szbuf, "风向");
break;
case RainfallNo:
sprintf(szbuf, "雨量");
break;
case AtmosNo:
sprintf(szbuf, "大气压");
break;
case OpticalRadiationNo:
sprintf(szbuf, "日照");
break;
default:
sprintf(szbuf, "未知");
break;
}
sprintf(logbuf, "data_state=%d, %svalue=%0.3f", data->AiState, szbuf,data->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState))
{
weatherpntmsg[datano].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetAirTempData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[AirTempNo].EuValue;
airt->AiState = weatherpntmsg[AirTempNo].AiState;
sprintf(logbuf, "data_state=%d, 温度value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[AirTempNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetHumidityData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[HumidityNo].EuValue;
airt->AiState = weatherpntmsg[HumidityNo].AiState;
sprintf(logbuf, "data_state=%d, 湿度value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[HumidityNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetWindSpeedData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[WindSpeedNo].EuValue;
airt->AiState = weatherpntmsg[WindSpeedNo].AiState;
sprintf(logbuf, "data_state=%d, 风速value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[WindSpeedNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetWindDirectionData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[WindDirectionNo].EuValue;
airt->AiState = weatherpntmsg[WindDirectionNo].AiState;
sprintf(logbuf, "data_state=%d, 风向value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[WindDirectionNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetRainfallData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[RainfallNo].EuValue;
airt->AiState = weatherpntmsg[RainfallNo].AiState;
sprintf(logbuf, "data_state=%d, 雨量value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[RainfallNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetAtmosData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[AtmosNo].EuValue;
airt->AiState = weatherpntmsg[AtmosNo].AiState;
sprintf(logbuf, "data_state=%d, 大气压value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[AtmosNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetOpticalRadiationData(Data_DEF *airt)
{
char logbuf[512];
if (NULL == airt)
return -1;
airt->EuValue = weatherpntmsg[OpticalRadiationNo].EuValue;
airt->AiState = weatherpntmsg[OpticalRadiationNo].AiState;
sprintf(logbuf, "data_state=%d, 日照value=%0.3f", airt->AiState, airt->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == airt->AiState) || (SAMPLINGSUCCESS == airt->AiState))
{
weatherpntmsg[OpticalRadiationNo].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetPullValue(int devno, Data_DEF *data)
{
char logbuf[512];
if (NULL == data)
return -1;
if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno))
return -1;
if (RALLY_PROTOCOL != devparam[devno].ProtocolIdx)
return -1;
data->EuValue = srdt.ms_dev[devno].aiValue[0].EuValue;
data->AiState = srdt.ms_dev[devno].aiValue[0].AiState;
sprintf(logbuf, "装置%d, ID=%d, data_state=%d, 拉力value=%0.3f", devno + 1, devparam[devno].devaddr, data->AiState, data->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState))
{
srdt.ms_dev[devno].aiValue[0].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetAngleValue(int devno, Data_DEF *data, int Xy)
{
char logbuf[512];
if (NULL == data)
return -1;
if ((0 > devno) || (MAX_SERIAL_DEV_NUM < devno))
return -1;
if (SLANT_PROTOCOL != devparam[devno].ProtocolIdx)
return -1;
if ((0 > Xy) || (1 < Xy))
return -1;
data->EuValue = srdt.ms_dev[devno].aiValue[Xy].EuValue;
data->AiState = srdt.ms_dev[devno].aiValue[Xy].AiState;
sprintf(logbuf, "装置%d, ID=%d, data_state=%d, 倾角value[%d]=%0.3f", devno + 1, devparam[devno].devaddr, data->AiState, Xy, data->EuValue);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == data->AiState) || (SAMPLINGSUCCESS == data->AiState))
{
srdt.ms_dev[devno].aiValue[Xy].AiState = SER_IDLE;
return 2;
}
return 1;
}
int GetImage(int devno, IMAGE_DEF *photo)
{
char logbuf[512];
if (NULL == photo)
return -1;
photo->presetno = serialport[0].image.presetno;
photo->phototime = serialport[0].image.phototime;
memset(photo->photoname, 0, sizeof(photo->photoname));
memmove(photo->photoname, serialport[0].image.photoname, sizeof(photo->photoname));
photo->imagelen = serialport[0].image.imagelen;
photo->state = serialport[0].image.state;
sprintf(logbuf, "装置%d, image_state=%d, 预置点:%d,拍照时间:%d, pic_name:%s", devno + 1, photo->state, photo->presetno, photo->phototime, photo->photoname);
DebugLog(8, logbuf, 'I');
if ((SER_SAMPLEFAIL == photo->state) || (SAMPLINGSUCCESS == photo->state))
{
serialport[0].image.state = SER_IDLE;
return 2;
}
return 1;
}
/* 数据和图片采集数据返回函数 结束*/