#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
/* #include <linux/soundcard.h> */
#include <curses.h>
#include <wav.h>
#include <ncinput.h>
#include "mfjterm.h"
#include "inout.h"
#include "misc.h"
#include "timefuncs.h"


void set_spd(int k)
{
       char s[80];
       int *spd = NULL;
       char *cmdstr = NULL;
       char **sstr = NULL;
       int limit = 0;

       if ((opmode != ASCII) && (opmode != RTTY) && (opmode != PACTOR))
               return;

       switch (opmode) {
               case ASCII:
                       spd = &ascii_spd;
                       cmdstr = ascii_cmd_str[ascii_shift];
                       sstr = speed_str;
                       limit = 8;
                       break;
               case RTTY:
                       spd = &rtty_spd;
                       cmdstr = rtty_cmd_str[rtty_shift];
                       sstr = speed_str;
                       limit = 8;
                       break;
               case PACTOR:
                       spd = &pactor_spd;
                       sstr = pactspeed_str;
                       limit = 1;
       }

       switch (k){
               case KEY_LEFT:
                       if ((--(*spd)) < 0)
                               (*spd) = limit;
                       break;
               case KEY_RIGHT:
                       if ((++(*spd)) > limit)
                               (*spd) = 0;
       }

       if (opmode != PACTOR) {
               write_tnc(0x03);
               zleep(20);
               write_tnc(0x0A);

               strcpy(s,"");
               strcat(s,cmdstr);
               strcat(s,speed_str[(*spd)]);

               send_string(s,1);
               send_string("CONV",1);
       }

       attrset(A_REVERSE);

       curs_set(0);
       move(0, 65);
       sprintf(s, "Speed: %-3s", sstr[*spd]);
       addstr(s);
       refresh();
       move(tnc_y, tnc_x);
       curs_set(1);
}


void set_inv(void)
{
       if ((opmode != AMTOR) && (opmode != RTTY) && (opmode != ASCII))
               return;

       delta_inv = 0;

       switch (opmode) {
               case AMTOR:
                       amtor_inv ^= 1;
                       send_string(a_rinv_str[amtor_inv],1);
                       send_string(a_tinv_str[amtor_inv],1);
                       delta_inv = amtor_inv;
                       break;
               case ASCII:
                       ascii_inv ^= 1;
                       write_tnc(0x03);
                       zleep(20);
                       write_tnc(0x0A);
                       send_string(b_rinv_str[ascii_inv],1);
                       send_string(b_tinv_str[ascii_inv],1);
                       send_string("CONV",1);
                       delta_inv = ascii_inv;
                       break;
               case RTTY:
                       rtty_inv ^= 1;
                       write_tnc(0x03);
                       zleep(20);
                       write_tnc(0x0A);
                       send_string(b_rinv_str[rtty_inv],1);
                       send_string(b_tinv_str[rtty_inv],1);
                       send_string("CONV",1);
                       delta_inv = rtty_inv;
       }

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

       curs_set(0);

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

       if (! delta_shift)
               attrset(A_REVERSE);

       addch(shiftsign[delta_shift]);

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


void set_shift(void)
{
       char s[50];
       int spd;
       char *cmdstr;

       if ((opmode != RTTY) && (opmode != ASCII))
               return;

       if (opmode == ASCII) {
               ascii_shift ^= 1;
               delta_shift = ascii_shift;
               spd = ascii_spd;
               cmdstr = ascii_cmd_str[ascii_shift];
       } else {
               rtty_shift ^= 1;
               delta_shift = rtty_shift;
               spd = rtty_spd;
               cmdstr = rtty_cmd_str[rtty_shift];
       }

       write_tnc(0x03);
       zleep(20);
       write_tnc(0x0A);

       strcpy(s,"");
       strcat(s,cmdstr);
       strcat(s,speed_str[spd]);
       send_string(s,1);
       send_string("CONV",1);

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

       curs_set(0);

       move(19,76);
       addch(shiftsign[delta_shift]);
       refresh();

       move(tnc_y, tnc_x);
       curs_set(1);
}


void set_usos(int on)
{
       char s[80];

       write_tnc(0x03);
       zleep(20);
       write_tnc(0x0A);
       send_string(usos_str[on], 1);
       send_string("CONV", 1);

       attrset(A_REVERSE);

       curs_set(0);

       move(0, 52);
       sprintf(s, "%s", usos_str2[usos]);
       addstr(s);
       refresh();

       move(tnc_y, tnc_x);
       curs_set(1);
}


void switch_fec(int on)
{
       switch(opmode){
               case AMTOR:
                       if (on) {
                               send_string("FEC",1);
                               zleep(20);
                               send_string("K",1);
                               transmit = TRUE;
                       } else {
                               transmit = FALSE;
                               write_tnc(3);
                               zleep(20);
                               send_string("R",1);
                       }
                       break;
               case PACTOR:
                       if (on) {
                               send_string(pactor_fec_cmd[pactor_spd],1);
                               transmit = TRUE;
                       } else {
                               transmit = FALSE;
                               write_tnc(3);
                               zleep(20);
                               send_string("D",1);
                       }
       }
}


void set_scancrit(void)
{
       attrset(A_REVERSE);
       move(19, 1);
       addstr("String to scan for: ");
       edgets(stdscr, scancrit, 30, FALSE);
       move(19, 1);
       addstr("                                                                    ");

       if (strlen(scancrit)) {
               scan = TRUE;
               strcpy(scanstr,"                              ");
       } else
               scan = FALSE;

       curs_set(0);
       move(0,78);
       addch(scansign[scan]);
       refresh();
       move(tnc_y, tnc_x);
       curs_set(1);
}


void sound_alarm(void)
{
       int i;
#if 0
       if (use_dsp_as_alarm) {
               sprintf(samp_name, "%s%s", lib_path, "/alarm.wav");
               play_wav(samp_name);
       } else {
               for (i = 0; i < 10; i++) {
                       putchar(7);
                       zleep(10);
               }
       }
#endif
       for (i = 0; i < 10; i++) {
               putchar(7);
               zleep(10);
       }

       strcpy(scanstr,"                              ");
}


void show_help(void)
{
       char cmd_str[161];
       char amt_hlp_path[81];
       static char pager_parms[31];

       if (! pager[0]) return;

       attrset(A_REVERSE);
       move(19, 1);
       addstr("Optional parameters: ");
       refresh();
       edgets(stdscr, pager_parms, 30, FALSE);
       move(19, 1);
       addstr("                                                                    ");
       refresh();

       setscrreg(0, 24);
       attrset(A_NORMAL);

       endwin();
       sprintf(amt_hlp_path, "%s%s", lib_path, "/mfjterm.hlp");
       sprintf(cmd_str, "%s %s %s", pager, pager_parms, amt_hlp_path);
       system(cmd_str);

       old_min = 0xffff;
       move(tnc_y, tnc_x);
       refresh();
}


void invoke_editor(void)
{
       setscrreg(0, 24);
       attrset(A_NORMAL);
       endwin();
       system(editor);
       old_min = 0xffff;
       move(tnc_y, tnc_x);
       refresh();
}


void bbs_capture(void)
{
       bbs_cap ^= 1;

       attrset(A_REVERSE);

       curs_set(0);
       move(0, 52);

       if (bbs_cap) {
               addstr("BBS capture");
       } else
               addstr("           ");
               strcpy(scanstr,"                              ");

       move(tnc_y, tnc_x);
       curs_set(1);
}


void open_bbs_capf(int mode)
{
       static char *fname[2] = {"fbb.txt", "mail.txt"};

       bbs_capf = fopen(fname[mode], "a");
       bbs_capf_open = TRUE;
}

void close_bbs_capf()
{
       fclose(bbs_capf);
       strcpy(scanstr,"                              ");
       bbs_capf_open = FALSE;
}