#include "main.h"             //包含需要的头文件

/*-------------------------------------------------*/
/*函数名：从24c02指定的地址读一字节数据            */
/*参  数：ReadAddr:需要读数据的地址                */
/*返回值：读到的数据                               */
/*-------------------------------------------------*/
uint8_t m24c02ReadOneByte(uint8_t ReadAddr) {
  uint8_t receive;               //定义一个变量用于保存接收到的数据

  iicStart();                   //IIC开始信号
  iicSendByte(M24C02_WADDR);   //发送24c02器件地址+写操作
  iicWaitAck();                //等待应答
  iicSendByte(ReadAddr);       //发送需要读数据的地址
  iicWaitAck();	               //等待应答
  iicStart();  	 	           //IIC开始信号
  iicSendByte(M24C02_RADDR);   //发送24c02器件地址+读操作
  iicWaitAck();	               //等待应答
  receive=iicReadByte(0);	   //读一字节数据，保存在receive变量中
  iicStop();                    //停止信号
  HAL_Delay(5);                   //延迟
  return receive;                //返回读取的数据
}
/*-------------------------------------------------*/
/*函数名：指定地址写入一个数据                     */
/*参  数：WriteAddr  :写入数据的目的地址           */
/*参  数：DataToWrite:要写入的数据                 */
/*返回值：无                                       */
/*-------------------------------------------------*/
void m24c02WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite) {
  iicStart();                    //开始信号
  iicSendByte(M24C02_WADDR);    //发送器件地址+写操作
  iicWaitAck();	                //等待应答
  iicSendByte(WriteAddr);       //发送写入数据的目的地址
  iicWaitAck(); 	 	        //等待应答
  iicSendByte(DataToWrite);     //发送要写入的数据
  iicWaitAck();  		        //等待应答
  iicStop();                     //停止信号
  HAL_Delay(5);                    //延迟
}
/*-------------------------------------------------*/
/*函数名：从指定的地址读指定数量数据               */
/*参  数：ReadAddr:需要读数据的地址                */
/*参  数：Redata:保存数据的缓冲区                  */
/*参  数：Redatalen:读多少数据                     */
/*返回值：无                                       */
/*-------------------------------------------------*/
void m24c02ReadSequential(uint8_t ReadAddr,uint8_t *Redata,uint16_t Redatalen) {
  uint16_t i;                                //定义一个变量用于for循环

  iicStart();                               //IIC开始信号
  iicSendByte(M24C02_WADDR);               //发送器件地址+写操作
  iicWaitAck();                            //等待应答
  iicSendByte(ReadAddr);                   //发送需要读数据的地址
  iicWaitAck();	                           //等待应答
  iicStart();  	 	                       //IIC开始信号
  iicSendByte(M24C02_RADDR);               //发送器件地址+读操作
  iicWaitAck();	                           //等待应答
  for(i=0; i<(Redatalen-1); i++) {           //循环读取前Redatalen-1个字节
    Redata[i]=iicReadByte(1);            //读一字节数据，发送ACK信号
  }
  Redata[Redatalen-1]=iicReadByte(0);      //读最后一字节数据，不发送ACK信号
  iicStop();                                //停止信号
  HAL_Delay(5);                               //延迟
}
/*-------------------------------------------------*/
/*函数名：从EEprom指定的地址读数据                 */
/*参  数：addr:需要读数据的地址                    */
/*参  数：data:保存数据缓冲区                      */
/*参  数：len:要读取的数据长度                     */
/*返回值：无                                       */
/*-------------------------------------------------*/
void eepromReadData(uint8_t addr,void *data, uint16_t len) {
  uint8_t *ptr;                                 //定义一个指针用于读取数据

  ptr = data;                                   //ptr指向需要读取数据的缓冲区
  m24c02ReadSequential(addr,ptr,len);          //读取数据
}
/*-------------------------------------------------*/
/*函数名：EEprom指定地址写入指定字节的数据         */
/*参  数：addr：地址                               */
/*参  数：data：写入的数据                         */
/*参  数：len：写入多少数据                        */
/*返回值：无                                       */
/*-------------------------------------------------*/
void eepromWriteData(uint8_t addr, void *data, uint16_t len) {
  uint16_t i;                                    //用于for循环
  uint8_t *ptr;                                  //定义一个指针用于写入数据
  ptr = data;                                    //ptr指向需要写入数据的缓冲区
  for(i=0; i<len; i++) {                         //循环写入数据
    m24c02WriteOneByte(addr,ptr[i]);          //写一字节数据
    addr++;                                    //地址+1
  }
}
/*-------------------------------------------------*/
/*函数名：从EEprom读取所有证书参数信息             */
/*参  数：无                                       */
/*返回值：无                                       */
/*-------------------------------------------------*/
void eepromReadInfo(void) {
	#if Download
		log_info("当前为下载模式,准备将MQTT信息写入EEPROM");
		eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
	#else
		log_info("当前为运行模式,准备从EEPROM读出MQTT信息");
		memset(&MqttInfoStr,0,MQTT_STRUCT_LEN);                   //清空结构体
		eepromReadData(0,&MqttInfoStr,MQTT_STRUCT_LEN);  //从继电器状态后的扇区开始读取
	#endif 
}

