#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
/* PC control program for 50016 receiver @ 25 MHz and 7008 VFO @ 50 MHz */ 
/* RX25N.C 9mar97 PTAnderson KC1HR */

main() 
{  int tempint = 0;
   int gain_state = 0;
   int j = 0;
   int c = 'm';
   int exit_char = '!';
   char preamble[] = "20011";
   char postamble[] = "000001";
   char ph_inc_string[] = "20011011001100101110101010001011110010001";
   long maxfreq = 12000000;
   long freq = 6175000;
   float tempfloat = 0.0;
   double freq_offset = 0.0;
   double dfreq = 0.0;
   double rxkhz = 0.0;  double txkhz = 0.0;
   double alkhz = 0.0;
   double dph_inc = 0.0;
   long ph_inc = 0;
/* 50016 clock frequency is nominally 25000000.0, my osc is a little low */
   double fclock = 24999900.0;
   double two_up32_over_fclock = 0.0;
   two_up32_over_fclock = 4294967296.0 / fclock;

/* initialize receiver to minimum gain */
   fprintf(stdprn,"@A\n");

/* initialize control registers 2 and 3 (same data for DSB or SSB or CW) */
   fprintf(stdprn,"20100000000000000000000000000000000000000\n");
   fprintf(stdprn,"20110000000000000000000000000000000000000\n");

/* print help table */
   printf("\nSimple SSB/CW/synchronous_AM receiver RX25 9mar97 PTAnderson");
   printf("\nFrequency range 10 to 12500 kHz");
   printf("\nAlias frequency range 24990 to 12500 kHz");
   printf("\n");
   printf("\nRF passband center = frequency (-,+ 1.526 kHz for lsb,usb only)");
   printf("\n");
   printf("\nexit to DOS:  set DDC clock kHz:   set frequency kHz:");
   printf("\n !          #           =");
   printf("\n");
   printf("\nup frequency:");
   printf("\n q=1MHz w=100kHz e=10kHz r=5kHz t=1kHz y=100Hz u=10Hz i=1Hz");
   printf("\n");
   printf("\ndown frequency:");
   printf("\n a=1MHz s=100kHz d=10kHz f=5kHz g=1kHz h=100Hz j=10Hz k=1Hz");
   printf("\n");
   printf("\ngain:               set VFO = passband center: W");
   printf("\nz=up x=dn c=min");
   printf("\n");
   printf("\naudio bandwidth Hz , mode:     ?=107cw without audio alias");
   printf("\n     b=6836am n=1709usb m=1709lsb ,=1709cw .=427cw /=107cw");
   printf("\n");
   printf("\nlast command, gain, alias, VFO, rx frequencies in kHz now are:");
   printf("\n");
   printf("\n");

/* while not exit char */
   while(c-exit_char){

     /* set preamble and postamble to update 50016 phase increment */
     strcpy( preamble,"20011" );
     strcpy( postamble,"000001" );

     switch (c)
     {
       case 'z':      /* up gain */ 
        if( gain_state > 14 ) 
          gain_state = 15;
         else 
         { 
           gain_state = gain_state + 1;
            fprintf(stdprn,"C");
         } 
         break;
     case 'x':      /* dn gain */ 
       if ( gain_state < 2 ) 
       { 
          gain_state = 0;
          fprintf(stdprn,"A");
       } 
       else 
       { 
         gain_state = gain_state - 1;
         fprintf(stdprn,"B");
       } 
       break;
     case 'c':      /* min gain */ 
       gain_state = 0;
       fprintf(stdprn,"A");
       break;
     case '=':      /* set freq in kHz*/ 
       printf("\rfreq kHz ");
       cscanf( "%f", &tempfloat );
       freq = 1000.0 * tempfloat;
       tempint = getch();
       break;
     case '#':      /* set fclock in kHz */ 
       printf("\rclock kHz ");
       cscanf( "%f", &tempfloat );
       fclock = 1000.0 * tempfloat;
       two_up32_over_fclock = 4294967296.0 / fclock;
       tempint = getch();
       break;
     case 'b':      /* 6836 Hz bandwidth synchronous am */
       fprintf(stdprn,"21000000000000000000000000000000001000110\n");
       fprintf(stdprn,"21010000000011111111100000000000000000101\n");
       fprintf(stdprn,"21100000000011101010100100100000000011010\n");
       freq_offset = 0;
       break;
     case 'n':      /* 1709 Hz bandwidth usb */ 
       fprintf(stdprn,"21000000010000000000000000000000000101000\n");
       fprintf(stdprn,"21010000011111111111100000000000000000101\n");
       fprintf(stdprn,"21100000000011101010100100000000001011010\n");
       freq_offset = -1526;
       break;
     case 'm':      /* 1709 Hz bandwidth lsb */
       fprintf(stdprn,"21000000010000000000000000000000000101001\n");
       fprintf(stdprn,"21010000011111111111100000000000000000101\n");
       fprintf(stdprn,"21100000000011101010100100000000001011010\n");
       freq_offset = 1526;
       break;
     case ',':      /* 1709 Hz bandwidth cw */
       fprintf(stdprn,"21000000010000000000000000000000000101001\n");
       fprintf(stdprn,"21010000011111111111100000000000000000101\n");
       fprintf(stdprn,"21100000000011101010100100000000001011010\n");
       freq_offset = 0;
       break;
     case '.':      /* 427 Hz bandwidth cw */
       fprintf(stdprn,"21000000010000000000000000000000000010101\n");
       fprintf(stdprn,"21010001111111111111100000000000000000101\n");
       fprintf(stdprn,"21100000000011101010100100000000111001000\n");
       freq_offset = 0;
       break;
     case '/':      /* 107 Hz bandwidth cw with audio alias */
       fprintf(stdprn,"21000000010000000000000000000000000000001\n");
       fprintf(stdprn,"21010111111111111111100000000000000000101\n");
       fprintf(stdprn,"21100000000011101010100100000000001011010\n");
       freq_offset = 0;
       break;
     case '?':      /* 107 Hz bandwidth cw without audio alias */
       fprintf(stdprn,"21000000010000000000000000000000000000001\n");
       fprintf(stdprn,"21010111111111111111100000000000000000101\n");
       fprintf(stdprn,"21100100000011101010100100000011100100011\n");
       freq_offset = 0;
       break;
     case 'W':      /* TX frequency = RX frequency */ 
       txkhz = rxkhz;
       /* set preamble and postamble to update 7008 DDS phase increment */ 
       strcpy( preamble,"00000" );
       strcpy( postamble,"400000" );
       break;
     case 'i':      /* up 1Hz */ 
       freq = freq + 1 ;
       break;
     case 'k':      /* dn 1Hz */ 
       freq = freq - 1 ;
       break;
     case 'u':      /* up 10Hz */ 
       freq = freq + 10 ;
       break;
     case 'j':      /* dn 10Hz */ 
       freq = freq - 10 ;
        break;
     case 'y':      /* up 100Hz */ 
       freq = freq + 100 ;
       break;
     case 'h':      /* dn 100Hz */ 
       freq = freq - 100 ;
       break;
     case 't':      /* up 1kHz */ 
       freq = freq + 1000 ;
       break;
     case 'g':      /* dn 1kHz */ 
       freq = freq - 1000 ;
       break;
     case 'r':      /* up 5kHz */ 
       freq = freq + 5000 ;
       break;
     case 'f':      /* dn 5kHz */ 
       freq = freq - 5000 ;
       break;
     case 'e':      /* up 10kHz */ 
       freq = freq + 10000 ;
        break;
     case 'd':      /* dn 10kHz */ 
       freq = freq - 10000 ;
       break;
     case 'w':      /* up 100kHz */ 
       freq = freq + 100000 ;
       break;
     case 's':      /* dn 100kHz */ 
       freq = freq - 100000 ;
       break;
     case 'q':      /* up 1MHz */ 
       freq = freq + 1000000 ;
       break;
     case 'a':      /* dn 1MHz */ 
       freq = freq - 1000000 ;
       break;
     default:
       break;
   }
   if ( freq > maxfreq )
     freq = maxfreq;
   if ( freq < 10000 )
     freq = 10000;
   dfreq = freq;
   rxkhz = 0.001*dfreq;
   alkhz = 0.001*(fclock-dfreq);
   dph_inc = (dfreq-freq_offset) * two_up32_over_fclock;
   ph_inc = dph_inc;
   dph_inc = ph_inc;
   printf("\r%c %2.2u %9.3f %9.3f %9.3f     ",
      c, gain_state, alkhz, txkhz, rxkhz);
   strcpy( ph_inc_string, preamble );
   /* convert thirty bits of ph_inc to ASCII string */
   for( j = 0; j < 30; j = j + 1 )
   {
     ph_inc = ph_inc << 1;
     if( ph_inc < 0 ) 
       strcat( ph_inc_string, "1" );
     else 
       strcat( ph_inc_string, "0" );
   }
   strcat( ph_inc_string, postamble );
   /* send forty-one-character string to transceiver on printer port */
   for( j = 0; j < 41; j = j + 1 )
   {
     fprintf(stdprn,"%c", ph_inc_string[j]);
   }
   /* send newline characters to keep printer happy */
   fprintf(stdprn,"\n");
   c = getch();
  }
}

