/***************************************************************************\
| t813deeltal.c: Een programma om deeltallen voor de Teletron T813 te       |
|                berekenen. Getest onder Linux gcc. Zou moeten werken onder |
|                elke ANSI C-compiler.                                      |
|---------------------------------------------------------------------------|
| 2/3/97:   Bugfix, code compileert nu met Borland Turbo C (2.0)            |
|---------------------------------------------------------------------------|
| (c) 1997 Herman Robers, PA3FYW.       E-mail: H.W.K.Robers@ET.TUDelft.NL  |
| Gebruik op eigen risico.             amprnet: PA3FYW@PI8ZAA.#NBO.NLD.EU   |
|                                                                           |
| Dit programma mag alleen inclusief de broncode en gratis worden verspreid.|
| Aanpassen en/of hergebruiken van (gedeelten van) deze code mag zonder     |
| voorafgaande toestemming.                                                 |
\***************************************************************************/

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

/* RASTER: rasterfrequentie in 100-den Hz. 125=12.5 kHz 100=10.0 kHz */
#define RASTER	125

/* MFFREQ: de middenfrequent-frequentie in kHz-en. 21400=21.4 MHz */
#define MFFREQ  21400


#define BUFLEN 	256

int str2int(char *buffer, int *frqM, int *frqk)
{
  int i;

  int MHz=0;
  int kHz=0;
  int digit;
  *frqM=MHz;
  *frqk=kHz;

  i=0;
  
  digit=0;
  while(isdigit(buffer[i]))
  {
    if(digit<3)
    {
      MHz*=10;
      MHz+=buffer[i]-'0';
      digit++;
      i++;
    }
    else
    break;
  }
  while(!isdigit(buffer[i]))
  {
    i++;
  }
  digit=0;
  if(i>strlen(buffer))
   if(MHz)
   {
     *frqM=MHz;
     *frqk=kHz;
     return 0;
   }
   else
     return -1;
  while(isdigit(buffer[i]))
  {
    if(digit<4)
    {
      kHz*=10;
      kHz+=buffer[i]-'0';
      digit++;
      i++;
    }
    else
    break;
  }
  while(digit<4)
  {
    kHz*=10;
    digit++;
  }
  *frqM=MHz;
  *frqk=kHz;
  return 0;
}

int adjraster(int *MHz, int *kHz, int raster)
{
  int afwijking;
  int khz, mhz;
  
  khz=*kHz;
  mhz=*MHz;

  afwijking=khz%raster;
  if(afwijking)
  {
    if((khz%raster)*2>=raster)
      khz+=raster;
    khz-=khz%raster;
    if(khz>9999)
    {
      khz-=10000;
      mhz++;
    } 
    *kHz=khz;
    *MHz=mhz;
  } 
  return afwijking;
}

int freq2deeltal(int MHz, int kHz, int *Adeler, int *Bdeler, int shift, int raster)
{
   long int frequentie,deeltallen;

   MHz+=shift/1000;
   kHz+=10*(shift%1000);
   if(kHz>9999)
   {
     kHz-=10000;
     MHz++;
   }
   if(kHz<0)
   {
     kHz+=10000;
     MHz--;
   }

  frequentie=MHz*(10000l)+kHz;
  printf("%ld.%03ld.%ld MHz\n",frequentie/(10000l), (frequentie%(10000l))/10,frequentie%10);
  deeltallen=frequentie/raster;
  *Adeler=deeltallen%100;
  *Bdeler=deeltallen/100;
  if((deeltallen%100>=deeltallen/100))   /* Bdeeltal moet groter zijn dan Adeeltal */
  {
    return -1;
  }
  return 0;
}

int showdeeltal(int Adeler, int Bdeler)
{
  int i;
  printf("Dec: A='%d' B='%d'  Hex: A='%02X' B='%02X'  Bin: A='",Adeler, Bdeler, Adeler, Bdeler);
  for(i=64; i>0; i/=2)
  {
    if(Adeler&i)
      putchar('1');
    else
      putchar('0');
  }
  printf("' B='");
  for(i=128; i>0; i/=2)
  {
    if(Bdeler&i)
      putchar('1');
    else
      putchar('0');
  }
  putchar('\'');
  printf("' 8/10='%c'\n",(RASTER==125)?'0':(RASTER==100)?'1':'?');
  return 0; 
}

int ignoredeeltal(int Adeler, int Bdeler)
{
  printf("*** Voor deze frequentie bestaan geen deeltallen: A=%d B=%d mag niet\nA moet kleiner zijn dan B!!!\n", Adeler,Bdeler);
  return 0;
}

int main()
{
  
  char buffer[BUFLEN];
  int rxM, rxk;			/* MHz en khz rx-frequentie */
  int txM, txk;
  int txA, txB;
  int rxA, rxB;
  long int frequentie,deeltallen;

  printf("T813 deeltalgenerator. (c) 1997 H.W.K.Robers@ET.TUDelft.NL, PA3FYW\n");
  printf("versie 0.2. Gebruik op eigen risico. raster=%d.%d kHz\n\n",RASTER/10,RASTER%10);

  while(1)
  {
    printf("Welke frequentie? ");
    fgets(buffer, BUFLEN, stdin);
    if(str2int(buffer,&rxM,&rxk))
      printf("Ongeldig formaat! Geef frequentie in MMM.kkk.hhh formaat b.v. 145.325\n");
    else
      break;
  }

  if(adjraster(&rxM, &rxk, RASTER))
  {
    printf("Let op! Frequentie niet in het %d.%d kHz raster\n",RASTER/10,RASTER%10);
    printf("*** Frequentie afgerond naar %d.%03d.%d\n",rxM,rxk/10,rxk%10);
  }

  printf("Frequentie: %d.%03d.%d\n",rxM,rxk/10,rxk%10);

  txM=rxM; 				/* TX = RX frequentie */
  txk=rxk;

  if(txM==145)				/* Repeatershift ? */
     if((txk>=6000)&&(txk<8000))
     {
       printf("-600 kHz Repeatershift? (j/n) ");
       buffer[0]=getchar();
       if((buffer[0]=='j')||(buffer[0]=='J')||(buffer[0]=='y')||(buffer[0]=='Y'))
       {
         txk-=6000;			/* TX -600 kHz */
         printf("Zendfrequentie: %d.%03d.%d\n",txM,txk/10,txk%10);
       }
     }
  
  printf("\nOntvangst met bovenmenging. PLL-frequentie: ");
  if(!freq2deeltal(rxM, rxk, &rxA, &rxB, 21400, RASTER))
    showdeeltal(rxA, rxB);
  else
    ignoredeeltal(rxA, rxB);
  printf("---\nOntvangst met ondermenging. PLL-frequentie: ");
  if(!freq2deeltal(rxM, rxk, &rxA, &rxB, -21400, RASTER))
    showdeeltal(rxA, rxB);
  else
    ignoredeeltal(rxA, rxB);
  printf("---\nZenden. PLL-frequentie: ");
  if(txM<144||txM>145)
    printf("*** NIET IN DE AMATEURBAND ***\n");
  else
  {
    if(!freq2deeltal(txM, txk, &txA, &txB, 0, RASTER))
      showdeeltal(txA, txB);
    else
      ignoredeeltal(txA, txB);
  }
  printf("---\n\nLegenda: Dec=Decimaal, Hex=Hexadeximaal, Bin=Binair, 8/10=8 of 10 deler ingang\n");
   
  return 0;
}
