
//#define LED_ON

#define USE_MOISENSOR  //  水分センサ
#ifdef USE_MOISENSOR
#define SENSOR_PORT  A0
#define ANALOG_REF  DEFAULT
#endif
#define WAIT_DELAYMS 500

#define ANT_NETWORK_NUMBER		0x00
unsigned char ANTNetworkKey[8] = 	{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // sample Network Key
#define ANT_CHANNEL_NUMBER 		0x00
#define ANT_CHANNEL_TYPE		0x50		// Transmit only
#define ANT_DEVICE_NUMBER		0x0001		// Your Device Number;
#define ANT_DEVICE_TYPE_ID		0x01		// Your device type
#define ANT_DEVICE_TYPE_PAIRING	0x00		// 0x80: Pairing	0x00: No Pairing
#define ANT_TRANSACTION_TYPE	0x01		// Your Transaction Type
#define ANT_RF_FREQUENCY		50

#define ANT_CHANNEL_HZ			
#define ANT_CHANNEL_PERIOD		0x4000	// 1Hz (32768 / ANT_CHANNEL_HZ);
#define ANT_TX_POWER			3			// dBm


#define ANT_TX_SYNC 0xA4
#define ANT_MSG_RESET 0x4A
#define ANT_MSG_SET_NETWORK_KEY 0x46
#define ANT_MSG_ASSIGN_CHANNEL 0x42
#define ANT_MSG_SET_RF_FREQUENCY 0x45
#define ANT_MSG_SET_CHANNEL_PERIOD 0x43
#define ANT_MSG_SET_TRANSMIT_POWER 0x47
#define ANT_MSG_OPEN_CHANNEL 0x4B
#define ANT_MSG_SEND_BROADCAST 0x4E

#define DUMMY_DATA 0x00
#define DUMMY_SIZE 2

#define FALSE 0
#define TRUE 1

int ANT_Reset()
{
  unsigned char buf[5+DUMMY_SIZE];
  
  char chk = 0 ;
  
  memset(buf, 0x00, sizeof(buf)) ;
  
  buf[0] = 0xa4 ; //ANT_TX_SYNC;
  buf[1] = 0x01 ;
  buf[2] = 0x4a ; //ANT_MSG_RESET ;
  buf[3] = 0x00 ;
  
  chk = buf[0] ^ buf[1] ^ buf[2] ^ buf[3] ;
  buf[4] = chk ;
  
  buf[5] = DUMMY_DATA ;
  buf[6] = DUMMY_DATA ;
  
  Serial.write(buf, 7) ;
  
  return 0;
}

int ANT_WAIT_STARTUP_MESSAGE()
{
  delay(1000) ;
  return 0;
}

int ANT_SET_NETWORK_KEY()
{
  unsigned char buf[13+DUMMY_SIZE];
  
  char chk = 0 ;
  
  memset(buf, 0x00, sizeof(buf)) ;
  
  buf[0] = ANT_TX_SYNC;
  buf[1] = 9 ;
  buf[2] = ANT_MSG_SET_NETWORK_KEY ;
  buf[3] = ANT_NETWORK_NUMBER;
  buf[4] = ANTNetworkKey[0];
  buf[5] = ANTNetworkKey[1];
  buf[6] = ANTNetworkKey[2];
  buf[7] = ANTNetworkKey[3];
  buf[8] = ANTNetworkKey[4];
  buf[9] = ANTNetworkKey[5];
  buf[10] = ANTNetworkKey[6];
  buf[11] = ANTNetworkKey[7];
  
  chk = buf[0] ^ buf[1] ^ buf[2] ^ buf[3] ^ buf[4] ^ buf[5] ^ buf[6] ^ buf[7] ^ buf[8] ^ buf[9] ^ buf[10] ^ buf[11];
  buf[12] = chk ;
  
  buf[13] = DUMMY_DATA ;
  buf[14] = DUMMY_DATA ;
  
  Serial.write(buf, 15) ;
  return 0;
}

int ANT_WAIT_COMMAND_RESPONCE(int flag)
{
  while (Serial.available()) {
    Serial.read() ;
    if (flag) {
      delay(WAIT_DELAYMS) ;
    }
  }
  return 0;  
}

int ANT_ASSIGN_CHANNEL()
{
  unsigned char ANTCommand[7+DUMMY_SIZE] ;
  
  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;
  
  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 3;						// Length
  ANTCommand[2] = ANT_MSG_ASSIGN_CHANNEL;
  ANTCommand[3] = ANT_CHANNEL_NUMBER;		// Channel Number
  ANTCommand[4] = ANT_CHANNEL_TYPE;		// Channel Type
  ANTCommand[5] = ANT_NETWORK_NUMBER;		// Network Number
  
  ANTCommand[6] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ^ \
                  ANTCommand[4] ^ \
                  ANTCommand[5] ;
  ANTCommand[7] = DUMMY_DATA ;
  ANTCommand[8] = DUMMY_DATA ;
  
  Serial.write(ANTCommand, 9) ;
  
  return 0;
}

int ANT_SET_CHANNEL_ID()
{
  unsigned char ANTCommand[9+DUMMY_SIZE] ;
  
  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;
  
  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 5;						// Length
  ANTCommand[2] = 0x51;
  ANTCommand[3] = ANT_CHANNEL_NUMBER;
  ANTCommand[4] = ANT_DEVICE_NUMBER & 0xFF;
  ANTCommand[5] = (ANT_DEVICE_NUMBER >> 8) & 0xFF;
  ANTCommand[6] = (ANT_DEVICE_TYPE_PAIRING | ANT_DEVICE_TYPE_ID);
  ANTCommand[7] = ANT_TRANSACTION_TYPE;
  ANTCommand[8] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ^ \
                  ANTCommand[4] ^ \
                  ANTCommand[5] ^ \
                  ANTCommand[6] ^ \
                  ANTCommand[7] ;
  ANTCommand[9] = DUMMY_DATA ;
  ANTCommand[10] = DUMMY_DATA ;
  
  Serial.write(ANTCommand,11) ;
  return 0;
}

int ANT_SET_RF_FREQUENCY()
{
  unsigned char ANTCommand[6+DUMMY_SIZE] ;
  
  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;

  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 2;
  ANTCommand[2] = ANT_MSG_SET_RF_FREQUENCY;
  ANTCommand[3] = ANT_CHANNEL_NUMBER;
  ANTCommand[4] = ANT_RF_FREQUENCY;
  ANTCommand[5] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ^ \
                  ANTCommand[4] ;
  ANTCommand[6] = DUMMY_DATA ;
  ANTCommand[7] = DUMMY_DATA ;
  
  Serial.write(ANTCommand,8) ;
  return 0;
}

int ANT_SET_CHANNEL_PERIOD()
{
  unsigned char ANTCommand[7+DUMMY_SIZE] ;
  
  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;

  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 3;
  ANTCommand[2] = ANT_MSG_SET_CHANNEL_PERIOD;
  ANTCommand[3] = ANT_CHANNEL_NUMBER;
  ANTCommand[4] = (ANT_CHANNEL_PERIOD >> 8);
  ANTCommand[5] = (ANT_CHANNEL_PERIOD & 0xFF);

  ANTCommand[6] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ^ \
                  ANTCommand[4] ^ \
                  ANTCommand[5] ;
  ANTCommand[7] = DUMMY_DATA ;
  ANTCommand[8] = DUMMY_DATA ;
  
  Serial.write(ANTCommand, 9) ;
  return 0;
}

int ANT_SET_TRANSMIT_POWER()
{
  unsigned char ANTCommand[7+DUMMY_SIZE] ;
  
  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;

  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 2;
  ANTCommand[2] = ANT_MSG_SET_TRANSMIT_POWER;
  ANTCommand[3] = 0;
  ANTCommand[4] = ANT_TX_POWER;

  ANTCommand[5] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ^ \
                  ANTCommand[4] ;
  ANTCommand[6] = DUMMY_DATA ;
  ANTCommand[7] = DUMMY_DATA ;
  
  Serial.write(ANTCommand, 8) ;
  return 0;
}

int ANT_OPEN_CHANNEL()
{
  unsigned char ANTCommand[5+DUMMY_SIZE] ;
  
  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;

  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 1;
  ANTCommand[2] = ANT_MSG_OPEN_CHANNEL;
  ANTCommand[3] = ANT_CHANNEL_NUMBER;

  ANTCommand[4] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ;
  ANTCommand[5] = DUMMY_DATA ;
  ANTCommand[6] = DUMMY_DATA ;
  
  Serial.write(ANTCommand,7) ;
  return 0;
}

int ANT_SEND_BROADCAST()
{
  unsigned char ANTCommand[13+DUMMY_SIZE] ;

  memset(ANTCommand, 0x00, sizeof(ANTCommand)) ;
  
  ANTCommand[0] = ANT_TX_SYNC;
  ANTCommand[1] = 9;
  ANTCommand[2] = ANT_MSG_SEND_BROADCAST;	// Broadcast Data
  ANTCommand[3] = ANT_CHANNEL_NUMBER;
  ANTCommand[4] = 0xFF ;
#ifdef USE_MOISENSOR
  int sensorvalue = 0 ;
  sensorvalue = analogRead(A0) ;

  ANTCommand[5] = (sensorvalue >> 8) & 0xff ;
  ANTCommand[6] = sensorvalue & 0xff ;
#endif
ANTCommand[12] = ANTCommand[0] ^ \
                  ANTCommand[1] ^ \
                  ANTCommand[2] ^ \
                  ANTCommand[3] ^ \
                  ANTCommand[4] ^ \
                  ANTCommand[5] ^ \
                  ANTCommand[6] ^ \
                  ANTCommand[7] ^ \
                  ANTCommand[8] ^ \
                  ANTCommand[9] ^ \
                  ANTCommand[10] ^ \
                  ANTCommand[11] ^ \
                  ANTCommand[12] ;                 
  ANTCommand[13] = DUMMY_DATA ;
  ANTCommand[14] = DUMMY_DATA ;
  Serial.write(ANTCommand, 15) ;
  return 0;
}

#define STOP for(;;);
#define WAITMS 100

void setup() {
  Serial.begin(9600) ;
  
  pinMode(GREEN_LED, OUTPUT) ;
  digitalWrite(GREEN_LED, LOW) ;
  
  ANT_Reset() ;
  delay(1000) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
  
  ANT_SET_NETWORK_KEY() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
  
  ANT_ASSIGN_CHANNEL() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
  
  ANT_SET_CHANNEL_ID() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
  
  ANT_SET_RF_FREQUENCY() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
   
  ANT_SET_CHANNEL_PERIOD() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
  
  ANT_SET_TRANSMIT_POWER() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
  
  ANT_OPEN_CHANNEL() ;
  delay(WAITMS) ;
  ANT_WAIT_COMMAND_RESPONCE(FALSE) ;
}

void loop() {
  digitalWrite(GREEN_LED, HIGH) ;
  ANT_SEND_BROADCAST() ;
  digitalWrite(GREEN_LED, LOW) ;
  delay(500) ;
}


