189 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 | 
						|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
						|
be copied by any method or incorporated into another program without
 | 
						|
the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
liability for its use in any way and conveys no license or title under
 | 
						|
any patent or copyright and makes no representation or warranty that this
 | 
						|
Information is free from patent or copyright infringement.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
#ifndef CVG_BITMAP_H
 | 
						|
#define CVG_BITMAP_H
 | 
						|
 | 
						|
/* os shim includes */
 | 
						|
#include "os_types.h"
 | 
						|
#include "os_mem.h"
 | 
						|
 | 
						|
/* common includes */
 | 
						|
#include "iot_bitops.h"
 | 
						|
#include "iot_bitmap_api.h"
 | 
						|
 | 
						|
/* public api includes */
 | 
						|
#include "plc_protocol.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
/* bitmap index to tei conversion */
 | 
						|
#define CVG_BM_TO_TEI(bm)           ((tei_t)((bm) - 1))
 | 
						|
 | 
						|
/* tei to bitmap index conversion */
 | 
						|
#define CVG_TEI_TO_BM(tei)          ((tei) + 1)
 | 
						|
 | 
						|
/* tei map definition */
 | 
						|
#define CVG_TEI_MAP_BYTE_LEN        ((PLC_TEI_MAX_NUM + 8) / 8)
 | 
						|
 | 
						|
 | 
						|
#pragma pack(push)	/* save the pack status */
 | 
						|
#pragma pack(1)		/* 1 byte align */
 | 
						|
typedef struct _cvg_tei_map {
 | 
						|
    uint8_t map[CVG_TEI_MAP_BYTE_LEN];
 | 
						|
} cvg_tei_map_t;
 | 
						|
#pragma pack(pop)	/* restore the pack status */
 | 
						|
 | 
						|
 | 
						|
#define cvg_tei_map_reset(bm) os_mem_set((bm), 0, sizeof(*(bm)))
 | 
						|
 | 
						|
#define cvg_tei_map_ffs(bm) iot_bitmap_ffs((bm)->map, sizeof(*(bm)))
 | 
						|
 | 
						|
#define cvg_tei_map_fls(bm) iot_bitmap_fls((bm)->map, sizeof(*(bm)))
 | 
						|
 | 
						|
#define cvg_tei_map_ffs_and_c(bm) iot_bitmap_ffs_and_c((bm)->map, sizeof(*(bm)))
 | 
						|
 | 
						|
#define cvg_tei_map_ffs_from(bm, sp) \
 | 
						|
    iot_bitmap_ffs_from((bm)->map, sizeof(*(bm)), (sp))
 | 
						|
 | 
						|
static inline uint32_t cvg_tei_map_ffz(cvg_tei_map_t *bm)
 | 
						|
{
 | 
						|
    uint32_t ret;
 | 
						|
 | 
						|
    /* always skip the first bit as it's invalid */
 | 
						|
    bm->map[0] |= 0x01;
 | 
						|
    ret = iot_bitmap_ffz(bm->map, sizeof(*bm));
 | 
						|
    bm->map[0] &= ~0x01;
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static inline uint32_t cvg_tei_map_ffz_from(cvg_tei_map_t *bm,
 | 
						|
    uint16_t bm_size, uint32_t sp)
 | 
						|
{
 | 
						|
    uint32_t ret;
 | 
						|
 | 
						|
    /* always skip the first bit as it's invalid */
 | 
						|
    bm->map[0] |= 0x01;
 | 
						|
    ret = iot_bitmap_ffz_from(bm->map, bm_size, sp);
 | 
						|
    bm->map[0] &= ~0x01;
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static inline uint32_t cvg_tei_map_ffz_and_s(cvg_tei_map_t *bm)
 | 
						|
{
 | 
						|
    uint32_t ret;
 | 
						|
 | 
						|
    /* always skip the first bit as it's invalid */
 | 
						|
    bm->map[0] |= 0x01;
 | 
						|
    ret = iot_bitmap_ffz_and_s(bm->map, sizeof(*bm));
 | 
						|
    bm->map[0] &= ~0x01;
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
#define cvg_tei_map_set(bm, bit) \
 | 
						|
    iot_bitmap_set((bm)->map, sizeof(*(bm)), (bit))
 | 
						|
 | 
						|
#define cvg_tei_map_is_set(bm, bit) \
 | 
						|
    iot_bitmap_is_set((bm)->map, sizeof(*(bm)), (bit))
 | 
						|
 | 
						|
#define cvg_tei_map_clear(bm, bit) \
 | 
						|
    iot_bitmap_clear((bm)->map, sizeof(*(bm)), (bit))
 | 
						|
 | 
						|
#define cvg_tei_map_cbs(bm) iot_bitmap_cbs((bm)->map, sizeof(*(bm)))
 | 
						|
 | 
						|
static inline uint32_t cvg_tei_map_cbz(cvg_tei_map_t *bm)
 | 
						|
{
 | 
						|
    uint32_t ret;
 | 
						|
 | 
						|
    /* always skip the first bit as it's invalid */
 | 
						|
    bm->map[0] |= 0x01;
 | 
						|
    ret = iot_bitmap_cbz(bm->map, sizeof(*bm));
 | 
						|
    bm->map[0] &= ~0x01;
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * cvg_tei_map_merge() -  merge bm2 to bm1.
 | 
						|
 * @bm1:     bitmap to be merged with bm2 and store the result
 | 
						|
 * @bm2:     bitmap to be merged to bm1
 | 
						|
 */
 | 
						|
static inline void cvg_tei_map_merge(cvg_tei_map_t *bm1,
 | 
						|
    const cvg_tei_map_t *bm2)
 | 
						|
{
 | 
						|
    for (uint16_t i = 0; i < CVG_TEI_MAP_BYTE_LEN; i++) {
 | 
						|
        bm1->map[i] |= bm2->map[i];
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * cvg_tei_map_exclude() -  exclude bm2 from bm1.
 | 
						|
 * @bm1:     bitmap to be excluded with bm2 and store the result
 | 
						|
 * @bm2:     bitmap to be excluded from bm1
 | 
						|
 */
 | 
						|
static inline void cvg_tei_map_exclude(cvg_tei_map_t *bm1,
 | 
						|
    const cvg_tei_map_t *bm2)
 | 
						|
{
 | 
						|
    for (uint16_t i = 0; i < CVG_TEI_MAP_BYTE_LEN; i++) {
 | 
						|
        bm1->map[i] &= ~(bm2->map[i]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * CVG_TEI_MAP_LOOP_BEGIN()
 | 
						|
 * CVG_TEI_MAP_LOOP_END()
 | 
						|
 *
 | 
						|
 * macro to go through the tei set to 1 in the bitmap.
 | 
						|
 * @bm:     pointer to bitmap
 | 
						|
 * @tei:    the tei_t variable to save the tei info of each loop
 | 
						|
 */
 | 
						|
#define CVG_TEI_MAP_LOOP_BEGIN(bm, tei)                             \
 | 
						|
    do {                                                            \
 | 
						|
        uint32_t __b;                                               \
 | 
						|
        uint32_t __idx = cvg_tei_map_ffs(bm);                       \
 | 
						|
        if (__idx == 0)                                             \
 | 
						|
            break;                                                  \
 | 
						|
        tei = CVG_BM_TO_TEI(__idx);                                 \
 | 
						|
        __b = 1 << (tei & 0x07);                                    \
 | 
						|
        __idx = tei >> 3;                                           \
 | 
						|
        for (; __idx < CVG_TEI_MAP_BYTE_LEN; __idx++) {             \
 | 
						|
            if ((bm)->map[__idx] == 0) {                            \
 | 
						|
                (tei) += 8;                                         \
 | 
						|
                continue;                                           \
 | 
						|
            }                                                       \
 | 
						|
            while (__b < 0x100) {                                   \
 | 
						|
                if ((bm)->map[__idx] & __b) {                       \
 | 
						|
 | 
						|
#define CVG_TEI_MAP_LOOP_END(bm, tei)                               \
 | 
						|
                }                                                   \
 | 
						|
                (tei)++;                                            \
 | 
						|
                __b <<= 1;                                          \
 | 
						|
            }                                                       \
 | 
						|
            __b = 1;                                                \
 | 
						|
        }                                                           \
 | 
						|
    } while (0);
 | 
						|
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* CVG_BITMAP_H */
 |