mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-27 14:48:46 -05:00
88e838a76d
Any band can be added to the schedule for a day phase, when a coordinated band slot is not available a random band will be chosen from all the bands enabled for the current phase (Day, Night, etc.). Fine tuned the size of the hopping schedule table widget. Coloured the coordinated band columns in the schedule table widget. Due to the full range of bands now being supported, the settings key for the band hopping schedule has been changed forcing current testers to redefine their schedultes. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5543 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
192 lines
3.7 KiB
C++
192 lines
3.7 KiB
C++
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <ctime>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
|
|
namespace
|
|
{
|
|
char tx[6][10];
|
|
int tx_table_2hr_slot=-1, tx_table_pctx=0;
|
|
};
|
|
|
|
int tx_band_sum(char bsum[10])
|
|
{
|
|
int i,j;
|
|
|
|
for (j=0; j<10; j++) {
|
|
bsum[j]=0;
|
|
for (i=0; i<6; i++) {
|
|
bsum[j]=bsum[j]+tx[i][j];
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int tx_add_to_band(int band)
|
|
{
|
|
// add tx cycle to a band without regard to ntxlim
|
|
int i,islot;
|
|
for ( i=0; i<10; i++) {
|
|
islot=rand()%6;
|
|
if( tx[islot][band] != 1 ) {
|
|
tx[islot][band]=1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int tx_sum()
|
|
{
|
|
int i,j,sum=0;
|
|
for (i=0; i<6; i++) {
|
|
for (j=0; j<10; j++) {
|
|
sum=sum+tx[i][j];
|
|
}
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
int tx_add_one(char* tx)
|
|
{
|
|
int i;
|
|
for (i=1; i<59; i++) {
|
|
if( tx[i-1]==0 && tx[i]==0 && tx[i+1]==0 ) {
|
|
tx[i]=1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int tx_trim(char* tx, int ntxlim)
|
|
{
|
|
// trim array to that ntxlim is not exceeded
|
|
int i,nrun,sum;
|
|
nrun=0;
|
|
for (i=0; i<60; i++) {
|
|
if( tx[i]==1 ) {
|
|
nrun++;
|
|
if( nrun > ntxlim ) {
|
|
tx[i]=0;
|
|
nrun=0;
|
|
}
|
|
} else {
|
|
nrun=0;
|
|
}
|
|
}
|
|
sum=0;
|
|
for (i=0; i<60; i++) {
|
|
sum=sum+tx[i];
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
void tx_print()
|
|
{
|
|
int i,j;
|
|
for (i=0; i<6; i++) {
|
|
for (j=0; j<10; j++) {
|
|
if( (i*10+j)%10 == 0 && i>=0 ) printf("\n");
|
|
printf("%d ",tx[i][j]);
|
|
}
|
|
}
|
|
printf("\n");
|
|
fflush(stdout);
|
|
}
|
|
|
|
int create_tx_schedule(int pctx)
|
|
{
|
|
char bsum[10];
|
|
int i, j, k, sum, ntxlim, ntxbandmin, needed;
|
|
int iflag;
|
|
|
|
needed=60*(pctx/100.0)+0.5;
|
|
|
|
srand(time(NULL));
|
|
memset(tx,0,sizeof(char)*60);
|
|
|
|
if( pctx < 17 ) {
|
|
needed=pctx*60/100;
|
|
for (i=0; i<needed; i++) {
|
|
tx[rand()%6][rand()%10]=1;
|
|
}
|
|
return 1;
|
|
} else if( pctx >= 17 && pctx < 33 ) {
|
|
ntxlim=1;
|
|
ntxbandmin=1;
|
|
} else if( pctx >= 33 && pctx < 50 ) {
|
|
ntxlim=1;
|
|
ntxbandmin=2;
|
|
} else if( pctx >= 50 && pctx < 60 ) {
|
|
ntxlim=2;
|
|
ntxbandmin=3;
|
|
} else {
|
|
ntxlim=3;
|
|
ntxbandmin=4;
|
|
}
|
|
|
|
// start by filling each band slot with ntxbandmin tx's
|
|
for (i=0; i<ntxbandmin; i++) {
|
|
for (j=0; j<10; j++) {
|
|
tx_add_to_band(j);
|
|
}
|
|
}
|
|
// trim so that no more than ntxlim successive transmissions
|
|
sum=tx_trim(*tx,ntxlim);
|
|
j=0;
|
|
iflag=0;
|
|
while (j<100 && iflag==0) {
|
|
// now backfill columns that got trimmed
|
|
tx_band_sum(bsum);
|
|
|
|
iflag=1;
|
|
for (i=0; i<10; i++) {
|
|
if( bsum[i] < ntxbandmin ) {
|
|
iflag=0;
|
|
for (k=0; k<ntxbandmin-bsum[i]; k++) {
|
|
tx_add_to_band(i);
|
|
}
|
|
}
|
|
}
|
|
sum=tx_trim(*tx,ntxlim);
|
|
j++;
|
|
}
|
|
|
|
for(j=0; j < (needed-sum); j++ ) {
|
|
tx_add_one(*tx);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int next_tx_state(int pctx)
|
|
{
|
|
time_t now=time(0)+30;
|
|
tm *ltm = localtime(&now);
|
|
int hour = ltm->tm_hour;
|
|
int minute = ltm->tm_min;
|
|
|
|
int tx_2hr_slot = hour/2;
|
|
int tx_20min_slot = (hour-tx_2hr_slot*2)*3 + minute/20;
|
|
int tx_2min_slot = (minute%20)/2;
|
|
|
|
if( (tx_2hr_slot != tx_table_2hr_slot) || (tx_table_pctx != pctx) ) {
|
|
create_tx_schedule(pctx);
|
|
tx_table_2hr_slot = tx_2hr_slot;
|
|
tx_table_pctx = pctx;
|
|
}
|
|
|
|
// tx_print();
|
|
return tx[tx_20min_slot][tx_2min_slot];
|
|
}
|
|
|
|
int next_hopping_band()
|
|
{
|
|
time_t now=time(0)+30;
|
|
tm *ltm = localtime(&now);
|
|
int minute = ltm->tm_min;
|
|
int tx_2min_slot = (minute%20)/2;
|
|
return tx_2min_slot;
|
|
}
|