/****************************************************************************/
/* Copyright 2013 MBARI.                                                    */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
#include <p24fxxxx.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys_defs.h"

#include "actions.h"
#include "errors.h"
#include "parser.h"
#include "serial.h"
#include "dig_io.h"
#include "rtcc.h"
#include "spi_io.h"
#include "sys_timer.h"

#define MAX_CHARS   80  /* maximum command line entry length */
static char msg_buff[64];
char cmd_buff[MAX_CHARS];

/****************************************************************************/
/*                               Root commands                              */
/****************************************************************************/
int actGetCmd(char* s)
{
    return prsParse(s, cmdsGet, ERR_NO_SUB_COMMAND);
}

int actSetCmd(char* s)
{
    return prsParse(s, cmdsSet, ERR_NO_SUB_COMMAND);
}

int actClrCmd(char* s)
{
    return prsParse(s, cmdsClr, ERR_NO_SUB_COMMAND);
}

int actHelloKittyCmd(char* s)
{
    serPutString(SER_CONSOLE, "MEOW\r\n");
    return ERR_SUCCESS;
}

/****************************************************************************/
/*                               Get commands                               */
/****************************************************************************/

int actGetDinCmd(char* s)
{
    int bit = atoi(s);
    
    if ( digGetInBit(bit) )
        sprintf(msg_buff, "BIT %d IS HI\r\n", bit);
    else
        sprintf(msg_buff, "BIT %d IS LO\r\n", bit);

    serPutString(SER_CONSOLE, msg_buff);

    return ERR_SUCCESS;
}

int actGetDoutCmd(char* s)
{
    int bit = atoi(s);
    
    if ( digGetOutBit(bit) )
        sprintf(msg_buff, "BIT %d IS HI\r\n", bit);
    else
        sprintf(msg_buff, "BIT %d IS LO\r\n", bit);

    serPutString(SER_CONSOLE, msg_buff);


    return ERR_SUCCESS;
}

int actGetTimeCmd(char* s)
{
    DateTime dt;

    rtcRead(&dt);
    rtcDateToString(&dt, msg_buff);

    serPutString(SER_CONSOLE, "DATE: ");
    serPutString(SER_CONSOLE, msg_buff);
    serPutString(SER_CONSOLE, "\r\n");

    rtcTimeToString(&dt, msg_buff);

    serPutString(SER_CONSOLE, "TIME: ");
    serPutString(SER_CONSOLE, msg_buff);
    serPutString(SER_CONSOLE, "\r\n");
    
    return ERR_SUCCESS;
}



/****************************************************************************/
/*                               Set commands                               */
/****************************************************************************/
int actSetDoutCmd(char* s)
{
    int bit = atoi(s);
    
    digSetOutBit(bit, 1);

    return ERR_SUCCESS;
}

int actSetTimeCmd(char* s)
{
    DateTime dt;
    IntDateTime idt;

    if ( strlen(s) == 0 )
    {
        serPutString(SER_CONSOLE, "TIME SET FORMAT: hh:mm:ss:wd:DD:MM:YY\r\n");
        serPutString(SER_CONSOLE, "wd(week day): 0 = Sunday, 1 = Monday, etc.\r\n");
        return ERR_SUCCESS; 
    }
    
    sscanf(s, "%d:%d:%d:%d:%d:%d:%d", &idt.hours, &idt.minutes, 
           &idt.seconds, &idt.day_of_week, &idt.day, &idt.month, &idt.year);

    dt.hours = idt.hours;
    dt.minutes = idt.minutes;
    dt.seconds = idt.seconds;
    dt.day_of_week = idt.day_of_week;
    dt.day = idt.day;
    dt.month = idt.month;
    dt.year = idt.year;
    dt.half_second = 0;

    if ( !rtcSet(&dt) )
        serPutString(SER_CONSOLE, "ERR: FAILED TO SET RTC\r\n");
    else
	serPutString(SER_CONSOLE, "rtcSet returns SUCCESS\r\n");

    return ERR_SUCCESS;
}

int actSetSerial1Cmd(char* s)
{
    serPutString(SER_MODBUS1, s);
    serPutString(SER_MODBUS1, "\r\n");
    return(ERR_SUCCESS);
}

int actSetSerial2Cmd(char* s)
{
    serPutString(SER_MODBUS2, s);
    serPutString(SER_MODBUS2, "\r\n");
    return(ERR_SUCCESS);
}


/****************************************************************************/
/*                              Clear commands                              */
/****************************************************************************/
int actClrDoutCmd(char* s)
{
    int bit = atoi(s);
    
    digSetOutBit(bit, 0);

    return ERR_SUCCESS;
}
		



/****************************************************************************/
/*                              SN Board commands                           */
/****************************************************************************/
int actGetRelayStateCmd(char* s)
{
    int bit = atoi(s);
    int state = digGetInBit(bit-1);

    if ( bit >0 && bit <5)
    {
        if ( state == 1 )
        {
            sprintf(msg_buff, "Relay %d IS ON\r\n", bit);
            serPutString(SER_CONSOLE, msg_buff);
        }
        else
        {
            sprintf(msg_buff, "Relay %d is OFF\r\n", bit);
            serPutString(SER_CONSOLE, msg_buff);
        }
    }
        
    else
    {
        sprintf(msg_buff, "No such relay\r\n");
        serPutString(SER_CONSOLE, msg_buff);
    }

    return ERR_SUCCESS;
}

int actSetRelayOnCmd(char* s)
{
    int bit = atoi(s);
    int delay = 0;

    if ( bit > 0 && bit <5 )
    {
        if (bit == 4)
        {
            digSetOutBit(bit, 0);
            for (delay=0; delay<=4000; delay++);
            digSetOutBit(bit, 1);

            sprintf(msg_buff,"Turning on relay %d\r\n", bit);
            serPutString(SER_CONSOLE, msg_buff);

        }
        else
        {
            digSetOutBit(bit, 1);
            for (delay=0; delay<=4000; delay++);
            digSetOutBit(bit, 0);

            sprintf(msg_buff,"Turning on relay %d\r\n", bit);
            serPutString(SER_CONSOLE, msg_buff);
        }
    }
    else
    {
        sprintf(msg_buff,"No such relay\r\n");
        serPutString(SER_CONSOLE, msg_buff);
    }

    return ERR_SUCCESS;
}

int actSetRelayOffCmd(char* s)
{
    int bit = atoi(s);
    int delay = 0;

    if ( bit > 0 && bit <5 )
    {
        if ( bit == 4)
        {
            digSetOutBit(bit+4, 0);
            for (delay=0; delay<=4000; delay++);
            digSetOutBit(bit+4, 1);

            sprintf(msg_buff,"Turning off relay %d\r\n", bit);
            serPutString(SER_CONSOLE, msg_buff);
        }
        else
        {
            digSetOutBit(bit+4, 1);
            for (delay=0; delay<=4000; delay++);
            digSetOutBit(bit+4, 0);
    
            sprintf(msg_buff,"Turning off relay %d\r\n", bit);
            serPutString(SER_CONSOLE, msg_buff);
        }
    }
    else
    {
        sprintf(msg_buff,"No such relay\r\n");
        serPutString(SER_CONSOLE, msg_buff);
    }

    return ERR_SUCCESS;
}


int actGetSerial1Cmd(char* s)
{
    int	chrs = 0;
    unsigned char c;

    while (serGetByte(SER_MODBUS1, &c))
    {
	chrs++;
	serPutByte(SER_CONSOLE, c);
    }

    if (chrs == 0)
	serPutString(SER_CONSOLE, "\r\nNo input chars on serial #1");

    serPutString(SER_CONSOLE, "\r\n");
    return(ERR_SUCCESS);
}

int actGetSerial2Cmd(char* s)
{
    int	chrs = 0;
    unsigned char c;
    
    while (serGetByte(SER_MODBUS2, &c))
    {
	chrs++;
	serPutByte(SER_CONSOLE, c);
    }

    if (chrs == 0)
	serPutString(SER_CONSOLE, "\r\nNo input chars on serial #2");

    serPutString(SER_CONSOLE, "\r\n");
    return(ERR_SUCCESS);
}
