完善并调试摄像机拍照,以及完善云台操作指令发送逻辑等

serial
huyizhong 12 months ago
parent 64bf7a5194
commit 8856013295

@ -13,6 +13,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <termios.h> #include <termios.h>
#include <asm/termbits.h>
#include <time.h> #include <time.h>
#include "GPIOControl.h" #include "GPIOControl.h"
#include "serialComm.h" #include "serialComm.h"
@ -738,7 +739,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
{ {
int i, j; int i, j;
#if 1 #if 0
srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
for(i=0; i<MAX_SERIAL_PORT_NUM; i++) for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{ {
@ -763,6 +764,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
#endif #endif
if(NULL == sensorParam) if(NULL == sensorParam)
return; return;
#if COLLECT_DATA
srdt.camerauseserial = -1; srdt.camerauseserial = -1;
sensorParam[0].SensorsType = WEATHER_PROTOCOL; sensorParam[0].SensorsType = WEATHER_PROTOCOL;
sensorParam[0].baudrate = 9600; sensorParam[0].baudrate = 9600;
@ -894,7 +896,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
#endif #endif
sensorParam[13].SensorsType = SLANT_PROTOCOL; sensorParam[13].SensorsType = SLANT_PROTOCOL;
sensorParam[13].baudrate = B9600; sensorParam[13].baudrate = 9600;
sensorParam[13].databit = 8; sensorParam[13].databit = 8;
//memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
//sprintf(devparam[13].stopbit, "1"); //sprintf(devparam[13].stopbit, "1");
@ -902,7 +904,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
sensorParam[13].parity = 0; sensorParam[13].parity = 0;
//devparam[13].PowerPort = 4; //devparam[13].PowerPort = 4;
sensorParam[13].IsNoInsta = 1; sensorParam[13].IsNoInsta = 1;
sensorParam[13].devaddr = 3; sensorParam[13].devaddr = 2;
#if 0 #if 0
devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200; devparam[14].baudrate = 1200;
@ -912,8 +914,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
devparam[14].IsNoInsta = 1; devparam[14].IsNoInsta = 1;
//devparam[14].PowerPort = 2; //devparam[14].PowerPort = 2;
devparam[14].devaddr = 3; devparam[14].devaddr = 3;
#endif
#if 0
devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL; devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL;
//#endif //#endif
devparam[15].ProtocolIdx = WIND_PROTOCOL; devparam[15].ProtocolIdx = WIND_PROTOCOL;
@ -974,6 +975,17 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
rallypntmsg[i][j].AiParam.EuValueDelta = 0; rallypntmsg[i][j].AiParam.EuValueDelta = 0;
} }
#endif #endif
#else
sensorParam[3].SensorsType = PELCO_P_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;
#endif
} }
// 初始化所有串口及所接传感器的配置 // 初始化所有串口及所接传感器的配置
@ -985,6 +997,7 @@ void Gm_InitSerialComm()
//if(NULL == sensorParam) //if(NULL == sensorParam)
// return; // return;
memset(sensorParam, 0, sizeof(sensorParam));
Gm_InitSerialComm_Test(sensorParam); Gm_InitSerialComm_Test(sensorParam);
// srdt 配置 // srdt 配置
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 //srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
@ -1005,7 +1018,7 @@ void Gm_InitSerialComm()
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
memset(szbuf, 0, sizeof(szbuf)); memset(szbuf, 0, sizeof(szbuf));
switch (devparam[i].ProtocolIdx) switch (sensorParam[i].SensorsType)
{ {
case 0: case 0:
sprintf(szbuf, "传感器%d没有接!", i + 1); sprintf(szbuf, "传感器%d没有接!", i + 1);
@ -1040,9 +1053,9 @@ void Gm_InitSerialComm()
} }
//LOGI("%s", szbuf); //LOGI("%s", szbuf);
sprintf(szbuf, "%s 地址%d!", szbuf, devparam[i].devaddr); sprintf(szbuf, "%s 地址%d!", szbuf, sensorParam[i].devaddr);
//LOGI("%s", szbuf); //LOGI("%s", szbuf);
if (0 == devparam[i].IsNoInsta) if (0 == sensorParam[i].IsNoInsta)
sprintf(szbuf, "没有启用!"); sprintf(szbuf, "没有启用!");
else else
{ {
@ -1050,7 +1063,12 @@ void Gm_InitSerialComm()
LOGI("%s", szbuf); LOGI("%s", szbuf);
} }
} }
#if COLLECT_DATA
Collect_sensor_data(sensorParam); Collect_sensor_data(sensorParam);
#else
CameraPhoto(sensorParam, 1, 0);
#endif
#endif #endif
#if 0 #if 0
//u_char UseSerialidx; // 使用的串口序号 //u_char UseSerialidx; // 使用的串口序号
@ -1144,11 +1162,17 @@ void GM_StartSerialComm()
{ {
if(i == srdt.camerauseserial) if(i == srdt.camerauseserial)
continue; continue;
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
serialport[i].RetryTime = 300/TIMER_CNT;
serialport[i].WaitTime = 0;
serialport[i].m_iRevStatus = 0; serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0; serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0; serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1; serialport[i].fd = -1;
ClearCmdAllFlag(i); memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
//ClearCmdAllFlag(i);
} }
} }
#if 0/* 简化插入使用摄像机过程,摄像机使用单独的串口*/ #if 0/* 简化插入使用摄像机过程,摄像机使用单独的串口*/
@ -1294,11 +1318,19 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
if(0x01 == (srdt.sampling & 0x01)) if(0x01 == (srdt.sampling & 0x01))
flag = 0; flag = 0;
#endif #endif
i = srdt.camerauseserial;
if((i<0) ||(i > MAX_SERIAL_PORT_NUM))
return;
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
serialport[i].RetryTime = 3000/TIMER_CNT;
serialport[i].WaitTime = 0;
serialport[i].m_iRevStatus = 0; serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0; serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0; serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1; serialport[i].fd = -1;
ClearCmdAllFlag(i); memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
// 初始化串口使用状态 // 初始化串口使用状态
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
@ -1308,6 +1340,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
continue; continue;
} }
memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx) switch(devparam[i].ProtocolIdx)
{ {
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
@ -1332,6 +1365,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
srdt.ms_dev[i].SerialCmdidx = cmdidx; srdt.ms_dev[i].SerialCmdidx = cmdidx;
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
srdt.sendphotocmdcnt = 0; srdt.sendphotocmdcnt = 0;
sprintf(szbuf, "摄像机");
flag = 1; flag = 1;
break; break;
default: default:
@ -1340,6 +1374,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
break; break;
} }
if(1 == srdt.ms_dev[i].IsNeedSerial)
{
LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf);
Gm_OpenSensorsPower(i);
Gm_OpenSerialPort(i);
}
} }
if(0x01 == flag) if(0x01 == flag)
{ {
@ -1355,12 +1396,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("退出采样流程!"); LOGV("退出采样流程!");
sleep(15); sleep(15);
GM_StartSerialComm(); //GM_StartSerialComm();
GM_StartSerialCameraPhoto(1,0);
//break; //break;
} }
} }
} }
return; //return;
} }
#endif #endif
@ -1426,9 +1468,9 @@ void Gm_FindAllSensorsCommand(void)
break; break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
flag = FindNextCameraPhotoCommand(curidx); flag = FindNextCameraPhotoCommand(curidx);
break; break;
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
break; break;
} }
if(flag == -1) if(flag == -1)
@ -1481,7 +1523,7 @@ void GM_IsCloseSensors(void)
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
if(-1 == srdt.ms_dev[i].SerialCmdidx) if(-1 == srdt.ms_dev[i].SerialCmdidx)
{ {
if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) //if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT)
{ {
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
//srdt.sampling &= 0xFB; //srdt.sampling &= 0xFB;
@ -1522,7 +1564,10 @@ void GM_AllSerialComRecv(void)
if(recvlen < 1) if(recvlen < 1)
break; break;
sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen);
BytestreamLOG(buf, recvbuf, recvlen, 'I'); if(recvlen < 101)
BytestreamLOG(buf, recvbuf, recvlen, 'I');
else
LOGI("%s", buf);
SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen);
@ -1679,40 +1724,134 @@ void SerialDataProcess(int devidx, u_char *buf, int len)
break; break;
case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/
break; break;
case RESERVE5_PROTOCOL: /* 网络安全加密协议*/ case PELCO_D_PROTOCOL: /* 摄像机协议*/
//EncryptRecvData(devidx, buf, len); case PELCO_P_PROTOCOL: /* 摄像机协议*/
break; case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 青青子木串口摄像机协议*/ CameraRecvData(devidx, buf, len);
break; break;
} }
} }
/*******************************************************************
* *
*******************************************************************/
void CameraRecvData(int devno, u_char *buf, int len)
{
int i;
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];
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(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;
}
}
}
/********************************************************************************* /*********************************************************************************
CameraPhoto CameraPhoto
**********************************************************************************/ **********************************************************************************/
void CameraPhotoPortDataProcess( int port) void CameraPhotoPortDataProcess( int devno)
{ {
RTUMSG rtumsg; RTUMSG rtumsg;
SERIAL_DEV_DEF *pPortParam; SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *serialport; SIO_PARAM_SERIAL_DEF *curserial;
int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime; int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime;
char szbuf[128]; char szbuf[128];
WORD uDevAddr; WORD uDevAddr;
BYTE cmdidx, recvend; BYTE cmdidx, recvend;
pPortParam = &srdt.ms_dev[port]; pPortParam = &srdt.ms_dev[devno];
serialport = &serialport[pPortParam->UseSerialidx]; curserial = &serialport[devparam[devno].commid];
memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData)); memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData));
memcpy((void*)rtumsg.MsgData, (void*)serialport->m_au8RecvBuf, pPortParam->m_iRecvLen); memcpy((void*)rtumsg.MsgData, (void*)curserial->m_au8RecvBuf, curserial->m_iRecvLen);
rtumsg.MsgLen = pPortParam->m_iRecvLen; rtumsg.MsgLen = curserial->m_iRecvLen;
rtumsg.PortIdx = port; rtumsg.PortIdx = devparam[devno].commid;
cmdidx = serialport->m_au8RecvBuf[5]; cmdidx = curserial->m_au8RecvBuf[5];
uDevAddr = serialport->m_au8RecvBuf[4]; uDevAddr = curserial->m_au8RecvBuf[4];
//sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx); //sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); //DebugStringPrintf(szbuf, strlen(szbuf), 1);
if(uDevAddr != devparam[port].devaddr) if(uDevAddr != devparam[devno].devaddr)
return; return;
switch(cmdidx) switch(cmdidx)
@ -1724,8 +1863,7 @@ void CameraPhotoPortDataProcess( int port)
if(srdt.RephotographCnt > 2) if(srdt.RephotographCnt > 2)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); LOGE("因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
} }
break; break;
} }
@ -1736,41 +1874,32 @@ void CameraPhotoPortDataProcess( int port)
img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); 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); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8);
srdt.imagepacketnum = packetnum; srdt.imagepacketnum = packetnum;
srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8);
sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGV("%s", szbuf);
//presetno = (int)GetPhotoPresetNo(pPortParam->CameraChannel);
presetno = (int)rtumsg.MsgData[i+8]; presetno = (int)rtumsg.MsgData[i+8];
//if(0 == netportparam.InitTimeFlag) curserial->RevCmdFlag = 1;
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = 10001;
/* 保存图片*/
//break
}
serialport->RevCmdFlag = 1;
pPortParam->SerialCmdidx = 1; pPortParam->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0; srdt.sendphotocmdcnt = 0;
break; break;
case 0x11: /* 图片数据包*/ case 0x11: /* 图片数据包*/
// if(0 == netportparam.InitTimeFlag)
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = 10001;
/* 保存图片*/
//break;
}
i = 6; i = 6;
iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256; iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256;
packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256; packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256;
sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum); sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGV("%s", szbuf);
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
pPortParam->FirstCmdTimeCnt = 0; pPortParam->FirstCmdTimeCnt = get_msec();
if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2]))
{ {
if(iNo == srdt.imagepacketnum)
recvend = 1;
else
recvend = 0;
if(packsize > MAX_PHOTO_FRAME_LEN)
recvend = 0xFF;
if(1 == recvend) if(1 == recvend)
pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/
else if(0xFF == recvend) else if(0xFF == recvend)
@ -1792,6 +1921,7 @@ void CameraPhotoPortDataProcess( int port)
srdt.errorPhotoNoCnt++; srdt.errorPhotoNoCnt++;
sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!",
pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt);
LOGE("%s", szbuf);
if(srdt.errorPhotoNoCnt > 5) if(srdt.errorPhotoNoCnt > 5)
{ {
pPortParam->SerialCmdidx = 0; pPortParam->SerialCmdidx = 0;
@ -1800,16 +1930,15 @@ void CameraPhotoPortDataProcess( int port)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGE("%s", szbuf);
} }
} }
break; break;
case 0x03: case 0x03:
sprintf(szbuf, "设置波特率%d成功", devparam[port].baudrate); sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGD("%s", szbuf);
//pPortParam->Baud = serialport->Baud;
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
pPortParam->FirstCmdTimeCnt = 0; pPortParam->FirstCmdTimeCnt = 0;
break; break;
case 0x15: case 0x15:
@ -1817,7 +1946,7 @@ void CameraPhotoPortDataProcess( int port)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "没有历史图片!结束读取图片!"); sprintf(szbuf, "没有历史图片!结束读取图片!");
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGI("%s", szbuf);
break; break;
} }
i = 6; i = 6;
@ -1827,20 +1956,11 @@ void CameraPhotoPortDataProcess( int port)
img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); 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); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8);
srdt.imagepacketnum = packetnum; srdt.imagepacketnum = packetnum;
srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8);
//presetno = netportparam.CurPresetno[pPortParam->CameraChannel-1];
presetno = rtumsg.MsgData[i+8]; presetno = rtumsg.MsgData[i+8];
sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGI("%s", szbuf);
//if(0 == netportparam.InitTimeFlag) curserial->RevCmdFlag = 1;
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = -1;
//netportparam.PhotosFlag = FALSE;
break;
}
serialport->RevCmdFlag = 1;
pPortParam->SerialCmdidx = 1; pPortParam->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0; srdt.sendphotocmdcnt = 0;
break; break;
@ -1849,30 +1969,22 @@ void CameraPhotoPortDataProcess( int port)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "图片保存失败!"); sprintf(szbuf, "图片保存失败!");
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGE("%s", szbuf);
} }
if(0 == rtumsg.MsgData[10]) if(0 == rtumsg.MsgData[10])
{ {
if(0 == srdt.historyimagenum[devparam[port].CameraChannel-1]) if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1])
{ {
//netportparam.SerialCameraPowerCtrl[devparam[port].CameraChannel-1] = 0; ;
//srdt.sampling &= 0xFB;
} }
else else
pPortParam->FirstCmdTimeCnt = -3*60*1000/TIMER_CNT; pPortParam->FirstCmdTimeCnt = get_msec();
}
else
{
//srdt.sampling &= 0xFB;
//netportparam.SerialCameraPowerCtrl[pPortParam->CameraChannel-1] = 0;
} }
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
//if(0 == netportparam.InitTimeFlag)
break; break;
default: default:
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
break; break;
} }
} }
@ -2018,18 +2130,20 @@ int FindNextCameraPhotoCommand(int devidx)
char szbuf[128]; char szbuf[128];
//如果命令缓冲区仍有命令,则退出本函数 //如果命令缓冲区仍有命令,则退出本函数
if((devparam[devidx].commid < 1) || (devparam[devidx].commid >= MAX_SERIAL_PORT_NUM)) if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM))
return -1; return -1;
if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/
return -1; return -1;
cmdno = srdt.ms_dev[devidx].SerialCmdidx; cmdno = srdt.ms_dev[devidx].SerialCmdidx;
if(0 == cmdno)/* 下发拍照指令*/ if(0 == cmdno)/* 下发拍照指令*/
{ {
if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 4*1000/TIMER_CNT) if((get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 3*35*1000) ||(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 0))
{ {
srdt.ms_dev[devidx].FirstCmdTimeCnt = get_msec();
return -1; return -1;
} }
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT)
if(get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000)
{ {
srdt.ms_dev[devidx].SerialCmdidx = -1; srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); sprintf(szbuf, "串口摄像机未接或故障!结束拍照!");
@ -2079,7 +2193,8 @@ int FindNextCameraPhotoCommand(int devidx)
srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo;
return -1; return -1;
} }
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000/TIMER_CNT)
if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000)
{ {
srdt.ms_dev[devidx].SerialCmdidx = -1; srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "设置串口摄像机参数时15秒未收到摄像机应答!退出设置!"); sprintf(szbuf, "设置串口摄像机参数时15秒未收到摄像机应答!退出设置!");
@ -2109,7 +2224,7 @@ int FindNextCameraPhotoCommand(int devidx)
imagesize = 0xFF; imagesize = 0xFF;
packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx;
cmdidx = 0x11; cmdidx = 0x11;
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000)
{ {
srdt.ms_dev[devidx].SerialCmdidx = -1; srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize);
@ -2118,7 +2233,8 @@ int FindNextCameraPhotoCommand(int devidx)
} }
} }
MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality);
srdt.curdevidx[devparam[devidx].commid] = devidx;
return 1; return 1;
} }
@ -2145,6 +2261,9 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara
sendbuf[i++] = cmdidx; /* 命令字*/ sendbuf[i++] = cmdidx; /* 命令字*/
switch(cmdidx) switch(cmdidx)
{ {
case 0x02: /* */
sendbuf[i-2] = 0xFF;
break;
case 0x03: /*设置传感器通讯参数03H*/ case 0x03: /*设置传感器通讯参数03H*/
sendbuf[i++] = 0x00; /* 波特率*/ sendbuf[i++] = 0x00; /* 波特率*/
sendbuf[i++] = 0x00; sendbuf[i++] = 0x00;
@ -2163,7 +2282,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara
sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60));
sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60));
sendbuf[i++] = Threep;/*图像质量ImageQuality*/ sendbuf[i++] = Threep;/*图像质量ImageQuality*/
//sendbuf[i++] = netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点PresetNo*/ sendbuf[i++] = 0;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点PresetNo*/
break; break;
case 0x11: /* 获取指定包数据11H*/ case 0x11: /* 获取指定包数据11H*/
sendbuf[i++] = HIBYTE(TwoParam);/*图片包号PackageNo*/ sendbuf[i++] = HIBYTE(TwoParam);/*图片包号PackageNo*/
@ -2187,7 +2306,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara
sendbuf[3] = (BYTE)((i-10)>>8); sendbuf[3] = (BYTE)((i-10)>>8);
sendbuf[4] = (BYTE)(i-10); sendbuf[4] = (BYTE)(i-10);
serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i; serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i;
return; //return;
} }
// 准备发送云台指令 // 准备发送云台指令
@ -2210,6 +2329,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd)
LOGI("%s", szbuf); LOGI("%s", szbuf);
return 1; return 1;
} }
#if 0
if((2 > srdt.ms_dev[i].UseSerialidx+1) ||(MAX_SERIAL_PORT_NUM < srdt.ms_dev[i].UseSerialidx+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); sprintf(szbuf, "通道%d摄像机错误的使用了串口%d", channel, srdt.ms_dev[i].UseSerialidx+1);
@ -2218,9 +2338,10 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd)
} }
else else
{ {
#endif
sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1);
LOGI("%s", szbuf); LOGI("%s", szbuf);
} //}
srdt.usecameradevidx = i; srdt.usecameradevidx = i;
// 查找串口序号 // 查找串口序号
srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx;
@ -2243,12 +2364,14 @@ int Gm_Camera_Timer(void)
{ {
char szbuf[128]; char szbuf[128];
#if 0
if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1)) if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1))
{ {
sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1); sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1);
LOGI("%s", szbuf); LOGI("%s", szbuf);
return 1; return 1;
} }
#endif
if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx)
{ {
switch(srdt.PtzCmdType) switch(srdt.PtzCmdType)
@ -3146,5 +3269,39 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam)
GM_StartSerialComm(); GM_StartSerialComm();
} }
void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx)
{
int i;
//speed_t baudrate;
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;
//baudrate = getBaudrate(sensorParam[i].baudrate);
devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate);
//devparam[i].baudrate = 17;
devparam[i].databit = sensorParam[i].databit;
if((sensorParam[i].stopbit > 0) && (sensorParam[i].stopbit < 3))
{
memset(devparam[i].stopbit, 0, sizeof(devparam[i].stopbit));
sprintf(devparam[i].stopbit, "%0.1f", sensorParam[i].stopbit);
}
devparam[i].CameraChannel = sensorParam[i].CameraChannel;
devparam[i].Phase = sensorParam[i].Phase;
}
for(;;)
{
Gm_CtrlPtzCmd(1, P_MOVE_LEFT);
sleep(3);
Gm_CtrlPtzCmd(1, Cmd_Cancel);
sleep(10);
}
//GM_StartSerialComm();
//GM_StartSerialCameraPhoto(1, 0);
}

@ -7,6 +7,7 @@
#include <string> #include <string>
#include "GPIOControl.h" #include "GPIOControl.h"
#include "termios.h"
#ifndef DWORD #ifndef DWORD
typedef unsigned int DWORD; typedef unsigned int DWORD;
@ -96,6 +97,8 @@ typedef unsigned char BYTE;
#define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/
#define SERIAL_CAMERA 2 /* 串口摄像机a*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/
#define COLLECT_DATA 0 /* 调试使用*/
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/
#define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/ #define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/
@ -355,6 +358,8 @@ int GM_CloseTimer(void);
// 串口接收数据处理 // 串口接收数据处理
void SerialDataProcess(int devidx, u_char *buf, int len); void SerialDataProcess(int devidx, u_char *buf, int len);
void CameraRecvData(int commid, u_char *buf, int len);
// 串口摄像机数据处理 // 串口摄像机数据处理
void CameraPhotoPortDataProcess( int port); void CameraPhotoPortDataProcess( int port);
@ -422,6 +427,7 @@ int Gm_SetSerialPortBaud(int commid);
//T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate); //T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate);
void Gm_CloseSerialCamera(); void Gm_CloseSerialCamera();
void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx);
// 生成一个随机整数 // 生成一个随机整数
int GeneratingRandomNumber(); int GeneratingRandomNumber();

@ -0,0 +1,574 @@
#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 "WeatherComm.h"
#include <sys/time.h>
SIO_PARAM_SERIAL_DEF serialport;
float weatherpntmsg[10];
static void set_baudrate (struct termios *opt, unsigned int baudrate)
{
cfsetispeed(opt, baudrate);
cfsetospeed(opt, baudrate);
}
static void set_data_bit (struct termios *opt, unsigned int databit)
{
opt->c_cflag &= ~CSIZE;
switch (databit)
{
case 8:
opt->c_cflag |= CS8;
break;
case 7:
opt->c_cflag |= CS7;
break;
case 6:
opt->c_cflag |= CS6;
break;
case 5:
opt->c_cflag |= CS5;
break;
default:
opt->c_cflag |= CS8;
break;
}
}
static void set_parity (struct termios *opt, char parity)
{
switch (parity)
{
case'N':/* 无校验 */
case 'n':
opt->c_cflag &= ~PARENB;
break;
case'E':/*偶校验*/
case 'e':
opt->c_cflag |= PARENB;
opt->c_cflag &= ~PARODD;
break;
case'O':/* 奇校验 */
case 'o':
opt->c_cflag |= PARENB;
opt->c_cflag |= ~PARODD;
break;
default: /*其它选择为无校验 */
opt->c_cflag &= ~PARENB;
break;
}
}
static void set_stopbit (struct termios *opt, const char *stopbit)
{
if (strcmp(stopbit, "1") == 0)
{
opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */
}
else if(0 == strcmp(stopbit, "1.5"))
{
opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */
}
else if(0 == strcmp (stopbit,"2"))
{
opt->c_cflag |= CSTOPB; /*2 位停止位 */
}
else
{
opt->c_cflag &= ~CSTOPB; /*1 位停止位 */
}
}
int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin )
{
struct termios opt;
tcgetattr(fd, &opt);
set_baudrate(&opt, baudrate);
//opt.c_cflag |= CLOCAL|CREAD; /*|CRTSCTS */
opt.c_lflag &= ~(ICANON | ECHO |ECHOE |ISIG);
opt.c_iflag &=~(INLCR|ICRNL);
opt.c_iflag &=~(IXON);/* 流控*/
set_data_bit(&opt, databit);
set_parity(&opt, parity);
set_stopbit(&opt, stopbit);
opt.c_oflag = 0;
//opt.c_lflag |= 0;
opt.c_oflag &= ~OPOST;
opt.c_cc[VTIME] = vtime;
opt.c_cc[VMIN] = vmin;
tcflush (fd, TCIFLUSH);
return (tcsetattr (fd, TCSANOW, &opt));
}
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 )
{
int res = ioctl(fd, IOT_PARAM_WRITE, &param);
// LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
close(fd);
}
return;
}
static void setRS485Enable(bool z) {
setInt(CMD_SET_485_EN_STATE, z ? 1 : 0);
}
static void set485WriteMode() {
setInt(CMD_SET_485_STATE, 1);
}
static void set485ReadMode() {
setInt(CMD_SET_485_STATE, 0);
}
static void set12VEnable(bool z) {
setInt(CMD_SET_12V_EN_STATE, z ? 1 : 0);
}
static void setCam3V3Enable(bool enabled)
{
setInt(CMD_SET_CAM_3V3_EN_STATE, enabled ? 1 : 0);
}
/*********************************************************************************
* *
**********************************************************************************/
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: /*拉力*/
LOGE("拉力:%0.3f ", fvalue);
break;
case 9: /*倾角传感器X轴倾角*/
LOGE("X:%0.3f ", fvalue);
break;
case 10: /*倾角传感器Y轴倾角*/
LOGE("Y:%0.3f ", fvalue);
break;
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,0x0D,0x09,0x16,0x16};
//unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x02,0x09,0x0B,0x16};
unsigned char sendbuf[] = {0x68,0x00,0x00,0x68,0x0ff,0x02,0x01,0x16};
//unsigned char sendbuf[] = {0x68,0x01,0x01,0x68,0x0a,0x01,0x01,0x0c, 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(3);
//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;
}
}
//tcdrain(fd);
//sleep(2);
usleep(100);
//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 > 500)
{
LOGE("传感器超过%ld毫秒未应答", irecvtime-isendtime);
serialport.RevCmdFlag = 1;
serialport.m_iRecvLen = 0;
serialport.m_iRevStatus = 0;
//close(fd);
//set12VEnable(false);
//setCam3V3Enable(false);
//setRS485Enable(false);
//fd = -1;
continue;
}
}
//set485ReadMode();
memset(recvbuf, 0, sizeof(recvbuf));
len = read(fd, recvbuf, sizeof(recvbuf));/* 在串口读取字符串 */
if (len < 0) {
LOGE("serial read error \n");
continue;
}
if(0 == len)
{
//icnt++;
continue;
}
memset(szbuf, 0, sizeof(szbuf));
sprintf(szbuf, "Recv");
for (i = 0; i < len; i++) {
sprintf(szbuf, "%s %02X", szbuf, recvbuf[i]);
}
__android_log_print(ANDROID_LOG_INFO, "serial", "%s", szbuf);
RecvData((u_char*)recvbuf, len);
//LOGE("一周期空循环次数%d, 读取次数%d, 时间:%d %d", icnt, inum, (int)time(NULL), itimecnt);
icnt = 0;
//serialport.RevCmdFlag =1;
}
close(fd);
set12VEnable(false);
setCam3V3Enable(false);
setRS485Enable(false);
//exit(-1);
return(0);
}
int serial_port_comm()
{
SERIAL_PARAM portparm;
//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 = B38400;
memset(portparm.stopbit, 0, sizeof(portparm.stopbit));
sprintf(portparm.stopbit, "1");
#endif
//itimecnt = (int)time(NULL);
for(;;)
{
sleep(10);
weather_comm(portparm);
}
return 0;
}

@ -0,0 +1,51 @@
//
// Created by hyz on 2024/6/5.
//
#ifndef WEATHERCOMM_H
#define WEATHERCOMM_H
#include <string>
#include "GPIOControl.h"
#define MAX_STRING_LEN 32
#define IOT_PARAM_WRITE 0xAE
#define IOT_PARAM_READ 0xAF
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args)
// 串口参数
typedef struct
{
int baudrate; /* 波特率*/
int databit; /* 数据位*/
char stopbit[8]; /* 停止位*/
char parity; /* 校验位*/
char pathname[128];/* 串口文件名及路径*/
} SERIAL_PARAM;
typedef struct
{
int m_iRevStatus; /* */
int m_iRecvLen; /* */
int m_iNeedRevLength; /* */
int iRecvTime; /* */
int RevCmdFlag;
unsigned char m_au8RecvBuf[128];/* */
} SIO_PARAM_SERIAL_DEF;
typedef struct
{
int cmd;
int value;
int result;
long value2;
char str[MAX_STRING_LEN];
}IOT_PARAM;
void PortDataProcess( void );
int serial_port_comm();
static int weather_comm(SERIAL_PARAM weatherport);
int set_port_attr (int fd, int baudrate, int databit, const char *stopbit, char parity, int vtime, int vmin );
#endif //WEATHERCOMM_H

@ -665,6 +665,7 @@ Java_com_xinyingpower_testcomm_MainActivity_testSpi(
//serial_port_comm(); //serial_port_comm();
//GM_StartSerialComm(); //GM_StartSerialComm();
Gm_InitSerialComm(); Gm_InitSerialComm();
//GM_StartSerialCameraPhoto(1, 0);
//lxy modify modify //lxy modify modify
//LOGE("_test_ setRS485Enable false"); //LOGE("_test_ setRS485Enable false");
//setRS485Enable(false); //setRS485Enable(false);

@ -13,6 +13,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <termios.h> #include <termios.h>
#include <asm/termbits.h>
#include <time.h> #include <time.h>
#include "GPIOControl.h" #include "GPIOControl.h"
#include "serialComm.h" #include "serialComm.h"
@ -738,7 +739,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
{ {
int i, j; int i, j;
#if 1 #if 0
srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
for(i=0; i<MAX_SERIAL_PORT_NUM; i++) for(i=0; i<MAX_SERIAL_PORT_NUM; i++)
{ {
@ -763,6 +764,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
#endif #endif
if(NULL == sensorParam) if(NULL == sensorParam)
return; return;
#if COLLECT_DATA
srdt.camerauseserial = -1; srdt.camerauseserial = -1;
sensorParam[0].SensorsType = WEATHER_PROTOCOL; sensorParam[0].SensorsType = WEATHER_PROTOCOL;
sensorParam[0].baudrate = 9600; sensorParam[0].baudrate = 9600;
@ -894,7 +896,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
#endif #endif
sensorParam[13].SensorsType = SLANT_PROTOCOL; sensorParam[13].SensorsType = SLANT_PROTOCOL;
sensorParam[13].baudrate = B9600; sensorParam[13].baudrate = 9600;
sensorParam[13].databit = 8; sensorParam[13].databit = 8;
//memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit)); //memset(devparam[13].stopbit, 0, sizeof(devparam[13].stopbit));
//sprintf(devparam[13].stopbit, "1"); //sprintf(devparam[13].stopbit, "1");
@ -902,7 +904,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
sensorParam[13].parity = 0; sensorParam[13].parity = 0;
//devparam[13].PowerPort = 4; //devparam[13].PowerPort = 4;
sensorParam[13].IsNoInsta = 1; sensorParam[13].IsNoInsta = 1;
sensorParam[13].devaddr = 3; sensorParam[13].devaddr = 2;
#if 0 #if 0
devparam[14].ProtocolIdx = SLANT_PROTOCOL; devparam[14].ProtocolIdx = SLANT_PROTOCOL;
devparam[14].baudrate = 1200; devparam[14].baudrate = 1200;
@ -912,8 +914,7 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
devparam[14].IsNoInsta = 1; devparam[14].IsNoInsta = 1;
//devparam[14].PowerPort = 2; //devparam[14].PowerPort = 2;
devparam[14].devaddr = 3; devparam[14].devaddr = 3;
#endif
#if 0
devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL; devparam[15].ProtocolIdx = LEIRALLY_PROTOCOL;
//#endif //#endif
devparam[15].ProtocolIdx = WIND_PROTOCOL; devparam[15].ProtocolIdx = WIND_PROTOCOL;
@ -974,6 +975,17 @@ void Gm_InitSerialComm_Test(SENSOR_PARAM *sensorParam)
rallypntmsg[i][j].AiParam.EuValueDelta = 0; rallypntmsg[i][j].AiParam.EuValueDelta = 0;
} }
#endif #endif
#else
sensorParam[3].SensorsType = PELCO_P_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;
#endif
} }
// 初始化所有串口及所接传感器的配置 // 初始化所有串口及所接传感器的配置
@ -985,6 +997,7 @@ void Gm_InitSerialComm()
//if(NULL == sensorParam) //if(NULL == sensorParam)
// return; // return;
memset(sensorParam, 0, sizeof(sensorParam));
Gm_InitSerialComm_Test(sensorParam); Gm_InitSerialComm_Test(sensorParam);
// srdt 配置 // srdt 配置
//srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型 //srdt.PtzCmdType = Cmd_Cancel; // 云台指令类型
@ -1005,7 +1018,7 @@ void Gm_InitSerialComm()
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
{ {
memset(szbuf, 0, sizeof(szbuf)); memset(szbuf, 0, sizeof(szbuf));
switch (devparam[i].ProtocolIdx) switch (sensorParam[i].SensorsType)
{ {
case 0: case 0:
sprintf(szbuf, "传感器%d没有接!", i + 1); sprintf(szbuf, "传感器%d没有接!", i + 1);
@ -1040,9 +1053,9 @@ void Gm_InitSerialComm()
} }
//LOGI("%s", szbuf); //LOGI("%s", szbuf);
sprintf(szbuf, "%s 地址%d!", szbuf, devparam[i].devaddr); sprintf(szbuf, "%s 地址%d!", szbuf, sensorParam[i].devaddr);
//LOGI("%s", szbuf); //LOGI("%s", szbuf);
if (0 == devparam[i].IsNoInsta) if (0 == sensorParam[i].IsNoInsta)
sprintf(szbuf, "没有启用!"); sprintf(szbuf, "没有启用!");
else else
{ {
@ -1050,7 +1063,12 @@ void Gm_InitSerialComm()
LOGI("%s", szbuf); LOGI("%s", szbuf);
} }
} }
#if COLLECT_DATA
Collect_sensor_data(sensorParam); Collect_sensor_data(sensorParam);
#else
CameraPhoto(sensorParam, 1, 0);
#endif
#endif #endif
#if 0 #if 0
//u_char UseSerialidx; // 使用的串口序号 //u_char UseSerialidx; // 使用的串口序号
@ -1144,11 +1162,17 @@ void GM_StartSerialComm()
{ {
if(i == srdt.camerauseserial) if(i == srdt.camerauseserial)
continue; continue;
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
serialport[i].RetryTime = 300/TIMER_CNT;
serialport[i].WaitTime = 0;
serialport[i].m_iRevStatus = 0; serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0; serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0; serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1; serialport[i].fd = -1;
ClearCmdAllFlag(i); memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
//ClearCmdAllFlag(i);
} }
} }
#if 0/* 简化插入使用摄像机过程,摄像机使用单独的串口*/ #if 0/* 简化插入使用摄像机过程,摄像机使用单独的串口*/
@ -1294,11 +1318,19 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
if(0x01 == (srdt.sampling & 0x01)) if(0x01 == (srdt.sampling & 0x01))
flag = 0; flag = 0;
#endif #endif
i = srdt.camerauseserial;
if((i<0) ||(i > MAX_SERIAL_PORT_NUM))
return;
serialport[i].Retry = 0;
//serialport[i].RetryTime = 500/TIMER_CNT;
serialport[i].RetryTime = 3000/TIMER_CNT;
serialport[i].WaitTime = 0;
serialport[i].m_iRevStatus = 0; serialport[i].m_iRevStatus = 0;
serialport[i].m_iRecvLen = 0; serialport[i].m_iRecvLen = 0;
serialport[i].m_iNeedRevLength = 0; serialport[i].m_iNeedRevLength = 0;
serialport[i].fd = -1; serialport[i].fd = -1;
ClearCmdAllFlag(i); memset(serialport[i].m_au8RecvBuf, 0, RECVDATA_MAXLENTH); // 接收数据缓存区
ClearCmdFormPollCmdBuf(i);
// 初始化串口使用状态 // 初始化串口使用状态
for(i=0; i<MAX_SERIAL_DEV_NUM; i++) for(i=0; i<MAX_SERIAL_DEV_NUM; i++)
@ -1308,6 +1340,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
continue; continue;
} }
memset(szbuf, 0, sizeof(szbuf));
switch(devparam[i].ProtocolIdx) switch(devparam[i].ProtocolIdx)
{ {
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
@ -1332,6 +1365,7 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
srdt.ms_dev[i].SerialCmdidx = cmdidx; srdt.ms_dev[i].SerialCmdidx = cmdidx;
srdt.ms_dev[i].FirstCmdTimeCnt = get_msec(); srdt.ms_dev[i].FirstCmdTimeCnt = get_msec();
srdt.sendphotocmdcnt = 0; srdt.sendphotocmdcnt = 0;
sprintf(szbuf, "摄像机");
flag = 1; flag = 1;
break; break;
default: default:
@ -1340,6 +1374,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
break; break;
} }
if(1 == srdt.ms_dev[i].IsNeedSerial)
{
LOGI("装置%d, IsNoInsta=%d, 类型:%s", i+1, devparam[i].IsNoInsta, szbuf);
Gm_OpenSensorsPower(i);
Gm_OpenSerialPort(i);
}
} }
if(0x01 == flag) if(0x01 == flag)
{ {
@ -1355,12 +1396,13 @@ void GM_StartSerialCameraPhoto(BYTE channel, int cmdidx)
//LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE)); //LOGE("12V state=%d", getInt(CMD_SET_12V_EN_STATE));
LOGV("退出采样流程!"); LOGV("退出采样流程!");
sleep(15); sleep(15);
GM_StartSerialComm(); //GM_StartSerialComm();
GM_StartSerialCameraPhoto(1,0);
//break; //break;
} }
} }
} }
return; //return;
} }
#endif #endif
@ -1426,9 +1468,9 @@ void Gm_FindAllSensorsCommand(void)
break; break;
case PELCO_D_PROTOCOL: /* 摄像机协议*/ case PELCO_D_PROTOCOL: /* 摄像机协议*/
case PELCO_P_PROTOCOL: /* 摄像机协议*/ case PELCO_P_PROTOCOL: /* 摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
flag = FindNextCameraPhotoCommand(curidx); flag = FindNextCameraPhotoCommand(curidx);
break; break;
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
break; break;
} }
if(flag == -1) if(flag == -1)
@ -1481,7 +1523,7 @@ void GM_IsCloseSensors(void)
case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/ case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
if(-1 == srdt.ms_dev[i].SerialCmdidx) if(-1 == srdt.ms_dev[i].SerialCmdidx)
{ {
if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT) //if(srdt.ms_dev[i].FirstCmdTimeCnt > 6*1000/TIMER_CNT)
{ {
srdt.ms_dev[i].IsNeedSerial = 0; srdt.ms_dev[i].IsNeedSerial = 0;
//srdt.sampling &= 0xFB; //srdt.sampling &= 0xFB;
@ -1522,7 +1564,10 @@ void GM_AllSerialComRecv(void)
if(recvlen < 1) if(recvlen < 1)
break; break;
sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen); sprintf(buf, "收到串口%d, %d字节数据:", j+1, recvlen);
BytestreamLOG(buf, recvbuf, recvlen, 'I'); if(recvlen < 101)
BytestreamLOG(buf, recvbuf, recvlen, 'I');
else
LOGI("%s", buf);
SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen); SerialDataProcess(srdt.curdevidx[j], recvbuf, recvlen);
@ -1679,40 +1724,134 @@ void SerialDataProcess(int devidx, u_char *buf, int len)
break; break;
case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/ case RESERVE2_PROTOCOL: /* 意科电池电量读取协议*/
break; break;
case RESERVE5_PROTOCOL: /* 网络安全加密协议*/ case PELCO_D_PROTOCOL: /* 摄像机协议*/
//EncryptRecvData(devidx, buf, len); case PELCO_P_PROTOCOL: /* 摄像机协议*/
break; case SERIALCAMERA_PROTOCOL: /* 串口摄像机协议*/
case SERIALCAMERA_PROTOCOL: /* 青青子木串口摄像机协议*/ CameraRecvData(devidx, buf, len);
break; break;
} }
} }
/*******************************************************************
* *
*******************************************************************/
void CameraRecvData(int devno, u_char *buf, int len)
{
int i;
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];
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(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;
}
}
}
/********************************************************************************* /*********************************************************************************
CameraPhoto CameraPhoto
**********************************************************************************/ **********************************************************************************/
void CameraPhotoPortDataProcess( int port) void CameraPhotoPortDataProcess( int devno)
{ {
RTUMSG rtumsg; RTUMSG rtumsg;
SERIAL_DEV_DEF *pPortParam; SERIAL_DEV_DEF *pPortParam;
SIO_PARAM_SERIAL_DEF *serialport; SIO_PARAM_SERIAL_DEF *curserial;
int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime; int img_file_size, packetnum, iNo, packsize, i=0, presetno, iphototime;
char szbuf[128]; char szbuf[128];
WORD uDevAddr; WORD uDevAddr;
BYTE cmdidx, recvend; BYTE cmdidx, recvend;
pPortParam = &srdt.ms_dev[port]; pPortParam = &srdt.ms_dev[devno];
serialport = &serialport[pPortParam->UseSerialidx]; curserial = &serialport[devparam[devno].commid];
memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData)); memset((void*)rtumsg.MsgData, 0, sizeof(rtumsg.MsgData));
memcpy((void*)rtumsg.MsgData, (void*)serialport->m_au8RecvBuf, pPortParam->m_iRecvLen); memcpy((void*)rtumsg.MsgData, (void*)curserial->m_au8RecvBuf, curserial->m_iRecvLen);
rtumsg.MsgLen = pPortParam->m_iRecvLen; rtumsg.MsgLen = curserial->m_iRecvLen;
rtumsg.PortIdx = port; rtumsg.PortIdx = devparam[devno].commid;
cmdidx = serialport->m_au8RecvBuf[5]; cmdidx = curserial->m_au8RecvBuf[5];
uDevAddr = serialport->m_au8RecvBuf[4]; uDevAddr = curserial->m_au8RecvBuf[4];
//sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx); //sprintf(szbuf, "摄像机地址%d,命令%02X!", uDevAddr, cmdidx);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); //DebugStringPrintf(szbuf, strlen(szbuf), 1);
if(uDevAddr != devparam[port].devaddr) if(uDevAddr != devparam[devno].devaddr)
return; return;
switch(cmdidx) switch(cmdidx)
@ -1724,8 +1863,7 @@ void CameraPhotoPortDataProcess( int port)
if(srdt.RephotographCnt > 2) if(srdt.RephotographCnt > 2)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); LOGE("因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt);
//DebugStringPrintf(szbuf, strlen(szbuf), 1);
} }
break; break;
} }
@ -1736,41 +1874,32 @@ void CameraPhotoPortDataProcess( int port)
img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); 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); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8);
srdt.imagepacketnum = packetnum; srdt.imagepacketnum = packetnum;
srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8);
sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); sprintf(szbuf, "有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGV("%s", szbuf);
//presetno = (int)GetPhotoPresetNo(pPortParam->CameraChannel);
presetno = (int)rtumsg.MsgData[i+8]; presetno = (int)rtumsg.MsgData[i+8];
//if(0 == netportparam.InitTimeFlag) curserial->RevCmdFlag = 1;
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = 10001;
/* 保存图片*/
//break
}
serialport->RevCmdFlag = 1;
pPortParam->SerialCmdidx = 1; pPortParam->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0; srdt.sendphotocmdcnt = 0;
break; break;
case 0x11: /* 图片数据包*/ case 0x11: /* 图片数据包*/
// if(0 == netportparam.InitTimeFlag)
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = 10001;
/* 保存图片*/
//break;
}
i = 6; i = 6;
iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256; iNo = rtumsg.MsgData[i+1]+rtumsg.MsgData[i]*256;
packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256; packsize = rtumsg.MsgData[i+3]+rtumsg.MsgData[i+2]*256;
sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum); sprintf(szbuf, "收到第%d(总%d包)", iNo, srdt.imagepacketnum);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGV("%s", szbuf);
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
pPortParam->FirstCmdTimeCnt = 0; pPortParam->FirstCmdTimeCnt = get_msec();
if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2])) if((iNo == pPortParam->SerialCmdidx) && (0xFF > rtumsg.MsgData[i+2]))
{ {
if(iNo == srdt.imagepacketnum)
recvend = 1;
else
recvend = 0;
if(packsize > MAX_PHOTO_FRAME_LEN)
recvend = 0xFF;
if(1 == recvend) if(1 == recvend)
pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/ pPortParam->SerialCmdidx = 10002;/* 图片读取完成*/
else if(0xFF == recvend) else if(0xFF == recvend)
@ -1792,6 +1921,7 @@ void CameraPhotoPortDataProcess( int port)
srdt.errorPhotoNoCnt++; srdt.errorPhotoNoCnt++;
sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!", sprintf(szbuf, "问询第%d包图片摄像机应答第%d包,连续错误%d次!",
pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt); pPortParam->SerialCmdidx, iNo, srdt.errorPhotoNoCnt);
LOGE("%s", szbuf);
if(srdt.errorPhotoNoCnt > 5) if(srdt.errorPhotoNoCnt > 5)
{ {
pPortParam->SerialCmdidx = 0; pPortParam->SerialCmdidx = 0;
@ -1800,16 +1930,15 @@ void CameraPhotoPortDataProcess( int port)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt); sprintf(szbuf, "因摄像机重拍%d次均未成功!结束拍照!",srdt.RephotographCnt);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGE("%s", szbuf);
} }
} }
break; break;
case 0x03: case 0x03:
sprintf(szbuf, "设置波特率%d成功", devparam[port].baudrate); sprintf(szbuf, "设置波特率%d成功", devparam[devno].baudrate);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGD("%s", szbuf);
//pPortParam->Baud = serialport->Baud;
pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo; pPortParam->SerialCmdidx = srdt.iLastGetPhotoNo;
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
pPortParam->FirstCmdTimeCnt = 0; pPortParam->FirstCmdTimeCnt = 0;
break; break;
case 0x15: case 0x15:
@ -1817,7 +1946,7 @@ void CameraPhotoPortDataProcess( int port)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "没有历史图片!结束读取图片!"); sprintf(szbuf, "没有历史图片!结束读取图片!");
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGI("%s", szbuf);
break; break;
} }
i = 6; i = 6;
@ -1827,20 +1956,11 @@ void CameraPhotoPortDataProcess( int port)
img_file_size = rtumsg.MsgData[i+3]+ (rtumsg.MsgData[i+2]<<8)+(rtumsg.MsgData[i+1]<<16)+(rtumsg.MsgData[i]<<24); 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); packetnum = rtumsg.MsgData[i+5]+(rtumsg.MsgData[i+4]<<8);
srdt.imagepacketnum = packetnum; srdt.imagepacketnum = packetnum;
srdt.historyimagenum[devparam[port].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8); srdt.historyimagenum[devparam[devno].CameraChannel-1] = rtumsg.MsgData[i+7]+(rtumsg.MsgData[i+6]<<8);
//presetno = netportparam.CurPresetno[pPortParam->CameraChannel-1];
presetno = rtumsg.MsgData[i+8]; presetno = rtumsg.MsgData[i+8];
sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[port].CameraChannel-1]); sprintf(szbuf, "读取历史图片,还有%d张历史图片!",srdt.historyimagenum[devparam[devno].CameraChannel-1]);
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGI("%s", szbuf);
//if(0 == netportparam.InitTimeFlag) curserial->RevCmdFlag = 1;
{
serialport->RevCmdFlag = 1;
srdt.sendphotocmdcnt = 0;
pPortParam->SerialCmdidx = -1;
//netportparam.PhotosFlag = FALSE;
break;
}
serialport->RevCmdFlag = 1;
pPortParam->SerialCmdidx = 1; pPortParam->SerialCmdidx = 1;
srdt.sendphotocmdcnt = 0; srdt.sendphotocmdcnt = 0;
break; break;
@ -1849,30 +1969,22 @@ void CameraPhotoPortDataProcess( int port)
{ {
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
sprintf(szbuf, "图片保存失败!"); sprintf(szbuf, "图片保存失败!");
//DebugStringPrintf(szbuf, strlen(szbuf), 1); LOGE("%s", szbuf);
} }
if(0 == rtumsg.MsgData[10]) if(0 == rtumsg.MsgData[10])
{ {
if(0 == srdt.historyimagenum[devparam[port].CameraChannel-1]) if(0 == srdt.historyimagenum[devparam[devno].CameraChannel-1])
{ {
//netportparam.SerialCameraPowerCtrl[devparam[port].CameraChannel-1] = 0; ;
//srdt.sampling &= 0xFB;
} }
else else
pPortParam->FirstCmdTimeCnt = -3*60*1000/TIMER_CNT; pPortParam->FirstCmdTimeCnt = get_msec();
}
else
{
//srdt.sampling &= 0xFB;
//netportparam.SerialCameraPowerCtrl[pPortParam->CameraChannel-1] = 0;
} }
pPortParam->SerialCmdidx = -1; pPortParam->SerialCmdidx = -1;
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
//if(0 == netportparam.InitTimeFlag)
break; break;
default: default:
serialport->RevCmdFlag = 1; curserial->RevCmdFlag = 1;
break; break;
} }
} }
@ -2018,18 +2130,20 @@ int FindNextCameraPhotoCommand(int devidx)
char szbuf[128]; char szbuf[128];
//如果命令缓冲区仍有命令,则退出本函数 //如果命令缓冲区仍有命令,则退出本函数
if((devparam[devidx].commid < 1) || (devparam[devidx].commid >= MAX_SERIAL_PORT_NUM)) if((devparam[devidx].commid+1 < 1) || (devparam[devidx].commid+1 >= MAX_SERIAL_PORT_NUM))
return -1; return -1;
if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/ if(-1 == srdt.ms_dev[devidx].SerialCmdidx)/* 下发拍照指令*/
return -1; return -1;
cmdno = srdt.ms_dev[devidx].SerialCmdidx; cmdno = srdt.ms_dev[devidx].SerialCmdidx;
if(0 == cmdno)/* 下发拍照指令*/ if(0 == cmdno)/* 下发拍照指令*/
{ {
if(srdt.ms_dev[devidx].FirstCmdTimeCnt < 4*1000/TIMER_CNT) if((get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 3*35*1000) ||(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt < 0))
{ {
srdt.ms_dev[devidx].FirstCmdTimeCnt = get_msec();
return -1; return -1;
} }
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT)
if(get_msec() - srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000)
{ {
srdt.ms_dev[devidx].SerialCmdidx = -1; srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "串口摄像机未接或故障!结束拍照!"); sprintf(szbuf, "串口摄像机未接或故障!结束拍照!");
@ -2079,7 +2193,8 @@ int FindNextCameraPhotoCommand(int devidx)
srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo; srdt.ms_dev[devidx].SerialCmdidx = srdt.iLastGetPhotoNo;
return -1; return -1;
} }
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000/TIMER_CNT)
if(get_msec()- srdt.ms_dev[devidx].FirstCmdTimeCnt > 15*1000)
{ {
srdt.ms_dev[devidx].SerialCmdidx = -1; srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "设置串口摄像机参数时15秒未收到摄像机应答!退出设置!"); sprintf(szbuf, "设置串口摄像机参数时15秒未收到摄像机应答!退出设置!");
@ -2109,7 +2224,7 @@ int FindNextCameraPhotoCommand(int devidx)
imagesize = 0xFF; imagesize = 0xFF;
packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx; packetsize = (WORD)srdt.ms_dev[devidx].SerialCmdidx;
cmdidx = 0x11; cmdidx = 0x11;
if(srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000/TIMER_CNT) if(get_msec()-srdt.ms_dev[devidx].FirstCmdTimeCnt > 35*1000)
{ {
srdt.ms_dev[devidx].SerialCmdidx = -1; srdt.ms_dev[devidx].SerialCmdidx = -1;
sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize); sprintf(szbuf, "读取第%d包图片数据35秒未收到!结束拍照!",packetsize);
@ -2118,7 +2233,8 @@ int FindNextCameraPhotoCommand(int devidx)
} }
} }
MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality); MakeCameraPhotoCommand(devidx, cmdidx, imagesize, packetsize, imagequality);
srdt.curdevidx[srdt.ms_dev[devidx].UseSerialidx] = devidx; //MakeCameraPhotoCommand(devidx, 2, imagesize, packetsize, imagequality);
srdt.curdevidx[devparam[devidx].commid] = devidx;
return 1; return 1;
} }
@ -2145,6 +2261,9 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara
sendbuf[i++] = cmdidx; /* 命令字*/ sendbuf[i++] = cmdidx; /* 命令字*/
switch(cmdidx) switch(cmdidx)
{ {
case 0x02: /* */
sendbuf[i-2] = 0xFF;
break;
case 0x03: /*设置传感器通讯参数03H*/ case 0x03: /*设置传感器通讯参数03H*/
sendbuf[i++] = 0x00; /* 波特率*/ sendbuf[i++] = 0x00; /* 波特率*/
sendbuf[i++] = 0x00; sendbuf[i++] = 0x00;
@ -2163,7 +2282,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara
sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = HIBYTE(LOWORD(icurtime+8*60*60));
sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60)); sendbuf[i++] = LOBYTE(LOWORD(icurtime+8*60*60));
sendbuf[i++] = Threep;/*图像质量ImageQuality*/ sendbuf[i++] = Threep;/*图像质量ImageQuality*/
//sendbuf[i++] = netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点PresetNo*/ sendbuf[i++] = 0;//netportparam.CurPresetno[srdt.ms_dev[portno].CameraChannel-1];/*拍照预置点PresetNo*/
break; break;
case 0x11: /* 获取指定包数据11H*/ case 0x11: /* 获取指定包数据11H*/
sendbuf[i++] = HIBYTE(TwoParam);/*图片包号PackageNo*/ sendbuf[i++] = HIBYTE(TwoParam);/*图片包号PackageNo*/
@ -2187,7 +2306,7 @@ void MakeCameraPhotoCommand( int portno, BYTE cmdidx, int OneParam, WORD TwoPara
sendbuf[3] = (BYTE)((i-10)>>8); sendbuf[3] = (BYTE)((i-10)>>8);
sendbuf[4] = (BYTE)(i-10); sendbuf[4] = (BYTE)(i-10);
serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i; serialport[srdt.ms_dev[portno].UseSerialidx].cmdlen = i;
return; //return;
} }
// 准备发送云台指令 // 准备发送云台指令
@ -2210,6 +2329,7 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd)
LOGI("%s", szbuf); LOGI("%s", szbuf);
return 1; return 1;
} }
#if 0
if((2 > srdt.ms_dev[i].UseSerialidx+1) ||(MAX_SERIAL_PORT_NUM < srdt.ms_dev[i].UseSerialidx+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); sprintf(szbuf, "通道%d摄像机错误的使用了串口%d", channel, srdt.ms_dev[i].UseSerialidx+1);
@ -2218,9 +2338,10 @@ int Gm_CtrlPtzCmd(u_char channel, DWORD ptzcmd)
} }
else else
{ {
#endif
sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1); sprintf(szbuf, "摄像机通道%d 使用串口%d", channel, srdt.ms_dev[i].UseSerialidx+1);
LOGI("%s", szbuf); LOGI("%s", szbuf);
} //}
srdt.usecameradevidx = i; srdt.usecameradevidx = i;
// 查找串口序号 // 查找串口序号
srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx; srdt.camerauseserial = srdt.ms_dev[i].UseSerialidx;
@ -2243,12 +2364,14 @@ int Gm_Camera_Timer(void)
{ {
char szbuf[128]; char szbuf[128];
#if 0
if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1)) if((2 > srdt.camerauseserial+1) ||(MAX_SERIAL_PORT_NUM < srdt.camerauseserial+1))
{ {
sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1); sprintf(szbuf, "摄像机错误的使用了串口%d", srdt.camerauseserial+1);
LOGI("%s", szbuf); LOGI("%s", szbuf);
return 1; return 1;
} }
#endif
if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx) if(PELCO_D_PROTOCOL == devparam[srdt.usecameradevidx].ProtocolIdx)
{ {
switch(srdt.PtzCmdType) switch(srdt.PtzCmdType)
@ -3146,5 +3269,39 @@ void Collect_sensor_data(SENSOR_PARAM *sensorParam)
GM_StartSerialComm(); GM_StartSerialComm();
} }
void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx)
{
int i;
//speed_t baudrate;
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;
//baudrate = getBaudrate(sensorParam[i].baudrate);
devparam[i].baudrate = getBaudrate(sensorParam[i].baudrate);
//devparam[i].baudrate = 17;
devparam[i].databit = sensorParam[i].databit;
if((sensorParam[i].stopbit > 0) && (sensorParam[i].stopbit < 3))
{
memset(devparam[i].stopbit, 0, sizeof(devparam[i].stopbit));
sprintf(devparam[i].stopbit, "%0.1f", sensorParam[i].stopbit);
}
devparam[i].CameraChannel = sensorParam[i].CameraChannel;
devparam[i].Phase = sensorParam[i].Phase;
}
for(;;)
{
Gm_CtrlPtzCmd(1, P_MOVE_LEFT);
sleep(3);
Gm_CtrlPtzCmd(1, Cmd_Cancel);
sleep(10);
}
//GM_StartSerialComm();
//GM_StartSerialCameraPhoto(1, 0);
}

@ -7,6 +7,7 @@
#include <string> #include <string>
#include "GPIOControl.h" #include "GPIOControl.h"
#include "termios.h"
#ifndef DWORD #ifndef DWORD
typedef unsigned int DWORD; typedef unsigned int DWORD;
@ -96,6 +97,8 @@ typedef unsigned char BYTE;
#define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/
#define SERIAL_CAMERA 2 /* 串口摄像机a*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/
#define COLLECT_DATA 0 /* 调试使用*/
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/ #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, "serial_port_comm", fmt, ##args) /* 红色*/
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/ #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, "Sensors_Protocol", fmt, ##args) /* 草绿色*/
#define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/ #define LOGV(fmt, args...) __android_log_print(ANDROID_LOG_VERBOSE, "serial_port_comm", fmt, ##args)/* 白色*/
@ -355,6 +358,8 @@ int GM_CloseTimer(void);
// 串口接收数据处理 // 串口接收数据处理
void SerialDataProcess(int devidx, u_char *buf, int len); void SerialDataProcess(int devidx, u_char *buf, int len);
void CameraRecvData(int commid, u_char *buf, int len);
// 串口摄像机数据处理 // 串口摄像机数据处理
void CameraPhotoPortDataProcess( int port); void CameraPhotoPortDataProcess( int port);
@ -422,6 +427,7 @@ int Gm_SetSerialPortBaud(int commid);
//T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate); //T_baudrate Gm_GetSerialPortBaud(UART_baudrate Baudrate);
void Gm_CloseSerialCamera(); void Gm_CloseSerialCamera();
void CameraPhoto(SENSOR_PARAM *sensorParam, unsigned char channel, int cmdidx);
// 生成一个随机整数 // 生成一个随机整数
int GeneratingRandomNumber(); int GeneratingRandomNumber();

Loading…
Cancel
Save