Exemple #1
0
/************************************************************************************************
 组包发送抄表指令,地址在每次开机时从bak区取回赋值,所以组包时不用赋值
 参数1:要组包的存储区域指针
 返回 CONTROL_RET_FAIL 发送失败, CONTROL_RET_SUC 发送成功
 ************************************************************************************************/
int CreatFrame_heatmeter(UINT8 * pCommd, DELU_HEAT_METER_CMD_T *pmeter,
		UINT8 *pucOutLen) {
	UINT8 i = 0;
	UINT8 *pTemp = pCommd;
	UINT8 *pCheck = pTemp + DELU_HEAT_METER_COMMOND_FE_NUMBER;

	if (pCommd == NULL) {
		debug_info(gDebugModule[TIMING_METER],
				"[%s][%s][%d] ERROR!  piont is NULL!\n", FILE_LINE);
		return CONTROL_RET_FAIL;
	}

	memset(pTemp, 0xFE, DELU_HEAT_METER_COMMOND_FE_NUMBER);		//前导符
	pTemp += DELU_HEAT_METER_COMMOND_FE_NUMBER;

	pCheck = pTemp;
	*pTemp++ = 0x68;											// 数据帧头
	*pTemp++ = 0x20;

	for (i = 0; i < 7; i++)											// 仪表地址 做逆序
			{
		*pTemp++ = pmeter->ucAddr[i];
	}

	*pTemp++ = pmeter->ucControlCode;							// 控制码
	*pTemp++ = pmeter->ucDataLen;								// 数据域长度

	*pTemp++ = pmeter->ucDILow;
	*pTemp++ = pmeter->ucDIHigh;
	*pTemp++ = gHeatMeterSer;

	memcpy(pTemp, pmeter->aucData, pmeter->ucDataLen - 3);
	pTemp += pmeter->ucDataLen - 3;

	*pTemp++ = Calc_CS_heat(pCheck,
			DELU_HEAT_METER_COMMOND_BASE_LEN + pmeter->ucDataLen);
	*pTemp = 0x16;

	*pucOutLen = DELU_HEAT_METER_COMMOND_BASE_LEN + pmeter->ucDataLen
			+ DELU_HEAT_METER_COMMOND_FE_NUMBER + 2;

	debug_notice(gDebugModule[METER], "the frame is ");
	for (i = 0; i < *pucOutLen; i++) {
		debug_notice(gDebugModule[METER], " %2x", pCommd[i]);
	}
	debug_notice(gDebugModule[METER], "\n");
	return CONTROL_RET_SUC;
}
Exemple #2
0
/************************************************************************************************
 德鲁热表的接受函数
 参数1:设备的描述符,在主线程中准备好,在此使用     
 返回 CONTROL_RET_FAIL 发送失败, CONTROL_RET_SUC 发送成功
 ************************************************************************************************/
INT32 heat_meter_com_rev(INT32 u32DeviceFd) {
	uint8 ret = 0, c;
	INT8 cLoopFlag = 1;
	fd_set ReadSetFD;
	struct timeval stTimeVal;

	while (cLoopFlag) {
		FD_ZERO(&ReadSetFD);
		FD_SET(u32DeviceFd, &ReadSetFD);
		/* 设置等待的超时时间 */
		stTimeVal.tv_sec = DELU_SEC_TIME_OUT;
		stTimeVal.tv_usec = DELU_USEC_TIME_OUT;
		if (select(u32DeviceFd + 1, &ReadSetFD, NULL, NULL, &stTimeVal) <= 0) {
			debug_notice(gDebugModule[METER],
					"heat_meter REV is time out .....(%d)\n", errno);
			cLoopFlag--;
			/* 超时处理*/
		}
		if (FD_ISSET(u32DeviceFd, &ReadSetFD)) {
			if (read(u32DeviceFd, &c, 1) == 1) {
				ret = Heat_ReceiveFrameAnalyse(c);
				if (ret != 9)
					gHeat_RecState = FRAME_START;

				if (ret == 0) {
					return (CONTROL_RET_SUC);
				} else {
					//printf("Heat meter rev return value is %d\n", ret);
				}
			}
		}
		//printf("\n");
	}
	return (CONTROL_RET_FAIL);
}
Exemple #3
0
/************************************************************************************************
 发送抄表热表通过Mbus       
 参数1:设备的描述符,在主线程中准备好,在此使用     
 返回 CONTROL_RET_FAIL 发送失败, CONTROL_RET_SUC 发送成功
 ************************************************************************************************/
INT32 heat_meter_com_send(INT32 u32DeviceFd, DELU_HEAT_METER_CMD_T *pmeter) {
	int i = 0;
	UINT8 ucCommdLen = 0;
	UINT8 CJ188Frame[256] = { 0x00 };

	CreatFrame_heatmeter(CJ188Frame, pmeter, &ucCommdLen);

	debug_notice(gDebugModule[METER], "The Frame is ");

	for (i = 0; i < ucCommdLen; i++) {
		debug_notice(gDebugModule[METER], " %2x", CJ188Frame[i]);
	}
	debug_notice(gDebugModule[METER], "\n");

	if (write(u32DeviceFd, (UINT8 *) &CJ188Frame, ucCommdLen) != ucCommdLen) {
		printf("heat_meter_com_send write error(%d)\n", errno);
	}

	return CONTROL_RET_SUC;
}
Exemple #4
0
int load_avatar(uint32_t friend_number, uint8_t **dest, size_t *size_out) {
    size_t size = 0;

    uint8_t *img = utox_load_data_avatar(friend_number, &size);
    if (!img) {
        debug_notice("Avatars:\tUnable to get saved avatar from disk for friend %u\n", friend_number);
        return 0;
    }

    if (size > UTOX_AVATAR_MAX_DATA_LENGTH) {
        free(img);
        debug_error("Avatars:\tSaved avatar file for friend (%u) too large for tox\n", friend_number);
        return 0;
    }

    *dest = img;

    // free(avatar_data);

    if (size_out) {
        *size_out = size;
    }
    return 1;
}
Exemple #5
0
UINT8 Heat_meter_com(INT32 u32DeviceFd, MeterFileType *pmf) {
	INT32 ret = 0;
	UINT8 datatemp[50] = { 0x00 };
	INT8 Retry = 1;
	int i = 0;
	char datatempString[100] = { 0x00 };
	char Sq_DataString[200] = { 0x00 };

	//ELECT_DataType elect_data;				//此处可扩展做多数据项读
	DELU_HEAT_METER_CMD_T heat_meter;

	for (i = 0; i < 7; i++) {
		debug_notice(gDebugModule[METER], " %x", pmf->Meter_addr[i]);
	}
	debug_notice(gDebugModule[METER], "\n");

	memcpy(heat_meter.ucAddr, pmf->Meter_addr, 7);
	memcpy(gHeatMeterAddrArray_Back, heat_meter.ucAddr, 7);

	//此处可做循环,来抄读多个数据项,通过传递参数多个标识符的宏定义来
	// 统一判断不同协议下读取相同数据项

	while (Retry-- > 0) {
		debug_notice(gDebugModule[METER], "Protocol_type is %d\n",
				pmf->Protocol_type);
		if (pmf->Protocol_type == 1) {
			heat_meter.ucControlCode = 0x01;
			heat_meter.ucDataLen = 0x03;
			heat_meter.ucDILow = 0x1F;
			heat_meter.ucDIHigh = 0x90;

			gheatmeterDI_Back = (heat_meter.ucDIHigh << 8) | heat_meter.ucDILow;
		} else if (pmf->Protocol_type == 2) {
			heat_meter.ucControlCode = 0x01;
			heat_meter.ucDataLen = 0x03;
			heat_meter.ucDILow = 0x1f;
			heat_meter.ucDIHigh = 0x90;

			gheatmeterDI_Back = (heat_meter.ucDIHigh << 8) | heat_meter.ucDILow;
		} else {
			debug_err(gDebugModule[METER], "Protocol type is not right!\n");
			ret = CONTROL_RET_FAIL;
			goto RealtimeRead;
		}

		debug_debug(gDebugModule[METER], "start com with heat meter!\n");
		heat_meter_com_send(u32DeviceFd, &heat_meter);

		ret = heat_meter_com_rev(u32DeviceFd);
		if (ret) {
			memset(datatemp, 0x00, 3);
			debug_info(gDebugModule[TIMING_METER],
					"[%s][%s][%d]  Analysis HeatMeter Data Error! This Error is %d\n",
					FILE_LINE, ret);
		} else {
			memcpy(datatemp, g_stDELU_Heat_Meter_Commd.aucData,
					g_stDELU_Heat_Meter_Commd.ucDataLen - 3);
			debug_info(gDebugModule[TIMING_METER], "Revcie successful !\n");
			break;
		}

	}
	if (ret)
		strcpy((char *) Sq_DataString, "timout','");
	else
		strcpy((char *) Sq_DataString, "ok','");
	//根据读取的标识符不同来做不同的数据处理,将其转换为字符串格式
	if (datatemp[9] == 0x05) {
		Bcd645DataToAscii((uint8 *) datatempString, (uint8 *) &datatemp[5], 6,
				2);
	} else if (datatemp[9] == 0x08) {

		Bcd645DataToAscii((uint8 *) datatempString, (uint8 *) &datatemp[5], 8,
				0);
		strcat((char *) datatempString, "0");
	} else if (datatemp[9] == 0x0A) {
		Bcd645DataToAscii((uint8 *) datatempString, (uint8 *) &datatemp[5], 8,
				0);
		strcat((char *) datatempString, "000");
	}
	strcat((char *) Sq_DataString, datatempString);

	//多个数据项抄读完成后在此处进行数据库数据的统一插入

	debug_info(gDebugModule[TIMING_METER], "Rcv Heat Data is %s\n",
			Sq_DataString);
	if (pmf->ReadMeter_type == PeriodReadMeter)
		heat_write_date_into_sqlite(pmf, Sq_DataString);
	RealtimeRead: if (pmf->ReadMeter_type == RealtimeReadMeter) {
		if (ret == CONTROL_RET_SUC)
			sprintf(gxml_realtime_rsp_t.error, "success");
		else
			sprintf(gxml_realtime_rsp_t.error, "fail");
		stringCopy((char *) gxml_realtime_rsp_t.result, (char *) Sq_DataString,
				'\'');
	} else
	debug_info(gDebugModule[TIMING_METER], "the  ReadMeter_type = %d error!\n",
			pmf->ReadMeter_type);
	return ret;
}