static void printEnable(uint16_t area, bool on) { uint8_t index = AREA_INDEX(area); if (index < sizeof(bitmasks)) { uint8_t bitmask = AREA_BITMASK(area); if (on) { SETBITS(bitmasks[index], bitmask); } else { CLEARBITS(bitmasks[index], bitmask); } } }
bool emberAfPrintEnabled(uint16_t area) { emberAfPrintActiveArea = area; if (area == 0xFFFF) { return true; #ifdef EMBER_AF_PRINT_BITS } else { uint8_t index = AREA_INDEX(area); if (index < sizeof(bitmasks)) { uint8_t bitmask = AREA_BITMASK(area); return READBITS(bitmasks[index], bitmask); } #endif } return false; }
// If the area is bogus, this may still print a name, but it shouldn't crash. static void printAreaName(uint16_t area) { uint16_t index; uint8_t bitmask = AREA_BITMASK(area); uint8_t bit; for (bit = 0; bit < 8; bit++) { if (READBIT(bitmask, bit)) { break; } } index = AREA_INDEX(area) * 8 + bit; if (area != 0xFFFF && index < EMBER_AF_PRINT_NAME_NUMBER) { emAfPrintf("%p:", names[index]); } }
ERASE_COUNT AREA_GetEC(PHY_BLOCK logical_block) { AREA area; STATUS status; PHY_BLOCK block; ERASE_COUNT ret = INVALID_EC; block = BLOCK_OFFSET_AREA(logical_block); area = AREA_INDEX(logical_block); status = AREA_Read(area); if (status == STATUS_SUCCESS) { ret = cached_area_table[block].physical_block_ec; } return ret; }
PHY_BLOCK AREA_GetBlock(LOG_BLOCK logical_block) { AREA area; STATUS status; PHY_BLOCK block; PHY_BLOCK ret = INVALID_BLOCK; block = BLOCK_OFFSET_AREA(logical_block); area = AREA_INDEX(logical_block); status = AREA_Read(area); if (status == STATUS_SUCCESS) { ret = cached_area_table[block].physical_block; } return ret; }
BOOL AREA_IsFull(PHY_BLOCK logical_block) { STATUS status; BOOL ret = FALSE; AREA area = AREA_INDEX(logical_block); status = AREA_Read(area); if (status == STATUS_SUCCESS) { /* offset is the current offset, so, -1 */ if (area_offset_table[area] == PAGE_PER_PHY_BLOCK-1) { ret = TRUE; } } return ret; }
STATUS AREA_Update(PHY_BLOCK logical_block, PHY_BLOCK new_origin_block, ERASE_COUNT new_origin_ec) { AREA area; BLOCK_OFF block; PAGE_OFF page = INVALID_PAGE; STATUS ret; block = BLOCK_OFFSET_AREA(logical_block); area = AREA_INDEX(logical_block); ret = AREA_Read(area); if (ret == STATUS_SUCCESS) { if (new_origin_block != INVALID_BLOCK) { cached_area_table[block].physical_block = new_origin_block; cached_area_table[block].physical_block_ec = new_origin_ec; } /* set the next area page offset */ page = (area_offset_table[area]+1) % PAGE_PER_PHY_BLOCK; ret = TABLE_Write(index_table.area_index_table[area], page, &cached_area_table); } if (ret == STATUS_SUCCESS) { ASSERT(page != INVALID_PAGE); area_offset_table[area] = page; } else if (ret == STATUS_BADBLOCK) { /* bad block, set the offset to toggle reclaim of the area table block */ area_offset_table[area] = PAGE_PER_PHY_BLOCK-1; index_table.area_index_ect[area] = INVALID_EC; } return ret; }