day22_6-re模块


# 参考资料:
# python模块(转自Yuan先生) - 狂奔__蜗牛 - 博客园
# https://www.cnblogs.com/guojintao/articles/9070485.html

# ------------------------------------------------------------
# ********************day22_6-re模块 *******************
# ********************day22_6-re模块 *******************
# =====>>>>>>内容概览
# =====>>>>>>内容概览

# ------------------------------------------------------------
# # 1、re模块 的解释
# # # 就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌
# # # 在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹
# # # 配引擎执行。
# # # 字符匹配(普通字符,元字符):
# # # 1 普通字符:大多数字符和字母都会和自身匹配
# # # >>> re.findall('alvin','yuanaleSxalexwupeiqi')
# # # ['alvin']
# # # 2 元字符:. ^ $ * + ? { } [ ] | ( ) \
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 2、re.findall(待匹配的字符串,被查找的对象)
# # # 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
# # # 注意: findall 匹配所有。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 3、re.findall(待匹配的字符串,被查找的对象) 与 “.”元字符
# # # 一个元字符“.”代表一个未知的字符
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 4、re.findall(待匹配的字符串,被查找的对象) 与 “^”元字符
# # # “^”代表待匹配的字符串的内容是在 被查找的对象中的开头部分开始匹配
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 5、re.findall(待匹配的字符串,被查找的对象) 与 “$”元字符
# # # “$”代表的是,待匹配的字符串的位置的末尾处,是在被查找对象的末尾的
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 6、re.findall(待匹配的字符串,被查找的对象) 与 元字符“*”
# # # 其前面的一个字符匹配0个或多个的表达式。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 7、re.findall(待匹配的字符串,被查找的对象) 与 元字符“+”
# # # 其前面的一个字符匹配1个或多个的表达式。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 8、re.findall(待匹配的字符串,被查找的对象) 与 元字符“?”
# # # 其前面的一个字符匹配1个或0个的表达式。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 9、re.findall(待匹配的字符串,被查找的对象) 与 元字符“{}”
# # # {0,} == *
# # # {1,} == +
# # # {0,1} == ?
# # # {6} ==
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 10、re.findall(字符序列1[字符序列2],被查找的对象) 与 元字符“[]”
# # # 字符序列2提供选择,查找是,字符序列1在序列2中选出某个字符进行搭配,之后再被查找对象中进行查找
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 11、re.findall(字符序列1[字符序列2],被查找的对象) 与 元字符“[ - ]*”
# # # 字符序列2提供选择,查找是,字符序列1在序列2中选出某个字符进行搭配,之后再被查找对象中进行查找
# # # 里面的“-”表示范围,[ a-z] ,表示a-z的小写字母;[ 0-9] ,表示a-z的小写字母
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 12、re.findall(字符序列1[^字符序列2],被查找的对象) 与 元字符“[^ - ]”
# # # ^字符序列2进行取非,之后提供选择,查找是,字符序列1在序列2中选出某个字符进行搭配,
# # # 之后再被查找对象中进行查找
# # # 里面的“^”表示取非,[ a-z] ,表示a-z的小写字母;[ 0-9] ,表示a-z的小写字母
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 13、元字符之转义符\
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

# ------------------------------------------------------------
# # 14、re.findall 在计算中的应用
# # # 在计算上的应用,使用正则表达示来处理字符串,而不是用eval来去掉字符中的双引号来实现计算
# # # 这里是将内层的(2-1)取出来
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------

 


 

 


------------------------------------------------分割线-------------------------------------------------

------------------------------------------------分割线-------------------------------------------------

------------------------------------------------分割线-------------------------------------------------

'''
# ------------------------------------------------------------
# # 1、re模块 的解释
# # # 就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌
# # # 在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹
# # # 配引擎执行。
# # # 字符匹配(普通字符,元字符):
# # # 1 普通字符:大多数字符和字母都会和自身匹配
# # #               >>> re.findall('alvin','yuanaleSxalexwupeiqi')
# # #                       ['alvin']
# # # 2 元字符:. ^ $ * + ? { } [ ] | ( ) \
# ------------------------------------------------------------
'''





'''
# ------------------------------------------------------------
# # 2、re.findall(待匹配的字符串,被查找的对象)
# # # 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
# # # 注意: findall 匹配所有。 
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a1 = re.findall("alex","asfasgasdfalrex")
# a2 = re.findall("alex","asfasgasdfalex")
# print(a1)
# print(a2)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # []
# # ['alex']
# #
# # Process finished with exit code 0



'''
# ------------------------------------------------------------
# # 3、re.findall(待匹配的字符串,被查找的对象) 与 “.”元字符
# # # 一个元字符“.”代表一个未知的字符
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a1 = re.findall("a.x","asfasgasdfalex")
# a2 = re.findall("a..x","asfasgasdfalex")
# a3 = re.findall("a....x","asfasgasdfalex")
#
# print(a1)
# print(a2)
# print(a3)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # []
# # ['alex']
# # []
# #
# # Process finished with exit code 0



'''
# ------------------------------------------------------------
# # 4、re.findall(待匹配的字符串,被查找的对象) 与 “^”元字符
# # # “^”代表待匹配的字符串的内容是在 被查找的对象中的开头部分开始匹配
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a0 = re.findall("^a","alexsfasgasdfalex")
# a1 = re.findall("^a.x","alexsfasgasdfalex")
# a2 = re.findall("^a..x","alexsfasgasdfalex")
# a21 = re.findall("^a..x","wwwalexsfasgasdfalex")      # 被查找的字符串的开头不是a
# a3 = re.findall("^a....x","alexsfasgasdfalex")
#
# print(a0)
# print(a1)
# print(a2)
# print(a21)
# print(a3)
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['a']
# # []
# # ['alex']
# # []
# # []
# # ['x']
# #
# # Process finished with exit code 0








'''
# ------------------------------------------------------------
# # 5、re.findall(待匹配的字符串,被查找的对象) 与 “$”元字符
# # # “$”代表的是,待匹配的字符串的位置的末尾处,是在被查找对象的末尾的
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a0 = re.findall("x$","alexsfasgasdfalex")
# a1 = re.findall("a.x$","alexsfasgasdfalex")
# a2 = re.findall("a..x$","alexsfasgasdfalex")
# a21 = re.findall("a..x$","alexsfasgasdfalexwwwww")
# a3 = re.findall("a....x$","alexsfasgasdfalex")
#
# print(a0)
# print(a1)
# print(a2)
# print(a21)
# print(a3)
#
# #
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['x']
# # []
# # ['alex']
# # []
# # []
# #
# # Process finished with exit code 0







'''
# ------------------------------------------------------------
# # 6、re.findall(待匹配的字符串,被查找的对象) 与 元字符“*”
# # # 其前面的一个字符匹配0个或多个的表达式。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a0 = re.findall("9*","9le99xsfa999sga9999sdfal99999ex")
# # 结果表示从  x  出现的次数从0次-->无穷次
# a1 = re.findall("alex*","ale0alex122alexx333alexxx4444alexxxx55555")
#
# print(a0)
# print(a1)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['9', '', '', '99', '', '', '', '', '999', '', '', '', '9999', '', '', '', '', '', '99999', '', '', '']
# # ['ale', 'alex', 'alexx', 'alexxx', 'alexxxx']
# #
# # Process finished with exit code 0







'''
# ------------------------------------------------------------
# # 7、re.findall(待匹配的字符串,被查找的对象) 与 元字符“+”
# # # 其前面的一个字符匹配1个或多个的表达式。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a0 = re.findall("9+","9le99xsfa999sga9999sdfal99999ex")
# # 结果表示从  x  出现的次数从1次-->无穷次
# a1 = re.findall("alex+","ale0alex122alexx333alexxx4444alexxxx55555")
#
# print(a0)
# print(a1)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['9', '99', '999', '9999', '99999']
# # ['alex', 'alexx', 'alexxx', 'alexxxx']
# #
# # Process finished with exit code 0






'''
# ------------------------------------------------------------
# # 8、re.findall(待匹配的字符串,被查找的对象) 与 元字符“?”
# # # 其前面的一个字符匹配1个或0个的表达式。
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a0 = re.findall("9?","9le99xsfa999sga9999")
# # 结果表示从  x  出现的次数从0次-->1次
# a1 = re.findall("alex?","ale0alex122alexx333alexxx4444alexxxx55555")
#
# print(a0)
# print(a1)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['9', '', '', '9', '9', '', '', '', '', '9', '9', '9', '', '', '', '9', '9', '9', '9', '']
# # ['ale', 'alex', 'alex', 'alex', 'alex']
# #
# # Process finished with exit code 0






'''
# ------------------------------------------------------------
# # 9、re.findall(待匹配的字符串,被查找的对象) 与 元字符“{}”
# # # {0,} == *
# # # {1,} == +
# # # {0,1} == ?
# # # {6} == 
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
#
# # {0,} == * ,结果表示从  x  出现的次数从0次-->无穷次
# a0 = re.findall("alex{0,}","ale0alex122alexx333alexxx4444alexxxx55555")
#
# # {1,} == + ,结果表示从  x  出现的次数从1次-->无穷次
# a1 = re.findall("alex{1,}","ale0alex122alexx333alexxx4444alexxxx55555")
#
# # {0,1} == ? ,结果表示从  x  出现的次数从0次-->1次
# a2 = re.findall("alex{0,1}","ale0alex122alexx333alexxx4444alexxxx55555")
#
# # {1,3} == {1,3} ,结果表示从  x  出现的次数从0次-->无穷次     ??
# a3 = re.findall("alex{1,3}","ale0alex122alexx333alexxx4444alexxxx55555")
#
# # {3} == {0,3} ,结果表示从  x  出现的次数从0次-->无穷次        ??
# a4 = re.findall("alex{0,}","ale0alex122alexx333alexxx4444alexxxx55555")
#
# print("alex{?,?}".center(60,"-"))
# print("{0,} == *    ",a0)
# print("{1,} == +    ",a1)
# print("{0,1} == ?   ",a2)
# print("{1,3} == {}  ",a3)
# print("{3} == {1,3}",a4)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # -------------------------alex{?,?}--------------------------
# # {0,} == *     ['ale', 'alex', 'alexx', 'alexxx', 'alexxxx']
# # {1,} == +     ['alex', 'alexx', 'alexxx', 'alexxxx']
# # {0,1} == ?    ['ale', 'alex', 'alex', 'alex', 'alex']
# # {1,3} == {}   ['alex', 'alexx', 'alexxx', 'alexxx']
# # {3} == {1,3} ['ale', 'alex', 'alexx', 'alexxx', 'alexxxx']
# #
# # Process finished with exit code 0





'''
# ------------------------------------------------------------
# # 10、re.findall(字符序列1[字符序列2],被查找的对象) 与 元字符“[]”
# # # 字符序列2提供选择,查找是,字符序列1在序列2中选出某个字符进行搭配,之后再被查找对象中进行查找
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
# import re
# a1 = re.findall("x[123]","x123aaax2aax3xx23")
# a2 = re.findall("x[123]A","x1A23aaax2Aaax3Axx2A3")
# a3 = re.findall("x[1,2,3]A","x1A23aaax23Aaax13Axx123A3")
# a4 = re.findall("x[1,2,*]A","x1A23aaax,Aaax*Axx123A3")
#
# print(a1)
# print(a2)
# print(a3)
# print(a4)
# #
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['x1', 'x2', 'x3', 'x2']
# # ['x1A', 'x2A', 'x3A', 'x2A']
# # ['x1A']
# # ['x1A', 'x,A', 'x*A']
# #
# # Process finished with exit code 0







'''
# ------------------------------------------------------------
# # 11、re.findall(字符序列1[字符序列2],被查找的对象) 与 元字符“[ - ]*”
# # # 字符序列2提供选择,查找是,字符序列1在序列2中选出某个字符进行搭配,之后再被查找对象中进行查找
# # # 里面的“-”表示范围,[ a-z] ,表示a-z的小写字母;[ 0-9] ,表示a-z的小写字母
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a1 = re.findall("x[0-9]*","x123aaax2aax3xx23")
# a2 = re.findall("x[0-9]*A","x1A23aaax2Aaax3Axx222A3")
#
# print(a1)
# print(a2)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['x123', 'x2', 'x3', 'x', 'x23']
# # ['x1A', 'x2A', 'x3A', 'x222A']
# #
# # Process finished with exit code 0






'''
# ------------------------------------------------------------
# # 12、re.findall(字符序列1[^字符序列2],被查找的对象) 与 元字符“[^ - ]”
# # # ^字符序列2进行取非,之后提供选择,查找是,字符序列1在序列2中选出某个字符进行搭配,
# # # 之后再被查找对象中进行查找
# # # 里面的“^”表示取非,[ a-z] ,表示a-z的小写字母;[ 0-9] ,表示a-z的小写字母
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# a0 = re.findall("x[^0-9]*","xx23")          # 取次数最多
# a1 = re.findall("x[^0-9]*","x123aaax2aax3xx23")
# a2 = re.findall("x[^0-9]*A","xaA23aaaxWAaax3Axx222A3")
#
# print(a0)
# print(a1)
# print(a2)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # ['xx']
# # ['x', 'x', 'x', 'xx']
# # ['xaA', 'xWA']
# #
# # Process finished with exit code 0





'''
# ------------------------------------------------------------
# # 13、元字符之转义符\
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# data = "12+(34*6+2-5*(2-1))"
# r1 = re.findall("\d",data)      # 匹配任意数字,等价于 [0-9]。
# r11 = re.findall("[0-9]",data)
# r2 = re.findall("\d+",data)
# r3 = re.findall("[0-9]+",data)
# r4 = re.findall("\D",data)      # 匹配任意非数字
# r5 = re.findall("\D+","hello world 1234ww")
# r6 = re.findall("\s+",data)     # 匹配任意空白字符,等价于 [\t\n\r\f]。
#
#
# print("\d       ",r1)
# print("[0-9]    ",r11)
# print("\d+      ",r2)
# print("[0-9]+   ",r3)
# print("\D       ",r4)
# print("\D+      ",r5)
# print("\s+      ",r6)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # \d        ['1', '2', '3', '4', '6', '2', '5', '2', '1']
# # [0-9]     ['1', '2', '3', '4', '6', '2', '5', '2', '1']
# # \d+       ['12', '34', '6', '2', '5', '2', '1']
# # [0-9]+    ['12', '34', '6', '2', '5', '2', '1']
# # \D        ['+', '(', '*', '+', '-', '*', '(', '-', ')', ')']
# # \D+       ['hello world ', 'ww']
# # \s+       []
# #
# # Process finished with exit code 0





'''
# ------------------------------------------------------------
# # 14、re.findall 在计算中的应用
# # # 在计算上的应用,使用正则表达示来处理字符串,而不是用eval来去掉字符中的双引号来实现计算
# # # 这里是将内层的(2-1)取出来
# # # Python3 正则表达式 | 菜鸟教程
# # # http://www.runoob.com/python3/python3-reg-expressions.html
# ------------------------------------------------------------
'''
#
# import re
# data = "12+(34*6+2-5*(2-1))"
# # eval处理
# e = eval(data)
# r = re.findall("\([^()]*\)",data)
#
# print(e)
# print(r,type(r),type(r[0]))
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day22_os_json_re_etc_MoKuai/day22_6-re.py
# # 213
# # ['(2-1)'] <class 'list'> <class 'str'>
# #
# # Process finished with exit code 0

  


 

转载于:https://www.cnblogs.com/jyfootprint/p/9439099.html

/****Copyright© ** ** 金卡智能集团股份有限公司 ** ** 产品开发部 ** ** http://www.china-goldcard.com ** **-----------------------------------文件信息---------------------------------- ** 文 件 名: half_hour_record_water.c ** 创 建 人: 卢立伟 ** 版 本: v1.1.2 ** 描 述: 半小时用水日志 ** **---------------------------------历史版本信息-------------------------------- ** 创 建 人 : 卢立伟 ** 版 本: v1.0.0 ** 日 期: 2020.09.19 ** 描 述: 半小时用水日志 ** **----------------------------------------------------------------------------- ** 修 改 人 :程楼 ** 版 本: v1.1.0 ** 日 期: 2022.01.05 ** 描 述: 新增反向计量,支持指定无效值返回 ** 新增读正反净数据接口,详见接口定义 ** HalfHourForwardRecordRead ** HalfHourReverseRecordRead ** HalfHourABSRecordRead ** 新增反向累积量配置使能宏定义配置选项 HALF_HOUR_REVERSE_DIS ** 当无需无反向流量记录时需在外部增加定义 #define HALF_HOUR_REVERSE_DIS ** **----------------------------------------------------------------------------- ** 修 改 人 :程楼 ** 版 本: v1.1.1 ** 日 期: 2022.01.18 ** 描 述: 修复反向累积量>正向累积量时,净累积量为无效值的问题 ** *----------------------------------------------------------------------------- ** 修 改 人 :卢立伟 ** 版 本: v1.1.2 ** 日 期: 2022.08.26 ** 描 述: 增加带符号位的净累积量读取,指令无效值为32位 ** **----------------------------------------------------------------------------- ******************************************************************************/ #include “half_hour_record_water.h” #define HALF_HOUR_RECORD_REREAD_TIMES (3u) #define HALF_HOUR_RECORD_INVALID_VALUE (0u) #define HALF_HOUR_RECORD_NUM (10u) typedef enum { HOUR_HALF_FORWARD, //读正向累积量 HOUR_HALF_REVERSE, //读反向累积量 HOUR_HALF_ABS, //读净累积量 HOUR_HALF_SABS //读净累积量带符号位 }eDataType; typedef struct { eDataType data_sel; //读取的数据类型 uint32_t d_invaild; //读取无效值 eHourType d_type; //数据位置的选择 uint8_t *des_buff; //存储数据的地址(可偏移) uint8_t read_num; //读取数据的个数 uint8_t read_cycle_cnt; //循环读取的次数 uint8_t *data_get_buff; //读取数据的地址(可偏移) }sHalfHourDataGet; /****************************************************************************** 功能: 时间转天偏移地址 参数: obj:模块数据结构 time_bcd:获取地址索引的时间 返回: 无 其它说明:无 *****************************************************************************/ static uint16_t HalfHourRecordGetDayAddr(sHalfHourRecord obj, sDateYMDHMS const time_bcd) { uint16_t days; uint16_t offset; uint16_t day_start_addr; days = MathDateToDays((const sDateYMD *)(const void *)time_bcd); //计算距离2000.01.01的天数 offset = days%HALF_HOUR_RECORD_SAVE_DAY_NUM; //获取天偏移 offset = offset*HALF_HOUR_RECORD_DAY_SAVE_LEN; //计算天偏移地址 day_start_addr = obj->start_addr+offset; return day_start_addr; } /****************************************************************************** 功能: 半小时用水日志初始化 参数: obj:模块数据结构 strategy:策略存储模块 count:累计量模块 start_addr: 半小时用水日志在EEPROM中的起始地址 返回: 无 其它说明:无 ****************************************************************************/ void HalfHourRecordInit(sHalfHourRecord obj, sStrategy strategy, sCount count, uint16_t start_addr) { obj->strategy = strategy; obj->count = count; obj->start_addr = start_addr; } /****************************************************************************** 功能: 读取某天半点用气日志 参数: obj:模块数据结构 type:0:按半小时读取 1:按小时读取 read_time:要读取的时间,只取年月日 des_buff: 返回数据 返回: 0表示成功读取数据;1表示读取数据无效或不存在 说明: des_buff数据格式如下,返回数据不带crc year(BCD) month(BCD) day(BCD) des_buff_1 … des_buff_49(des_buff_25) ****************************************************************************/ uint8_t HalfHourRecordRead(sHalfHourRecord obj,uint8_t type, sDateYMDHMS const read_time_bcd, uint8_t des_buff) { uint16_t read_addr; sDateYMDHMS save_time_bcd = {0u,0u,0u,0u,0u,0u}; uint8_t i,j,k; uint8_t read_cycle; //一次读10个总共需要读次数 uint8_t read_cnt; //一次读的个数 uint8_t last_read_cnt; //最后一次读个数 uint8_t check_ret; //校验结果 uint8_t record_buff[HALF_HOUR_RECORD_SAVE_LEN * HALF_HOUR_RECORD_NUM] = {0u}; //读取缓存 uint8_t index_addr; uint16_t data_addr; //获取今天偏移地址 read_addr = HalfHourRecordGetDayAddr(obj,read_time_bcd); //获取当天存储的半小时用水日志物理地址 //读取时间戳 if(0u == StrategyRead(obj->strategy, read_addr, 0u,&save_time_bcd.year, HALF_HOUR_RECORD_TIMESTAMP_LEN)) { return 1u; } if( (save_time_bcd.year != read_time_bcd->year) || (save_time_bcd.month != read_time_bcd->month) || (save_time_bcd.day != read_time_bcd->day)) //日期不一致 { return 1u; } MathMemCpy(&des_buff[0], &save_time_bcd.year, HALF_HOUR_RECORD_TIMESTAMP_LEN); //返回日期 read_addr += HALF_HOUR_RECORD_TIMESTAMP_LEN; //物理地址偏移 //确定读取次数和每次读取条数 read_cycle = HALF_HOUR_RECORD_NUM_PRE_DAY/HALF_HOUR_RECORD_NUM; last_read_cnt = HALF_HOUR_RECORD_NUM_PRE_DAY%HALF_HOUR_RECORD_NUM; if(last_read_cnt == 0u) { last_read_cnt = HALF_HOUR_RECORD_NUM; } else { read_cycle ++; } for(k = 0u; k < read_cycle; k++) //读取循环 { if(k == (read_cycle-1u)) { read_cnt = last_read_cnt; } else { read_cnt = HALF_HOUR_RECORD_NUM; } if(StrategyRead(obj->strategy, (read_addr + ((uint16_t)k * HALF_HOUR_RECORD_NUM * HALF_HOUR_RECORD_SAVE_LEN)), 0u, record_buff, ((uint16_t)read_cnt*HALF_HOUR_RECORD_SAVE_LEN)) == 0u) //读取失败 { return 1u; } for(j = 0u; j < read_cnt; j++) //校验循环 { check_ret = 1u; for(i = 0u; i < HALF_HOUR_RECORD_REREAD_TIMES; i++) //校验失败重试循环 { if(record_buff[j*HALF_HOUR_RECORD_SAVE_LEN+HALF_HOUR_RECORD_DATA_LEN] == MathCrc8(&record_buff[j*HALF_HOUR_RECORD_SAVE_LEN], HALF_HOUR_RECORD_DATA_LEN)) { check_ret = 0u; break; } if(0u == StrategyRead(obj->strategy, read_addr+((uint16_t)k * HALF_HOUR_RECORD_NUM * HALF_HOUR_RECORD_SAVE_LEN + ((uint16_t)HALF_HOUR_RECORD_SAVE_LEN * j)), 0u, &record_buff[HALF_HOUR_RECORD_SAVE_LEN*j], HALF_HOUR_RECORD_SAVE_LEN))//读取失败不重试 { break; } } if(check_ret == 1u) //校验失败超过3次或读取失败清该条记录 { MathInitArray(&record_buff[j * HALF_HOUR_RECORD_SAVE_LEN], HALF_HOUR_RECORD_INVALID_VALUE, HALF_HOUR_RECORD_SAVE_LEN); } } if(type == 1u) //读半小时日志 { index_addr = 2u; } else { index_addr = 1u; } data_addr = HALF_HOUR_RECORD_TIMESTAMP_LEN+((uint16_t)k * HALF_HOUR_RECORD_NUM * HALF_HOUR_RECORD_FOR_DATA_LEN / (uint16_t)index_addr);//缓存地址偏移量 for(i = 0u; i < read_cnt; i += index_addr)//根据上传类型和读取类型(半小时/整点)读取相应数据 { MathMemCpy(&des_buff[data_addr + ((uint16_t)i / index_addr * HALF_HOUR_RECORD_FOR_DATA_LEN)], &record_buff[i * HALF_HOUR_RECORD_SAVE_LEN], HALF_HOUR_RECORD_FOR_DATA_LEN); } } return 0u; } /****************************************************************************** 功能: 半小时用水读取结构体初始化 参数: data_select:数据选择模块结构体 des_addr:目标数组首地址 invaild:无效值 d_type: 选取的数据类型 type:选取数据的位置 返回: 无 其它说明:无 *****************************************************************************/ static void HalfHourWaterInit(sHalfHourDataGet data_select,uint8_t des_addr, uint32_t invaild,eDataType d_type,eHourType type) { data_select->data_sel=d_type; data_select->des_buff=des_addr; data_select->d_invaild=invaild; data_select->d_type=type; data_select->read_num=0u; data_select->read_cycle_cnt=0u; data_select->data_get_buff=NULL; } /****************************************************************************** 功能: 数据选择判断 参数: data_select:数据选择模块结构体 idx:数据个数 返回: 0:该位置数据需要 1:该位置数据不需要 其它说明:无 ******************************************************************************/ static uint8_t DataPlaceEn(sHalfHourDataGet data_select,uint8_t idx) { switch(data_select->d_type) { case HOUR_TYPE_HALF_FIRST: { if(idx>=48u) { return 1u; } break; } case HOUR_TYPE_HALF_LAST: { if(idx0u) { return 1u; } break; } case HOUR_TYPE_HALF_ALL: { break; } case HOUR_TYPE_FIRST: { if(idx>=48u || idx%2u!=0u) { return 1u; } break; } case HOUR_TYPE_LAST: { if(idx0u || idx%2u!=0u) { return 1u; } break; } case HOUR_TYPE_ALL: { if(idx%2u!=0u) { return 1u; } break; } default: break; } return 0u; } /****************************************************************************** 功能: 选取正反净的累积量 参数: data_select:数据选择模块结构体 返回: 无 其它说明:从8位据中选取正反净累积量 ******************************************************************************/ static void HalfHourWaterDataGet(sHalfHourDataGet data_select) { uint32_t sum_water,re_sum_water; switch(data_select->data_sel) { case HOUR_HALF_FORWARD: { MathMemCpy(data_select->des_buff, data_select->data_get_buff, HALF_HOUR_RECORD_FOR_DATA_LEN); break; } case HOUR_HALF_REVERSE: { MathMemCpy(data_select->des_buff, &data_select->data_get_buff[HALF_HOUR_RECORD_FOR_DATA_LEN], HALF_HOUR_RECORD_RES_DATA_LEN); break; } case HOUR_HALF_ABS: { sum_water=MathByteToU32(data_select->data_get_buff, 1u); re_sum_water=MathByteToU32(&data_select->data_get_buff[HALF_HOUR_RECORD_FOR_DATA_LEN], 1u); if((sum_water!=0xffffffffu)&&(re_sum_water!=0xffffffffu)) { if(sum_water<re_sum_water) { MathInitArray(data_select->des_buff,0x00u, HALF_HOUR_RECORD_FOR_DATA_LEN); } else { (void)MathU32ToByte((sum_water-re_sum_water), data_select->des_buff, 1u); } } else { MathInitArray(data_select->des_buff,0xffu, HALF_HOUR_RECORD_FOR_DATA_LEN); } break; } case HOUR_HALF_SABS: { uint32_t temp_sabs = data_select->d_invaild; sum_water=MathByteToU32(data_select->data_get_buff, 1u); re_sum_water=MathByteToU32(&data_select->data_get_buff[HALF_HOUR_RECORD_FOR_DATA_LEN], 1u); if((sum_water!=0xffffffffu)&&(re_sum_water!=0xffffffffu)) { temp_sabs = (uint32_t)((int32_t)(sum_water)-(int32_t)(re_sum_water)); } (void)MathU32ToByte(temp_sabs, data_select->des_buff, 1u); break; } default: break; } sum_water=MathByteToU32(data_select->des_buff,1u); if(data_select->data_sel != HOUR_HALF_SABS) { if(sum_water==0xffffffffu) { MathInitArray(data_select->des_buff,(uint8_t)data_select->d_invaild, HALF_HOUR_RECORD_FOR_DATA_LEN); } } data_select->des_buff = &data_select->des_buff[HALF_HOUR_RECORD_FOR_DATA_LEN]; return; } /****************************************************************************** 功能: 半小时日志的数据选择 参数: data_select:数据选择模块结构体 返回: 无 说明: 选择不同的数据类型进行读取 ******************************************************************************/ static void HalfHourRecordSelect(sHalfHourDataGet data_select) { uint8_t i; for(i=0u; i<data_select->read_num; i++)//根据上传类型和读取类型(半小时/整点)读取相应数据 { uint8_t idx = data_select->read_cycle_cnt*10u+i; if(DataPlaceEn(data_select,idx)==0u) { HalfHourWaterDataGet(data_select); } data_select->data_get_buff = &data_select->data_get_buff[HALF_HOUR_RECORD_SAVE_LEN]; } } /****************************************************************************** 功能: 读取某天半点用水日志 参数: obj:模块数据结构 data_select:数据选择模块结构体 now_time_bcd:数据时间 返回: 0 读取成功;1 读取失败 说明: 无 ****************************************************************************/ static uint8_t HalfHourRecordGetData(sHalfHourRecord obj, sDateYMDHMS const now_time_bcd,sHalfHourDataGet data_select) { uint16_t read_addr; sDateYMDHMS save_time_bcd = {0u,0u,0u,0u,0u,0u}; uint8_t i,j,k,ret=0u; uint8_t read_cycle; //一次读10个总共需要读次数 uint8_t read_cnt; //一次读的个数 uint8_t last_read_cnt; //最后一次读个数 uint8_t check_ret; //校验结果 uint8_t record_buff[HALF_HOUR_RECORD_SAVE_LEN * HALF_HOUR_RECORD_NUM] = {0u}; //读取缓存 data_select->data_get_buff=record_buff; //获取今天偏移地址 read_addr = HalfHourRecordGetDayAddr(obj,now_time_bcd); //获取当天存储的半小时用水日志物理地址 //读取时间戳 if(0u == StrategyRead(obj->strategy, read_addr, 0u,&save_time_bcd.year, HALF_HOUR_RECORD_TIMESTAMP_LEN)) { MathInitArray(record_buff,0xffu,HALF_HOUR_RECORD_SAVE_LEN * HALF_HOUR_RECORD_NUM); ret=1u; } if(ret==0u) { if( (save_time_bcd.year != now_time_bcd->year) || (save_time_bcd.month != now_time_bcd->month) || (save_time_bcd.day != now_time_bcd->day)) //日期不一致 { MathInitArray(record_buff,0xffu,HALF_HOUR_RECORD_SAVE_LEN * HALF_HOUR_RECORD_NUM); ret=1u; } } read_addr += HALF_HOUR_RECORD_TIMESTAMP_LEN; //物理地址偏移 //确定读取次数和每次读取条数 read_cycle = HALF_HOUR_RECORD_NUM_PRE_DAY/HALF_HOUR_RECORD_NUM; last_read_cnt = HALF_HOUR_RECORD_NUM_PRE_DAY%HALF_HOUR_RECORD_NUM; if(last_read_cnt == 0u) { last_read_cnt = HALF_HOUR_RECORD_NUM; } else { read_cycle ++; } for(k = 0u; k < read_cycle; k++) //读取循环 { if(k == (read_cycle-1u)) { read_cnt = last_read_cnt; } else { read_cnt = HALF_HOUR_RECORD_NUM; } if(ret==0u)//读取失败 { if(StrategyRead(obj->strategy, (read_addr + ((uint16_t)k * HALF_HOUR_RECORD_NUM * HALF_HOUR_RECORD_SAVE_LEN)), 0u, record_buff, ((uint16_t)read_cnt*HALF_HOUR_RECORD_SAVE_LEN)) == 0u) { MathInitArray(record_buff,0xffu,HALF_HOUR_RECORD_SAVE_LEN * HALF_HOUR_RECORD_NUM); ret=1u; } } if(ret==0u) { for(j = 0u; j < read_cnt; j++) //校验循环 { check_ret = 1u; for(i = 0u; i < HALF_HOUR_RECORD_REREAD_TIMES; i++) //校验失败重试循环 { if(record_buff[j*HALF_HOUR_RECORD_SAVE_LEN+HALF_HOUR_RECORD_DATA_LEN] == MathCrc8(&record_buff[j*HALF_HOUR_RECORD_SAVE_LEN], HALF_HOUR_RECORD_DATA_LEN)) { check_ret = 0u; break; } if(0u == StrategyRead(obj->strategy, read_addr+((uint16_t)k * HALF_HOUR_RECORD_NUM * HALF_HOUR_RECORD_SAVE_LEN + ((uint16_t)HALF_HOUR_RECORD_SAVE_LEN * j)), 0u, &record_buff[HALF_HOUR_RECORD_SAVE_LEN*j], HALF_HOUR_RECORD_SAVE_LEN))//读取失败不重试 { break; } } if(check_ret == 1u) //校验失败超过3次或读取失败清该条记录 { MathInitArray(&record_buff[j * HALF_HOUR_RECORD_SAVE_LEN], 0xffu, HALF_HOUR_RECORD_SAVE_LEN); } } } data_select->read_num=read_cnt; data_select->read_cycle_cnt=k; HalfHourRecordSelect(data_select); data_select->data_get_buff=record_buff; } return ret; } /****************************************************************************** 功能: 读取指定无效值的半小时正向累积量用水日志 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为正向累积量 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ uint8_t HalfHourForwardRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint8_t invaild) { uint8_t ret; sHalfHourDataGet h_f_hour_data; HalfHourWaterInit(&h_f_hour_data,des_buff,invaild,HOUR_HALF_FORWARD,type); ret=HalfHourRecordGetData(obj, now_time_bcd,&h_f_hour_data); return ret; } /****************************************************************************** 功能: 读取指定无效值的半小时反向累积量用水日志 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为反向累积量 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ #ifndef HALF_HOUR_REVERSE_DIS uint8_t HalfHourReverseRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint8_t invaild) { uint8_t ret; sHalfHourDataGet h_f_hour_data; HalfHourWaterInit(&h_f_hour_data,des_buff,invaild,HOUR_HALF_REVERSE,type); ret=HalfHourRecordGetData(obj, now_time_bcd,&h_f_hour_data); return ret; } /****************************************************************************** 功能: 读取指定无效值的半小时净累积量用水日志 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为净累积量 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ uint8_t HalfHourABSRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint8_t invaild) { uint8_t ret; sHalfHourDataGet h_f_hour_data; HalfHourWaterInit(&h_f_hour_data,des_buff,invaild,HOUR_HALF_ABS,type); ret=HalfHourRecordGetData(obj, now_time_bcd,&h_f_hour_data); return ret; } /****************************************************************************** 功能: 读取指定无效值的半小时净累积量用水日志(带符号位) 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为净累积量,有符号 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ uint8_t HalfHourSABSRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint32_t invaild) { uint8_t ret; sHalfHourDataGet h_f_hour_data; HalfHourWaterInit(&h_f_hour_data,des_buff,invaild,HOUR_HALF_SABS,type); ret=HalfHourRecordGetData(obj, now_time_bcd,&h_f_hour_data); return ret; } #endif /****************************************************************************** 功能: 半小时用气日事件 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 返回: 0 成功 说明: 分更新调用 *****************************************************************************/ uint8_t HalfHourRecordWrite(sHalfHourRecord obj, sDateYMDHMS now_time_bcd) { if(now_time_bcd->min == 0x00u || now_time_bcd->min == 0x30u) { uint32_t count_sum; uint16_t day_start_addr; sDateYMDHMS save_time_bcd = {0u,0u,0u,0u,0u,0u}; uint8_t record_buff[HALF_HOUR_RECORD_SAVE_LEN] = {0u}; uint8_t hour_offset; uint16_t save_adress; //获取今天偏移地址 day_start_addr = HalfHourRecordGetDayAddr(obj, now_time_bcd); //读取当前地址日期 (void)StrategyRead(obj->strategy, day_start_addr, 0u, &save_time_bcd.year, HALF_HOUR_RECORD_TIMESTAMP_LEN); //日期不一致 或者时间自然走到0点0分 if( (save_time_bcd.year != now_time_bcd->year || save_time_bcd.month != now_time_bcd->month || save_time_bcd.day != now_time_bcd->day) || ((now_time_bcd->hour==0x00u)&&(now_time_bcd->min==0x00u))) { //清除当日数据 (void)StrategySetValue(obj->strategy, day_start_addr, 0xffu, HALF_HOUR_RECORD_DAY_SAVE_LEN); (void)StrategySave(obj->strategy, day_start_addr, 0u, &now_time_bcd->year, HALF_HOUR_RECORD_TIMESTAMP_LEN); } //获取当前数据 count_sum = CountGetForwardCumulantL(obj->count); (void)MathU32ToByte(count_sum,record_buff,1u); #ifndef HALF_HOUR_REVERSE_DIS count_sum = CountGetReverseCumulantL(obj->count); (void)MathU32ToByte(count_sum,&record_buff[4u],1u); #endif record_buff[HALF_HOUR_RECORD_DATA_LEN] = MathCrc8(record_buff, HALF_HOUR_RECORD_DATA_LEN); //计算小时偏移 hour_offset = MathBcdToHex(now_time_bcd->hour)*2u; if(now_time_bcd->min == 0x30u) { hour_offset++; } //写当天数据 save_adress = day_start_addr+HALF_HOUR_RECORD_TIMESTAMP_LEN+HALF_HOUR_RECORD_SAVE_LEN*(uint16_t)hour_offset; (void)StrategySave(obj->strategy,save_adress,0u,record_buff, HALF_HOUR_RECORD_SAVE_LEN); if(hour_offset == 0u) //补写前一天数据第49条数据 { sDateYMDHMS yes_time_bcd; MathGetYesterday((sDateYMD*)(void *)now_time_bcd, (sDateYMD*)(void *)&yes_time_bcd); //重新定位地址 day_start_addr = HalfHourRecordGetDayAddr(obj,&yes_time_bcd); save_time_bcd.year = 0u; save_time_bcd.month = 0u; save_time_bcd.day = 0u; //读取当前地址日期 (void)StrategyRead(obj->strategy, day_start_addr, 0u, &save_time_bcd.year, HALF_HOUR_RECORD_TIMESTAMP_LEN); if( (save_time_bcd.year != yes_time_bcd.year) || (save_time_bcd.month != yes_time_bcd.month) || (save_time_bcd.day != yes_time_bcd.day)) { //日期一致,如果不一致,则说明跨天校时了 //写当天数据 (void)StrategySetValue(obj->strategy, day_start_addr, 0xffu, HALF_HOUR_RECORD_DAY_SAVE_LEN); (void)StrategySave(obj->strategy, day_start_addr, 0u, &yes_time_bcd.year, HALF_HOUR_RECORD_TIMESTAMP_LEN); } save_adress = day_start_addr + HALF_HOUR_RECORD_TIMESTAMP_LEN + HALF_HOUR_RECORD_SAVE_LEN*(HALF_HOUR_RECORD_NUM_PRE_DAY-1u); (void)StrategySave(obj->strategy,save_adress,0u,record_buff, HALF_HOUR_RECORD_SAVE_LEN); } } return 0u; } /****************************************************************************** 功能: 清零所有的半小时用水日志 参数: sHalfHourRecord:模块数据结构 返回: 0:成功 1:失败 其它说明:清除用时为500ms *******************************************************************************/ uint8_t HalfHourRecordClrAll(sHalfHourRecord *obj) { uint8_t ret = 0u; uint16_t i; uint16_t clr_addr; clr_addr = obj->start_addr; for(i = 0u; i < HALF_HOUR_RECORD_SAVE_DAY_NUM; i++) { if(StrategySetValue(obj->strategy, clr_addr, 0xffu, HALF_HOUR_RECORD_TIMESTAMP_LEN) == 0u) { ret = 1u; break; } clr_addr += HALF_HOUR_RECORD_DAY_SAVE_LEN; } return ret; } /****Copyright© ** ** 金卡智能集团股份有限公司 ** ** 产品开发部 ** ** http://www.china-goldcard.com ** **-----------------------------------文件信息---------------------------------- ** 文 件 名: half_hour_record_water.c ** 创 建 人: 卢立伟 ** 版 本: v1.1.2 ** 描 述: 半小时用水日志 ** **---------------------------------历史版本信息-------------------------------- ** 创 建 人 : 卢立伟 ** 版 本: v1.0.0 ** 日 期: 2020.09.19 ** 描 述: 半小时用水日志 ** **----------------------------------------------------------------------------- ** 修 改 人 :程楼 ** 版 本: v1.1.0 ** 日 期: 2022.01.05 ** 描 述: 新增反向计量,支持指定无效值返回 ** 新增读正反净数据接口,详见接口定义 ** HalfHourForwardRecordRead ** HalfHourReverseRecordRead ** HalfHourABSRecordRead ** 新增反向累积量配置使能宏定义配置选项 HALF_HOUR_REVERSE_DIS ** 当无需无反向流量记录时需在外部增加定义 #define HALF_HOUR_REVERSE_DIS ** **----------------------------------------------------------------------------- ** 修 改 人 :程楼 ** 版 本: v1.1.1 ** 日 期: 2022.01.18 ** 描 述: 修复反向累积量>正向累积量时,净累积量为无效值的问题 ** **----------------------------------------------------------------------------- ** 修 改 人 :卢立伟 ** 版 本: v1.1.2 ** 日 期: 2022.08.26 ** 描 述: 增加带符号位的净累积量读取,指令无效值为32位 ** **----------------------------------------------------------------------------- ******************************************************************************/ #ifndef HALF_HOUR_RECORD_WATER_H__ #define HALF_HOUR_RECORD_WATER_H__ #ifdef __cplusplus extern “C” { #endif #include “type.h” #include “strategy.h” #include “count.h” #include “common_define.h” //半小时 #define HALF_HOUR_RECORD_FOR_DATA_LEN (4u) //半小时用水记录有效数据长度,正向累积量(4) #define HALF_HOUR_RECORD_RES_DATA_LEN (4u) //半小时用水记录有效数据长度,反向累积量(4) #define HALF_HOUR_RECORD_ABS_DATA_LEN (4u) //半小时用水记录有效数据长度,综合累积量(4) #ifndef HALF_HOUR_REVERSE_DIS #define HALF_HOUR_RECORD_DATA_LEN (HALF_HOUR_RECORD_FOR_DATA_LEN+HALF_HOUR_RECORD_RES_DATA_LEN) //半小时用水记录有效数据长度,正向累积量(4)+反向累积量(4) #else #define HALF_HOUR_RECORD_DATA_LEN (HALF_HOUR_RECORD_FOR_DATA_LEN ) //半小时用水记录有效数据长度,正向累积量(4) #endif #define HALF_HOUR_RECORD_SAVE_LEN (HALF_HOUR_RECORD_DATA_LEN+1u) //半小时用水记录存储长度,累积量+CRC8(1) #define HALF_HOUR_RECORD_TIMESTAMP_LEN (3u) //半小时用水记录时间戳长度,年(1byte)+月(1byte)+日(1byte),格式BCD #define HALF_HOUR_RECORD_NUM_PRE_DAY (49u) //半小时用水记录每天记录条数 #define HOUR_RECORD_NUM_PRE_DAY (25u) //小时用水记录每天记录条数 //一天半小时用水记录存储长度 #define HALF_HOUR_RECORD_DAY_SAVE_LEN ((HALF_HOUR_RECORD_SAVE_LENHALF_HOUR_RECORD_NUM_PRE_DAY)+HALF_HOUR_RECORD_TIMESTAMP_LEN) #define HALF_HOUR_RECORD_SAVE_DAY_NUM (31u) //记录31天的半小时用水记录 //所有半小时用水记录存储长度 #define HALF_HOUR_RECORD_TOTAL_SAVE_LEN (HALF_HOUR_RECORD_DAY_SAVE_LENHALF_HOUR_RECORD_SAVE_DAY_NUM) typedef struct { sStrategy* strategy; //存储策略 sCount* count; //计量模块 uint16_t start_addr; //起始 }sHalfHourRecord; typedef enum { HOUR_TYPE_HALF_FIRST, //返回0点到23:30点的前48条半小时数据 HOUR_TYPE_HALF_LAST, //返回0:30点到24点的后48条半小时数据 HOUR_TYPE_HALF_ALL,//返回49条半小时数据 HOUR_TYPE_FIRST, //返回0点到23点的前24条小时数据 HOUR_TYPE_LAST, //返回0点到24点的后24条小时数据 HOUR_TYPE_ALL //返回全部25条小时数据 }eHourType; /****************************************************************************** 功能: 半小时用气日志初始化 参数: obj:模块数据结构 strategy:策略存储模块 count:累计量模块 start_addr: 半小时用气日志在EEPROM中的起始地址 返回: 无 说明: 无 / extern void HalfHourRecordInit(sHalfHourRecord obj, sStrategy strategy, sCount count, uint16_t start_addr); /** 功能: 读取某天半点用气日志 参数: obj:模块数据结构 type:0:按半小时读取 1:按小时读取 read_time:要读取的时间,只取年月日 des_buff: 返回数据 返回: 0表示成功读取数据;1表示读取数据无效或不存在 说明: des_buff数据格式如下,返回数据不带crc year(BCD) month(BCD) day(BCD) des_buff_1 … des_buff_49(des_buff_25) ****************************************************************************/ extern uint8_t HalfHourRecordRead(sHalfHourRecord obj, uint8_t type, sDateYMDHMS const read_time_bcd, uint8_t des_buff); /****************************************************************************** 功能: 读取指定无效值的半小时正向累积量用水日志 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为正向累积量 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ extern uint8_t HalfHourForwardRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint8_t invaild); /****************************************************************************** 功能: 读取指定无效值的半小时反向累积量用水日志 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为反向累积量 6、返回的数据中存储无效值为指定无效值 / #ifndef HALF_HOUR_REVERSE_DIS extern uint8_t HalfHourReverseRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint8_t invaild); /** 功能: 读取指定无效值的半小时净累积量用水日志 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为净累积量 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ extern uint8_t HalfHourABSRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint8_t invaild); /****************************************************************************** 功能: 读取指定无效值的半小时净累积量用水日志(带符号位) 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 des_buff: 传出的记录数据(CRC已去除) invalid: 无效值的表现形式 type: 读取模式(详情见eHourType) 返回: 0 成功,1 失败 说明: 1、type为HOUR_TYPE_HALF_FIRST返回0点到23:30的前48条半小时数据 2、type为HOUR_TYPE_HALF_LAST返回0:30到24点的后48条半小时数据 3、type为HOUR_TYPE_FIRST返回0点到23点的前24条小时数据 4、type为HOUR_TYPE_LAST返回1点到24点的后24条小时数据 5、返回数据的每一条都为净累积量,有符号 6、返回的数据中存储无效值为指定无效值 ****************************************************************************/ extern uint8_t HalfHourSABSRecordRead (sHalfHourRecord obj, eHourType type, sDateYMDHMS const now_time_bcd, uint8_t des_buff,uint32_t invaild); #endif /****************************************************************************** 功能: 半小时用气日事件 参数: obj:模块数据结构 now_time_bcd:当前时间BCD码 返回: 0 成功 说明: 分更新调用 *****************************************************************************/ extern uint8_t HalfHourRecordWrite(sHalfHourRecord obj, sDateYMDHMS now_time_bcd); /****************************************************************************** 功能: 清零所有的半小时用水日志 参数: obj:模块数据结构 返回: 无 说明: 无 *******************************************************************************/ extern uint8_t HalfHourRecordClrAll(sHalfHourRecord *obj); #ifdef __cplusplus } #endif #endif 上述是C文件和H文件,我想改为每隔15分钟写一次用水数据,然后增加选项,可以读取15分钟的数据。改为正向累积量,反向累积量,和综合累积量(净)为8字节。希望少改动
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值