#include <time.h>
#include <sys/time.h>
#include <ncurses.h>
#include <panel.h>

#include "aprstlm.h"

void pcsat_a_display()
{

   extern WINDOW *raw_win;
   extern WINDOW *tlm_win;
   extern WINDOW *tlmb_win;
   extern WINDOW *cmd_win;
   extern WINDOW *arm_win;

   extern WINDOW *tlmdateutc_win;
   extern WINDOW *tlmdatelcl_win;
   extern WINDOW *tlmdatemet_win;

   extern int tlmframe;
   extern char rawtlmno[3];
   extern int rawtlmint[4][5];
   extern char rawcmdbits[8];
   extern char sbits[2];
   extern char rawarmbit;
   extern float tlmval[4][5];
   extern float ref5v;
  
   extern struct tm tmframe[4][2];
   extern char rawfrnum[2];
   extern char *tzname[2];
   extern float birdorbit;
   extern long framedays[4];                   /* Frame Received Days*/
   extern long framehours[4];                  /* Frame Received Hours */
   extern long framemins[4];                   /* Frame Received Mins */
   extern long framesecs[4];                   /* Frame Received Seconds */

   extern int anytlmrx;
   extern int numcmdstr;

   extern int preden;

   int k;

   
   /* Handle Raw Window First, its easy */
    mvwprintw(raw_win,3+tlmframe,10,"%c%c%c   %3d   %3d   %3d   %3d   %3d   %c%c%c%c%c%c%c%c   %c%c    %c",rawtlmno[0],rawtlmno[1],rawtlmno[2],rawtlmint[tlmframe][0],rawtlmint[tlmframe][1],rawtlmint[tlmframe][2],rawtlmint[tlmframe][3],rawtlmint[tlmframe][4],rawcmdbits[0],rawcmdbits[1],rawcmdbits[2],rawcmdbits[3],rawcmdbits[4],rawcmdbits[5],rawcmdbits[6],rawcmdbits[7],sbits[0],sbits[1],rawarmbit);

   /* Handle Each Frame */
   switch (tlmframe)
   {
      case 0:
         mvwprintw(tlmb_win,2,43,"%4.0f",tlmval[0][0]);
         mvwprintw(tlmb_win,4,43,"%4.0f",tlmval[0][1]);
         mvwprintw(tlmb_win,3,43,"%4.0f",tlmval[0][2]);
         mvwprintw(tlmb_win,2,70,"%4.0f",tlmval[0][3]);
         break;
      case 1:
         mvwprintw(tlm_win,3,16,"%2.2f",tlmval[1][0]);
         mvwprintw(tlm_win,5,16,"%2.2f",tlmval[1][1]);
         mvwprintw(tlm_win,5,43,"%2.2f",tlmval[1][2]);
         mvwprintw(tlm_win,4,16,"%2.2f",tlmval[1][3]);
         break;
      case 2:
         mvwprintw(tlm_win,2,16,"%2.2f",tlmval[2][0]);
         mvwprintw(tlm_win,2,70,"%2.2f",tlmval[2][1]);
         mvwprintw(tlmb_win,3,70,"%4.0f",tlmval[2][2]);
         mvwprintw(tlmb_win,5,43,"%4.0f",tlmval[2][3]);
         break;
      case 3:
         mvwprintw(tlmb_win,2,17,"%2.2f",tlmval[3][0]);
         mvwprintw(tlmb_win,3,17,"%2.2f",tlmval[3][1]);
         mvwprintw(tlmb_win,5,71,"%2.2f",tlmval[3][2]);
         mvwprintw(tlm_win,5,71,"%2.2f",tlmval[3][2]);
         mvwprintw(tlmb_win,6,18,"%1.2f",tlmval[3][3]);
         break;

   }

   /* Handle the 8 CMD Bits */
   if (anytlmrx==1)
   {
      for (k=0; k<=(numcmdstr/2); k++)
      {
         if (rawcmdbits[k]=='0')
         {
             mvwchgat(cmd_win,2+k,2,CMD_STR_LEN,A_REVERSE,COLOUR_NOMINAL,NULL);
         }
         else
         {
            mvwchgat(cmd_win,2+k,2,CMD_STR_LEN,A_NORMAL,COLOUR_NOMINAL,NULL);
         }
         if (rawcmdbits[k+4]=='0')
         {
            mvwchgat(cmd_win,2+k,22,CMD_STR_LEN,A_REVERSE,COLOUR_NOMINAL,NULL);
         }
         else
         {
            mvwchgat(cmd_win,2+k,22,CMD_STR_LEN,A_NORMAL,COLOUR_NOMINAL,NULL);
         }
      /* Now we can handle the iso-batt and iso-tx bits */
      }
      if (sbits[0]='0')
      {
         mvwchgat(arm_win,2,19,8,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(arm_win,2,19,8,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      if (sbits[1]='0')
      {
         mvwchgat(arm_win,2,31,6,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(arm_win,2,31,6,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      /* and now the 5vref figure */
      mvwprintw(arm_win,2,9,"%1.2f",ref5v);
   }

   /* Now Handle The TLM RX Date Window - Just stolen from pcsat2 */

    mvwprintw(tlmdateutc_win,tlmframe+2,2,"A-%c%c T#%c%c%c %4d/%02d/%02d %02d:%02d:%02d UTC",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(tmframe[tlmframe][0].tm_year+1900),(tmframe[tlmframe][0].tm_mon+1),tmframe[tlmframe][0].tm_mday,tmframe[tlmframe][0].tm_hour,tmframe[tlmframe][0].tm_min,tmframe[tlmframe][0].tm_sec);
     mvwprintw(tlmdatelcl_win,tlmframe+2,2,"A-%c%c T#%c%c%c %4d/%02d/%02d %02d:%02d:%02d %s",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(tmframe[tlmframe][1].tm_year+1900),(tmframe[tlmframe][1].tm_mon+1),tmframe[tlmframe][1].tm_mday,tmframe[tlmframe][1].tm_hour,tmframe[tlmframe][1].tm_min,tmframe[tlmframe][1].tm_sec,tzname[0]);

    if (preden==1)
    {
       mvwprintw(tlmdatemet_win,tlmframe+2,2,"A-%c%c T#%c%c%c %05d/%04d %02d:%02d:%02d MET",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(int)birdorbit,(int)framedays[tlmframe],(int)framehours[tlmframe],(int)framemins[tlmframe],(int)framesecs[tlmframe]);
    }
    else
    {
      mvwprintw(tlmdatemet_win,tlmframe+2,2,"A-%c%c T#%c%c%c -----/%04d %02d:%02d:%02d MET",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(int)framedays[tlmframe],(int)framehours[tlmframe],(int)framemins[tlmframe],(int)framesecs[tlmframe]);
     }
}

void pcsat_b_display()
{
   extern WINDOW *rawb_win;
   extern WINDOW *tlm_win;
   extern WINDOW *tlmb_win;
   extern WINDOW *cmd_win;
   extern WINDOW *arm_win;

   extern WINDOW *tlmdateutcb_win;
   extern WINDOW *tlmdatelclb_win;
   extern WINDOW *tlmdatemetb_win;

   extern int tlmframe;
   extern char rawtlmno[3];
   extern int rawtlmint[4][5];
   extern char rawcmdbits[8];
   extern char sbits[2];
   extern char rawarmbit;
   extern float tlmval[4][5];
   extern float ref5v;

   extern struct tm tmframe[4][2];
   extern char rawfrnum[2];
   extern char *tzname[2];
   extern float birdorbit;
   extern long framedays[4];                   /* Frame Received Days*/
   extern long framehours[4];                  /* Frame Received Hours */
   extern long framemins[4];                   /* Frame Received Mins */
   extern long framesecs[4];                   /* Frame Received Seconds */

   extern int anytlmrx;
   extern int numcmdstr;

   extern struct tm tmframeb[4][2];
   extern long framedaysb[4];                   /* Frame Received Days*/
   extern long framehoursb[4];                  /* Frame Received Hours */
   extern long frameminsb[4];                   /* Frame Received Mins */
   extern long framesecsb[4];                   /* Frame Received Seconds */

   extern int preden;

   int k;

   /* Handle Raw Window First, its easy */
    mvwprintw(rawb_win,3+tlmframe,10,"%c%c%c   %3d   %3d   %3d   %3d   %3d   %c%c%c%c%c%c%c%c   %c%c    %c",rawtlmno[0],rawtlmno[1],rawtlmno[2],rawtlmint[tlmframe][0],rawtlmint[tlmframe][1],rawtlmint[tlmframe][2],rawtlmint[tlmframe][3],rawtlmint[tlmframe][4],rawcmdbits[0],rawcmdbits[1],rawcmdbits[2],rawcmdbits[3],rawcmdbits[4],rawcmdbits[5],rawcmdbits[6],rawcmdbits[7],sbits[0],sbits[1],rawarmbit);

   /* Handle Each Frame */

   switch (tlmframe)
   {
      case 0:
         mvwprintw(tlmb_win,2,70,"%4.0f",tlmval[0][0]);
         mvwprintw(tlmb_win,4,70,"%4.0f",tlmval[0][1]);
         mvwprintw(tlmb_win,3,70,"%4.0f",tlmval[0][2]);
         mvwprintw(tlmb_win,2,43,"%4.0f",tlmval[0][3]);
         break;
      case 1:
         mvwprintw(tlm_win,3,43,"%2.2f",tlmval[1][0]);
         mvwprintw(tlm_win,6,16,"%2.2f",tlmval[1][1]);
         mvwprintw(tlm_win,6,43,"%2.2f",tlmval[1][2]);
         mvwprintw(tlm_win,4,43,"%2.2f",tlmval[1][3]);
         break;
      case 2:
         mvwprintw(tlm_win,2,43,"%2.2f",tlmval[2][0]);
         mvwprintw(tlm_win,3,70,"%2.2f",tlmval[2][1]);
         mvwprintw(tlmb_win,3,43,"%4.0f",tlmval[2][2]);
         mvwprintw(tlmb_win,6,43,"%4.0f",tlmval[2][2]);
         break;
      case 3:
         mvwprintw(tlmb_win,4,17,"%2.2f",tlmval[3][0]);
         mvwprintw(tlmb_win,5,17,"%2.2f",tlmval[3][1]);
         mvwprintw(tlmb_win,6,71,"%2.2f",tlmval[3][2]);
         mvwprintw(tlm_win,6,71,"%2.2f",tlmval[3][2]);
         mvwprintw(tlmb_win,6,18,"%2.2f",tlmval[3][3]);
   }

   /* Handle the 8 CMD Bits */
   if (anytlmrx==1)
   {
      for (k=0; k<=(numcmdstr/2); k++)
      {
         if (rawcmdbits[k]=='0')
         {
             mvwchgat(cmd_win,2+k,2,CMD_STR_LEN,A_REVERSE,COLOUR_NOMINAL,NULL);
         }
         else
         {
            mvwchgat(cmd_win,2+k,2,CMD_STR_LEN,A_NORMAL,COLOUR_NOMINAL,NULL);
         }
         if (rawcmdbits[k+4]=='0')
         {
            mvwchgat(cmd_win,2+k,22,CMD_STR_LEN,A_REVERSE,COLOUR_NOMINAL,NULL);
         }
         else
         {
            mvwchgat(cmd_win,2+k,22,CMD_STR_LEN,A_NORMAL,COLOUR_NOMINAL,NULL);
         }
      }
      /* handle experiment bits */
      if (sbits[0]='0')
      {
         mvwchgat(arm_win,2,19,8,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(arm_win,2,19,8,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      if (sbits[1]='0')
      {
         mvwchgat(arm_win,2,31,6,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(arm_win,2,31,6,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      mvwprintw(arm_win,2,9,"%1.2f",ref5v);
   }
   /* Now Handle The TLM RX Date Window - Just stolen from pcsat2 */

    mvwprintw(tlmdateutcb_win,tlmframe+2,2,"B-%c%c T#%c%c%c %4d/%02d/%02d %02d:%02d:%02d UTC",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(tmframeb[tlmframe][0].tm_year+1900),(tmframeb[tlmframe][0].tm_mon+1),tmframeb[tlmframe][0].tm_mday,tmframeb[tlmframe][0].tm_hour,tmframeb[tlmframe][0].tm_min,tmframeb[tlmframe][0].tm_sec);
     mvwprintw(tlmdatelclb_win,tlmframe+2,2,"B-%c%c T#%c%c%c %4d/%02d/%02d %02d:%02d:%02d %s",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(tmframeb[tlmframe][1].tm_year+1900),(tmframeb[tlmframe][1].tm_mon+1),tmframeb[tlmframe][1].tm_mday,tmframeb[tlmframe][1].tm_hour,tmframeb[tlmframe][1].tm_min,tmframeb[tlmframe][1].tm_sec,tzname[0]);

    if (preden==1)
    {
       mvwprintw(tlmdatemetb_win,tlmframe+2,2,"B-%c%c T#%c%c%c %05d/%04d %02d:%02d:%02d MET",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(int)birdorbit,(int)framedaysb[tlmframe],(int)framehoursb[tlmframe],(int)frameminsb[tlmframe],(int)framesecsb[tlmframe]);
     }
     else
     {
        mvwprintw(tlmdatemetb_win,tlmframe+2,2,"B-%c%c T#%c%c%c -----/%04d %02d:%02d:%02d MET",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(int)framedaysb[tlmframe],(int)framehoursb[tlmframe],(int)frameminsb[tlmframe],(int)framesecsb[tlmframe]);
     }
}
