#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>

#define RELAY_BUF_LEN (8)
#define RELAY_STATUS ((unsigned char)0x00)
#define RELAY_OPEN   ((unsigned char)0x01)
#define RELAY_CLOSE  ((unsigned char)0x02)
#define RELAY_TOGGLE ((unsigned char)0x03)
#define RELAY_MOMENT ((unsigned char)0x04)
#define RELAY_INTLK  ((unsigned char)0x05)

#define CMD_CHAN   ((unsigned char)5)
#define CMD_CODE   ((unsigned char)6)
#define CMD_CHKSUM ((unsigned char)7)

static unsigned char calc_checksum(unsigned char *buf)
{
unsigned char val = 0;

    val = buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6];
    return val;
}

void relayCmd(unsigned char *buf, unsigned char chan, unsigned char cmd)
{
    buf[0]=0x55; buf[1]=0x56; buf[2]=0x00; buf[3]=0x00; buf[4]=0x00;
    buf[CMD_CHAN] = chan;
    buf[CMD_CODE] = cmd;
    buf[CMD_CHKSUM] = calc_checksum(buf);
}

main()
{
int fd;
int i, c;
unsigned char cmdBuf[RELAY_BUF_LEN], reply[RELAY_BUF_LEN];
struct termios my_termios;
    
    fd = open("/dev/ttyS14", O_RDWR);

    //set up serial port with receiver enable and modem control lines disabled
    tcgetattr(fd, &my_termios);
    my_termios.c_cflag |= CREAD | CLOCAL;
    //set up a reasonable timeout for reads of replies
    my_termios.c_cc[VTIME] = 10;
    if (tcsetattr(fd, TCSANOW, &my_termios)<0) perror("tcsetattr");
    
    for (i=0; i<8; i++) {
      relayCmd(cmdBuf, i+1, RELAY_CLOSE);
      write(fd, cmdBuf, RELAY_BUF_LEN);
      read(fd, reply, RELAY_BUF_LEN);
      printf("reply: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
	reply[0], reply[1], reply[2], reply[3], reply[4], reply[5],
   	reply[6], reply[7]);
      sleep(5);
      relayCmd(cmdBuf, i+1, RELAY_MOMENT);
      write(fd, cmdBuf, RELAY_BUF_LEN);
      read(fd, reply, 8);
      printf("reply: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
        reply[0], reply[1], reply[2], reply[3], reply[4], reply[5],
        reply[6], reply[7]);
      sleep(1);
    }
}
 
