/*! \brief Obtention depuis le fichier du bloc contenant l'enregistrement * d'indice-fichier donné. * * \ingroup cache_internal * * Cette fonction retourne un bloc valide contenant l'enregistrement cherché. * On cherche d'abord l'enregistrement dans le cache grâce à Find_Block. Si on * ne l'y trouve pas, on obtient un bloc libre grâce à la fonction * Strategy_Replace_Block (qui, comme son nom l'indique, depend de la * strategie). On sauve ce bloc si il est marqué modifié puis on initialise son * entête et on lit son contenu depuis le fichier (Read_Block). * * \param pcache un pointeur sur le cache à synchroniser * \param irfile indice du bloc cherché dans le fichier * \return un pointeur sur l'entête du bloc (ou le pointeur nul si le bloc n'est pas trouvé) */ struct Cache_Block_Header *Get_Block(struct Cache *pcache, int irfile) { struct Cache_Block_Header *pbh; if ((pbh = Find_Block(pcache, irfile)) == NULL) { /* L'enregistrement n'est pas dans le cache */ /* On demande un block à Strategy_Replace_Block */ pbh = Strategy_Replace_Block(pcache); if (pbh == NULL) return NULL; /* Si le bloc libéré est valide et modifié, on le sauve sur le fichier */ if ((pbh->flags & VALID) && (pbh->flags & MODIF) && (Write_Block(pcache, pbh) != CACHE_OK)) return NULL; /* On remplit le bloc libre et son entête avec l'information de * l'enregistrement d'indice-fichier irfile */ pbh->flags = 0; pbh->ibfile = irfile / pcache->nrecords; /* indice du bloc dans le fichier */ if (Read_Block(pcache, pbh) != CACHE_OK) return NULL; } /* Soit l'enregistrement était déjà dans le cache, soit on vient de l'y mettre */ return pbh; }
void app_brushMemSetting(void) { BOOL flag = FALSE; #define U8_FIRST_BRUSH_CARD_DLY 5 UINT8 u8_FirstBrushCardDly = 0; //第一次刷管理卡显示信息,再次刷则更改 app_timeClear(AD_CHANNEL_NUM); //清除时间 do { if (app_brushCard() == MEM_CARD && Read_Block(gBuff, 4) == FM1702_OK) { if (gBuff[0] == 0x01 && gBuff[1] == 0x0A) //金额管理卡 { if (u8_FirstBrushCardDly) { s_System.Money += 10; if (s_System.Money > 200) { s_System.Money = 10; } flag = TRUE; } drv_ledDisplayChannel(0, s_System.Money); drv_ledDisplayChannel(1, 0); u8_ledDot = 1 << 0; } else if (gBuff[0] == 0xFA && gBuff[1] == 0x01) //时间管理卡 { if (u8_FirstBrushCardDly) { s_System.Time += 30; if (s_System.Time > 600) { s_System.Time = 30; } flag = TRUE; } drv_ledDisplayChannel(0, 0); drv_ledDisplayChannel(1, s_System.Time); } else if (gBuff[0] == 0xFF && gBuff[1] == 0xFF) { if (b_TestMode) { b_TestMode = FALSE; } else { b_TestMode = TRUE; } drv_buzzerNumber(1); break; } drv_buzzerNumber(1); u8_FirstBrushCardDly = 1; } sys_delayms(1000); u8_FirstBrushCardDly++; } while (u8_FirstBrushCardDly < U8_FIRST_BRUSH_CARD_DLY); if (flag) { app_configWrite(SYSTEM_SETTING_SECTOR); } }