/************

Acidblood module for running a robot via serial port.

  Rue_Mohr and icez

***********/


#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include "acidblood.h"
#include "acidfuncs.h"
#include "tracking.h"
#include "serial.h"
#include "serial.c"

#define AMAX  1500
#define AMIN  -1500
#define OK  0
#define ERR 1

serial_t * PORT;
int        angle;   // this is to keep people from winding up the cord :)

int robomod_robo1cmd(char *replyto, struct userlist *user, char *data);
int robomod_tellpage(char *replyto, struct userlist *user, char *data);

int module_init(void *module){

	// initialize a parallel port
	PORT = serial_Init("/dev/ttyS0", 4800);

	// configure commands
	addusrcommand(module, "bot1", robomod_robo1cmd, 99);   
    addusrcommand(module, "bot", robomod_robo1cmd, 99);      
	addusrcommand(module, "url", robomod_tellpage, 99);

	angle = 0;

	return(1);
}

int module_shutdown(void *module){

	// remove commands
	delusrcommand(module, "bot1");
	delusrcommand(module, "bot");
	delusrcommand(module, "url");

	//close ports
	serial_Destroy(PORT);

	return(1);
}

int robomod_tellpage(char *replyto, struct userlist *user, char *data){

	struct           socket_info *socket ;

	socket=user->userinfo->server->sinfo ;
	
	privmsg(socket,replyto, "http://eds.dyndns.org:81/~ircjunk/robots/newbot/ircbot.html \n");
	return(0);		
}



int robomod_robo1cmd(char *replyto, struct userlist *user, char *data){

	struct           socket_info *socket;
	char             cmd[16], packet[16];
	unsigned int     arg;
	int              stat;

	socket=user->userinfo->server->sinfo;
	// format should be "cmd #"

	if (data == NULL) {
		privmsg(socket,replyto, "usage bot1 [op cl sp ld fd bk lt rt] (00-99) \n");
		return(0);
	}

	data = strtok(data, " ");
	strncpy(cmd, data, 8);

	data = strtok(NULL, " ");
		
	if (data == NULL) {
		privmsg(socket,replyto, "You forgot the number!! \n");
		return(0);
	}
	
	arg = atoi(data);
	
	if (arg > 99) {
		privmsg(socket,replyto, "The maximum amount is 99, I made it 99 for you.\n");
		arg = 99;
	}
	
	stat = ERR;
	if (0) {
	// right turn
	} else if (strcmp(cmd, "rt") == 0) {
		if (angle < AMAX)  {
			snprintf(packet, 8, "ri %02d\n", arg); stat = OK;
			angle += arg;
		} else {
			privmsg(socket, replyto, "I'm tired of turning right, let's turn left. \n" );
		}
	// left turn
	} else if (strcmp(cmd, "lt") == 0) {
		if (angle > AMIN)  {
			snprintf(packet, 8, "le %02d\n", arg); stat = OK;
			angle -= arg;
		} else {
			privmsg(socket, replyto, "I'm tired of turning left, let's turn right. \n" );
		}	
	// open gripper
	} else if (strcmp(cmd, "op") == 0) {
		snprintf(packet, 8, "op %02d\n", arg); stat = OK;
	// close gripper
	} else if (strcmp(cmd, "cl") == 0) {
		snprintf(packet, 8, "cl %02d\n", arg); stat = OK;
	// led toggle
	} else if (strcmp(cmd, "ld") == 0) {
		snprintf(packet, 8, "ld %02d\n", arg); stat = OK;
	// speed set
	} else if (strcmp(cmd, "sp") == 0) {
		snprintf(packet, 8, "sp %02d\n", arg); stat = OK;
	// go forward
	} else if (strcmp(cmd, "fd") == 0) {
	   snprintf(packet, 8, "fo %02d\n", arg); stat = OK;
	// go back
	} else if (strcmp(cmd, "bk") == 0) {
		snprintf(packet, 8, "ba %02d\n", arg); stat = OK;
	// bad command
	} else {
		privmsg(socket, replyto, "Unknown command '%s'. Use op, cl, ld, sp, rt, lt, fd, or bk.\n", cmd );
	}
	
	// if it's good, send it
	if (stat == OK) {
		serial_WriteData(PORT, packet);
		privmsg(socket, replyto, "OK! \n");
	}
	
	return(0);
}



