308 lines
4.8 KiB
C
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;
|
|
}
|
|
|