/* Geprogrammeerd door: Mark Stoopman in december 2004 */
#include "lcd.h"

typedef unsigned char byte;
typedef unsigned short word;

volatile word* TOC2=(word*)0x1018;
volatile byte* TCTL1=(byte*)0x1020;
volatile byte* TMSK1=(byte*)0x1022;
volatile byte* TFLG1=(byte*)0x1023;
volatile byte* TMSK2=(byte*)0x1024;
volatile word* TCNT=(word*)0x100E;

void tijd(int);

const char str[] = "SOS"; 
// te verzenden tekst
const int punttijd = 100; 
// tijd in ms Groter maken voor slow motion Morse 

const byte morse[]={
	0x06,0x17,0x15,0x0B,0x03,0x1D,0x09,0x1F,0x07,0x18,
	0x0A,0x1B,0x04,0x05,0x08,0x19,0x12,0x0D,0x0F,0x02,
	0x0E,0x1E,0x0C,0x16,0x14,0x13,0x20,0x30,0x38,0x3C,
	0x3E,0x3F,0x2F,0x27,0x23,0x21
};

int main() {
	int i=0;	
	void playmorse(int);
	lcd_init();
	lcd_clrscr();
	*TMSK2|=0x01;
	while ((str[i]!='\0')) {
		lcd_putc(str[i]);
		if (str[i]==' ') {
			*TCTL1=0x80;
			tijd(4);
		}
		else {
			if (str[i]>='A' && str[i]<='Z') {
				playmorse(str[i]-'A');
			} else if (str[i]>='a' && str[i]<='z') {
				playmorse(str[i]-'a');
			} else if (str[i]>='0' && str[i]<='9') {
				playmorse(str[i]-'0'+26);
			}  
			*TCTL1=0x80;
			tijd(2);
		}   
		i++;	
	}	
	while(1);
	return 0;
}

void playmorse(int index) {	
	int bitcheck=0,morsecode=0,eerstebit=0;
	int teller=0,output=0,tijdsduur=0;		
	bitcheck=0x80;
	do {
		morsecode=morse[index];
		bitcheck>>=1;
		eerstebit++;
	} while ((morsecode&=bitcheck)!=bitcheck);
	morsecode=morse[index];	  
	for (teller=0;teller<(7-eerstebit);teller++) {
		bitcheck>>=1;
		output=morsecode;
		output&=bitcheck;
		if (output>=1) {
			output=1;	
			tijdsduur=1;
		} 		
		else {
			tijdsduur=3;
		}
		*TCTL1=0x40;
		tijd(tijdsduur);
		*TCTL1=0x80;
		tijd(1);
	}
}

void tijd(int tijdsd) {
	int msecteller=0;
	*TOC2=*TCNT;
	do {
		*TOC2+=1000;
		while ((*TFLG1&0x40)!=0x40);	
		msecteller++;	
		*TFLG1|=0x40;
	} while(msecteller!=tijdsd*punttijd);
	msecteller=0;	
}


