[Date Prev][Date Next][Thread Prev][Thread Next] - [Date Index][Thread Index][Author Index]

Re: AO40 Orbit 207 JPEGs



Paul thanks for the information!  Images are always cool...

I have inserted two C routines that I use to decode the D blocks as 
examples.  The variable  "Pref.exor"  is used to determine if the block 
needs to be  XOR'd or not.  Files from the archive often  don't need to 
be XOR'd.




Standard Disclaimer:  I want to be a programmer when I grow up;  I am 
not yet grown.


-------------------------------------------------------------------------------------------------------------------------

#include <math.h>
#include <stdio.h>
#include<stat.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

struct dblock {
					char				ID[5];
					short				NB;		// NB=Number of blocks
					short				NS;		// NS sequence number
					short				N;		// N = number of bytes in block
				};
				
// This routine is passed a telmetry block,
// it is assumed the input routine has already done a CRC check.

void d_decode(unsigned char block[])
{



	time_t lclTime;
	struct tm *now;
	char ts[256]; /* time string */
	extern struct Pref_conf Pref;			
	unsigned short				x,i;
	unsigned char		Dblock[500];
	char				temp[255];
	FILE				*fp6,*fp7;
	
	struct dblock bIndex;
					
	// get time UTC
	lclTime = time(NULL);
	now = gmtime(&lclTime);
  			
	// setup directories
	strftime(ts, 256, ":TLM Folder:%Y", now);		
	mkdir(ts,0);
	strftime(ts, 256, ":TLM Folder:%Y:%b", now);		
	mkdir(ts,0);
	strftime(ts, 256, ":TLM Folder:%Y:%b:%d", now);		
	mkdir(ts,0);
	strftime(ts, 256, ":TLM Folder:%Y:%b:%d:", now);
  			
	// pull fileID from telemetry block	
	bIndex.ID[0]=block[2];
	bIndex.ID[1]=block[3];
	bIndex.ID[2]='\0';
			
	sprintf(temp,"%sd.%s.raw",ts,bIndex.ID);
	fp6=fopen(temp,"a+b");
	
	sprintf(temp,"%sd.%s.index",ts,bIndex.ID);
	fp7=fopen(temp,"ab");
	
	// pull the other header information from the block.		
	bIndex.NB = (block[5] << 8) + (0x00ff & block[4]);
	bIndex.NS = (block[7] << 8) + (0x00ff & block[6]);
	bIndex.N = (block[509] << 8) + (0x00ff & block[508]);
	
	//sprintf(temp,"\rFileID = %s ,   NS= %d",bIndex.ID,bIndex.NB);	// debug	
	//TlmDraw(temp);	
		
	sprintf(temp,"\rSN= %d ,  N= %d\r",bIndex.NS,bIndex.N);		// debug	
	TlmDraw(temp);	
			

			
	for(x=8,i=0;i<bIndex.N;x++,i++){
			if(!Pref.exor){    // If the D block has not already been XORed
				Dblock[i]=(unsigned char)(x ^ block[x]);
				}else{
				Dblock[i]=block[x]; // If we are reading from 
archived D block that has been XORed
				}		
			}	
		
		// seek offset NS*500
		fseek(fp6,(bIndex.NS*500),0);
		
		// write block N in length
		fwrite(Dblock,1,bIndex.N,fp6);
		fclose(fp6);
		
		// update index
		fwrite(&bIndex,1,sizeof(struct dblock ),fp7);
		fclose(fp7);
		

}


// Routine that tracks percent of file received

void	checkIndex(void)
{
	
	SFTypeList			typeList={'TEXT','????',0,0};
	StandardFileReply 	reply;
	short				fileRefNum;
	struct dblock 	bIndex;
	unsigned char 	i=0,j;
	float			x=0;
	long			c;
	char			temp[255];//t[11];
	unsigned short 	NSarray[4096]; // Support 2MB filesize. Note the 
spec allows for files with upto 32MB in length.			
		
	c=sizeof(struct dblock);	
	
	StandardGetFile(nil,0,typeList,&reply);
	
	if(reply.sfGood == 0)
		{
		
			return;
		}	
		
	FSpOpenDF(&reply.sfFile,fsRdPerm,&fileRefNum);  // use file 
selection dialog
		while ( !(FSRead(fileRefNum,&c,&bIndex)) )  // read in index.
		{
			NSarray[bIndex.NS]=12340; 	// mark this sequence
			
			//sprintf(temp,"\r%s NS=%d",bIndex.ID,bIndex.NS);	// debug	
			//TlmDraw(temp);								
		}
	FSClose(fileRefNum);
	
	// Count how many blocks we have
	for(i=0,j=0;i<bIndex.NB;i++){
		if(NSarray[i] == 12340){
				j++;}
		}
	
	x=(float)j/bIndex.NB; // what percentae of "D" blocks have been 
captured
	
	sprintf(temp,"\r%s NB=%d x=%2.2f \r",bIndex.ID,bIndex.NB,x);	// debug	
			TlmDraw(temp);
			
}







Gilbert Mackall
N3RZN

----
Via the amsat-bb mailing list at AMSAT.ORG courtesy of AMSAT-NA.
To unsubscribe, send "unsubscribe amsat-bb" to Majordomo@amsat.org



AMSAT Top AMSAT Home