Files
2025-12-15 16:07:49 +08:00

308 lines
4.8 KiB
C

#include "stdafx.h"
#include "doc.h"
static struct meter_struct meter[MAX_METER_NUM];
//static u16 meter_num = 0;
/*
增加电表
id 总是保持统一
*/
void meter_init()
{
memset(meter,0,sizeof(meter));
}
bool meter_find(u8 * addr,u16 * index)
{
for(u16 i = 0;i<MAX_METER_NUM;i++)
{
if(0 == memcmp(addr,meter[i].addr,6))
{
*index = i;
return true;
}
}
return false;
}
void meter_add(u16 id,u8 * addr,u8 type,u8 pro,u8 baud,u8 * pd,u8 * coladdr,u8 port)
{
//判断是否是唯一。
//如果有相同的。不加入
u16 index = 0;
if(!meter_find(addr,&index))
{
if(id<MAX_METER_NUM)
{
meter[id].id = id;
memmove(meter[id].addr,addr,7);
meter[id].type = type;
meter[id].pro = pro;
meter[id].baud = baud;
memmove(meter[id].password,pd,4);
memmove(meter[id].colladdr,coladdr,6);
meter[id].port = port;
}
}
}
/*
读电表档案
*/
bool is_meter_read(u8 * val)
{
u8 * num = val;
// if(*num<MAX_METER_NUM)
{
u8 * id = val + 1;
for(u8 i=0; i<*num; i++)
{
u16 index = (id[1]<<8)|id[0];
if(index>MAX_METER_NUM)
{
return false;
}
id = id + 2;
}
return true;
}
//return false;
}
void meter_read(u8 * id,u8 * val,u16 * len)
{
u8 num = * id;
u8 i = 0;
u16 index = 0;
//因为容易挂,所以对数据合法性判断
if(is_meter_read(id))
{
id = id + 1;
* val = num;
val = val + 1;
// if(num<MAX_METER_NUM)
{
for(i=0;i<num;i++)
{
index = (id[1]<<8)|id[0];
//0 1
//val[0] = id[0];
//val[1] = id[1];
//为统一,用表里实际的值来填充!
val[0] = meter[index].id&0xFF;//id[0];
val[1] = meter[index].id>>8&0xFF;//id[1];
//234 567 8
memmove(&val[2],meter[index].addr,7);
//9
val[9] = meter[index].type;
//10
val[10] = meter[index].pro;
//11
val[11] = meter[index].baud;
//12 13 14 15
memmove(&val[12],meter[index].password,4);
//16 17 18 19 20 21
//memmove(&val[16],meter[index].colladdr,4);
//22
//val[22] = meter[index].port;
id = id + 2;
//val = val + 23;
val = val + 17;
}
//*len = 23 * num + 1;
*len = 17 * num + 1;
}
}
}
bool meter_find_id_fromaddr(u8 * addr,u16 * id)
{
for(u16 i = 0;i<MAX_METER_NUM;i++)
{
if(0 == memcmp(addr,meter[i].addr,6))
{
* id = i;
return true;
}
}
return false;
}
bool meter_find_addr6(u8 * addr)
{
for(u16 i = 0;i<MAX_METER_NUM;i++)
{
if(0 == memcmp(addr,meter[i].addr,6) && meter[i].id == i)
{
return true;
}
}
return false;
}
bool meter_find_addr6_relay(u8 * addr)
{
u8 * relay = NULL;
for(u16 i = 0;i<MAX_METER_NUM;i++)
{
relay = addr + 6;
if(0 == memcmp(addr,meter[i].addr,6) && meter[i].id == i && 0 == memcmp(relay,meter[i].colladdr,6))
{
return true;
}
}
return false;
}
void meter_close(u8 * id)
{
}
void doc_write()
{
}
void doc_read()
{
}
bool is_doctype_ok(u16 index)
{
//暂时认为全部打开,有命令可以设置关闭。
// if((meter[index].type == 0x81 || meter[index].type == 0x01)&&(meter[index].id != 0))
//0x81 有阀门
//0x01 没有阀门
//
if((meter[index].id != 0) && meter[index].id == index)
{
return true;
}
return false;
}
//合法的档案总数
u16 meter_get_count()
{
u16 count = 0;
u16 i = 0;
for(i=0;i<MAX_METER_NUM;i++)
{
if(is_doctype_ok(i))
{
count++;
}
}
return count;
}
//按序号得到的档案id号。
bool meter_get_id(u16 index,u16 * id)
{
//count 档案里有用的才用。
//index是有序的索引值。
//id是实际返回的值
u16 count = 0;
u16 i = 0;
for(i=0;i<MAX_METER_NUM;i++)
{
if(is_doctype_ok(i))
{
if(index == count)
{
*id = meter[i].id;
return true;
}
count ++;
}
}
return false;
}
//按序号得到的档案地址号。
bool meter_get_addr(u16 index,u8 * addr)
{
//count 档案里有用的才用。
//index是有序的索引值。
//id是实际返回的值
u16 count = 0;
u16 i = 0;
for(i=0;i<MAX_METER_NUM;i++)
{
if(is_doctype_ok(i))
{
if(index == count)
{
memmove(addr,meter[i].addr,7);
return true;
}
count ++;
}
}
return false;
}
//按序号得到的档案地址号。
bool meter_get_relay(u16 index,u8 * addr)
{
//count 档案里有用的才用。
//index是有序的索引值。
//id是实际返回的值
u16 count = 0;
u16 i = 0;
for(i=0;i<MAX_METER_NUM;i++)
{
if(is_doctype_ok(i))
{
if(index == count)
{
memmove(addr,meter[i].colladdr,6);
return true;
}
count ++;
}
}
return false;
}
//id 为实际电表数组里的下标
bool meter_getaddress_fromid(u16 id,u8 * addr)
{
if(id<MAX_METER_NUM)
{
if(NULL != addr)
{
memmove(addr,meter[id].addr,7);
return true;
}
}
else
{
printf("\r\n**********meter_getfromid 大于电表总数 id >= MAX_METER_NUM **********\n\r\n");
}
return false;
}