#ifndef __twi_aap_h__#define __two_aap_h__#include <compat/twi.h>#include "common.h"#include "usart.h"#include "guids.h"#include "eeprom.h"//#define SERIAL_DBGnamespace EEPROM_layout {const uint16_t TWI_SoftAddr_Ofs = 0xff;}namespace TWI {const uint8_t GeneralCallAddr = 0;const size_t UniqueID_Size = 16*3;const size_t GUID_Size = sizeof(GUID);struct sConfigRecord {uint8_t UniqueID[UniqueID_Size];GUID ClassID;GUID DevID;};enum TWI_AAPCommands {TWI_AAPCmd_Reserved = 0,TWI_AAPCmd_Start = 0x20,TWI_AAPCmd_End = 0x21,TWI_AAPCmd_ResetDevices = 0x22,TWI_AAPCmd_ResetToPermAddress = 0x23,TWI_AAPCmd_GetConfig = 0x24,TWI_AAPCmd_AssignAddress = 0x25};enum MainStates {MS_Idle = 0,MS_Addressed,AAP_CmdGetConfig_GetAddress,AAP_CmdGetConfig_SendConfig,AAP_CmdAssignAddress_GetUniqueID,AAP_CmdAssignAddress_GetAddress,US_Base};extern uint8_t State;extern uint8_t LastCmd;extern uint8_t SoftAddress;inline void Init() {TWBR = 32; // 100kHz with an 8MHz crystal// TWBR = 16; // 200kHz with an 8MHz crystalTWSR = 0; // pre-scaler: 1TWCR = (1 << TWEA) | (1 << TWEN) | (1 << TWIE) | (1 << TWINT);if (TWSR == TW_BUS_ERROR) SETBIT(TWCR,(1 << TWSTO)); // reset TWITWAMR = 0; // all address bits matterState = MS_Idle;SoftAddress = EEPROM::GetByte(EEPROM_layout::TWI_SoftAddr_Ofs);if (SoftAddress == 0xff) SoftAddress = 0;SoftAddress &= 0xfe;// TWAR = GeneralCallAddr | 1; // General call recognition and slave-receiver mode through address being 0TWAR = SoftAddress | 1;LastCmd = TWI_AAPCmd_Reserved;}// These used in all states, including user states, so make them available.extern uint8_t TWIStatus;extern uint8_t TWIData;extern uint8_t TWIPrevData;extern uint8_t TWIControl;void ResetTWITransmit();void ResetTWIReceive();void ResetTWI();}#endif // __twi_aap_h__