#!/usr/bin/env slsh

private variable Data_Tables = Assoc_Type[];
private variable VHF_Cross_Repeater_Transmit_Freq = 440.7375;
private variable UHF_Cross_Repeater_Transmit_Freq = 146.5050;
private variable Bad_Transmit_Freq = 800.0;

private define add_data_table (name, table)
{
   variable s = struct
     {
	data = table, 
	mode = qualifier ("mode", "NFM"),
	deviation = qualifier ("dev", "NORM"),
	power = qualifier ("power", "HIGH"),
	tag_type = qualifier ("tag", "ALPHA"),
	tag_index = qualifier ("tagindex", 0),
	step="5 KHz",
	masked = "NO",
	dcs = "023",
	clk_sh = "OFF",
	scn_md = qualifier ("scn_md", "OFF"),
	transmit_freq = qualifier ("transmit", NULL),
     };
   Data_Tables[name] = s;
}

% Note: The 4th field in this table encodes the transmit frequency.
% If the value is a string, then it represents the shift in Mhz. 
% If it is NULL, then the transmit frequency is undefined.
% Otherwise it represents the transmit frequency in Mhz.
private variable Data_2m =
{
   % location, call, freq, shift, tone, pl
   {"GLOSTR", "W1GLO",	145.1300, "-0.6",	"TSQL",	107.2},
   {"BOSTN1", "W1BOS",	145.2300, "-0.6",	"TSQL",	88.5},
   {"WALTHM", "W1MHL",	146.6400, "-0.6",	"OFF",	88.5},
   {"BELMNT", "WA1RTT",	145.4300, "-0.6",	"TSQL",	67.0},
   {"NORWEL", "AC1M",	145.2500, "-0.6",	"TSQL",	77.0},
   {"HAVERL", "KT1S",	145.3500, "-0.6",	"TSQL",	136.5},
   {"DANVER", "NS1RA",	145.4700, "-0.6",	"TSQL",	136.5},
   {"STONHM", "N1NVL",	146.7150, "-0.6",	"TSQL",	146.2},
   {"STOTON", "K1VNU",	146.7750, "-0.6",	"TONE",	77.0},
   {"BROOKL", "K5TEC",	146.8200, "-0.6",	"TSQL",	146.2},
   {"WSTFRD", "WB1GOF",	146.9550, "-0.6",	"TSQL",	74.4},
   {"PAXTON", "W1BIM",	146.9700, "-0.6",	"TSQL",	114.8},
   {"NEWTN1", "W1TKZ",	147.0300, "+0.6",	"OFF",	88.5},
   {"NRWOOD", "W1JLI",	147.2100, "+0.6",	"TSQL",	100.0},
   {"WEYMTH", "AC1N",	147.3000, "+0.6",	"TSQL",	67.0},
   {"NEWTN2", "W1HEB",	147.3600, "+0.6",	"TSQL",	67.0},
};
add_data_table ("2m", Data_2m);
add_data_table ("2m_crossband", Data_2m; 
		transmit=VHF_Cross_Repeater_Transmit_Freq, power="LOW");

private variable Data_70cm =
{
   % location, call, freq, shift, tone, pl
   {"WESTON", "N1NOM",	442.7000, "+5.0",	"TSQL", 88.5},
   {"DANVER", "NS1RA",	442.8000, "+5.0",	"TONE", 136.5},
   {"NEWTON", "W1TKZ",	444.6000, "+5.0",	"TSQL", 88.5},
   {"BOSTN1", "W1KRU",	444.7000, "+5.0",	"TSQL", 88.5},
   {"BROOK1", "W1CLA",	446.3250, "-5.0",	"TSQL", 146.2},
   {"READNG", "WA1RHN",	446.5250, "-5.0",	"TSQL", 151.4},
   {"BOSTN2", "WA1PBJ", 446.5750, "-5.0",	"TSQL", 88.5},
   {"STONHM", "W1DYJ",	446.7250, "-5.0",	"TONE", 88.5},
   {"MEDFRD", "W1KN",	446.9250, "-5.0",	"TSQL", 88.5},
   {"BOSTN3", "WN9T",	447.1750, "-5.0", "TONE",	110.9},
   {"BROOK2", "K1IW",	447.8750, "-5.0", "TONE",	136.5},
%   {"BOSTN4", "W1NAU",	448.7250, "-5.0", "D343",	-1},
   {"WBOROH", "W1WNS",	448.7750, "-5.0",	"TSQL", 103.5},
   {"WALTHM", "WA1PBU",	449.0750, "-5.0",	"OFF",	88.5},
   {"MIT",    "W1XM",	449.7250, "-5.0",	"TSQL", 114.8},
   {"WOBURN", "N1OMJ",	449.8250, "-5.0",	"TSQL", 136.5},
};
add_data_table ("70cm", Data_70cm; tag="ALPHA");
add_data_table ("70cm_crossband", Data_70cm; 
		tag="ALPHA", transmit=UHF_Cross_Repeater_Transmit_Freq,
		power="LOW");

private variable Data_MURS = 
{
   % location, call, freq, shift, tone, pl
   {"MURS1",  "MURS1", 	151.8200, "0.0",	"OFF",	100.0},
   {"MURS2",  "MURS2", 	151.8800, "0.0",	"OFF",	100.0},
   {"MURS3",  "MURS3", 	151.9400, "0.0",	"OFF",	100.0},
   {"MURS4",  "MURS4", 	154.5700, "0.0",	"OFF",	100.0},
   {"MURS5",  "MURS5", 	154.6000, "0.0",	"OFF",	100.0},
};
add_data_table ("murs", Data_MURS; dev="HALF");

private variable Data_FRS =
{
   {"FRS1",   "FRS1",	462.5625, "0.0",	"OFF",	100.0},
   {"FRS2",   "FRS2",	462.5875, "0.0",	"OFF",	100.0},
   {"FRS3",   "FRS3",	462.6125, "0.0",	"OFF",	100.0},
   {"FRS4",   "FRS4",	462.6375, "0.0",	"OFF",	100.0},
   {"FRS5",   "FRS5",	462.6625, "0.0",	"OFF",	100.0},
   {"FRS6",   "FRS6",	462.6875, "0.0",	"OFF",	100.0},
   {"FRS7",   "FRS7",	462.7125, "0.0",	"OFF",	100.0},
   {"FRS8",   "FRS8",	467.5625, "0.0",	"OFF",	100.0},
   {"FRS9",   "FRS9",	467.5875, "0.0",	"OFF",	100.0},
   {"FRS10",  "FRS10",	467.6125, "0.0",	"OFF",	100.0},
   {"FRS11",  "FRS11",	467.6375, "0.0",	"OFF",	100.0},
   {"FRS12",  "FRS12",	467.6625, "0.0",	"OFF",	100.0},
   {"FRS13",  "FRS13",	467.6875, "0.0",	"OFF",	100.0},
   {"FRS14",  "FRS14",	467.7125, "0.0",	"OFF",	100.0},
};
add_data_table ("frs", Data_FRS; power="LOW", dev="HALF");

private variable Data_GMRS =
{
   {"GMRS1",  "GMRS1",	462.5500, "0.0",	"OFF",	100.0},
   {"GMRS2",  "GMRS2",	462.5750, "0.0",	"OFF",	100.0},
   {"GMRS3",  "GMRS3",	462.6000, "0.0",	"OFF",	100.0},
   {"GMRS4",  "GMRS4",	462.6250, "0.0",	"OFF",	100.0},
   {"GMRS5",  "GMRS5",	462.6500, "0.0",	"OFF",	100.0},
   {"GMRS6",  "GMRS6",	462.6750, "0.0",	"OFF",	100.0},
   {"GMRS7",  "GMRS7",	462.7000, "0.0",	"OFF",	100.0},
   {"GMRS8",  "GMRS8",	462.7250, "0.0",	"OFF",	100.0},
};
add_data_table ("gmrs", Data_GMRS; power="LOW", dev="HALF");

private variable Data_CB =
{
   {"CB01",   "CB01",	 26.9650, "0.0",	"OFF",	100.0},
   {"CB02",   "CB02",	 26.9750, "0.0",	"OFF",	100.0},
   {"CB03",   "CB03",	 26.9850, "0.0",	"OFF",	100.0},
   {"CB04",   "CB04",	 27.0050, "0.0",	"OFF",	100.0},
   {"CB05",   "CB05",	 27.0150, "0.0",	"OFF",	100.0},
   {"CB06",   "CB06",	 27.0250, "0.0",	"OFF",	100.0},
   {"CB07",   "CB07",	 27.0350, "0.0",	"OFF",	100.0},
   {"CB08",   "CB08",	 27.0550, "0.0",	"OFF",	100.0},
   {"CB09",   "CB09",	 27.0650, "0.0",	"OFF",	100.0},
   {"CB10",   "CB10",	 27.0750, "0.0",	"OFF",	100.0},
   {"CB11",   "CB11",	 27.0850, "0.0",	"OFF",	100.0},
   {"CB12",   "CB12",	 27.1050, "0.0",	"OFF",	100.0},
   {"CB13",   "CB13",	 27.1150, "0.0",	"OFF",	100.0},
   {"CB14",   "CB14",	 27.1250, "0.0",	"OFF",	100.0},
   {"CB15",   "CB15",	 27.1350, "0.0",	"OFF",	100.0},
   {"CB16",   "CB16",	 27.1550, "0.0",	"OFF",	100.0},
   {"CB17",   "CB17",	 27.1650, "0.0",	"OFF",	100.0},
   {"CB18",   "CB18",	 27.1750, "0.0",	"OFF",	100.0},
   {"CB19",   "CB19",	 27.1850, "0.0",	"OFF",	100.0},
   {"CB20",   "CB20",	 27.2050, "0.0",	"OFF",	100.0},
   {"CB21",   "CB21",	 27.2150, "0.0",	"OFF",	100.0},
   {"CB22",   "CB22",	 27.2250, "0.0",	"OFF",	100.0},
   {"CB23",   "CB23",	 27.2550, "0.0",	"OFF",	100.0},
   {"CB24",   "CB24",	 27.2350, "0.0",	"OFF",	100.0},
   {"CB25",   "CB25",	 27.2450, "0.0",	"OFF",	100.0},
   {"CB26",   "CB26",	 27.2650, "0.0",	"OFF",	100.0},
   {"CB27",   "CB27",	 27.2750, "0.0",	"OFF",	100.0},
   {"CB28",   "CB28",	 27.2850, "0.0",	"OFF",	100.0},
   {"CB29",   "CB29",	 27.2950, "0.0",	"OFF",	100.0},
   {"CB30",   "CB30",	 27.3050, "0.0",	"OFF",	100.0},
   {"CB31",   "CB31",	 27.3150, "0.0",	"OFF",	100.0},
   {"CB32",   "CB32",	 27.3250, "0.0",	"OFF",	100.0},
   {"CB33",   "CB33",	 27.3350, "0.0",	"OFF",	100.0},
   {"CB34",   "CB34",	 27.3450, "0.0",	"OFF",	100.0},
   {"CB35",   "CB35",	 27.3550, "0.0",	"OFF",	100.0},
   {"CB36",   "CB36",	 27.3650, "0.0",	"OFF",	100.0},
   {"CB37",   "CB37",	 27.3750, "0.0",	"OFF",	100.0},
   {"CB38",   "CB38",	 27.3850, "0.0",	"OFF",	100.0},
   {"CB39",   "CB39",	 27.3950, "0.0",	"OFF",	100.0},
   {"CB40",   "CB40",	 27.4050, "0.0",	"OFF",	100.0},
};
add_data_table ("cb", Data_CB; power="LOW", mode="AM");

private variable Data_FM =
{
   {"WGBH",   "WGBH",	 89.7000, NULL,	"OFF",	100.0},
   {"WBUR",   "WBUR",	 90.9000, NULL,	"OFF",	100.0},
};
add_data_table ("fm", Data_FM; power="LOW", mode="WFM", scn_md="SKIP");

private variable Data_MBTA = 
{
   {"REDLIN", "REDLIN",	470.4125, NULL,	"OFF",	100.0},
   {"MBTAF1", "MBTAF1",	470.6625, NULL,	"OFF",	100.0},
   {"MBTAF2", "MBTAF2",	483.5625, NULL,	"OFF",	100.0},
   {"PORTBL", "PORTBL", 153.7550, NULL, "OFF",  100.0},
   {"MICPHN", "MICPHN", 154.5700, NULL, "OFF",  100.0},
   {"TR2DSN", "TR2DSN",	161.5200, NULL,	"OFF",	100.0},
   {"TR2DS1", "TR2DS1",	161.4900, NULL,	"OFF",	100.0},
   {"TR2DS2", "TR2DS2",	161.6950, NULL,	"OFF",	100.0},
   {"DS2TRN", "DS2TRN",	161.1600, NULL,	"OFF",	100.0},
   {"TRNYRD", "TRNYRD",	160.8750, NULL,	"OFF",	100.0},
   {"DS2TR",  "DS2TR",	160.5900, NULL,	"OFF",	100.0},
   {"TRNDS",  "TRNDS",	160.3200, NULL,	"OFF",	100.0},
};
add_data_table ("mbta", Data_MBTA; power="LOW");

private variable Data_Police = 
{
   {"PCMBRDG", "PCMBRDG", 470.3125, NULL, "OFF", 88.5},
   {"FCMBRDG", "FCMBRDG", 471.3125, NULL, "OFF", 88.5},
   {"MITEMS",  "MITEMS",  461.7750, NULL, "OFF", 88.5},
   {"PMIT",    "PMIT",    472.5375, NULL, "OFF", 88.5},
};
add_data_table ("police", Data_Police; power="LOW");

    
private define write_data (fp, name, startp)
{
   variable s = Data_Tables[name];
   variable num = @startp;
   variable data = s.data;
   variable transmit_freq = s.transmit_freq;
   foreach (data)
     {
	variable item = ();
	variable freq = item[2];
	variable tag = item[s.tag_index];
	variable shift = item[3];
	variable rpt = "+RPT";
	if (transmit_freq != NULL)
	  shift = transmit_freq;

	if (typeof (shift) == String_Type)
	  {
	     shift = atof (shift);
	     if (shift == 0)
	       rpt = "SIMP";
	     if (shift < 0)
	       {
		  shift = -shift;
		  rpt = "-RPT";
	       }
	  }
	else if (typeof (shift) == Double_Type)
	  rpt = "DUP";
	else if (shift == NULL)
	  {
	     rpt = "DUP";
	     shift = Bad_Transmit_Freq;
	  }

	variable tone = item[4];
	if (tone == "TSQL")
	  {
	     tone = "T SQL";
	     tone = "TONE";	       %  The vx-2 is buggy
	  }

	variable pl = item[5];

	variable masked = s.masked;
	variable tag_type = s.tag_type;
	variable mode = s.mode;
	variable scn_md = s.scn_md;
	variable step = s.step;
	variable dcs = s.dcs;
	variable power = s.power;
	variable dev = s.deviation;
	variable clk_sh = s.clk_sh;

	() = fprintf (fp, "%d,%s,%.4f,%s,%s,%s,%s,%s,%s,%.4f,%s,%.1f,%s,%s,%s,%s\r\n",
		      num, tag, freq, tag_type, mode, scn_md,
		      step, masked, rpt, shift, tone, pl, 
		      dcs, power, dev, clk_sh);
	num++;
     }
   @startp = num;
}

private define write_header (fp)
{
   () = fputs ("#,Tag,Freq,Name,Mode,Scn Md,Step,Masked,RPT SH,Shift,TS/DCS,Tone,DCS,TX Pwr,Dev,Clk Sh\r\n", fp);
}


define slsh_main ()
{
   variable num;
   variable fp = stdout;
   write_header (fp);

   num = 1;   
   write_data (fp, "2m", &num);
   num = 50;  
   write_data (fp, "70cm", &num);

   num = 100;
   write_data (fp, "2m_crossband", &num);
   num = 150;
   write_data (fp, "70cm_crossband", &num);

   num = 200;
   write_data (fp, "murs", &num);
   write_data (fp, "frs", &num);
   write_data (fp, "gmrs", &num);

   num = 250;
   write_data (fp, "cb", &num);

   num = 300;
   write_data (fp, "fm", &num);

   num = 400;
   write_data (fp, "mbta", &num);
   
   num = 500;
   write_data (fp, "police", &num);
}

   
