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

3067 lines
104 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 <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <android/log.h>
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <time.h>
#include "GPIOControl.h"
#include "serialComm.h"
#include "SensorsProtocol.h"
#include <sys/time.h>
#include "SensorsProtocol.h"
//#include "Eint.h"
SIO_PARAM_SERIAL_DEF serialport[MAX_SERIAL_PORT_NUM];
SERIAL_PARAM devparam[MAX_SERIAL_DEV_NUM];
//float weatherpntmsg[10];
static void setInt(int cmd, int value)
{
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
IOT_PARAM param;
param.cmd = cmd;
param.value = value;
// LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value);
if( fd > 0 )
{
ioctl(fd, IOT_PARAM_WRITE, &param);
// LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
close(fd);
}
//return;
}
int getInt(int cmd)
{
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
// LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd);
if( fd > 0 )
{
IOT_PARAM param;
param.cmd = cmd;
ioctl(fd, IOT_PARAM_READ, &param);
#ifdef _DEBUG
ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
#endif
close(fd);
return param.value;
}
return -1;
}
static void setRS485Enable(bool z) {
setInt(CMD_SET_485_EN_STATE, z ? 1 : 0);
}
static void set485WriteMode() {
setInt(CMD_SET_485_STATE, 1);
}
static void set485ReadMode() {
setInt(CMD_SET_485_STATE, 0);
}
static void set12VEnable(bool z) {
setInt(CMD_SET_12V_EN_STATE, z ? 1 : 0);
}
static void setCam3V3Enable(bool enabled)
{
setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0);
}
#if 0
/*********************************************************************************
* 气象数据处理 *
**********************************************************************************/
static void PortDataProcess( void )
{
float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/;
//WORD uDevAddr;
unsigned char cmdidx;
int i, j, aipnt, datanum;
SIO_PARAM_SERIAL_DEF *pPortParam;
char szbuf[64];
pPortParam = &serialport;
//取出装置地址,开始处理地址+++
if(0x02 == pPortParam->m_au8RecvBuf[5])
{
//pPortParam->devaddr = pPortParam->m_au8RecvBuf[4];
return;
}
cmdidx = pPortParam->m_au8RecvBuf[5];
#if 0
aipnt = pPortParam->SameTypeDevIdx;
uDevAddr = serialport->m_au8RecvBuf[4];
if(0 == srdt.IsReadWireTem)
{
if(uDevAddr != pPortParam->devaddr)
return;
}
#endif
fvalua = &fvalue;
datanum = pPortParam->m_au8RecvBuf[6];
if((0x08 != cmdidx) && (0x09 != cmdidx))
return;
for(i = 0, j=7; (i<datanum) && (j<6+pPortParam->m_au8RecvBuf[1]); i++, j+=5 )
{
if(0x08 == cmdidx)
fvalue = (pPortParam->m_au8RecvBuf[j+1]<<24)+(pPortParam->m_au8RecvBuf[j+2]<<16)
+(pPortParam->m_au8RecvBuf[j+3]<<8)+pPortParam->m_au8RecvBuf[j+4];
else
{
*(u_char *)fvalua = pPortParam->m_au8RecvBuf[j+4];
*((u_char *)fvalua+1) = pPortParam->m_au8RecvBuf[j+3];
*((u_char *)fvalua+2) = pPortParam->m_au8RecvBuf[j+2];
*((u_char *)fvalua+3) = pPortParam->m_au8RecvBuf[j+1];
}
switch(pPortParam->m_au8RecvBuf[j])
{
case 1: /*温度*/
weatherpntmsg[0] = fvalue;
LOGE("温度:%0.3f ", fvalue);
break;
case 2: /*气压*/
weatherpntmsg[5] = fvalue;
LOGE("气压:%0.3f ", fvalue);
break;
case 3: /*湿度*/
weatherpntmsg[1] = fvalue;
LOGE("湿度:%0.3f ", fvalue);
break;
case 4: /*雨量*/
break;
case 5: /*日照*/
break;
case 6: /*风速*/
weatherpntmsg[2] = fvalue;
LOGE("风速:%0.3f ", fvalue);
break;
case 7: /*风向*/
weatherpntmsg[3] = fvalue;
LOGE("风向:%0.3f ", fvalue);
break;
case 8: /*拉力*/
case 9: /*倾角传感器X轴倾角*/
case 10: /*倾角传感器Y轴倾角*/
case 11: /*测温球导线温度*/
case 12: /*测温球内部温度*/
break;
case 13: /*测温球导线X轴倾角*/
break;
case 14: /*测温球导线Y轴倾角*/
break;
case 15: /*测温球导线电流*/
break;
case 16: /*测温球电池电压*/
break;
case 17: /*A相泄漏电流平均值*/
break;
case 18: /*A相泄漏电流最大值*/
break;
case 19: /*A相超过3mA的脉冲频次*/
break;
case 20: /*A相超过10mA的脉冲频次*/
break;
case 21: /*B相泄漏电流平均值*/
break;
case 22: /*B相泄漏电流最大值*/
break;
case 23: /*B相超过3mA的脉冲频次*/
break;
case 24: /*B相超过10mA的脉冲频次*/
case 25: /*C相泄漏电流平均值*/
case 26: /*C相泄漏电流最大值*/
case 27: /*C相超过3mA的脉冲频次*/
case 28: /*C相超过10mA的脉冲频次*/
break;
}
}
}
/***************************************************************
* 按照协议格式化接收数据 *
***************************************************************/
static void RecvData(u_char *buf, int len)// 规约读数据处理
{
int i, ictime;
//WORD crc, check;
SIO_PARAM_SERIAL_DEF *pPortParam;
pPortParam = &serialport;
ictime = (int)time(NULL);
if(pPortParam->m_iRecvLen == 0)
{
pPortParam->iRecvTime = ictime;
}
else
{
if((ictime-pPortParam->iRecvTime > 6) || (ictime - pPortParam->iRecvTime < 0))
pPortParam->iRecvTime = ictime;
else if(ictime - pPortParam->iRecvTime > 2)
{
pPortParam->m_iRecvLen = 0;
pPortParam->m_iRevStatus = 0;
}
}
for(i=0; i<len; i++)
{
switch(pPortParam->m_iRevStatus)
{
case 0: // 0x68
pPortParam->m_iRecvLen = 0;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(0x68 == buf[i])
pPortParam->m_iRevStatus++;
else
pPortParam->m_iRevStatus = 18;
break;
case 1: // len1
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iRevStatus++;
break;
case 2: // len2
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(buf[i] == pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen-2])
{
pPortParam->m_iRevStatus++;
pPortParam->m_iNeedRevLength = buf[i]+5;
}
else
pPortParam->m_iRevStatus = 18;
break;
case 3: // 0x68
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iNeedRevLength--;
if(0x68 == buf[i])
pPortParam->m_iRevStatus++;
else
pPortParam->m_iRevStatus = 18;
break;
case 4: // 正确接收数据
pPortParam->m_iNeedRevLength--;
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(pPortParam->m_iNeedRevLength > 0)
break;
if(buf[i] != 0x16)
{
pPortParam->m_iRevStatus=18;
break;
}
//if(CheckLpcError(serialport->m_au8RecvBuf, pPortParam->m_iRecvLen) == TRUE)
{
PortDataProcess();
pPortParam->m_iRevStatus = 0;
pPortParam->RevCmdFlag = 1;
}
pPortParam->m_iRecvLen = 0;
break;
case 255:// 错误接收数据
default:
if(buf[i] == 0x68)
{
pPortParam->m_iRevStatus = 1;
pPortParam->m_iRecvLen = 1;
pPortParam->m_au8RecvBuf[0] = buf[i];
}
else if(buf[i] == 0x16)
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
pPortParam->m_iRevStatus = 0;
pPortParam->m_iRecvLen = 0;
}
else
{
pPortParam->m_au8RecvBuf[pPortParam->m_iRecvLen++] = buf[i];
if(pPortParam->m_iRecvLen > 200)
{
pPortParam->m_iRecvLen = 0;
}
}
break;
}
}
}
static long get_msec(void )
{
struct timeval tv;
gettimeofday(&tv, NULL);
long 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;
long 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);
//long 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;
}
static speed_t getBaudrate(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 -1;
}
}
#endif
//u_char serialstatus[MAX_SERIAL_PORT_NUM];
SRDT_DEF srdt;
AI_DEF weatherpntmsg[WEATHER_DATA_NUM];
AI_DEF rallypntmsg[6][RALLY_DATA_NUM];
AI_DEF slantpntmsg[6][SLANTANGLE_DATA_NUM];
//extern void * memset(void *m, int c, unsigned int n);
//extern int atoi(const char *s);
//extern int Gm_GetSamplingTimeSec(void);
//extern void Delayms(kal_uint32 time);
//extern void srand( unsigned int seed );
//extern int rand( void );
static long get_msec()
{
struct timeval tv;
gettimeofday(&tv, NULL);
long time_in_msec = tv.tv_sec * 1000 + tv.tv_usec/1000;
return time_in_msec;
}
/*
打开串口电源
*/
void Gm_OpenSerialPower()
{
/*由传送的主站的地方来控制串口电源,这里不实现*/;
}
// 关闭串口电源
void Gm_CloseSerialPower()
{
}
// 关闭传感器电源
void Gm_CloseSensorsPower(int port)
{
//char iIoNo;
char szbuf[128];
sprintf(szbuf, "Close Sensors port %d Power!", port);
/* 关闭电源*/
//switch(port)
/* 根据硬件具体布置最后调整,目前是微拍板子的来控制*/
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
}
// 打开传感器电源
void Gm_OpenSensorsPower(int port)
{
//char iIoNo;
char szbuf[128];
if(0 == port)
return;
sprintf(szbuf, "Open Sensors port %d Power!", port);
set12VEnable(true);
setCam3V3Enable(true);
setRS485Enable(true);
/* 打开电源*/
//switch(port)
}
// 查询传感器电源状态
char Gm_GetSensorsPowerState(int port)
{
char iIoNo, cstate=0;
//char szbuf[128];
/* 查询电源状态*/
//switch(port)
return cstate;
}
void BytestreamLOG(char* describe, u_char* buf, int len, char flag)
{
int i;
char szbuf[4096];
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]);
}
switch (flag)
{
case 'E':
LOGE("%s", szbuf);
break;
case 'I':
LOGI("%s", szbuf);
break;
case 'D':
LOGD("%s", szbuf);
break;
case 'V':
LOGV("%s", szbuf);
break;
case 'W':
LOGW("%s", szbuf);
break;
default:
LOGI("%s", szbuf);
break;
}
}
// 打开串口通讯
void Gm_OpenSerialPort(int devidx)
{
int fd = -1;
if((devidx < 0) || (devidx >= MAX_SERIAL_DEV_NUM))
return;
if(serialport[devparam[devidx].commid].fd < 0)
{
fd = open(devparam[devidx].pathname, O_RDWR | O_NDELAY);
if(fd < 0)
{
LOGE("装置%d 打开串口%d失败fd=%d\n", devidx+1, devparam[devidx].commid+1, fd);
return;
}
LOGI("装置%d 打开串口%d成功fd=%d\n", devidx+1, devparam[devidx].commid+1, fd);
serialport[devparam[devidx].commid].fd = fd;
return;
}
LOGI("装置%d 串口%d已经打开fd=%d\n", devidx+1, devparam[devidx].commid+1, serialport[devparam[devidx].commid].fd);
}
// 关闭串口通讯
void Gm_CloseSerialPort()
{
int i;
for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{
if(serialport[i].fd > 0)
{
close(serialport[i].fd);
serialport[i].fd = -1;
}
}
}
/*******************************************************************************
函数名称: int GM_SerialComSend(const BYTE * cSendBuf, DWORD nSendLen, int commid)
功能说明:串口发送数据 返回实际发送的字节数
输入参数:
输出参数:
其它说明:
*********************************************************************************/
int GM_SerialComSend(unsigned char * cSendBuf, unsigned long nSendLen, int commid)
{
int i, len;
char szbuf[512];
len = write(serialport[commid].fd, cSendBuf, nSendLen);/* 向串囗发送字符串 */
//serialport[commid].RevCmdFlag = 0;
//LOGE("发送命令时间差%ld毫秒", get_msec() - isendtime);
//isendtime = time(NULL);
//isendtime = get_msec();
if (len < 0)
{
LOGE("write data error \n");
return -1;
}
else if(len > 0)
{
//memset(szbuf, 0, sizeof(szbuf));
//sprintf(szbuf, "串口%d发送%d字节", commid+1, len);
//BytestreamLOG(szbuf, cSendBuf, len, 'D');
#if 0
for (i = 0; i < len; i++)
{
sprintf(szbuf, "%s %02X", szbuf, cSendBuf[i]);
}
LOGE("%s", szbuf);
#endif
}
return len;
}
int Gm_SetSerialPortParam(int commid)
{
int ret;
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)
{
LOGE("串口%d 波特率等参数设置错误!", commid+1);
return -1;
}
return ret;
}
void Gm_InitSerialComm_Test()
{
int i, j;
srdt.sampling = 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;
devparam[0].ProtocolIdx = WEATHER_PROTOCOL;
devparam[0].baudrate = B9600;
devparam[0].databit = 8;
memset(devparam[0].stopbit, 0, sizeof(devparam[0].stopbit));
sprintf(devparam[0].stopbit, "1");
devparam[0].parity = 0;
devparam[0].IsNoInsta = 1;
//devparam[0].PowerPort = 2;
//devparam[0].devaddr = 4;
devparam[0].devaddr = 10;
devparam[1].ProtocolIdx = WEATHER_PROTOCOL;
devparam[1].baudrate = B9600;
devparam[1].databit = 8;
memset(devparam[1].stopbit, 0, sizeof(devparam[1].stopbit));
sprintf(devparam[1].stopbit, "1");
devparam[1].parity = 0;
devparam[1].IsNoInsta = 1;
//devparam[1].PowerPort = 14;
//devparam[1].devaddr = 1;
devparam[1].devaddr = 2;
devparam[2].ProtocolIdx = RALLY_PROTOCOL;
devparam[2].baudrate = B9600;
devparam[2].databit = 8;
memset(devparam[2].stopbit, 0, sizeof(devparam[2].stopbit));
sprintf(devparam[2].stopbit, "1");
devparam[2].parity = 0;
devparam[2].IsNoInsta = 1;
//devparam[2].PowerPort = 3;
//devparam[2].devaddr = 13;
devparam[2].devaddr = 13;
#if 0
devparam[3].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[3].baudrate = 9600;
devparam[3].databit = 8;
devparam[3].stopbit = 1;
devparam[3].parity = 0;
devparam[3].IsNoInsta = 0;
//devparam[3].PowerPort = 15;
devparam[3].CameraChannel = 1;
devparam[3].devaddr = 0;
devparam[4].ProtocolIdx = WDIITEMP_PROTOCOL_NEW;
devparam[4].baudrate = 1200;
devparam[4].databit = 8;
devparam[4].stopbit = 1;
devparam[4].parity = 0;
devparam[4].IsNoInsta = 0;
//devparam[4].PowerPort = 17;
devparam[4].devaddr = 4;
devparam[5].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[5].baudrate = 9600;
devparam[5].databit = 8;
devparam[5].stopbit = 1;
devparam[5].parity = 0;
devparam[5].IsNoInsta = 1;
//devparam[5].PowerPort = 6;
devparam[5].devaddr = 11;
devparam[6].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[6].baudrate = 9600;
devparam[6].databit = 8;
devparam[6].stopbit = 1;
devparam[6].parity = 0;
devparam[6].IsNoInsta = 1;
//devparam[6].PowerPort = 6;
devparam[6].devaddr = 12;
devparam[7].ProtocolIdx = RALLY_PROTOCOL_NEW;
devparam[7].baudrate = 9600;
devparam[7].databit = 8;
devparam[7].stopbit = 1;
devparam[7].parity = 0;
devparam[7].IsNoInsta = 1;
//devparam[7].PowerPort = 6;
devparam[7].devaddr = 10;
devparam[8].ProtocolIdx = PELCO_P_PROTOCOL;
devparam[8].baudrate = 9600;
devparam[8].databit = 8;
devparam[8].stopbit = 1;
devparam[8].parity = 0;
devparam[8].IsNoInsta = 0;
//devparam[8].PowerPort = 10;
devparam[8].CameraChannel = 2;
devparam[8].devaddr = 0;
devparam[9].ProtocolIdx = WDIITEMP_PROTOCOL_NEW;
devparam[9].baudrate = 9600;
devparam[9].databit = 8;
devparam[9].stopbit = 1;
devparam[9].parity = 0;
devparam[9].IsNoInsta = 1;
//devparam[9].PowerPort = 17;
devparam[9].devaddr = 47;
devparam[10].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[10].baudrate = 9600;
devparam[10].databit = 8;
devparam[10].stopbit = 1;
devparam[10].parity = 0;
devparam[10].IsNoInsta = 1;
//devparam[10].PowerPort = 5;
devparam[10].devaddr = 7;
devparam[11].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[11].baudrate = 9600;
devparam[11].databit = 8;
devparam[11].stopbit = 1;
devparam[11].parity = 0;
devparam[11].IsNoInsta = 1;
//devparam[11].PowerPort = 6;
devparam[11].devaddr = 6;
devparam[12].ProtocolIdx = LCURRENT_PROTOCOL;
devparam[12].baudrate = 9600;
devparam[12].databit = 8;
devparam[12].stopbit = 1;
devparam[12].parity = 0;
devparam[12].IsNoInsta = 1;
//devparam[12].PowerPort = 8;
devparam[12].devaddr = 5;
#endif
devparam[13].ProtocolIdx = SLANT_PROTOCOL;
devparam[13].baudrate = B9600;
devparam[13].databit = 8;
memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
sprintf(devparam[13].stopbit, "1");
devparam[13].parity = 0;
//devparam[13].PowerPort = 4;
devparam[13].IsNoInsta = 1;
devparam[13].devaddr = 2;
#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;
#endif
#if 0
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;
// 6 气象
// 空气温度
weatherpntmsg[0].AiParam.fFactor = 1.0;
weatherpntmsg[0].AiParam.EuValueDelta = 50;
// 相对湿度
weatherpntmsg[1].AiParam.fFactor = 1.0;
weatherpntmsg[1].AiParam.EuValueDelta = 0;
// 风速
weatherpntmsg[2].AiParam.fFactor = 0.01;
weatherpntmsg[2].AiParam.EuValueDelta = 0;
// 风向
weatherpntmsg[3].AiParam.fFactor = 0.001;
weatherpntmsg[3].AiParam.EuValueDelta = 0;
// 降水强度
weatherpntmsg[4].AiParam.fFactor = 60;
weatherpntmsg[4].AiParam.EuValueDelta = 0;
// 相对空气压力
weatherpntmsg[5].AiParam.fFactor = 1.0;
weatherpntmsg[5].AiParam.EuValueDelta = 0;
// 备用
weatherpntmsg[6].AiParam.fFactor = 1.0;
weatherpntmsg[6].AiParam.EuValueDelta = 0;
// 备用
weatherpntmsg[7].AiParam.fFactor = 1.0;
weatherpntmsg[7].AiParam.EuValueDelta = 0;
smokepntmsg[0].AiParam.EuValueDelta = 0;
smokepntmsg[0].AiParam.fFactor = 0.1;
rizhaopntmsg[0].AiParam.fFactor = 1.0;
rizhaopntmsg[0].AiParam.EuValueDelta = 0;
rizhaopntmsg[1].AiParam.fFactor = 2.5;
rizhaopntmsg[1].AiParam.EuValueDelta = 0;
slantpntmsg[0][0].AiParam.fFactor = 100.0;
slantpntmsg[0][0].AiParam.EuValueDelta = 0;
slantpntmsg[0][1].AiParam.fFactor = 100.0;
slantpntmsg[0][1].AiParam.EuValueDelta = 0;
slantpntmsg[1][0].AiParam.fFactor = 100.0;
slantpntmsg[1][0].AiParam.EuValueDelta = 0;
slantpntmsg[1][1].AiParam.fFactor = 100.0;
slantpntmsg[1][1].AiParam.EuValueDelta = 0;
for(i=0; i<6; i++)
for(j=0; j<RALLY_DATA_NUM; j++)
{
rallypntmsg[i][j].AiParam.fFactor = 1.0;
rallypntmsg[i][j].AiParam.EuValueDelta = 0;
}
#endif
}
// 初始化所有串口及所接传感器的配置
void Gm_InitSerialComm()
{
int i;
char szbuf[128];
Gm_InitSerialComm_Test();
// srdt 配置
//srdt.sampling = 0;
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
//srdt.SendStopPtzCmdTimeCnt=-1; // 发送云台停止指令计数
//srdt.uRunMode = 0;
//srdt.CommMod = 0;
// 查找装置使用的串口序号
//FindDevUseSerialCommNo();
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
srdt.ms_dev[i].uOpenPowerFlag = CLOSEPOWER;
#endif
#if 1
//******************** 端口基本信息 ************************
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx)
{
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, "地址%d!", devparam[i].devaddr);
LOGI("%s", szbuf);
if(0 == devparam[i].IsNoInsta)
sprintf(szbuf, "没有启用!");
else
sprintf(szbuf, "已启用!");
LOGI("%s", szbuf);
}
#endif
#if 0
//u_char UseSerialidx; // 使用的串口序号
// 数据参数配置
sprintf(szbuf, "气象数据参数:");
DebugStringPrintf(szbuf, strlen(szbuf), 1);
//weatherpntmsg[0].AiParam.EuValueDelta = 500;
sprintf(szbuf, "温度系数%4.2f, 偏移%4.2f", weatherpntmsg[0].AiParam.fFactor, weatherpntmsg[0].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "湿度系数%4.2f, 偏移%4.2f", weatherpntmsg[1].AiParam.fFactor, weatherpntmsg[1].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "风速系数%4.2f, 偏移%4.2f", weatherpntmsg[2].AiParam.fFactor, weatherpntmsg[2].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "风向系数%4.2f, 偏移%4.2f", weatherpntmsg[3].AiParam.fFactor, weatherpntmsg[3].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "雨量系数%4.2f, 偏移%4.2f", weatherpntmsg[4].AiParam.fFactor, weatherpntmsg[4].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "空气压力系数%4.2f, 偏移%4.2f", weatherpntmsg[5].AiParam.fFactor, weatherpntmsg[5].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "烟雾数据参数:");
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "CO2浓度系数%4.2f, 偏移%4.2f", smokepntmsg[0].AiParam.fFactor, smokepntmsg[0].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
#if 0
sprintf(szbuf, "日照数据参数:");
DebugStringPrintf(szbuf, strlen(szbuf), 1);
sprintf(szbuf, "日照系数%4.2f, 偏移%4.2f", rizhaopntmsg[0].AiParam.fFactor, rizhaopntmsg[0].AiParam.EuValueDelta);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
#endif
#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:
case SLANT_PROTOCOL:
case RALLY_PROTOCOL:
case SERIALCAMERA_PROTOCOL:
memset(devparam[i].pathname, 0, sizeof(devparam[i].pathname));
/* 目前还不确定具体串口分配暂时默认使用串口1</dev/ttyS0>*/
sprintf(devparam[i].pathname, "/dev/ttyS0");
devparam[i].commid = 0;
break;
default:
devparam[i].IsNoInsta = 0;
break;
}
}
}
void GM_StartSerialComm()
{
int i, j;
char szbuf[64];
long polltime=0;
// 测试使用初始化配置
Gm_InitSerialComm();
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
memset((void*)srdt.curdevidx, 0, sizeof(srdt.curdevidx));
//Gm_OpenSerialPower(); /* 不在这使用*/
FindDevUseSerialCommNo();
//Gm_InitSensorsIsUse();
// 初始化串口使用状态
for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{
serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1;
ClearCmdAllFlag(i);
}
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx)
{
case WEATHER_PROTOCOL: // 气象
sprintf(szbuf, "气象");
srdt.ms_dev[i].IsNeedSerial = 1;
break;
case RALLY_PROTOCOL: /* 拉力*/
sprintf(szbuf, "拉力");
srdt.ms_dev[i].IsNeedSerial = 1;
break;
case WIND_PROTOCOL: /* 风速风向*/
sprintf(szbuf, "风速风向");
srdt.ms_dev[i].IsNeedSerial = 1;
break;
case SLANT_PROTOCOL: /* 倾角*/
sprintf(szbuf, "倾角");
srdt.ms_dev[i].IsNeedSerial = 1;
break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
sprintf(szbuf, "摄像机");
break;
default:
srdt.ms_dev[i].IsNeedSerial = 0;
sprintf(szbuf, "无效传感器");
break;
}
LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf);
if(0 == devparam[i].IsNoInsta)
{
srdt.ms_dev[i].IsNeedSerial = 0;
continue;
}
// 测试查询传感器电源状态
#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电源
// 打开串口通讯
if(1 == srdt.ms_dev[i].IsNeedSerial)
{
Gm_OpenSensorsPower(i);
Gm_OpenSerialPort(i);
}
//LOGV("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
}
LOGI("启动数据采样!");
/* 直接使用循环进行采样处理*/
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));
LOGV("退出采样流程!");
sleep(15);
GM_StartSerialComm();
//break;
}
}
return;
}
#if 1
// 启动使用串口拍照
void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
{
BYTE bCameratype=SPEED_DOME_CAMERA;
int i, flag=0;
char szbuf[64];
srdt.RephotographCnt = 0;
FindDevUseSerialCommNo();
#if 0
//sprintf(szbuf, "sampling=%02X !", srdt.sampling);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
//if(0 == srdt.selfflag)
// srdt.selfflag = 1;
//Gm_OpenSerialPower();
//Gm_OpenSensorsPower();
//if(0x00 == srdt.sampling)
//{
// Gm_OpenSerialPort();
//}
if(0 == (srdt.sampling & 0x04))
{
srdt.sampling |= 4;
flag = 1;
}
if(0x01 == (srdt.sampling & 0x01))
flag = 0;
#endif
// 初始化串口使用状态
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
srdt.ms_dev[i].recvdatacnt = 0;
srdt.ms_dev[i].m_iRevStatus = 0;
srdt.ms_dev[i].m_iRecvLen = 0;
srdt.ms_dev[i].m_iNeedRevLength = 0;
//sprintf(szbuf, "装置%d, IsNoInsta=%d, 规约序号=%d", i+1, srdt.ms_dev[i].IsNoInsta, srdt.ms_dev[i].ProtocolIdx);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
if(0 == devparam[i].IsNoInsta)
{
srdt.ms_dev[i].IsNeedSerial = 0;
continue;
}
switch(devparam[i].ProtocolIdx)
{
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/
case PELCO_D_PROTOCOL: /* 摄像机协议*/
if((1>devparam[i].CameraChannel) || (devparam[i].CameraChannel >MAX_CHANNEL_NUM))
{
srdt.ms_dev[i].IsNeedSerial = 0;
break;
}
if(channel == devparam[i].CameraChannel)
{
;
}
else
break;
if(SERIAL_CAMERA == bCameratype)
{
if(0 == srdt.ms_dev[i].IsNeedSerial)
srdt.iLastGetPhotoNo = -1;
else
srdt.iLastGetPhotoNo = srdt.ms_dev[i].SerialCmdidx;
srdt.ms_dev[i].IsNeedSerial = 1;
srdt.ms_dev[i].SerialCmdidx = cmdidx;
srdt.ms_dev[i].FirstCmdTimeCnt = -1;
srdt.sendphotocmdcnt = 0;
break;
}
srdt.ms_dev[i].IsNeedSerial = 0;
break;
default:
if(1 == srdt.ms_dev[i].IsNeedSerial)
break;
srdt.ms_dev[i].IsNeedSerial = 0;
break;
}
}
//if(0x01 == flag)
//{
sprintf(szbuf, "摄像机拍照启动串口定时器!");
LOGI("%s", szbuf);
//StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer);
//}
return;
}
#endif
int GM_SerialTimer(void)
{
int flag = -1;
GM_AllSerialComRecv();
GM_IsCloseSensors();
Gm_FindAllSensorsCommand();
GM_AllSerialComRecv();
flag = GM_CloseTimer();
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
return flag;
}
/********************************************************************************
函数名称: void Gm_FindAllSensorsCommand()
功能说明:轮询所有串口和传感器是否需要生成下发命令
输入参数:
输出参数:
其它说明:
*********************************************************************************/
void Gm_FindAllSensorsCommand(void)
{
int i, j,curidx,flag;
//Gm_CheckSensorsPower(); /* 暂时不考虑电源控制*/
for(j=0; 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: /* 摄像机协议*/
flag = FindNextCameraPhotoCommand(curidx);
break;
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
break;
}
if(flag == -1)
continue;
srdt.curdevidx[j] = curidx;
break;
}
// 发送缓冲区中命令 生成了命令之后紧接着进行命令发送
SendCmdFormPollCmdBuf(j);
}
}
/********************************************************************************
函数名称: void GM_IsCloseSensors()
功能说明:检查所有传感器是否采集完毕,采集完毕的关闭传感器电源
输入参数:
输出参数:
其它说明:
*********************************************************************************/
void GM_IsCloseSensors(void)
{
int i;
char buf[256];
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if(srdt.ms_dev[i].IsNeedSerial == 0)
continue;
switch(devparam[i].ProtocolIdx)
{
case WEATHER_PROTOCOL: /* 气象*/
case RALLY_PROTOCOL: /* 拉力*/
case WIND_PROTOCOL: /* 风速风向*/
case SLANT_PROTOCOL: /* 倾角*/
if((get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt > 50*1000) ||(get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt < 0))
{
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
break;
}
if(get_msec()- srdt.ms_dev[i].FirstCmdTimeCnt > 15*1000)
{
srdt.ms_dev[i].IsNeedSerial = 0;
// 关闭传感器电源
LOGI("读取装置%d数据%0.3f秒,关闭装置%d电源!", i+1, (get_msec()-srdt.ms_dev[i].FirstCmdTimeCnt)/1000.0,i+1);
//Gm_CtrlCloseSensorsPower(i);
}
break;
case PELCO_D_PROTOCOL: /* 摄像机类型*/
case PELCO_P_PROTOCOL: /* 摄像机类型*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
if(-1 == srdt.ms_dev[i].SerialCmdidx)
{
if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT)
{
srdt.ms_dev[i].IsNeedSerial = 0;
srdt.sampling &= 0xFB;
memset(buf, 0, sizeof(buf));
LOGI("通道%d摄像机使用完毕!可以关闭摄像机电源!", devparam[i].CameraChannel);
//netportparam.SerialCameraPowerCtrl[srdt.ms_dev[i].CameraChannel-1] = 0;
//if(0 == netportparam.InitTimeFlag)
// Gm_CtrlCloseSensorsPower(i);
}
}
srdt.ms_dev[i].FirstCmdTimeCnt++;
break;
}
}
}
/********************************************************************************
函数名称: void GM_AllSerialComRecv()
功能说明:检查所有串口是否有数据接收,有则启动接收
输入参数:
输出参数:
其它说明:
*********************************************************************************/
void GM_AllSerialComRecv(void)
{
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)
break;
sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen);
BytestreamLOG(buf, recvbuf, recvlen, 'I');
SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen);
}
}
/********************************************************************************
函数名称: int GM_CloseTimer()
功能说明:
输入参数:
输出参数:
其它说明:
*********************************************************************************/
int GM_CloseTimer(void)
{
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 // 关闭所有串口及电源
{
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if((srdt.ms_dev[i].IsNeedSerial == 1) && (7 == devparam[i].ProtocolIdx))
break;
}
if(i<MAX_SERIAL_DEV_NUM)
{
if(-1 == srdt.tempsamplingstartime)
{
;
}
for(j=0; j<MAX_SERIAL_DEV_NUM; j++)
{
if(srdt.ms_dev[j].IsNeedSerial == 0)
continue;
switch(devparam[j].ProtocolIdx)
{
case 7: // 测温
Gm_SetSerialPortParam(srdt.ms_dev[j].UseSerialidx);
iretime = (int)get_msec()/1000-srdt.ms_dev[j].FirstCmdTimeCnt;
//if(iretime > 35)
//{
// if((devparam[j].PowerPort) == 0)
{
sprintf(buf, "打开无线模块电源!当前时间%d秒起始时间%d秒",
(int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt);
LOGI("%s", buf);
}
//}
#if 1
//samtime = (int)(Gm_GetSamplingTimeSec()-10);
//if(iretime > samtime)
if(iretime > 155)
{
srdt.ms_dev[j].IsNeedSerial = 0;
//srdt.tempsamplingstartime = -1;
srdt.tempsamplingsucctime = -1;
// 关闭传感器电源
memset(buf, 0, sizeof(buf));
sprintf(buf, "关闭无线模块电源!当前时间%d秒起始时间%d秒采样间隔时间10",
(int)time(NULL), srdt.ms_dev[j].FirstCmdTimeCnt/*, samtime*/);
LOGI("%s", buf);
//Gm_CtrlCloseSensorsPower(j);
}
#endif
break;
}
}
//StartTimer(GM_SERIAL_START, TIMER_CNT, GM_SerialTimer);
}
else
{
#endif
#if 0
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if((srdt.ms_dev[i].IsNeedSerial == 1) && (RESERVE5_PROTOCOL == devparam[i].ProtocolIdx))
break;
}
if(i<MAX_SERIAL_DEV_NUM)
return;
else
{
#endif
Gm_CloseSerialPort();
for(j=0; j< MAX_SERIAL_DEV_NUM; j++)
Gm_CloseSensorsPower(j);
for(j=0; j<MAX_SERIAL_PORT_NUM; j++)
ClearCmdFormPollCmdBuf(j);
sprintf(buf, "关闭串口定时器!");
LOGI("%s", buf);
return -1;
#if 0
//g_usleep &= 0xFE;
//if(0 == g_usleep)
{
sprintf(buf, "采集数据结束模块休眠!");
LOGI("%s", buf);
//if(0 == srdt.uRunMode)
// L1SM_SleepEnable(l1handle);
}
//sprintf(buf, "usleep=%d", g_usleep);
//DebugStringPrintf(buf, strlen(buf), 1);
srdt.sampling &= 0xFA;
if(1 == srdt.uRunMode)
{
GM_StartSerialComm();
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
srdt.ms_dev[i].FirstCmdTimeCnt = 4*1000/TIMER_CNT;
}
}
srdt.tempsamplingstartime = -1;
}
#endif
#if 0
if(0 == srdt.selfflag)
;
else
;//Gm_CloseSerialPower();
//srdt.clcyesampling = 0;
//Gm_CloseAllSensorsPower();
//srdt.selfflag = 0;
//}
#endif
}
}
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 RESERVE5_PROTOCOL: /* 网络安全加密协议*/
//EncryptRecvData(devidx, buf, len);
break;
case SERIALCAMERA_PROTOCOL: /* 青青子木串口摄像机协议*/
break;
}
}
/*********************************************************************************
CameraPhoto 端口数据处理
**********************************************************************************/
void CameraPhotoPortDataProcess( int port)
{
RTUMSG rtumsg;
SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *serialport;
int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime;
char szbuf[128];
WORD uDevAddr;
BYTE cmdidx, recvend;
pPortParam = &srdt.ms_dev[port];
serialport = &serialport[pPortParam->UseSerialidx];
memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData));
memcpy((void*)rtumsg.MsgData, (void*)serialport->m_au8RecvBuf, pPortParam->m_iRecvLen);
rtumsg.MsgLen = pPortParam->m_iRecvLen;
rtumsg.PortIdx = port;
cmdidx = serialport->m_au8RecvBuf[5];
uDevAddr = serialport->m_au8RecvBuf[4];
//sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
if(uDevAddr != devparam[port].devaddr)
return;
switch(cmdidx)
{
case 0x10: /* 拍照应答*/
if(0xFF == rtumsg.MsgData[6])
{
srdt.RephotographCnt++;
if(srdt.RephotographCnt > 2)
{
pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
}
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;
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);
srdt.imagepacketnum = packetnum;
srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8);
sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
//presetno = (int)GetPhotoPresetNo(pPortParam->CameraChannel);
presetno = (int)rtumsg.MsgData[i+8];
//if(0 == netportparam.InitTimeFlag)
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = 10001;
/* 保存图片*/
//break
}
serialport->RevCmdFlag = 1;
pPortParam->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0;
break;
case 0x11: /* 图片数据包*/
// if(0 == netportparam.InitTimeFlag)
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = 10001;
/* 保存图片*/
//break;
}
i = 6;
iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256;
packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256;
sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
serialport->RevCmdFlag = 1;
pPortParam->FirstCmdTimeCnt = 0;
if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2]))
{
if(1 == recvend)
pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/
else if(0xFF == recvend)
{
pPortParam->SerialCmdidx = -1;
}
else
{
if((iNo > srdt.imagepacketnum) || (0 >= srdt.imagepacketnum))
{
pPortParam->SerialCmdidx = -1;
}
else
pPortParam->SerialCmdidx = iNo+1;
}
srdt.errorPhotoNoCnt = 0;
break;
}
srdt.errorPhotoNoCnt++;
sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!",
pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt);
if(srdt.errorPhotoNoCnt > 5)
{
pPortParam->SerialCmdidx = 0;
srdt.RephotographCnt++;
if(srdt.RephotographCnt > 2)
{
pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
}
}
break;
case 0x03:
sprintf(szbuf, "设置波特率%d成功", devparam[port].baudrate);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
//pPortParam->Baud = serialport->Baud;
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
serialport->RevCmdFlag = 1;
pPortParam->FirstCmdTimeCnt = 0;
break;
case 0x15:
if(0xFF == rtumsg.MsgData[6])
{
pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "没有历史图片!结束读取图片!");
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
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;
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);
srdt.imagepacketnum = packetnum;
srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8);
//presetno = netportparam.CurPresetno[pPortParam->CameraChannel-1];
presetno = rtumsg.MsgData[i+8];
sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
//if(0 == netportparam.InitTimeFlag)
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = -1;
//netportparam.PhotosFlag = FALSE;
break;
}
serialport->RevCmdFlag = 1;
pPortParam->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0;
break;
case 0x16:
if(0xFF == rtumsg.MsgData[10])
{
pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "图片保存失败!");
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
}
if(0 == rtumsg.MsgData[10])
{
if(0 == srdt.historyimagenum[devparam[port].CameraChannel-1])
{
//netportparam.SerialCameraPowerCtrl[devparam[port].CameraChannel-1] = 0;
srdt.sampling &= 0xFB;
}
else
pPortParam->FirstCmdTimeCnt = -3*60*1000/TIMER_CNT;
}
else
{
srdt.sampling &= 0xFB;
//netportparam.SerialCameraPowerCtrl[pPortParam->CameraChannel-1] = 0;
}
pPortParam->SerialCmdidx = -1;
serialport->RevCmdFlag = 1;
//if(0 == netportparam.InitTimeFlag)
break;
default:
serialport->RevCmdFlag = 1;
break;
}
}
long lsendtime=0;
/*********************************************************************************
发送命令
**********************************************************************************/
void SendCmdFormPollCmdBuf( int port )
{
char buf[64];
int len, idelay=0, ret;
SIO_PARAM_SERIAL_DEF *pPortParam;
//int recvlen;
//u_char recvbuf[300];
pPortParam = &serialport[port];
if(pPortParam->ForceWaitFlag && pPortParam->ForceWaitCnt)
{
pPortParam->ForceWaitCnt--;
return;
}
if(pPortParam->SendCmdFlag && (pPortParam->RevCmdFlag == 0))
{
pPortParam->RetryTimeCnt++;
//if(srdt.sendphotocmdcnt > 0)
// idelay = 10*1000/TIMER_CNT;
//LOGV("polltime:%ldms", get_msec()-srdt.ms_dev[0].FirstCmdTimeCnt);
if(pPortParam->RetryTimeCnt < (pPortParam->RetryTime+idelay))
{
return;
}
pPortParam->RetryTimeCnt = 0;
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)
{
pPortParam->WaitTimeCnt++;
if(pPortParam->WaitTimeCnt < pPortParam->WaitTime)
{
return;
}
}
pPortParam->WaitTimeCnt = 0;
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;
ret = Gm_SetSerialPortParam(port);
if(ret < 0)
return;
len = GM_SerialComSend(&pPortParam->PollCmd[2], pPortParam->cmdlen-2, port);
if(len < 1)
{
LOGE("串口%d, 发送命令失败!", port+1);
}
else
{
sprintf(buf, "发送串口%d 装置%d命令:", port+1, srdt.curdevidx[port]+1);
BytestreamLOG(buf, &pPortParam->PollCmd[2], len, 'D');
LOGW("sendtimeconst= %ld", get_msec()-lsendtime);
lsendtime = get_msec();
}
pPortParam->SendCmdFlag = 1;
pPortParam->ReSendCmdFlag = 0;
pPortParam->RevCmdFlag = 0;
pPortParam->RetryTimeCnt = 0;
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 = 0;
serialport[commid].WaitTimeCnt = 0;
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);
}
// 下发串口拍照指令控制
int FindNextCameraPhotoCommand(int devidx)
{
int imagesize=3, cmdno;
BYTE channel, imagequality=50;
WORD packetsize;
BYTE cmdidx=0x10;
char szbuf[128];
//如果命令缓冲区仍有命令,则退出本函数
if((srdt.ms_dev[devidx].UseSerialidx < 1) || (srdt.ms_dev[devidx].UseSerialidx >= MAX_SERIAL_PORT_NUM))
return -1;
if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/
return -1;
cmdno = srdt.ms_dev[devidx].SerialCmdidx;
if(0 == cmdno)/* 下发拍照指令*/
{
if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 4*1000/TIMER_CNT)
{
return -1;
}
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT)
{
srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "串口摄像机未接或故障!结束拍照!");
LOGI("%s", szbuf);
return -1;
}
channel = devparam[devidx].CameraChannel;
if((1>channel) || (channel >MAX_CHANNEL_NUM))
{
/* 通道号错误退出拍照流程*/;
srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "装置配置中,通道号配置错误!结束拍照!");
LOGI("%s", szbuf);
}
packetsize = (WORD)MAX_PHOTO_FRAME_LEN;
srdt.sendphotocmdcnt++;
srdt.imagepacketnum = 0;
srdt.errorPhotoNoCnt = 0;
cmdidx = 0x10;
srdt.sendphototime=(int)time(NULL);
}
else if(10000 == cmdno)/* 下发设置串口波特率命令*/
{
switch(devparam[devidx].baudrate)
{
case 9600:
imagesize = 0x07;
break;
case 14400:
imagesize = 0x08;
break;
case 19200:
imagesize = 0x08;
break;
case 38400:
imagesize = 0x09;
break;
case 57600:
imagesize = 0x09;
break;
case 115200:
imagesize = 0x09;
break;
default:
sprintf(szbuf, "设置串口摄像机参数时,配置参数错误!退出设置!");
LOGI("%s", szbuf);
srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo;
return -1;
}
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000/TIMER_CNT)
{
srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "设置串口摄像机参数时15秒未收到摄像机应答!退出设置!");
LOGI("%s", szbuf);
return -1;
}
cmdidx = 0x03;
packetsize = 0xFFFF;
}
else if((10001 == cmdno)||(10002 == cmdno))/* 通知摄像机图片读取完成或存储16H*/
{
cmdidx = 0x16;
if(10001 == cmdno)
packetsize = 1;
else
packetsize = 0;
imagesize = srdt.photographtime; /* 需要保存或删除的图片拍摄时间*/
}
else if(10003 == cmdno) /* 读取历史图片15H*/
{
cmdidx = 0x15;
packetsize = (WORD)MAX_PHOTO_FRAME_LEN;
srdt.sendphototime=(int)time(NULL);
}
else
{
imagesize = 0xFF;
packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx;
cmdidx = 0x11;
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT)
{
srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize);
LOGI("%s", szbuf);
return -1;
}
}
MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx;
return 1;
}
/*********************************************************************************
生成 CameraPhoto命令
**********************************************************************************/
void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoParam, BYTE Threep )
{
int i, icurtime;
u_char *sendbuf;
//char szbuf[128];
sendbuf = serialport[srdt.ms_dev[portno].UseSerialidx].PollCmd;
icurtime = (int)time(NULL);
i = 0;
sendbuf[i++] = 0x00; /* 强制等待时间*/
sendbuf[i++] = 0x00; /* 强制等待时间*/
sendbuf[i++] = 0x68; /* 起始字符*/
sendbuf[i++] = (BYTE)0x00; /* length */
sendbuf[i++] = (BYTE)0x00; /* length */
sendbuf[i++] = 0x68; /* 起始字符*/
sendbuf[i++] = (BYTE)devparam[portno].devaddr;/* 传感器地址*/
sendbuf[i++] = cmdidx; /* 命令字*/
switch(cmdidx)
{
case 0x03: /*设置传感器通讯参数03H*/
sendbuf[i++] = 0x00; /* 波特率*/
sendbuf[i++] = 0x00;
sendbuf[i++] = 0x00;
sendbuf[i++] = (BYTE)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++] = 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++] = (BYTE)TwoParam; /* 是否需要保存*/
break;
}
sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6);
i+= 1;
sendbuf[i++] = 0x16; /* 信息尾*/
sendbuf[3] = (BYTE)((i-10)>>8);
sendbuf[4] = (BYTE)(i-10);
serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i;
return;
}
// 准备发送云台指令
int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd)
{
int i;
char szbuf[64];
srdt.PtzCmdType = ptzcmd;
// 查找装置序号
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if((channel == devparam[i].CameraChannel) && ((devparam[i].ProtocolIdx ==PELCO_P_PROTOCOL)
|| (devparam[i].ProtocolIdx ==PELCO_D_PROTOCOL)))
break;
}
if(i == MAX_SERIAL_DEV_NUM)
{
sprintf(szbuf, "没有找到摄像机使用的通道和串口通讯协议");
LOGI("%s", szbuf);
return 1;
}
if((2 > srdt.ms_dev[i].UseSerialidx+1) ||(MAX_SERIAL_PORT_NUM < srdt.ms_dev[i].UseSerialidx+1))
{
sprintf(szbuf, "通道%d摄像机错误的使用了串口%d", channel, srdt.ms_dev[i].UseSerialidx+1);
LOGI("%s", szbuf);
return 1;
}
else
{
sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1);
LOGI("%s", szbuf);
}
srdt.usecameradevidx = i;
// 查找串口序号
srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx;
//if(0 == srdt.sampling)
//{
// 1.打开串口电源
Gm_OpenSerialPower();
// 2.打开串口通讯
Gm_OpenSerialPort(i);
//}
srdt.sampling |= 2;
srdt.SendStopPtzCmdTimeCnt = -1;
//return 1;
return Gm_Camera_Timer();
//return 1;
}
// 发送转动摄像机云台命令定时器
int Gm_Camera_Timer(void)
{
char szbuf[128];
if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1))
{
sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1);
LOGI("%s", szbuf);
return 1;
}
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;
}
if(srdt.SendStopPtzCmdTimeCnt > PTZ_MOVETIME*1000)
{
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;
}
/********************************************************************************
* 生成 PELCO_P 命令 *
*********************************************************************************/
void Gm_SendPelco_pCommand( DWORD cmdtype)
{
int len;
BYTE commandbuf[32];
char buf[128];
len = 0;
commandbuf[len++] = (BYTE)0xA0;
commandbuf[len++] = (BYTE)devparam[srdt.usecameradevidx].devaddr;
commandbuf[len++] = (BYTE)(cmdtype>>24);
commandbuf[len++] = (BYTE)(cmdtype>>16);
commandbuf[len++] = (BYTE)(cmdtype>>8);
commandbuf[len++] = (BYTE)(cmdtype);
commandbuf[len++] = (BYTE)0xAF;
commandbuf[len] = (BYTE)Gm_Pelco_pXORCheck(commandbuf, len);
len++;
serialport[srdt.camerauseserial].cmdlen = len;
Gm_SetSerialPortParam(srdt.camerauseserial);
len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial);
if(len < 1)
{
LOGE("发送Pelco_p命令失败");
}
else
{
sprintf(buf, "发送串口%d 像机通道%d Pelco_P命令:",
srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel);
BytestreamLOG(buf, commandbuf, len, 'D');
}
ClearCmdFormPollCmdBuf(srdt.camerauseserial);
serialport[srdt.camerauseserial].ForceWaitCnt = 100;
serialport[srdt.camerauseserial].ForceWaitFlag = 1;
}
BYTE Gm_Pelco_pXORCheck( BYTE *msg, int len )
{
int i;
BYTE 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( DWORD cmdtype)
{
int len;
BYTE commandbuf[32];
char buf[128];
len = 0;
#if 1 /* Pelco_D*/
commandbuf[len++] = (BYTE)0xFF;
commandbuf[len++] = (BYTE)devparam[srdt.usecameradevidx].devaddr;
commandbuf[len++] = (BYTE)(cmdtype>>24);
commandbuf[len++] = (BYTE)(cmdtype>>16);
commandbuf[len++] = (BYTE)(cmdtype>>8);
commandbuf[len++] = (BYTE)(cmdtype);
commandbuf[len] = (BYTE)Gm_Pelco_DCheck(commandbuf, len);
#endif
len++;
serialport[srdt.camerauseserial].cmdlen = len;
Gm_SetSerialPortParam(srdt.camerauseserial);
len = GM_SerialComSend(commandbuf, len, srdt.camerauseserial);
if(len < 1)
{
LOGE("发送Pelco_D命令失败");
}
else
{
sprintf(buf, "发送串口%d 像机通道%d Pelco_D命令:",
srdt.camerauseserial+1, devparam[srdt.usecameradevidx].CameraChannel);
BytestreamLOG(buf, commandbuf, len, 'D');
}
ClearCmdFormPollCmdBuf(srdt.camerauseserial);
serialport[srdt.camerauseserial].ForceWaitCnt = 10;
serialport[srdt.camerauseserial].ForceWaitFlag = 1;
}
// 计算Pelco_D校验
BYTE Gm_Pelco_DCheck( BYTE *msg, int len )
{
int i;
BYTE checkvalue=0;
if(len <= 0)
return checkvalue;
checkvalue = 0;
for(i=1; i<len; i++)
checkvalue += msg[i];
return checkvalue;
}
/*********************************************************************************
寻找并生成下一条倾角命令
**********************************************************************************/
int FindNextShxyProtocolCommand( int devidx )
{
//如果命令缓冲区仍有命令,则退出本函数
if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM))
return -1;
//if(srdt.ms_dev[devidx].SerialCmdidx == 0)
{
if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 3*1000)
{
//srdt.ms_dev[devidx].FirstCmdTimeCnt++;
return -1;
}
#if 0
if(SLANT_PROTOCOL == devparam[devidx].ProtocolIdx)
{
devparam[devidx].devaddr = 0xFF;
MakeShxyProtocolPollCommand(devidx, 0x02);
}
//else if(WEATHER_PROTOCOL== devparam[devidx].ProtocolIdx)
// MakeShxyProtocolPollCommand(devidx, 0x09);
else
#endif
MakeShxyProtocolPollCommand(devidx, 0x09);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx;
return 1;
}
return -1;
}
/*********************************************************************************
生成下发命令
**********************************************************************************/
void MakeShxyProtocolPollCommand(int portno, BYTE cmdidx)
{
int i/*, sendWaitTime = 100, y*/;
//char buf[128];
u_char *sendbuf;
sendbuf = serialport[srdt.ms_dev[portno].UseSerialidx].PollCmd;
i = 0;
sendbuf[i++] = 0x00; // 强制等待时间
sendbuf[i++] = 0x00; //
sendbuf[i++] = 0x68; // 起始字符
sendbuf[i++] = (BYTE)0x00; // length
sendbuf[i++] = (BYTE)0x00; // length
sendbuf[i++] = 0x68;
sendbuf[i++] = (BYTE)devparam[portno].devaddr; // 传感器地址
sendbuf[i++] = cmdidx; // 命令信息0x06
sendbuf[i] = CalLpc((u_char *)&sendbuf[6],i-6);
i+= 1;
sendbuf[i++] = 0x16; // 信息尾
serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i;
//sprintf((char*)buf, "生成串口%d 装置%d倾角命令:", srdt.ms_dev[portno].UseSerialidx+1, portno+1);
//Gm_OMC_UART_DebugHex(buf, i-2, (char*)&sendbuf[2]);
}
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;
//WORD 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) == TRUE)
{
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 = FALSE;
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 = TRUE;
}
return bRetval;
}
/*********************************************************************************
上海欣影传感器协议数据处理
**********************************************************************************/
void ShxyProtocolDataProcess( int devno)
{
float fvalue, fcorvalue, *fvalua, frnb/*, fwind*/;
WORD uDevAddr;
BYTE 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;
if(0x06 == cmdidx)
{
if(0x08 !=curserial->m_au8RecvBuf[1])
return;
pPortParam->recvdatacnt++;
if(pPortParam->recvdatacnt < 2)
return;
// ++++++++++++++++++++++++++++
//g_SelfTest.SensorsFault |= (0x800<<aipnt);
*(BYTE*)fvalua = curserial->m_au8RecvBuf[9];
*((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[8];
*((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[7];
*((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[6];
if((fvalue < -59) ||(fvalue > 59))
{
frnb = (GeneratingRandomNumber()%101-50)/1000.0;
slantpntmsg[aipnt][0].EuValue *= (1+frnb);
}
else
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);
LOGV("%s", szbuf);
}
//XslantSec[aipnt][srdt.SectimesamplingCnt[0]] = (short)slantpntmsg[aipnt][0].EuValue;
//srdt.SectimesamplingCnt[0] += 1;
*(BYTE*)fvalua = curserial->m_au8RecvBuf[13];
*((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[12];
*((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[11];
*((BYTE*)fvalua+3) = curserial->m_au8RecvBuf[10];
//if ((gDisSunRain & 0x20) == 0x20)
{
sprintf(szbuf, "Y =%0.3f ", fvalue);
LOGV("%s", szbuf);
}
if((fvalue < -59) ||(fvalue > 59))
{
frnb = (GeneratingRandomNumber()%101-50)/1000.0;
slantpntmsg[aipnt][1].EuValue *= (1+frnb);
}
else
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;
#if 0
if(1 == srdt.IsReadWireTem)
{
for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{
if((WDIITEMP_PROTOCOL_NEW == srdt.ms_dev[i].ProtocolIdx) && (uDevAddr == (WORD)srdt.ms_dev[i].devaddr))
break;
}
if(i == MAX_SERIAL_DEV_NUM)
return;
pPortParam = &srdt.ms_dev[i];
aipnt = pPortParam->SameTypeDevIdx;
}
#endif
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
{
*(BYTE*)fvalua = curserial->m_au8RecvBuf[j+4];
*((BYTE*)fvalua+1) = curserial->m_au8RecvBuf[j+3];
*((BYTE*)fvalua+2) = curserial->m_au8RecvBuf[j+2];
*((BYTE*)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[0].EuValue *= (1+frnb);
weatherpntmsg[0].EuValue *= (1+frnb);
}
else
{
pPortParam->aiValue[0].EuValue = fvalue*pPortParam->aiValue[0].AiParam.fFactor + pPortParam->aiValue[0].AiParam.EuValueDelta;
weatherpntmsg[0].EuValue = fvalue*weatherpntmsg[0].AiParam.fFactor + weatherpntmsg[0].AiParam.EuValueDelta;
}
pPortParam->aiValue[0].AiState = 1;
weatherpntmsg[0].AiState = 1;
//g_SelfTest.SensorsFault |= (0x01);
//if ((gDisSunRain & 0x80) == 0x80)
{
sprintf(szbuf, "温度:%0.3f ", fvalue);
LOGV("%s", szbuf);
}
break;
case 2: /*气压*/
if((fvalue < 550) ||(fvalue > 1060))
{
frnb = (GeneratingRandomNumber()%41-20)/10000.0;
pPortParam->aiValue[5].EuValue *= (1+frnb);
weatherpntmsg[5].EuValue *= (1+frnb);
}
else
{
pPortParam->aiValue[5].EuValue = fvalue*pPortParam->aiValue[5].AiParam.fFactor + pPortParam->aiValue[5].AiParam.EuValueDelta;
weatherpntmsg[5].EuValue = fvalue*weatherpntmsg[5].AiParam.fFactor + weatherpntmsg[5].AiParam.EuValueDelta;
}
pPortParam->aiValue[5].AiState = 1;
weatherpntmsg[5].AiState = 1;
//g_SelfTest.SensorsFault |= (0x10);
//if ((gDisSunRain & 0x80) == 0x80)
{
sprintf(szbuf, "气压:%0.3f ", fvalue);
LOGV("%s", szbuf);
}
break;
case 3: /*湿度*/
if((fvalue < 0) ||(fvalue > 100))
{
frnb = (GeneratingRandomNumber()%41-20)/1000.0;
pPortParam->aiValue[1].EuValue *= (1+frnb);
weatherpntmsg[1].EuValue *= (1+frnb);
}
else
{
pPortParam->aiValue[1].EuValue = fvalue*pPortParam->aiValue[1].AiParam.fFactor + pPortParam->aiValue[1].AiParam.EuValueDelta;
weatherpntmsg[1].EuValue = fvalue*weatherpntmsg[1].AiParam.fFactor + weatherpntmsg[1].AiParam.EuValueDelta;
}
pPortParam->aiValue[1].AiState = 1;
weatherpntmsg[1].AiState = 1;
//g_SelfTest.SensorsFault |= (0x02);
//if ((gDisSunRain & 0x80) == 0x80)
{
sprintf(szbuf, "湿度:%0.3f ", fvalue);
LOGV("%s", szbuf);
}
break;
case 4: /*雨量*/
break;
case 5: /*日照*/
break;
case 6: /*风速*/
if((fvalue/1000 < 0) ||(fvalue/1000 > 80))
{
frnb = (GeneratingRandomNumber()%41-20)/1000.0;
pPortParam->aiValue[2].EuValue *= (1+frnb);
weatherpntmsg[2].EuValue *= (1+frnb);
}
else
{
pPortParam->aiValue[2].EuValue = fvalue*pPortParam->aiValue[2].AiParam.fFactor + pPortParam->aiValue[2].AiParam.EuValueDelta;
weatherpntmsg[2].EuValue = fvalue*weatherpntmsg[2].AiParam.fFactor + weatherpntmsg[2].AiParam.EuValueDelta;
}
pPortParam->aiValue[2].AiState = 1;
weatherpntmsg[2].AiState = 1;
//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, "风速:%0.3f ", fvalue);
LOGV("%s", szbuf);
}
break;
case 7: /*风向*/
if((fvalue/1000 < 0) ||(fvalue/1000 > 359.99))
{
frnb = (GeneratingRandomNumber()%41-20)/1000.0;
pPortParam->aiValue[3].EuValue *= (1+frnb);
weatherpntmsg[3].EuValue *= (1+frnb);
}
else
{
pPortParam->aiValue[3].EuValue = fvalue*pPortParam->aiValue[3].AiParam.fFactor + pPortParam->aiValue[3].AiParam.EuValueDelta;
weatherpntmsg[3].EuValue = fvalue*weatherpntmsg[3].AiParam.fFactor + weatherpntmsg[3].AiParam.EuValueDelta;
}
pPortParam->aiValue[3].AiState = 1;
weatherpntmsg[3].AiState = 1;
//g_SelfTest.SensorsFault |= (0x08);
//if ((gDisSunRain & 0x10) == 0x10)
{
sprintf(szbuf, "风向:%0.3f ", fvalue);
LOGV("%s", szbuf);
}
break;
case 8: /*拉力*/
#if 0
if(RESERVE1_PROTOCOL == pPortParam->ProtocolIdx)
{
leirallypntmsg[0].EuValue = fvalue*leirallypntmsg[0].AiParam.fFactor\
+leirallypntmsg[0].AiParam.EuValueDelta;
leirallypntmsg[0].AiState = 1;
g_SelfTest.SensorsFault |= (0x800000);
if ((gDisSunRain & 0x10) == 0x10)
{
sprintf(szbuf, "地址%d模拟导线拉力:%0.3fKg ", pPortParam->devaddr, fvalue/1000.0);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
}
}
else
{
#endif
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 = 1;
//rallypntmsg[aipnt][0].AiState = 1;
sprintf(szbuf, "地址%d拉力:%0.3fKg ", devparam[devno].devaddr, fvalue);
LOGV("%s", szbuf);
//}
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 = 1;
//slantpntmsg[aipnt][0].AiState = 1;
sprintf(szbuf, "倾角ID:%d slantangle X=%0.3f ", devparam[devno].devaddr, fvalue);
LOGV("%s", szbuf);
break;
case 10: /*倾角传感器Y轴倾角*/
sprintf(szbuf, "Y =%0.3f ", fvalue);
LOGV("%s", szbuf);
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].AiParam.fFactor\
+pPortParam->aiValue[1].AiParam.EuValueDelta;
//slantpntmsg[aipnt][1].EuValue = fvalue*slantpntmsg[aipnt][1].AiParam.fFactor\
// +slantpntmsg[aipnt][1].AiParam.EuValueDelta;
}
pPortParam->aiValue[1].AiState = 1;
//slantpntmsg[aipnt][1].AiState = 1;
break;
#if 0
case 11: /*测温球导线温度*/
fcorvalue = WireTemperatureCorrection(fvalue/100, (WORD)pPortParam->devaddr);
wdiitemppntmsg[aipnt][0].EuValue = fvalue*wdiitemppntmsg[aipnt][0].AiParam.fFactor\
+wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta;
//#else
wdiitemppntmsg[aipnt][0].EuValue = fcorvalue*100*wdiitemppntmsg[aipnt][0].AiParam.fFactor\
+wdiitemppntmsg[aipnt][0].AiParam.EuValueDelta;
wdiitemppntmsg[aipnt][0].AiState = 1;
g_SelfTest.SensorsFault |= (0x100000);
sprintf(szbuf, "地址%d导线温度:%0.3f ", pPortParam->devaddr, fcorvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 12: /*测温球内部温度*/
wdiitemppntmsg[aipnt][1].EuValue = fvalue*wdiitemppntmsg[aipnt][1].AiParam.fFactor\
+wdiitemppntmsg[aipnt][1].AiParam.EuValueDelta;
wdiitemppntmsg[aipnt][1].AiState = 1;
sprintf(szbuf, "地址%d内部温度:%0.3f ", pPortParam->devaddr, fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
break;
case 13: /*测温球导线X轴倾角*/
wdiitemppntmsg[aipnt][3].EuValue = fvalue*wdiitemppntmsg[aipnt][3].AiParam.fFactor\
+wdiitemppntmsg[aipnt][3].AiParam.EuValueDelta;
wdiitemppntmsg[aipnt][3].AiState = 1;
sprintf(szbuf, "地址%d导线X轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 14: /*测温球导线Y轴倾角*/
wdiitemppntmsg[aipnt][4].EuValue = fvalue*wdiitemppntmsg[aipnt][4].AiParam.fFactor\
+wdiitemppntmsg[aipnt][4].AiParam.EuValueDelta;
wdiitemppntmsg[aipnt][4].AiState = 1;
sprintf(szbuf, "地址%d导线Y轴倾角:%0.3f ", pPortParam->devaddr, fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
break;
case 15: /*测温球导线电流*/
wdiitemppntmsg[aipnt][5].EuValue = fvalue*wdiitemppntmsg[aipnt][5].AiParam.fFactor\
+wdiitemppntmsg[aipnt][5].AiParam.EuValueDelta;
wdiitemppntmsg[aipnt][5].AiState = 1;
sprintf(szbuf, "地址%d导线电流:%0.3f ", pPortParam->devaddr, fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 16: /*测温球电池电压*/
wdiitemppntmsg[aipnt][2].EuValue = fvalue*wdiitemppntmsg[aipnt][2].AiParam.fFactor\
+wdiitemppntmsg[aipnt][2].AiParam.EuValueDelta;
wdiitemppntmsg[aipnt][2].AiState = 1;
sprintf(szbuf, "地址%d测温球电池电压:%0.3fV ", pPortParam->devaddr, fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
break;
case 17: /*A相泄漏电流平均值*/
LCpntmsg[0].EuValue = fvalue*LCpntmsg[0].AiParam.fFactor + LCpntmsg[0].AiParam.EuValueDelta;
LCpntmsg[0].AiState = 1;
sprintf(szbuf, "A相泄漏电流平均值:%0.3f ", fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 18: /*A相泄漏电流最大值*/
LCpntmsg[1].EuValue = fvalue*LCpntmsg[1].AiParam.fFactor + LCpntmsg[1].AiParam.EuValueDelta;
LCpntmsg[1].AiState = 1;
sprintf(szbuf, "A相泄漏电流最大值:%0.3f ", fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 19: /*A相超过3mA的脉冲频次*/
LCpntmsg[2].EuValue = fvalue*LCpntmsg[2].AiParam.fFactor + LCpntmsg[2].AiParam.EuValueDelta;
LCpntmsg[2].AiState = 1;
sprintf(szbuf, "A相超过3mA的脉冲频次:%0.3f ", fvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 20: /*A相超过10mA的脉冲频次*/
LCpntmsg[3].EuValue = fvalue*LCpntmsg[3].AiParam.fFactor + LCpntmsg[3].AiParam.EuValueDelta;
LCpntmsg[3].AiState = 1;
sprintf(szbuf, "A相超过10mA的脉冲频次:%0.3f ", fvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
break;
case 21: /*B相泄漏电流平均值*/
LCpntmsg[4].EuValue = fvalue*LCpntmsg[4].AiParam.fFactor + LCpntmsg[4].AiParam.EuValueDelta;
LCpntmsg[4].AiState = 1;
sprintf(szbuf, "B相泄漏电流平均值:%0.3f ", fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 22: /*B相泄漏电流最大值*/
LCpntmsg[5].EuValue = fvalue*LCpntmsg[5].AiParam.fFactor + LCpntmsg[5].AiParam.EuValueDelta;
LCpntmsg[5].AiState = 1;
sprintf(szbuf, "B相泄漏电流最大值:%0.3f ", fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 23: /*B相超过3mA的脉冲频次*/
LCpntmsg[6].EuValue = fvalue*LCpntmsg[6].AiParam.fFactor + LCpntmsg[6].AiParam.EuValueDelta;
LCpntmsg[6].AiState = 1;
sprintf(szbuf, "B相超过3mA的脉冲频次:%0.3f ", fvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 24: /*B相超过10mA的脉冲频次*/
LCpntmsg[7].EuValue = fvalue*LCpntmsg[7].AiParam.fFactor + LCpntmsg[7].AiParam.EuValueDelta;
LCpntmsg[7].AiState = 1;
sprintf(szbuf, "B相超过10mA的脉冲频次:%0.3f ", fvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
break;
case 25: /*C相泄漏电流平均值*/
LCpntmsg[8].EuValue = fvalue*LCpntmsg[8].AiParam.fFactor + LCpntmsg[8].AiParam.EuValueDelta;
LCpntmsg[8].AiState = 1;
sprintf(szbuf, "C相泄漏电流平均值:%0.3f ", fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 26: /*C相泄漏电流最大值*/
LCpntmsg[9].EuValue = fvalue*LCpntmsg[9].AiParam.fFactor + LCpntmsg[9].AiParam.EuValueDelta;
LCpntmsg[9].AiState = 1;
sprintf(szbuf, "C相泄漏电流最大值:%0.3f ", fvalue/100);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 27: /*C相超过3mA的脉冲频次*/
LCpntmsg[10].EuValue = fvalue*LCpntmsg[10].AiParam.fFactor + LCpntmsg[10].AiParam.EuValueDelta;
LCpntmsg[10].AiState = 1;
sprintf(szbuf, "C相超过3mA的脉冲频次:%0.3f ", fvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 0);
break;
case 28: /*C相超过10mA的脉冲频次*/
LCpntmsg[11].EuValue = fvalue*LCpntmsg[11].AiParam.fFactor + LCpntmsg[11].AiParam.EuValueDelta;
LCpntmsg[11].AiState = 1;
sprintf(szbuf, "C相超过10mA的脉冲频次:%0.3f ", fvalue);
DebugStringPrintf(szbuf, strlen(szbuf), 1);
break;
#endif
}
}
}
/*********************************************************************************
把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((DWORD)ictime);
randomdate = rand();
return randomdate;
}