#ifndef _SUNDRY_H_ #define _SUNDRY_H_ #include "define_all.h" #include "extern_rtc.h" #include "time.h" /*»·ÐÎÊý×é´óС*/ #define FLOW_RING_BUFFER_SIZE 20 #define TEMP_RING_BUFFER_SIZE 10 #define PRESS_RING_BUFFER_SIZE 10 #define INSTANT_WC_RING_BUFFER_SIZE 20 // ´óС¶Ëת»» #define BSWAP_16(x) ((x & 0x00ff) << 8) | \ ((x & 0xff00) >> 8) #define BSWAP_32(x) ((x & 0xff000000) >> 24) | \ ((x & 0x00ff0000) >> 8) | \ ((x & 0x0000ff00) << 8) | \ ((x & 0x000000ff) << 24) // #define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32)) #define BSWAP_64(x) ((x & 0xff00000000000000) >> 56) | \ ((x & 0x00ff000000000000) >> 40) | \ ((x & 0x0000ff0000000000) >> 24) | \ ((x & 0x000000ff00000000) >> 8) | \ ((x & 0x00000000ff000000) << 8) | \ ((x & 0x0000000000ff0000) << 24) | \ ((x & 0x000000000000ff00) << 40) | \ ((x & 0x00000000000000ff) << 56) // ϵͳͨÓÃÑÓ³Ùʱ¼äÉèÖà #define __SYS_DELAY_SEC_TIME_SET_(__HANDLE__, __NUMBER__) ((&sys_delay_sec_para_g)->__HANDLE__.delay_time = __NUMBER__) // ϵͳͨÓÃÑÓ³Ùʱ¼ä»ñÈ¡ #define __SYS_DELAY_SEC_TIME_GET_(__HANDLE__) ((&sys_delay_sec_para_g)->__HANDLE__.delay_time) // ϵͳͨÓÃÑÓ³Ù±ê־λget #define __SYS_DELAY_SEC_FLAG_GET(__HANDLE__) ((&sys_delay_sec_para_g)->__HANDLE__.delay_flag) // ϵͳͨÓÃÑÓ³Ù±ê־λÉèÖà #define __SYS_DELAY_SEC_FLAG_SET_(__HANDLE__) ((&sys_delay_sec_para_g)->__HANDLE__.delay_flag = SET) // ϵͳͨÓÃÑÓ³Ù±ê־λÇå³ý #define __SYS_DELAY_SEC_FLAG_CLEAR_(__HANDLE__) ((&sys_delay_sec_para_g)->__HANDLE__.delay_flag = RESET) // ÖÜÆÚÊ״μÆËã±ê־λÉèÖà #define __PERIOD_FIRST_CALC_FLAG_SET(__HANDLE__) ((&period_para_g)->__HANDLE__.period_flag = SET) /*µÃ³ö½á¹¹Ìå³ÉÔ±Æ«ÒÆÁ¿ºÍ´óС*/ #define OFFSET_OF(type, member) ((size_t) & (((type *)0))->member) #define SIZEOF_OF(type, member) (sizeof(((type *)0))->member) /*Ê®Áù½øÖƺÍBCD¸ñʽ»¥Ïàת»»£¨ÏÞÖÆ·¶Î§0~99£©*/ #define BCD_2_HEX_U8(__BCD_DATA__) (((__BCD_DATA__) / 16) * 10 + (__BCD_DATA__) % 16) #define HEX_2_BCD_U8(__HEX_DATA__) (((__HEX_DATA__) / 10) * 16 + (__HEX_DATA__) % 10) /*ÿÈÕ0µã*/ #define DAILY_ZERO ((&calendar_g)->Hour == 0 && (&calendar_g)->Minute == 0 && (&calendar_g)->Second == 0 ? SET : RESET) /** * @brief ¼ì²é½á¹¹Ìå´óСÊÇ·ñ·ûºÏ * ÔÚ±àÒëʱ»á½øÐмì²é * @param type ½á¹¹ÌåÀàÐÍ * @param size ½á¹¹Ìå¼ì²é´óС */ #define TYPE_CHECK_SIZE(type, size) extern char sizeof_##type##_is_##size##_error[!!(sizeof(type) == (size_t)(size)) - 1] /** * @brief ½á¹¹Ìå³ÉÔ± * @param type ½á¹¹ÌåÀàÐÍ * @param member ³ÉÔ±±äÁ¿ */ #define TYPE_MEMBER(type, member) (((type *)0)->member) /** * @brief ¼ì²é½á¹¹Ìå³ÉÔ±´óСÊÇ·ñ·ûºÏ * ÔÚ±àÒëʱ»á½øÐмì²é * @param type ½á¹¹ÌåÀàÐÍ * @param member ½á¹¹ÌåÀàÐÍ * @param size ½á¹¹Ìå¼ì²é´óС */ #define TYPE_MEMBER_CHECK_SIZE(type, member, size) extern int sizeof_##type##_##member##_is_error \ [!!(sizeof(TYPE_MEMBER(type, member)) == (size_t)(size)) - 1] /** * @brief ¼ì²é½á¹¹ÌåÖнṹÌå³ÉÔ±´óСÊÇ·ñ·ûºÏ * ÔÚ±àÒëʱ»á½øÐмì²é * @param type ½á¹¹ÌåÀàÐÍ * @param member ½á¹¹ÌåÀàÐÍ * @param size ½á¹¹Ìå¼ì²é´óС */ #define TYPE_CHILDTYPE_MEMBER_CHECK_SIZE(type, childtype, member, size) extern int sizeof_##type##_##childtype##_##member##_is_error \ [!!(sizeof(TYPE_MEMBER(type, childtype.member)) == (size_t)(size)) - 1] /** * @brief ¼ì²é½á¹¹Ìå³ÉÔ±Æ«ÒÆÎ»ÖÃÊÇ·ñ·ûºÏ * ÔÚ±àÒëʱ»á½øÐмì²é * @param type ½á¹¹ÌåÀàÐÍ * @param member ½á¹¹Ìå³ÉÔ± * @param value ³ÉÔ±Æ«ÒÆ */ #define TYPE_MEMBER_CHECK_OFFSET(type, member, value) \ extern int offset_of_##member##_in_##type##_is_error \ [!!(__builtin_offsetof(type, member) == ((size_t)(value))) - 1] /** * @brief ¼ì²é½á¹¹Ìå³ÉÔ±Æ«ÒÆÎ»ÖÃÊÇ·ñ·ûºÏ * ÔÚ±àÒëʱ»á½øÐмì²é * @param type ½á¹¹ÌåÀàÐÍ * @param member ½á¹¹Ìå³ÉÔ± * @param value ³ÉÔ±Æ«ÒÆ */ #define TYPE_CHILDTYPE_MEMBER_CHECK_OFFSET(type, childtype, member, value) \ extern int offset_of_##member##_in_##type##_##childtype##_is_error \ [!!(__builtin_offsetof(type, childtype.member) == ((size_t)(value))) - 1] #pragma pack(1) typedef struct { float *pRing_buffer; uint8_t front_index; // ¶ÓÁÐÍ·£¨¶ÁÒ»¸öÊý¾Ý+1£© uint8_t rear_index; // ¶ÓÁÐβ(дһ¸öÊý¾Ý+1) } ANALOGOUS_RING_BUFFER_T; // ÀàËÆ»·ÐÎÊý×飨ֻÐèҪд£¬²»ÐèÒª¶Á£© typedef struct { __IO uint8_t delay_flag; // ÑÓʱʱ¼äµ½±ê־λ __IO uint16_t delay_time; // ÑÓʱ¾ßÌåʱ¼ä } DELAY_SEC_TYPE_T; // ÑÓʱʱ¼äÀàÐͽṹÌå typedef struct { DELAY_SEC_TYPE_T gprs_delay_para; // GPRSÑÓ³Ùʱ¼ä DELAY_SEC_TYPE_T gprs_timeout_para; // GPRS³¬Ê±Ê±¼ä DELAY_SEC_TYPE_T flow_data_period_para; // Á÷Á¿Êý¾Ý»ñÈ¡ÖÜÆÚʱ¼ä DELAY_SEC_TYPE_T sys_active_time; // ϵͳ¼¤»îʱ¼ä DELAY_SEC_TYPE_T mode_flag_active_time; // Çл»Ä£Ê½±ê־λ¼¤»îʱ¼ä DELAY_SEC_TYPE_T sys_restart_delay_time;// ÏµÍ³ÖØÆôµÄÑÓ³Ùʱ¼ä } SYS_DELAY_SEC_PARA_T; typedef struct { uint16_t period_flag ; // Ê״μÆËãÉÏÒ»´ÎÖÜÆÚµÄ±ê־λ __IO uint16_t last_time_m; // ÉÏÒ»´ÎµÄʱ¼ä } PERIOD_TYPE_T ; typedef struct { PERIOD_TYPE_T gprs_send_period; PERIOD_TYPE_T alka_get_power_period; PERIOD_TYPE_T lith_get_power_period; PERIOD_TYPE_T mcu_get_temperature_period; } PERIOD_PARA_T ; #pragma pack() extern uint8_t restart_alarm_flag; extern SYS_DELAY_SEC_PARA_T sys_delay_sec_para_g; extern PERIOD_PARA_T period_para_g; extern ANALOGOUS_RING_BUFFER_T flow_ring; extern ANALOGOUS_RING_BUFFER_T temp_ring; extern ANALOGOUS_RING_BUFFER_T press_ring; extern ANALOGOUS_RING_BUFFER_T instant_wc_ring; uint8_t Bcd_2_Hex(uint8_t bcd_data); uint8_t Hex_2_Bcd(uint8_t hex_data); void Hex_2_Ascii(uint8_t *Hex, uint8_t *Ascii, int Len); // HEX_TO_ASCII void Ascii_2_Hex(uint8_t *Ascii, uint8_t *Hex, int Len); // ASCII_TO_HEX void Float_To_Byte4(float flo, uint8_t *pData); float Byte4_To_Float(uint8_t *pData); void Sys_Delay_Sec(SYS_DELAY_SEC_PARA_T *sys_delay_sec_para_p); FlagStatus Func_PeriodStartHandler(uint16_t ref_time_m, uint16_t period_min_set, uint16_t *pPeriod_flag, __IO uint16_t *pLast_time_m, __IO RTC_TimeDateTypeDef *calendar_p); uint16_t get_one_in_data_3(uint16_t data); int Datecmp(const uint8_t *pDate1, const uint8_t *pDate2); int16_t Date_DaysDifference(uint8_t yearst_bcd, uint8_t monthst_bcd, uint8_t dayst_bcd, uint8_t yearend_bcd, uint8_t monthend_bcd, uint8_t dayend_bcd); int16_t Data_MonthsDifference(uint8_t yearst_bcd, uint8_t monthst_bcd, uint8_t yearend_bcd, uint8_t monthend_bcd); uint8_t ring_write_array(ANALOGOUS_RING_BUFFER_T *ring_buffer_p, const float *pData, uint8_t write_cnt, uint8_t buffer_len_max); uint8_t ring_read_1_data(ANALOGOUS_RING_BUFFER_T *ring_buffer_p, float *pData, uint8_t buffer_len_max); float LowPassFilter_Ring_Average(ANALOGOUS_RING_BUFFER_T *ring_buffer_p, const float *pData, uint8_t write_cnt, uint8_t buffer_len_max); float LowPassFilter_MaxMin_Ring_Average(ANALOGOUS_RING_BUFFER_T *ring_buffer_p, const float *pData, uint8_t write_cnt, uint8_t buffer_len_max); float Wc_2_Sc(float wc_flow, float real_press, float real_temp); float BLEndianFloat(float fValue); double BLEndianDouble(double ffValue); uint8_t CalcCheckSum(const uint8_t *pData, uint16_t Len); int8_t my_memcmp(const void * pData_1,const void * pData_2,size_t n); #endif