//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CPort"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    timerCounter = 0;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FileOpenClick(TObject *Sender)
{
    if(OpenDialog1->Execute())
    {
        inputFile = fopen (OpenDialog1->FileName.c_str (), "r");
        if (inputFile == NULL)
        {
            Application->MessageBox("Could not open File", NULL, MB_OK);
            return;
        }
        else
            Timer1->Enabled = true;
    }


}
//---------------------------------------------------------------------------

void __fastcall TForm1::FileExitClick(TObject *Sender)
{
    exit(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
     OpenDialog1->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    ProcGPSData();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ProcGPSData()
{
    char temp[160];
    char gmttime[10];
    char localtime[10];
    char debug[100];
    bool transmitSentence;
    int timerCounterMax;
    timerCounter++;
    if (PlaybackSpeedSelector->Position == 1 ||
        PlaybackSpeedSelector->Position == 2)
        timerCounterMax = 1;
    else if (PlaybackSpeedSelector->Position == 3)
        timerCounterMax = 2;
    else if (PlaybackSpeedSelector->Position == 4)
        timerCounterMax = 4;
    else if (PlaybackSpeedSelector->Position == 5)
        timerCounterMax = 8;
    else if (PlaybackSpeedSelector->Position == 6)
        timerCounterMax = 16;
    else if (PlaybackSpeedSelector->Position == 7)
        timerCounterMax = 32;

    if (timerCounter >= timerCounterMax)
    {
        timerCounter = 0;
        transmitSentence = 1;
    }
    else
        transmitSentence = 0;
        
    /*if (ComPort-> Connected)
    {
        //char hithere[5];
        //itoa(temp[0], hithere, 16);
        //testLabel->Caption = AnsiString(hithere);
        itoa(timerCounter, debug, 10);
        ComPort->WriteStr(debug);
        ComPort->WriteStr(" ");
        itoa(PlaybackSpeedSelector->Position, debug, 10);
        ComPort->WriteStr(debug);
        ComPort->WriteStr(" ");
        itoa(timerCounterMax, debug, 10);
        ComPort->WriteStr(debug);
        ComPort->WriteStr("\r\n");
    } */
    if (feof(inputFile))
        return;
    fgets (temp, 160, inputFile);

    fix_newline (temp);
    while (!contains(temp, "$GPRMC"))
    {
        if (feof(inputFile))
            return;
        fgets (temp, 160, inputFile);
        fix_newline (temp);
        GPRMCDataOutput->Text = AnsiString(temp);
    }
    Speed->Text = AnsiString(GPS_get_word_float (7, temp)*1.852) + "km/h";
    fix_newline (temp);
    while (!contains(temp, "$GPGGA"))
    {
        if (feof(inputFile))
            return;
        fgets (temp, 160, inputFile);
        fix_newline (temp);
        GPGGADataOutput->Text = AnsiString(temp);
    }
    GPS_get_word_time (gmttime, 1, temp);
    if (transmitSentence && ComPort-> Connected && gmttime[0] != 0x00)
    {
        //char hithere[5];
        //itoa(temp[0], hithere, 16);
        //testLabel->Caption = AnsiString(hithere);
        ComPort->WriteStr(temp);
        //ComPort->WriteStr("\r");
    }
    GPS_get_word_time (gmttime, 1, temp);
    GMTTimeData->Text = AnsiString(gmttime);
    conv_GMT_to_local (gmttime, localtime);
    LocalTimeData->Text = AnsiString(localtime);
    SatsInView->Text = AnsiString(GPS_get_word_int (7, temp));
    Altitude->Text = AnsiString(GPS_get_word_float (9, temp)) + "m";

}
//---------------------------------------------------------------------------
float __fastcall TForm1::GPS_get_word_float (int index, char *sentence)
{
    int i, j, wordIndex = 0;
    char temp[30];
    for (i=0; i < lengthOf(sentence); i++)
    {
        if (sentence[i] == ',')
            wordIndex++;
        if (wordIndex >= index)
            break;
    }
    if (sentence[i+1] == ',')
        return 0;
    for (j=0; j<30 && i<lengthOf(sentence); j++)
    {
        i++;
        temp[j] = sentence[i];
        if (sentence[i+1] == ',')
            break;
    }
    temp[j+1] = NULL;
    return atof(temp);
}
//---------------------------------------------------------------------------
int __fastcall TForm1::GPS_get_word_int (int index, char *sentence)
{
    int i, j, wordIndex = 0;
    char temp[30];
    for (i=0; i < lengthOf(sentence); i++)
    {
        if (sentence[i] == ',')
            wordIndex++;
        if (wordIndex >= index)
            break;
    }
    if (sentence[i+1] == ',')
        return 0;
    for (j=0; j<30 && i<lengthOf(sentence); j++)
    {
        i++;
        temp[j] = sentence[i];
        if (sentence[i+1] == ',')
            break;
    }
    temp[j+1] = NULL;
    return atoi(temp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::fix_newline (char *temp)
{
    int i=0;
    while (1)
    {
        if (temp[i++] == 0x0a)
            break;
    }
    temp[i] = temp[i-1];
    temp[i-1] = 0x0d;
    temp[i+1] = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::conv_GMT_to_local (char *gmttime, char *localtime)
{
    char temp[3];
    char hour;
    int i;
    if (gmttime[0] == 0x00)
    {
        localtime[0] = 0x00;
        return;
    }
    for (i = 0; i<2; i++)
        temp[i] = gmttime[i];
    hour = atoi (temp);
    if (hour - 5 < 0)
        hour = hour + 24 - 5;
    else
        hour = hour - 5;
    itoa (hour, temp, 10);
    if (hour >= 10)
    {
        localtime[0] = temp[0];
        localtime[1] = temp[1];
    }
    else
    {
        localtime[0] = '0';
        localtime[1] = temp[0];
    }
    for (i=2; gmttime[i] != 0x00; i++)
        localtime[i] = gmttime[i];
    localtime[i] = gmttime[i];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GPS_get_word_time (char *time, int index, char *sentence)
{
    int current_word = 0;
    int i;
    for (i=0; i< lengthOf(sentence); i++)
    {
        if (sentence[i] == ',')
            current_word++;
        if (current_word == index)
            break;
    }
    int j = 0;
    if (((lengthOf(sentence) - i) < 8) || sentence[i+1] == ',')
        time[0] = NULL;
    else
    {
        i++;
        for (int k = i; k < i+6; k++)
        {
            time[j++] = sentence[k];
            if (j == 2 || j == 5)
            {
                time[j++] = ':';
            }
        }
    }
    time[j] = 0x00;
}
//---------------------------------------------------------------------------

bool __fastcall TForm1::contains (char *line, char* search)
{
    int i;
    for (i=0; line[i] != NULL; i++)
        if (!strncmp (&line[i], search, lengthOf (search)))
            return TRUE;
    return FALSE;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::lengthOf (char* line)
{
    int i = 0;
    for (i=0; line[i] != NULL; i++);
    return i;
}
//----------------------------------------------------------------------------

void __fastcall TForm1::PlaybackSpeedSelectorChange(TObject *Sender)
{
    if (PlaybackSpeedSelector->Position == 1)
    {
        PlaybackSpeed->Caption = "Playback Speed: 1X";
        Timer1->Interval = 2000;
    }
    else if (PlaybackSpeedSelector->Position == 2)
    {
        PlaybackSpeed->Caption = "Playback Speed: 2X";
        Timer1->Interval = 1000;
    }
    else if (PlaybackSpeedSelector->Position == 3)
    {
        PlaybackSpeed->Caption = "Playback Speed: 4X";
        Timer1->Interval = 500;
    }
    else if (PlaybackSpeedSelector->Position == 4)
    {
        PlaybackSpeed->Caption = "Playback Speed: 8X";
        Timer1->Interval = 250;
    }
    else if (PlaybackSpeedSelector->Position == 5)
    {
        PlaybackSpeed->Caption = "Playback Speed: 16X";
        Timer1->Interval = 125;
    }
    else if (PlaybackSpeedSelector->Position == 6)
    {
        PlaybackSpeed->Caption = "Playback Speed: 32X";
        Timer1->Interval = 63;
    }
    else if (PlaybackSpeedSelector->Position == 7)
    {
        PlaybackSpeed->Caption = "Playback Speed: 64X";
        Timer1->Interval = 31;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComPortMenuOffClick(TObject *Sender)
{
    ComPort->Connected = false;
    ComPortMenuCom1->Checked = false;
    ComPortMenuCom2->Checked = false;
    ComPortMenuCom3->Checked = false;
    ComPortMenuCom4->Checked = false;
    ComPortMenuOff->Checked = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComPortMenuCom1Click(TObject *Sender)
{
    ComPort->Connected = false;
    ComPort->Port = "COM1";
    ComPort->Connected = true;
    ComPortMenuCom1->Checked = true;
    ComPortMenuCom2->Checked = false;
    ComPortMenuCom3->Checked = false;
    ComPortMenuCom4->Checked = false;
    ComPortMenuOff->Checked = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComPortMenuCom2Click(TObject *Sender)
{
    ComPort->Connected = false;
    ComPort->Port = "COM2";
    ComPort->Connected = true;
    ComPortMenuCom1->Checked = false;
    ComPortMenuCom2->Checked = true;
    ComPortMenuCom3->Checked = false;
    ComPortMenuCom4->Checked = false;
    ComPortMenuOff->Checked = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComPortMenuCom3Click(TObject *Sender)
{
    ComPort->Connected = false;
    ComPort->Port = "COM3";
    ComPort->Connected = true;
    ComPortMenuCom1->Checked = false;
    ComPortMenuCom2->Checked = false;
    ComPortMenuCom3->Checked = true;
    ComPortMenuCom4->Checked = false;
    ComPortMenuOff->Checked = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComPortMenuCom4Click(TObject *Sender)
{
    ComPort->Connected = false;
    ComPort->Port = "COM4";
    ComPort->Connected = true;
    ComPortMenuCom1->Checked = false;
    ComPortMenuCom2->Checked = false;
    ComPortMenuCom3->Checked = false;
    ComPortMenuCom4->Checked = true;
    ComPortMenuOff->Checked = false;
}
//---------------------------------------------------------------------------


