/******************************************************************************* 函 数 名: GroupEEPROMData_Set 功能说明: 设置组号标识是否有效 参 数: unit: 单元位置 area: 区域位置(0~4) num: 组号 返 回 值: 无 *******************************************************************************/ void GroupEEPROM_Set(u8 unit, u8 area, u8 num) { u8 groupAddr[8]; ReadDataFromEEPROM(GROUP_START_ADD + (UNIT_GROUP_SPACE * unit) + (AREA_GROUP_SPACE * area) + num/8, 1, &groupAddr[num/8]); if (num < AREA_GROUP_NUM && !(groupAddr[num/8] & (1 << (num%8)))) // 组号正确, 并且还未设置 { groupAddr[num/8] |= 1 << (num%8); WriteDataToEEPROM(GROUP_START_ADD + (UNIT_GROUP_SPACE * unit) + (AREA_GROUP_SPACE * area), 1, &groupAddr[num/8]); } #if 0 u16 flag; ReadDataFromEEPROM(GROUP_START_ADD + (UNIT_GROUP_SPACE * unit) + (AREA_GROUP_SPACE * area), sizeof(flag), (u8 *)&flag); if (num < AREA_GROUP_NUM && !(flag & (1 << num))) // 组号正确, 并且还未设置 { flag |= (1 << num); WriteDataToEEPROM(GROUP_START_ADD + (UNIT_GROUP_SPACE * unit) + (AREA_GROUP_SPACE * area), sizeof(flag), (u8 *)&flag); } #endif }
/******************************************************************************* 函 数 名: SceneEEPROMSaveData_Clr 功能说明: 场景EEPROM存储数据清除 参 数: number: 场景数据编号 返 回 值: 无 *******************************************************************************/ void SceneEEPROMData_Clr(u8 number) { // u8 i; gSceneIndex[(number-1)/8] &= ~(1<<((number-1)%8)); WriteDataToEEPROM(SCENESAVEFLAG_START_ADD + (number-1) / 8, 1, &gSceneIndex[(number-1)/8]); #if 0 ReadDataFromEEPROM(SCENESAVEFLAG_START_ADD + number / 8, 1, &i); i &= ~(1 << number % 8); WriteDataToEEPROM(SCENESAVEFLAG_START_ADD + number / 8, 1, &i); #endif }
/******************************************************************************* 函 数 名: UnitPublicEEPROMData_Set 功能说明: 设置单元共用EEPROM数据初始化 参 数: size: 设置数据大小 data: 设置数据内容 返 回 值: 无 *******************************************************************************/ u8 UnitPublicEEPROMData_Set(u8 size , u8 *data) { u32 seat = (u32)data - (u32)&gUnitData; return WriteDataToEEPROM(UNITDATA_START_ADD + (ONCEUNITDATA_SPACE * (seat / sizeof(UnitData_t))) + seat % sizeof(UnitData_t), size, data); }
/******************************************************************************* 函 数 名: FaultData_Save 功能说明: 异常事件存储 参 数: event: 异常事件名 返 回 值: 无 *******************************************************************************/ void FaultData_Save(u8 event) { u32 name; ReadDataFromEEPROM(FAULT_START_ADD + sizeof(name)*event, sizeof(name), (u8 *)&name); //获取标识 name++; WriteDataToEEPROM(FAULT_START_ADD + sizeof(name)*event, sizeof(name), (u8 *)&name); //获取标识 }
/******************************************************************************* 函 数 名: SceneEEPROMSaveData_ClrEx 功能说明: 场景EEPROM存储的时间数据清除 参 数: number: 场景数据编号(0x01~0xff) 返 回 值: 无 *******************************************************************************/ static void SceneEEPROMData_ClrEx(u8 number) { u8 i = 0u; if(number < SCENE_TIMSPACE_NUM) { ReadDataFromEEPROM(SCENETIMUSEFLAG_START_ADD + number / 8, 1, &i); i &= ~(1 << number % 8); WriteDataToEEPROM(SCENETIMUSEFLAG_START_ADD + number / 8, 1, &i); } }
/******************************************************************************* 函 数 名: SysEEPROMData_Init() 功能说明: 系统EEPROM数据初始化 参 数: 无 返 回 值: 无 *******************************************************************************/ void SysEEPROMData_Init(void) { gSysData.userID = DEFAULT_USERID; //用户号 gSysData.deviceID = HardID_Check(0); // gSysData.sendCnt = 2; //默认两次发送信号,周旺修改,2015.7.2 gSysData.serialNum = 0; memset((u8 *)gSysData.BandAddr, 0, sizeof(gSysData.BandAddr)); //清绑定地址转发功能,周旺增加 gSysData.BandAreaEn = 0; //清区域广播转发功能,周旺增加 WriteDataToEEPROM(SYSDATA_START_ADD, sizeof(gSysData), (u8 *)&gSysData); }
/******************************************************************************* 函 数 名: UnitPublicEEPROMUnitData_Init 功能说明: 单元共用EEPROM单元数据初始化 参 数: unit: 目标格式化单元号 返 回 值: 无 *******************************************************************************/ void UnitPublicEEPROMUnitData_Init(u8 unit) { *(u32*)gUnitData[unit].area = DEFAULT_AREA; //默认区域号 gUnitData[unit].type = 0; //默认设备应用类型 gUnitData[unit].able = 1; //默认使能标识 gUnitData[unit].common = 0; //默认单元应用大类 gUnitData[unit].UploadAble = 1; //默认上报使能标记 yanhuan adding 2016/01/04 gUnitData[unit].UploadSetTime = 3;//默认上报上报使能最大随机时间 WriteDataToEEPROM(UNITDATA_START_ADD + ONCEUNITDATA_SPACE*unit, sizeof(UnitData_t), (u8*)&gUnitData[unit]); }
bool CModule_ControlSwitch::TableWrite( int8_t inSrcNode, SMsg_Table const& inProgram) { if(inProgram.type == eTableType_ControlSwitch) { if(inProgram.index >= eMaxControlSwitchCount) { return false; } controlSwitchArray[inProgram.index].id = inProgram.controlSwitch.id; controlSwitchArray[inProgram.index].straightDInPin = inProgram.controlSwitch.straightDInPin; controlSwitchArray[inProgram.index].turnDInPin = inProgram.controlSwitch.turnDInPin; controlSwitchArray[inProgram.index].touchID = inProgram.controlSwitch.touchID; WriteDataToEEPROM(controlSwitchArray + inProgram.index, eepromOffset + inProgram.index * sizeof(SControlSwitchConfig), sizeof(SControlSwitchConfig)); } else if(inProgram.type == eTableType_ControlSwitchToTurnoutMap) { if(inProgram.index >= eMaxControlSwitchToTurnoutMapCount) { return false; } controlSwitchToTurnoutMapArray[inProgram.index].controlSwitchID = inProgram.trackTurnoutMap.controlSwitchID; controlSwitchToTurnoutMapArray[inProgram.index].turnout1ID = inProgram.trackTurnoutMap.turnout1ID; controlSwitchToTurnoutMapArray[inProgram.index].turnout2ID = inProgram.trackTurnoutMap.turnout2ID; WriteDataToEEPROM(controlSwitchToTurnoutMapArray + inProgram.index, eepromOffset + sizeof(controlSwitchArray) + inProgram.index * sizeof(SControlSwitchToTurnoutMapConfig), sizeof(SControlSwitchToTurnoutMapConfig)); } return TableRead(inSrcNode, inProgram); }
/******************************************************************************* 函 数 名: EEPROM_Write 功能说明: EEPROM_写入数据 参 数: 参数: addr-EEPROM中的实际地址 len-长度 data-要写入的相同数据 返回值: 消息执行结果 *******************************************************************************/ MsgResult_t EEPROM_Write(u32 addr, u32 len, u8 *data) { if ((addr + len) > A24C256 //地址越界 || addr < USERDATA_END_ADD ) { return EEPROM_RAND_ERR; } if (WriteDataToEEPROM(addr, len, data) == FALSE) { return EEPROM_ERR; } return COMPLETE; }
/******************************************************************************* 函 数 名: MsgResult_t Set_ResetAddr_Attr(UnitPara_t *pData) 功能说明: 写入重设地址 参 数: data[0]: 目标单元 data[1]: 参数长度 返 回 值: 消息执行结果 0x01(COMPLETE):表示设置成功 0x02:表示没设置过,设置失败 0x03:表示已设置过,无需再设置 *******************************************************************************/ MsgResult_t Set_ResetAddr_Attr(UnitPara_t *pData) { u8 Tab_Tem[20]= {0}; u32 DeviceID_Tem = 0xffffffff; DevPivotalSet_t* pDevPivotalSet = GetDevPivotalSet(); DeviceIDSet_t* pDeviceIDSet = (DeviceIDSet_t*)(pDevPivotalSet->DevResetParaAddr); if (pData->len < 8) //参数长度不合法 { return PARA_LEN_ERR; } if(DEVICE_ID_IS_OK(pDeviceIDSet->SetAddrFlag,\ pDeviceIDSet->DeviceID,pDeviceIDSet->DeviceIDInver)) //如果已设置的新地址合法 { if(pDeviceIDSet->DeviceID == (*(u32*)(&pData->data[0])))//若重设地址已设置过,则直接返回成功 { return COMPLETE; } } else //若当前运行STM32原始设备地址,校验当前设备地址与上位机发送的当前校验地址是否相同 { if(DEVICE_ID != (*(u32*)(&pData->data[4]))) { return PARA_MEANING_ERR; //参数错误 } } #if (FLASH_ENCRYPTION_EN > 0u) *(u32*)(Tab_Tem + sizeof(DeviceIDSet_t)) = ENCRYPTION_FLAG; *(u32*)(Tab_Tem + sizeof(DeviceIDSet_t) + offsetof(FlashEncrypt_t,EncryptFlashData)) = FlashEncryptionFunc((*(u32*)(&pData->data[0]))); #endif /*重设地址功能数据格式为->重设地址标记(2bytes 0xaa55) + 重设地址(4bytes) + 重设地址反码(4bytes) */ *(u32*)(Tab_Tem + 0x00) = RE_DEVICE_ID_FLAG; *(u32*)(Tab_Tem + offsetof(DeviceIDSet_t,DeviceID)) = (*(u32*)(&pData->data[0])); *(u32*)(Tab_Tem + offsetof(DeviceIDSet_t,DeviceIDInver)) =~(*(u32*)(&pData->data[0])); if(Program_WriteEx(pDevPivotalSet->DevResetParaAddr,sizeof(Tab_Tem), (u8 *)(Tab_Tem))) { DeviceID_Tem = (*(u32*)(&pData->data[0])); WriteDataToEEPROM(SYSDATA_START_ADD + offsetof(SysData_t, deviceID), sizeof(u32), (u8*)&DeviceID_Tem); Thread_Login(ONCEDELAY,0,1000,HardID_Change); return COMPLETE; //表示没设置过,设置成功 } else { return ((MsgResult_t)(0x02)); //表示没设置过,设置失败 } }
/******************************************************************************* 函 数 名: SceneEEPROMSaveData_Seat 功能说明: 申请一个场景存储位置 参 数: len: 目标存储数据长度 number: 存储的位置值 返 回 值: 无 *******************************************************************************/ void SceneEEPROMData_Seat(u8 len, u8 *number) { // u8 seat[SCENE_MAX_NUM / 8]; u32 i; ReadDataFromEEPROM(SCENESAVEFLAG_START_ADD, sizeof(gSceneIndex), gSceneIndex); //获取存储标识 for (i = SceneEEPROMSave_Seat(len), *number = SCENEFLAG_DEFAULT_VALUE; i < SCENE_MAX_NUM; i++) { if (!(gSceneIndex[(i-1) / 8] & (1 << ((i-1) % 8)))) //如果存储位置是空闲的 { *number = i; //存储位置确定 gSceneIndex[(i-1) / 8] |= (1 << ((i-1) % 8)); WriteDataToEEPROM(SCENESAVEFLAG_START_ADD + (i-1) / 8, 1, &gSceneIndex[(i-1) / 8]); //修改存储标识· break; } } }
/******************************************************************************* 函 数 名: GroupEEPROM_Clr 功能说明: 清除组号标识位 参 数: unit: 单元位置 area: 区域位置(0~4) num: 组号 返 回 值: 无 *******************************************************************************/ void GroupEEPROM_Clr(u8 unit, u8 area, u8 num) { u16 flag; ReadDataFromEEPROM(GROUP_START_ADD + (UNIT_GROUP_SPACE * unit) + (AREA_GROUP_SPACE * area), sizeof(flag), (u8 *)&flag); if (num < AREA_GROUP_NUM && (flag & (1 << num))) // 组号正确, 并且设置 { flag &= ~(1 << num); } else if (num == CLEAR) { flag = 0; } else { return; } WriteDataToEEPROM(GROUP_START_ADD + (UNIT_GROUP_SPACE * unit) + (AREA_GROUP_SPACE * area), sizeof(flag), (u8 *)&flag); }
/******************************************************************************* **函 数: AirCondition_SaveData **功 能: 空调面板保存数据到EEPROM **参 数: void **返 回: void *******************************************************************************/ void AirCondition_SaveData(void) { WriteDataToEEPROM(DEVICE_RELATE_START_ADDR,sizeof(DeveceRelate_s), (u8 *)&gDeveceRelate); WriteDataToEEPROM(DEVICE_RELATE_START_ADDR+sizeof(DeveceRelate_s),sizeof(gAirContionData), (u8 *)&gAirContionData); }
/******************************************************************************* 函 数 名: SceneDlyTimeEEPROM_Set 功能说明: 写入一个场景的扩展接口,支持延时顺序执行 参 数: unit: 单元位置 area: 区域位置(0~4) num: 情景号 cnt: 属性命令数量 data[0~n]: 场景时间数据内容 返 回 值: 存储结果 *******************************************************************************/ static u32 SceneDlyTimeEEPROM_Set(u8 unit, u8 area, u8 num, u8 cnt, u8 *data) { u8 scenetime_temp, scenetimeuseflag_temp[SCENE_TIMSPACE_NUM / 8], flag, i; if ((cnt > 0) && (cnt <= (SCENE_TIMDATA_SPACE / sizeof(DlyTimeData_t)))) { flag = FindScene(unit,area,num); ReadDataFromEEPROM(SCENCETIMFLAG_START_ADD + flag, 1, &scenetime_temp); if ((!scenetime_temp)||(scenetime_temp > SCENE_TIMSPACE_NUM)) //没有申请时间存储内存则申请内存 { ReadDataFromEEPROM(SCENETIMUSEFLAG_START_ADD, SCENE_TIMSPACE_NUM / 8, scenetimeuseflag_temp); for (i = 0, scenetime_temp = SCENEFLAG_DEFAULT_VALUE; i < SCENE_TIMSPACE_NUM; i++) { if (!(scenetimeuseflag_temp[i / 8] & (1 << (i % 8)))) { scenetime_temp = i + 1; //记录的场景时间存储标号从1~SCENE_TIMSPACE_NUM scenetimeuseflag_temp[i / 8] |= (1 << (i % 8)); WriteDataToEEPROM(SCENETIMUSEFLAG_START_ADD + i / 8, 1, &scenetimeuseflag_temp[i / 8]); WriteDataToEEPROM(SCENCETIMFLAG_START_ADD + flag,1,&scenetime_temp); break; } } if (SCENEFLAG_DEFAULT_VALUE == scenetime_temp) { CheckSceneDlyTimeEEPROM(); return EEPROM_RAND_ERR; } } WriteDataToEEPROM(SCENETIMSAVE_START_ADD + SCENE_TIMDATA_SPACE * (scenetime_temp - 1),\ sizeof(DlyTimeData_t)*cnt, (u8 *)data); return COMPLETE; } else { return EEPROM_RAND_ERR; } #if 0 if ((cnt > 0) && (cnt <= (SCENE_TIMDATA_SPACE / sizeof(DlyTimeData_t)))) { ReadDataFromEEPROM(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unit) + (AREA_SCENEFLAG_SPACE * area) + (SCENEFLAG_SPACE * num), sizeof(flag), (u8 *)&flag); ReadDataFromEEPROM(SCENCETIMFLAG_START_ADD + flag, 1, &scenetime_temp); if ((!scenetime_temp)||(scenetime_temp > SCENE_TIMSPACE_NUM)) //没有申请时间存储内存则申请内存 { ReadDataFromEEPROM(SCENETIMUSEFLAG_START_ADD, SCENE_TIMSPACE_NUM / 8, scenetimeuseflag_temp); for (i = 0, scenetime_temp = SCENEFLAG_DEFAULT_VALUE; i < SCENE_TIMSPACE_NUM; i++) { if (!(scenetimeuseflag_temp[i / 8] & (1 << (i % 8)))) { scenetime_temp = i + 1; //记录的场景时间存储标号从1~SCENE_TIMSPACE_NUM scenetimeuseflag_temp[i / 8] |= (1 << (i % 8)); WriteDataToEEPROM(SCENETIMUSEFLAG_START_ADD + i / 8, 1, &scenetimeuseflag_temp[i / 8]); WriteDataToEEPROM(SCENCETIMFLAG_START_ADD + flag,1,&scenetime_temp); break; } } if (SCENEFLAG_DEFAULT_VALUE == scenetime_temp) { CheckSceneDlyTimeEEPROM(); return EEPROM_RAND_ERR; } } WriteDataToEEPROM(SCENETIMSAVE_START_ADD + SCENE_TIMDATA_SPACE * (scenetime_temp - 1),\ sizeof(DlyTimeData_t)*cnt, (u8 *)data); return COMPLETE; } else { return EEPROM_RAND_ERR; } #endif }
/******************************************************************************* 函 数 名: void CheckSceneDlyTimeEEPROM(void) 功能说明: 检查EEPROM中场景延时参数的合法性 参 数: 无 返 回 值: 无 *******************************************************************************/ void CheckSceneDlyTimeEEPROM(void) { #if 0 u16 loopcnt,totalscene_num = 0x00; u8 unitCnt; u8 scenetime_flag = 0x00; u8 scenetimeuse_flag = 0x00; u8 scene_flag[UNIT_SCENEFLAG_NUM] = {0}; u8 scenetimepos[SCENE_MAX_NUM] = {0}; #endif u8 unitCnt; u16 loopcnt,totalscene_num = 0x00; u8 cnt; u16 i; u8 sceneAddr[SCENE_MAX_NUM]; u8 scenetime_flag = 0x00; // u8 scenetimedata[SCENE_MAX_NUM]; u8 scenetimeuse_flag = 0x00; u8 scenetimepos[SCENE_MAX_NUM] = {0}; for (unitCnt = 1; unitCnt < UnitCnt_Get(); unitCnt++) { for(i=0;i<SCENE_MAX_NUM;i++) { if(unitCnt == gSceneBuff[i][0]) { sceneAddr[cnt++] = i+1; } } } // ReadDataFromEEPROM(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unitCnt),\ // sizeof(scene_flag), (u8 *)&scene_flag); for(loopcnt = 0;loopcnt < sizeof(sceneAddr);loopcnt ++) { if(SCENEFLAG_DEFAULT_VALUE != sceneAddr[loopcnt]) //检查当前单元场景是否存在 { ReadDataFromEEPROM(SCENCETIMFLAG_START_ADD + sceneAddr[loopcnt],\ sizeof(scenetime_flag), (u8 *)&scenetime_flag); if((SCENEFLAG_DEFAULT_VALUE != scenetime_flag)&&(scenetime_flag <= SCENE_TIMSPACE_NUM)) //判断场景时间映射表的参数是否合法 { ReadDataFromEEPROM(SCENETIMUSEFLAG_START_ADD + ((scenetime_flag-1)/8),\ sizeof(scenetimeuse_flag), &scenetimeuse_flag); if(scenetimeuse_flag&(1<<(scenetime_flag-1)%8)) { scenetimepos[sceneAddr[loopcnt]] = scenetime_flag; } else { WriteDataToEEPROMEx(SCENCETIMFLAG_START_ADD + sceneAddr[loopcnt],\ 1, (u8)SCENEFLAG_DEFAULT_VALUE); } } continue; } totalscene_num ++; } if(sizeof(sceneAddr) == totalscene_num) //若场景数据全部为空,则时间数据清空 { WriteDataToEEPROMEx(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, SCENEFLAG_DEFAULT_VALUE); //清除场景数据与时间数据的映射表,256bytes WriteDataToEEPROMEx(SCENETIMUSEFLAG_START_ADD, SCENE_MAX_NUM / 8, SCENEFLAG_DEFAULT_VALUE); //清除场景时间数据的分配表,32bytes } else { WriteDataToEEPROM(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, scenetimepos); memset(sceneAddr,0,sizeof(sceneAddr)); for(loopcnt = 0;loopcnt < SCENE_MAX_NUM;loopcnt ++) { if(SCENEFLAG_DEFAULT_VALUE != scenetimepos[loopcnt]) { sceneAddr[(scenetimepos[loopcnt]-1)/8] |= (1 << ((scenetimepos[loopcnt]-1)%8)); } } WriteDataToEEPROM(SCENETIMUSEFLAG_START_ADD,SCENE_MAX_NUM/8,sceneAddr); } #if 0 for (unitCnt = 1; unitCnt < UnitCnt_Get(); unitCnt++) { ReadDataFromEEPROM(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unitCnt),\ sizeof(scene_flag), (u8 *)&scene_flag); for(loopcnt = 0;loopcnt < sizeof(scene_flag);loopcnt ++) { if(SCENEFLAG_DEFAULT_VALUE != scene_flag[loopcnt]) //检查当前单元场景是否存在 { ReadDataFromEEPROM(SCENCETIMFLAG_START_ADD + scene_flag[loopcnt],\ sizeof(scenetime_flag), (u8 *)&scenetime_flag); if((SCENEFLAG_DEFAULT_VALUE != scenetime_flag)&&(scenetime_flag <= SCENE_TIMSPACE_NUM)) //判断场景时间映射表的参数是否合法 { ReadDataFromEEPROM(SCENETIMUSEFLAG_START_ADD + ((scenetime_flag-1)/8),\ sizeof(scenetimeuse_flag), &scenetimeuse_flag); if(scenetimeuse_flag&(1<<(scenetime_flag-1)%8)) { scenetimepos[scene_flag[loopcnt]] = scenetime_flag; } else { WriteDataToEEPROMEx(SCENCETIMFLAG_START_ADD + scene_flag[loopcnt],\ 1, (u8)SCENEFLAG_DEFAULT_VALUE); } } continue; } totalscene_num ++; } } /////////////////////// if(unitCnt * UNIT_SCENEFLAG_NUM == totalscene_num) //若场景数据全部为空,则时间数据清空 { WriteDataToEEPROMEx(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, SCENEFLAG_DEFAULT_VALUE); //清除场景数据与时间数据的映射表,256bytes WriteDataToEEPROMEx(SCENETIMUSEFLAG_START_ADD, SCENE_MAX_NUM / 8, SCENEFLAG_DEFAULT_VALUE); //清除场景时间数据的分配表,32bytes } else { WriteDataToEEPROM(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, scenetimepos); memset(scene_flag,0,sizeof(scene_flag)); for(loopcnt = 0;loopcnt < SCENE_MAX_NUM;loopcnt ++) { if(SCENEFLAG_DEFAULT_VALUE != scenetimepos[loopcnt]) { scene_flag[(scenetimepos[loopcnt]-1)/8] |= (1 << ((scenetimepos[loopcnt]-1)%8)); } } WriteDataToEEPROM(SCENETIMUSEFLAG_START_ADD,SCENE_MAX_NUM/8,scene_flag); } #endif }
/******************************************************************************* 函 数 名: SceneEEPROM_Set 功能说明: 写入一个场景 参 数: unit: 单元位置 area: 区域位置(0~4) num: 情景号 data[0]: 场景内容长度 data[1~n]: 场景内容 返 回 值: 存储结果 *******************************************************************************/ u32 SceneEEPROM_Set(u8 unit, u8 area, u8 num, u8 *data) { u8 flag = 0x00; flag = FindScene(unit,area,num); if (Check_PositionRange(flag) != SceneEEPROMSave_Seat(data[0])) //相同场景号的情况下,所需要的存储空间内存块不同,需要重新申请 { DelOneScene(flag); // SceneEEPROMData_Clr(flag); //清除之前存储标识 #if (SCENCETIME_EN > 0u) SceneEEPROMTimeFlag_Clr(flag); #endif flag = SCENEFLAG_DEFAULT_VALUE; } if(SCENEFLAG_DEFAULT_VALUE == flag)//未找到该场景,场景还没有申请空间 { SceneEEPROMData_Seat(data[0], &flag); //申请一个存储空间 if (flag == SCENEFLAG_DEFAULT_VALUE) { return EEPROM_RAND_ERR; } SaveScene(unit,area,num,flag);// // gSceneIndex[(flag-1)/8] |= 1<<((flag-1)%8); // WriteDataToEEPROM(SCENESAVEFLAG_START_ADD + (flag-1) / 8, 1, &gSceneIndex[(flag-1)/8]); WriteDataToEEPROM(SCENEFLAG_START_ADD + 1 +SCENE_INDEXEX_SPACE*(flag-1), sizeof(gSceneBuff)/SCENE_MAX_NUM,(u8 *)&gSceneBuff[flag-1]);// } /////////////////TEST/////////////////////// SceneIndexes.sceneAddr = flag; //////////////////TEST////////////////////// SceneEEPROMData_Save(SceneEEPROMSave_Addr(flag), data); //////////////////////////////////////////////////////////////////// #if 0 ReadDataFromEEPROM(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unit) + (AREA_SCENEFLAG_SPACE * area) + (SCENEFLAG_SPACE * num), sizeof(flag), (u8 *)&flag); if (Check_PositionRange(flag) != SceneEEPROMSave_Seat(data[0])) //相同场景号的情况下,所需要的存储空间内存块不同,需要重新申请 { SceneEEPROMData_Clr(flag); //清除之前存储标识 #if (SCENCETIME_EN > 0u) SceneEEPROMTimeFlag_Clr(flag); #endif flag = SCENEFLAG_DEFAULT_VALUE; } if (flag == SCENEFLAG_DEFAULT_VALUE) //场景还没有申请空间 { SceneEEPROMData_Seat(data[0], &flag); //申请一个存储空间 if (flag == SCENEFLAG_DEFAULT_VALUE) { return EEPROM_RAND_ERR; } WriteDataToEEPROM(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unit) + (AREA_SCENEFLAG_SPACE * area) + (SCENEFLAG_SPACE * num), sizeof(flag), (u8 *)&flag); } SceneEEPROMData_Save(SceneEEPROMSave_Addr(flag), data); #endif //////////////////////////////////////////////////////////////////// return COMPLETE; }
/******************************************************************************* 函 数 名: SceneEEPROMUnitData_Init 功能说明: 场景EEPROM单元数据初始化 参 数: unit: 目标格式化单元号 返 回 值: 无 *******************************************************************************/ void SceneEEPROMUnit_Init(u8 unit) { u16 i=0; u16 cnt=0; u8 unitScene[SCENE_MAX_NUM]; u8 scenetimedata[SCENE_MAX_NUM]; for(i=0;i<SCENE_MAX_NUM;i++) { if(unit == gSceneBuff[i][0]) { DelOneScene(i); unitScene[cnt++] = i+1; } } ReadDataFromEEPROM(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, scenetimedata); for (i = 0; i < cnt; i++) { if (unitScene[i] != SCENEFLAG_DEFAULT_VALUE) //如果场景标识合法 { SceneEEPROMData_Clr(unitScene[i]); #if (SCENCETIME_EN > 0u) if (SCENEFLAG_DEFAULT_VALUE != scenetimedata[unitScene[i]]) { SceneEEPROMData_ClrEx(scenetimedata[unitScene[i]] - 1); scenetimedata[unitScene[i]] = SCENEFLAG_DEFAULT_VALUE; } #endif } } // WriteDataToEEPROMEx(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unit), // UNIT_SCENEFLAG_SPACE, SCENEFLAG_DEFAULT_VALUE); #if (SCENCETIME_EN > 0u) WriteDataToEEPROM(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, scenetimedata); #endif #if 0 u8 i, scene[UNIT_SCENEFLAG_SPACE], scenetimedata[SCENE_MAX_NUM]; ReadDataFromEEPROM(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unit), UNIT_SCENEFLAG_SPACE, scene); ReadDataFromEEPROM(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, scenetimedata); for (i = 0; i < UNIT_SCENEFLAG_SPACE; i++) { if (scene[i] != SCENEFLAG_DEFAULT_VALUE) //如果场景标识合法 { SceneEEPROMData_Clr(scene[i]); #if (SCENCETIME_EN > 0u) if (SCENEFLAG_DEFAULT_VALUE != scenetimedata[scene[i]]) { SceneEEPROMData_ClrEx(scenetimedata[scene[i]] - 1); scenetimedata[scene[i]] = SCENEFLAG_DEFAULT_VALUE; } #endif } } WriteDataToEEPROMEx(SCENEFLAG_START_ADD + (UNIT_SCENEFLAG_SPACE * unit), UNIT_SCENEFLAG_SPACE, SCENEFLAG_DEFAULT_VALUE); #if (SCENCETIME_EN > 0u) WriteDataToEEPROM(SCENCETIMFLAG_START_ADD, SCENE_MAX_NUM, scenetimedata); #endif #endif }
/******************************************************************************* 函 数 名: SceneEEPROMData_Save 功能说明: 场景EEPROM存储数据 参 数: addr: 存储空地址 data: 要存储的场景数据 返 回 值: 存储编号(0~127)/0xFF(没有存储空间) *******************************************************************************/ void SceneEEPROMData_Save(u32 addr, u8 *data) { WriteDataToEEPROM(addr, data[0] + 1, data); //保存数据 }
/******************************************************************************* 函 数 名: SysEEPROMData_Init() 功能说明: 系统EEPROM数据初始化 参 数: size: 设置数据大小 data: 设置数据内容 返 回 值: 无 *******************************************************************************/ u8 SysEEPROMData_Set(u8 size , u8 *data) { return WriteDataToEEPROM(SYSDATA_START_ADD + ((u32)data - (u32)&gSysData), size, data); }