/*
 * Kanta SMS
 * Author: Davide Cantaluppi <kanta@kdev.it>
 */
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#define TX_BUF		400
#define RX_BUF	 	 50
#define TEXT_BUF	370
#define PHONE_BUF	 20

#define K_DEV		"/dev/ttyACM0"
//#define K_DEV		"/dev/null"
// Global variable
int smsdev;

int main(int argc, char *argv[])
{
 int ret;
 int sms_ptr = 0;
 unsigned char tx_String[TX_BUF];
 unsigned char rx_String[RX_BUF];
 unsigned char text_string[TEXT_BUF];
 unsigned char phone_num_string[PHONE_BUF];
 unsigned char sms_num[20];
 char *nptr;
 char az[1];

 smsdev = open(K_DEV, O_RDWR|O_NONBLOCK);
 if(smsdev == -1)
		{
		 perror(K_DEV);
		 exit(errno);
		}

 fprintf(stdout, "smsdev Opened successfully!\n");
 // Need Ioctl ?
 // ioctl(smsdev, ISR_HW_TYPE, &hw);

 ret = lseek(smsdev, 0, SEEK_SET);

 if(argc != 3)	{
		 close(smsdev);
		 fprintf(stdout, "too few argument to main!\n");
		 return -1;
		}

// fprintf(stdout, "argc: %d\n",argc);
// fprintf(stdout, "argv1: %s\n",argv[1]);
// fprintf(stdout, "argv2: %s\n",argv[2]);

 // ********** Inizio sequenza invio comandi AT
 strcpy(tx_String, "at+cpms=\"MT\"\r\n");
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 read(smsdev, &rx_String[0], 50);
 fprintf(stdout, "received: %s\n",rx_String);

 strcpy(tx_String, "at+cscs=\"ASCII\"\r\n");
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 read(smsdev, &rx_String[0], 50);
 fprintf(stdout, "received: %s\n",rx_String);

 strcpy(tx_String, "at+cmgw=\"");
 strcat(tx_String, argv[1]);
 strcat(tx_String, "\"\r\n");
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 sleep(1);
// read(smsdev, &rx_String[0], 50);
 fprintf(stdout, "wait for prompt-received: %s\n",rx_String);

 strcpy(tx_String, argv[2]);
 strcat(tx_String, "\r\n");
 //sleep(10);
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 sleep(1);
// read(smsdev, &rx_String[0], 50);

// strcpy(tx_String, "<ctrl-z>");
// strcpy(tx_String, "^Z");
// strcpy(tx_String, "\26");
// az[0] = 0x1A;
 strcpy(tx_String, "\x1A");
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 sleep(1);
 read(smsdev, &rx_String[0], 50);
// ONLY FOR RECEIVE TEST
// strcpy(rx_String, "+CMGW: 6969\r\nOK\r\n");

 fprintf(stdout, "received: %s\n",rx_String);

 //parsing x ottenere sms_ptr
 nptr = strchr(rx_String, ':');
 if(nptr != NULL)
	{
	// fprintf(stdout, "strchr: %s\n",nptr);
	 strncpy(sms_num, nptr+1, 5);
	// fprintf(stdout, "sms num=%s=\n",sms_num);
	 sms_ptr = atoi(sms_num);
	}
 else	 fprintf(stdout, "parsing error on +CMGW:xxx!\n");

 sprintf(tx_String, "at+cmss=%d\r\n",sms_ptr);
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 read(smsdev, &rx_String[0], 50);
 fprintf(stdout, "received: %s\n",rx_String);
 sleep (10);
 sprintf(tx_String, "at+cmgd=%d\r\n",sms_ptr);
 write(smsdev, tx_String, strlen(tx_String));
 fprintf(stdout, "sended: %s\n",tx_String);
 read(smsdev, &rx_String[0], 50);
 fprintf(stdout, "received: %s\n",rx_String);

 // ********** Fine sequenza invio comandi AT

 close(smsdev);
 fprintf(stdout, "smsdev Closed successfully!\n");
 return 0;
}


