#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <curses.h>
#include "mfjterm.h"
#include "misc.h"
#include "inout.h"
#include "timefuncs.h"


void set_tnc_params(void)
{
       char s[50];
       int speed_mode;
       int speed;

       delta_inv=FALSE;
       delta_shift=0;
       speed=0;
       speed_mode = FALSE;

       strcpy(s,"");

       if (last_opmode == PACTOR) {
               write_tnc(0x03);
               zleep(20);
               send_string("EXIT",1);
               zleep(20);
               write_tnc(0x0A);
               zleep(20);
       } else {
               write_tnc(0x03);
               zleep(20);
               write_tnc(0x03);
               zleep(20);
               write_tnc(0x0A);
               zleep(20);
       }

       if (last_opmode  == AMTOR){
               send_string("ECHO OFF", 1);
               zleep(20);
       }


       switch (opmode){
               case AMTOR:
                       send_string("RADIO 1",1);
                       zleep(10);
                       send_string("ECHO ON",1);
                       zleep(20);
                       send_string("MODE AMTOR",1);
                       zleep(50);
                       while (! chk_incoming());
                       read_tnc();
                       send_string(a_rinv_str[amtor_inv], 1);
                       send_string(a_tinv_str[amtor_inv], 1);
                       delta_inv = amtor_inv;
                       last_opmode = AMTOR;
                       break;
               case ASCII:
                       send_string("RADIO 1",1);
                       zleep(10);
                       send_string(b_rinv_str[ascii_inv],1);
                       send_string(b_tinv_str[ascii_inv],1);
                       zleep(10);
                       strcat(s,ascii_cmd_str[ascii_shift]);
                       strcat(s,speed_str[ascii_spd]);
                       send_string(s,1);
                       zleep(10);
                       send_string("CONV",1);
                       delta_inv=ascii_inv;
                       delta_shift=ascii_shift;
                       speed=ascii_spd;
                       speed_mode = TRUE;
                       last_opmode = ASCII;
                       break;
               case RTTY:
                       send_string("RADIO 1",1);
                       zleep(10);
                       send_string(usos_str[usos],1);
                       zleep(10);
                       send_string(b_rinv_str[rtty_inv],1);
                       send_string(b_tinv_str[rtty_inv],1);
                       zleep(10);
                       strcat(s,rtty_cmd_str[rtty_shift]);
                       strcat(s,speed_str[rtty_spd]);
                       send_string(s,1);
                       zleep(10);
                       send_string("CONV",1);
                       delta_inv = rtty_inv;
                       delta_shift = rtty_shift;
                       speed=rtty_spd;
                       speed_mode = TRUE;
                       last_opmode = RTTY;
                       break;
               case PACTOR:
                       send_string("RADIO 1",1);
                       zleep(10);
                       send_string("MODE PT",1);
                       speed_mode = TRUE;
                       last_opmode = PACTOR;
                       break;
               case HPKT:
                       send_string("DEADTIME 12",1);
                       zleep(5);
                       send_string("ACKTIME 52",1);
                       zleep(5);
                       send_string("DWAIT 0",1);
                       zleep(5);
                       send_string("RESPTIME 0",1);
                       zleep(5);
                       send_string("MAXFRAME 1",1);
                       zleep(5);
                       send_string("FRACK 8",1);
                       zleep(5);
                       send_string("PACLEN 40",1);
                       zleep(5);
                       send_string("RADIO 1",1);
                       zleep(10);
                       send_string("MODE HP",1);
                       last_opmode = HPKT;
                       break;
               case VPKT:
                       send_string("DEADTIME 33",1);
                       zleep(5);
                       send_string("ACKTIME 13",1);
                       zleep(5);
                       send_string("RESPTIME 0",1);
                       zleep(5);
                       send_string("DWAIT 0",1);
                       zleep(5);
                       send_string("MAXFRAME 4",1);
                       zleep(5);
                       send_string("FRACK 3",1);
                       zleep(5);
                       send_string("PACLEN 128",1);
                       zleep(5);
                       send_string("RADIO 2",1);
                       zleep(10);
                       send_string("MODE VP",1);
                       last_opmode = VPKT;
                       break;
       }


       if (delta_inv)
               attrset(A_NORMAL);
       else
               attrset(A_REVERSE);

       move(19, 75);
       addch(modesign[opmode]);

       if (! delta_shift)
               attrset(A_REVERSE);

       addch(shiftsign[delta_shift]);

       attrset(A_REVERSE);
       move(0, 52);
       if (opmode == RTTY) {
               sprintf(s, "%s", usos_str2[usos]);
       } else
               sprintf(s, "        ");
       addstr(s);

       move(0, 65);

       if (speed_mode) {
               if (opmode == PACTOR)
                       sprintf(s, "Speed: %-3s", pactspeed_str[pactor_spd]);
               else
                       sprintf(s, "Speed: %-3s", speed_str[speed]);
               addstr(s);
       } else
               addstr("          ");

       move(tnc_y, tnc_x);
       refresh();
}


void change_opmode(void)
{
       int k;

       attrset(A_REVERSE);

       curs_set(0);
       move(19, 1);
       addstr("Enter new opmode  (A)MTOR  A(S)CII  (R)TTY  (P)ACTOR  (V)PKT  (H)PKT");
       nodelay(stdscr, FALSE);
       k = getch();
       nodelay(stdscr, TRUE);
       move(19, 1);
       addstr("                                                                    ");
       move(tnc_y, tnc_x);
       curs_set(1);

       switch (k){
               case 'a':
               case 'A':
                       opmode = AMTOR;
                       break;
               case 's':
               case 'S':
                       opmode = ASCII;
                       break;
               case 'r':
               case 'R':
                       opmode = RTTY;
                       break;
               case 'p':
               case 'P':
                       opmode = PACTOR;
                       break;
               case 'v':
               case 'V':
                        opmode = VPKT;
                        break;
               case 'h':
               case 'H':
                       opmode = HPKT;
                       break;
               default  :
                       refresh();
                       goto abort;
       }

       set_tnc_params();
abort:
}