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

#include "aprstlm.h"

void pcsat2_display()
{
   extern int tlmframe;
   extern float tlmval[4][5];
   extern int rawtlmint[4][5];

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

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

   extern char rawtlmno[3];
   extern char rawcmdbits[8];
   extern char sbits[2];
   extern char rawarmbit;
   extern int lasttlmnum;
   extern int currtlmnum;
   extern int tlmarmbit[4];

   extern char rawfrnum[2]; 

   extern struct tm tmframe[4][2];

   extern char *tzname[2];

   extern int preden;

   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 k;

   extern int anytlmrx;
   extern int numcmdstr; 

   if (tlmframe==0)
   {
      if (tlmval[tlmframe][0]<=28.00)
      {
         mvwchgat(timer_win,2,24,7,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(timer_win,2,24,7,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
   }
   /* Timers */
   if (tlmframe==3)
   {
      if ((int)tlmval[tlmframe][4]==0)
      {
         mvwchgat(timer_win,2,13,7,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(timer_win,2,13,7,A_NORMAL,COLOUR_NOMINAL,NULL);
      }

      if (tlmval[tlmframe][4]<1.0)
      {
         mvwchgat(timer_win,2,2,7,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(timer_win,2,2,7,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
    }
    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);

    if (lasttlmnum>currtlmnum)
    {
       mvwchgat(timer_win,2,35,4,A_REVERSE,COLOUR_NOMINAL,NULL);
    }
    else
    {
       mvwchgat(timer_win,2,35,4,A_NORMAL,COLOUR_NOMINAL,NULL);
    }
                      
    switch (tlmframe)
    {
       case 0:
          mvwprintw(tlm_win,2,49,"%4.0fmA",tlmval[0][0]);
          mvwprintw(tlm_win,3,49,"%4.0fmA",tlmval[0][1]);
          if (tlmval[0][2]<10.00)
          {
             mvwprintw(tlm_win,4,9," %2.2f V",tlmval[0][2]);
          }
          else
          {
             mvwprintw(tlm_win,4,9,"%2.2f V",tlmval[0][2]);
          } 
          mvwprintw(tlm_win,5,29,"%4.0fmA",tlmval[0][3]);
          mvwprintw(tlm_win,6,29,"%4.0fmA",tlmval[0][4]);
          if (tlmarmbit[0]!=0)
          {
              mvwchgat(arm_win,2,31,5,A_REVERSE,COLOUR_NOMINAL,NULL);
          }
          else
          {
              mvwchgat(arm_win,2,31,5,A_NORMAL,COLOUR_NOMINAL,NULL);
          }
          break;
       case 1:
          mvwprintw(tlm_win,3,70,"%2.2f",tlmval[1][0]);
          mvwprintw(tlm_win,6,49,"%2.2f",tlmval[1][1]);
          mvwprintw(tlm_win,4,49,"%4.0fmA",tlmval[1][2]);
          mvwprintw(tlm_win,5,49,"%4.0fmA",tlmval[1][3]);
          if (tlmval[1][4]<10.00)
          {
             mvwprintw(tlm_win,2,9," %2.2f V",tlmval[1][4]);
          }
          else
          {
             mvwprintw(tlm_win,2,9,"%2.2f V",tlmval[1][4]);
          }
          if (tlmarmbit[1]!=0)
          {
              mvwchgat(arm_win,2,13,5,A_REVERSE,COLOUR_NOMINAL,NULL);
          }
          else
          {
              mvwchgat(arm_win,2,13,5,A_NORMAL,COLOUR_NOMINAL,NULL);
          }
          break;
       case 2:
          mvwprintw(tlm_win,4,70,"%2.2f",tlmval[2][0]);
          mvwprintw(tlm_win,5,70,"%2.2f",tlmval[2][1]);
          if (tlmval[2][2]<10.00)
          {
             mvwprintw(tlm_win,3,9," %2.2f V",tlmval[2][2]);
          }
          else
          {
             mvwprintw(tlm_win,3,9,"%2.2f V",tlmval[2][2]);
          }
          mvwprintw(tlm_win,2,70,"%2.2f",tlmval[2][3]);
          mvwprintw(tlm_win,6,70,"%2.2f",tlmval[2][4]);
          if (tlmarmbit[2]!=0)
          {
              mvwchgat(arm_win,2,22,5,A_REVERSE,COLOUR_NOMINAL,NULL);
          }
          else
          {
              mvwchgat(arm_win,2,22,5,A_NORMAL,COLOUR_NOMINAL,NULL);
          }
          break;
       case 3:
          if (tlmval[3][0]<10.00)
          {
             mvwprintw(tlm_win,5,9," %2.2f V",tlmval[3][0]);
          }
          else
          {
             mvwprintw(tlm_win,5,9,"%2.2f V",tlmval[3][0]);
          }
          mvwprintw(tlm_win,3,29,"%4.0fmA",tlmval[3][1]);
          mvwprintw(tlm_win,2,29,"%4.0fmA",tlmval[3][2]);
          mvwprintw(tlm_win,4,29,"%4.0fmA",tlmval[3][3]);
          if (tlmval[3][4]<10.00)
          {
             mvwprintw(tlm_win,6,9," %2.2f V",tlmval[3][4]);
          }
          else
          {
             mvwprintw(tlm_win,6,9,"%2.2f V",tlmval[3][4]);
          }

          if (tlmarmbit[3]!=0)
          {
              mvwchgat(arm_win,2,4,5,A_REVERSE,COLOUR_NOMINAL,NULL);
          }
          else
          {
              mvwchgat(arm_win,2,4,5,A_NORMAL,COLOUR_NOMINAL,NULL);
          }
          break;
    }
  
    mvwprintw(tlmdateutc_win,tlmframe+2,2,"F-%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,"F-%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,"F-%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,"F-%c%c T#%c%c%c -----/%04d %02d:%02d:%02d MET",rawfrnum[0],rawfrnum[1],rawtlmno[0],rawtlmno[1],rawtlmno[2],(int)framedays[tlmframe],rawtlmno[0],rawtlmno[1],rawtlmno[2],(int)framehours[tlmframe],(int)framemins[tlmframe],(int)framesecs[tlmframe]);
     }
 
   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 Have To Handle The 7/8 bits again */
                  /* This is PCSAT2 Specific, and we need to */
                  /* override any REVERSE setting of position 8*/
                  /* Set Position 7 REVERSED only if bit 7 is 0 */
                  /* and bit 8 is 1. Do not call touchwin until */
                  /* we fix the potentially incorrect highlighting */

      mvwchgat(cmd_win,5,22,CMD_STR_LEN,A_NORMAL,COLOUR_NOMINAL,NULL);
      
      if ((rawcmdbits[7]=='0') && (rawcmdbits[8]=='1'))
      {
         mvwchgat(cmd_win,4,22,CMD_STR_LEN,A_REVERSE,COLOUR_NOMINAL,NULL);
      }
      else
      {
         mvwchgat(cmd_win,4,22,CMD_STR_LEN,A_NORMAL,COLOUR_NOMINAL,NULL);
      }
                 
   }

}
