/*******************************************************************************
函 数 名:  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]);
}
Ejemplo n.º 8
0
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);
}