mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			125 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/* the routine unpk() is not in wsprd_utils.c */
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <unistd.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <math.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <stdint.h>
							 | 
						||
| 
								 | 
							
								#include <time.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "wsprd_utils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								unsigned int nhash_( const void *key, size_t length, uint32_t initval);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void unpk_(signed char message[], int *nhashtab, char call_loc_pow[])
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  int i,n1,n2,n3,ndbm,ihash,nadd,noprint,nh;
							 | 
						||
| 
								 | 
							
								  char callsign[13],grid[5],grid6[7],cdbm[3];
							 | 
						||
| 
								 | 
							
								  static char hashtab[32768][13];
							 | 
						||
| 
								 | 
							
								  FILE *fhash;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if(*nhashtab==1) {
							 | 
						||
| 
								 | 
							
								    char line[80], hcall[12];
							 | 
						||
| 
								 | 
							
								    if( (fhash=fopen("hashtable.txt","r+")) ) {
							 | 
						||
| 
								 | 
							
								      while (fgets(line, sizeof(line), fhash) != NULL) {
							 | 
						||
| 
								 | 
							
									sscanf(line,"%d %s",&nh,hcall);
							 | 
						||
| 
								 | 
							
									strcpy(*hashtab+nh*13,hcall);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      fhash=fopen("hashtable.txt","w+");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    fclose(fhash);
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if(*nhashtab==2) {
							 | 
						||
| 
								 | 
							
								    fhash=fopen("hashtable.txt","w");
							 | 
						||
| 
								 | 
							
								    for (i=0; i<32768; i++) {
							 | 
						||
| 
								 | 
							
								      if( strncmp(hashtab[i],"\0",1) != 0 ) {
							 | 
						||
| 
								 | 
							
									fprintf(fhash,"%5d %s\n",i,*hashtab+i*13);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    fclose(fhash);
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unpack50(message,&n1,&n2);
							 | 
						||
| 
								 | 
							
								  unpackcall(n1,callsign);
							 | 
						||
| 
								 | 
							
								  unpackgrid(n2, grid);
							 | 
						||
| 
								 | 
							
								  int ntype = (n2&127) - 64;
							 | 
						||
| 
								 | 
							
								  callsign[12]=0;
							 | 
						||
| 
								 | 
							
								  grid[4]=0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 Based on the value of ntype, decide whether this is a Type 1, 2, or 
							 | 
						||
| 
								 | 
							
								 3 message.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * Type 1: 6 digit call, grid, power - ntype is positive and is a member 
							 | 
						||
| 
								 | 
							
								         of the set {0,3,7,10,13,17,20...60}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * Type 2: extended callsign, power - ntype is positive but not
							 | 
						||
| 
								 | 
							
								         a member of the set of allowed powers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * Type 3: hash, 6 digit grid, power - ntype is negative.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if( (ntype >= 0) && (ntype <= 62) ) {
							 | 
						||
| 
								 | 
							
								    int nu=ntype%10;
							 | 
						||
| 
								 | 
							
								    if( nu == 0 || nu == 3 || nu == 7 ) {
							 | 
						||
| 
								 | 
							
								      ndbm=ntype;
							 | 
						||
| 
								 | 
							
								      memset(call_loc_pow,0,sizeof(char)*23);
							 | 
						||
| 
								 | 
							
								      sprintf(cdbm,"%2d",ndbm);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,callsign,strlen(callsign));
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow," ",1);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,grid,4);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow," ",1);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,cdbm,2);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,"\0",1);
							 | 
						||
| 
								 | 
							
								      ihash=nhash_(callsign,strlen(callsign),(uint32_t)146);
							 | 
						||
| 
								 | 
							
								      strcpy(*hashtab+ihash*13,callsign);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      nadd=nu;
							 | 
						||
| 
								 | 
							
								      if( nu > 3 ) nadd=nu-3;
							 | 
						||
| 
								 | 
							
								      if( nu > 7 ) nadd=nu-7;
							 | 
						||
| 
								 | 
							
								      n3=n2/128+32768*(nadd-1);
							 | 
						||
| 
								 | 
							
								      unpackpfx(n3,callsign);
							 | 
						||
| 
								 | 
							
								      ndbm=ntype-nadd;
							 | 
						||
| 
								 | 
							
								      memset(call_loc_pow,0,sizeof(char)*23);
							 | 
						||
| 
								 | 
							
								      sprintf(cdbm,"%2d",ndbm);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,callsign,strlen(callsign));
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow," ",1);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,cdbm,2);
							 | 
						||
| 
								 | 
							
								      strncat(call_loc_pow,"\0",1);
							 | 
						||
| 
								 | 
							
								      ihash=nhash_(callsign,strlen(callsign),(uint32_t)146);
							 | 
						||
| 
								 | 
							
								      strcpy(*hashtab+ihash*13,callsign);
							 | 
						||
| 
								 | 
							
								      noprint=0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } else if ( ntype < 0 ) {
							 | 
						||
| 
								 | 
							
								    ndbm=-(ntype+1);
							 | 
						||
| 
								 | 
							
								    memset(grid6,0,sizeof(char)*7);
							 | 
						||
| 
								 | 
							
								    strncat(grid6,callsign+5,1);
							 | 
						||
| 
								 | 
							
								    strncat(grid6,callsign,5);
							 | 
						||
| 
								 | 
							
								    ihash=(n2-ntype-64)/128;
							 | 
						||
| 
								 | 
							
								    if( strncmp(hashtab[ihash],"\0",1) != 0 ) {
							 | 
						||
| 
								 | 
							
								      sprintf(callsign,"<%s>",hashtab[ihash]);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      sprintf(callsign,"%5s","<...>");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    memset(call_loc_pow,0,sizeof(char)*23);
							 | 
						||
| 
								 | 
							
								    sprintf(cdbm,"%2d",ndbm);
							 | 
						||
| 
								 | 
							
								    strncat(call_loc_pow,callsign,strlen(callsign));
							 | 
						||
| 
								 | 
							
								    strncat(call_loc_pow," ",1);
							 | 
						||
| 
								 | 
							
								    strncat(call_loc_pow,grid6,strlen(grid6));
							 | 
						||
| 
								 | 
							
								    strncat(call_loc_pow," ",1);
							 | 
						||
| 
								 | 
							
								    strncat(call_loc_pow,cdbm,2);
							 | 
						||
| 
								 | 
							
								    strncat(call_loc_pow,"\0",1);
							 | 
						||
| 
								 | 
							
								                
							 | 
						||
| 
								 | 
							
								    noprint=0;
							 | 
						||
| 
								 | 
							
								                
							 | 
						||
| 
								 | 
							
								// I don't know what to do with these... They show up as "A000AA" grids.
							 | 
						||
| 
								 | 
							
								    if( ntype == -64 ) noprint=1;  
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  //  printf("\nUnpacked in C:    %s\n",call_loc_pow);
							 | 
						||
| 
								 | 
							
								}
							 |