Alt 10.05.2005, 14:08   #1
Acidmrp
Handy Gott
Benutzerbild von Acidmrp
Registriert seit: 17.11.2002
Beiträge: 2.723
Code:
/*

miniGPS for x65
version: 0.8
author: ACiD[mrp], arsh0r
thx to: SiNgle, bennie
last modified: 10.05.2005


GSM DEVELOPMENT CREW - www.gsm-dev.com

version history:
v0.8: modified by ACiD[mrp]
      - in v0.7 there was an problem, the filesystem has 
        caused an crash sometimes. I hope this is fixed now.

v0.7: modified by ACiD[mrp]
      - redesign of the file "lastnet.tmp"
         -> faster & bugfix
      - no more need to create gps folder, folder will be created by patch
      - for every LAC there will be one folder

v0.6: modified by ACiD[mrp]
	  - added function to tmo files:
	    v: vibrate two times 
	    
v0.5: modified by ACiD[mrp]
	  - added more functions to tmo files
        
        [action] [space] [text to be displayed]
    
		action: command
		0: do nothing
		1-8: switch to profile 1-8
		a: Alarm
		q: shutdown phone	  
	  
	  
v0.4: modified by ACiD[mrp]
	  - logfile
	  
v0.3: modified by ACiD[mrp]

	  - added "change profile"
	  - changed file format into tmo. This format is directly editable
	    on the phone.
	    
	    Use this String:
	    
	    [profile number] [space] [text to be displayed]
	    
	    profile number is between 1 and 8. If the profile should be not changed
	    use 0 as profile number.
	    
	    Example:
	    
	    "0 home" will display "home" on screen and not change the profile
	    "1 work" will display "work" on screen and change profile to normal
	             environment.

      - now saving default text to files
      
v0.2: seem stable now
v0.1: beta for developers

*/

#include "..\shared\x65.h"
 
#define S65V43

#ifdef S65V43

	#define NETDataAddress 0xA867CE6C
	
	// File handling
	g_fopen fopen = (g_fopen)(0xA1230020);
	g_fwrite fwrite = (g_fwrite)(0xA1230148);
	g_lseek lseek = (g_lseek)(0xA122FFD4);
	g_fclose fclose = (g_fclose)(0xA122FF74);
	g_OpenReadCloseFile OpenReadCloseFile = (g_OpenReadCloseFile)(0xA0BDA69E + 1); 

	// File System Handling
	g_mkdir mkdir = (g_mkdir)(0xA128C710);

	// Memory
	g_malloc malloc = (g_malloc)(0xA0820F98);
	g_mfree mfree = (g_mfree)(0xA0821000);
	g_mfree_high mfree_high = (g_mfree_high)(0xA0BDE238 + 1);

	// Date / Time
	GETDATETIME getdate = (GETDATETIME)0xA0C39EBB;	

	// Strings
	f_strlen strlen = (f_strlen)(0xA167062C + 1);
	g_strcat strcat = (g_strcat)(0xA16704CC + 1);
	g_strchr strchr = (g_strchr)(0xA16704EC + 1);
	g_strcmp strcmp = (g_strcmp)(0xA1670510);
	f_strcpy strcpy = (f_strcpy)(0xA16705AC + 1);
	f_sprintf sprintf = (f_sprintf)0xA1670449;

	// Other
	g_AlarmClockRing AlarmClockRing = (g_AlarmClockRing)(0xA0AA7112 + 1);
	g_SwitchPhoneOff SwitchPhoneOff = (g_SwitchPhoneOff)(0xA1264F20);
	g_SetProfile SetProfile = (g_SetProfile)(0xA08C87CE + 1);
	g_editOrNewTXTModule editOrNewTXTModule = (g_editOrNewTXTModule)(0xA0A49994 + 1);
	g_PlaySoundLoop PlaySoundLoop = (g_PlaySoundLoop)(0xA0948AE8);
#endif


void copystrtowstr(char *src, unsigned short *dest, unsigned char *count);
unsigned char XORCheck(char *str);
void chartounicode(char *src, char *dest);
void saveTMOfile(char *filename, char *text);
void decodeTMOfile(char *src, char *dest);
void addLogFileEntry(char *cLine);
int isNewNet(unsigned int iCID);
void minigps(struct WString* pws);


void entryScreensaver(int a, struct WString* pws, int b) {
	minigps(pws);
	return;
}

void entryMainscreen(struct WString* pws) {
	minigps(pws);
	return;
}

void minigps(struct WString* pws) {
	char *filename;
	char *filedir;
	char *rootdir;
	unsigned char count = 1;
	unsigned short *p = pws->pstr; 
	const struct NetData* net = (struct NetData *)NETDataAddress;
	int iProfileNumber;
	unsigned int iError;
	unsigned int iLAC;
	unsigned int iCID;
	
	char *out;
	char *filebuffer;
	int size;

	iLAC = net->LAC;
	iCID = net->CI;
	
	rootdir = malloc(32);
	filedir = malloc(64);
	filename = malloc(64);
	out = malloc(64);
	
	sprintf(rootdir, "0:\\Misc\\gps\0");
	//mkdir(1, rootdir, &iError);

	sprintf(filedir, "%s\\%i\0", rootdir, iLAC);
	//mkdir(1, filedir, &iError);

	sprintf(filename, "%s\\%i-%i.tmo\0", filedir, iCID, iLAC);
	
	size = OpenReadCloseFile(filename, &filebuffer);

	if(size == -1){
		if (iCID != 0) {		
			sprintf(out, "0 cell:%i-%i\0", iCID, iLAC);
			mkdir(1, filedir, &iError);
			saveTMOfile(filename, out);
			
			// create logfile entry
			sprintf(out, "new network found [Cell ID:%i, LAC:%i]\0", iCID,iLAC);
			addLogFileEntry(out);

			sprintf(out, "saving %i-%i\0", iCID, iLAC);
		}
		else {
			if (isNewNet(iCID)) {
				// create logfile entry
				sprintf(out, "no network\0");
				addLogFileEntry(out);
			}
		}
		copystrtowstr(out, &p[count], &count);
	}
	else {
		decodeTMOfile(filebuffer, filebuffer);


		if (isNewNet(iCID)) {  // change Profile, Alarm, Log Entry only on new network
			
			// create logfile entry
			sprintf(out, "Network change: [Cell ID:%i, LAC:%i] (%s)\0", iCID, iLAC, &filebuffer[2]);
			addLogFileEntry(out);
			
			if (filebuffer[0] > '0' && filebuffer[0] < '9') {
				iProfileNumber = filebuffer[0] - '1';
				// change Profile
				SetProfile(iProfileNumber);

				// create logfile entry
				sprintf(out, "Profile change: %i\0", iProfileNumber);
				addLogFileEntry(out);
			} else if (filebuffer[0] == 'a' || filebuffer[0] == 'A') {
				addLogFileEntry("Alarm Clock\0");
				AlarmClockRing();
			} else if (filebuffer[0] == 'q' || filebuffer[0] == 'Q') {
				addLogFileEntry("Switching the phone off\0");
				SwitchPhoneOff();
			} else if (filebuffer[0] == 'v' || filebuffer[0] == 'V') {
				PlaySoundLoop(0x2F, 1, 2); // Vibrate 2 times
			} else if (filebuffer[0] == 'e' || filebuffer[0] == 'E') {
				copystrtowstr(filename, &p[count], &count);
				pws->buflen=count-1;
				editOrNewTXTModule(pws);
			}			
			
		}
		
		copystrtowstr(&filebuffer[2], &p[count], &count);
		mfree_high(filebuffer);
	}

	*p = count-1;
	
	mfree(rootdir);
	mfree(filedir);
	mfree(filename);
	mfree(out);
}

int isNewNet(unsigned int iCID)
{
	//const struct NetData* net = (struct NetData *)NETDataAddress;
	char *cFile;
	char *filename;
	int iFileSize;
	int iLastNet;
	int iReturn;
	int iFileHandle;
	unsigned int iError;
		
	filename = malloc(32);
	
	sprintf(filename, "0:\\Misc\\gps\\lastnet.tmp\0");
	
	iFileSize = OpenReadCloseFile(filename, &cFile);
	iReturn = 0;
	 
	if (iFileSize != -1) {
		iLastNet = cFile[1] * 0x100 + cFile[0];
		if (iCID != iLastNet) {
			iReturn = 1;
		}
		mfree_high(cFile);
	}	
	
	if (iReturn || iFileSize == -1) {
		// save new network as last network
		iFileHandle = fopen(filename, A_Create + A_WriteOnly, P_WRITE, &iError);

		if (iFileHandle != -1) { 
			cFile = malloc(2);
			cFile[0] = (iCID & 0xFF);
			cFile[1] = (iCID & 0xFF00) >> 8;
				
			fwrite(iFileHandle, cFile, 2, &iError);
			fclose(iFileHandle, &iError);
			mfree(cFile);
		}
	}
	
	mfree(filename);
	
	return iReturn; 	
}

void addLogFileEntry(char *cLine)
{
	struct DateInfo date;
	struct TimeInfo time;
	char *filename;	
	char *out;
	char *cdate;
	char *ctime;
	int iFileHandle;
	unsigned int iError;
	
	filename = malloc(32);
	out = malloc(64);
	cdate = malloc(16);
	ctime = malloc(16);
	
	getdate(&date, &time);
	
	sprintf(filename, "0:\\Misc\\gps\\_logfile.txt\0");
	

	iFileHandle = fopen(filename, A_Create + A_WriteOnly + A_Append, P_WRITE, &iError);	// write, append
	if (iFileHandle != -1) {
		sprintf(out, "[%i.%i.%i - %i:%i:%i] \0", date.day, date.month, date.year, time.hour, time.minute, time.sec);
		
		fwrite(iFileHandle, out, strlen(out), &iError);
		fwrite(iFileHandle, cLine, strlen(cLine), &iError);
		fwrite(iFileHandle, "\x0d\x0a", 2, &iError); // new line
		fclose(iFileHandle, &iError);	
	}	
	
	mfree(filename);
	mfree(out);	
	mfree(cdate);	
	mfree(ctime);	
}

void saveTMOfile(char *filename, char *text)
{
	unsigned char cLength;
	unsigned char cXORCheck;
	int iFileHandle;
	unsigned int iError;
	
	char *filebuffer;
	char *out;
	
	filebuffer = malloc(256);
	out = malloc(2);
	out[1] = 0;
	
	cLength = strlen(text);
	cXORCheck = XORCheck(text) ^ cLength;
	
	
	chartounicode(text, filebuffer);
	
	iFileHandle = fopen(filename, A_Create + A_WriteOnly, P_WRITE, &iError);
	lseek (iFileHandle, 0, S_SET, &iError);

	out[0] = cLength;
	fwrite(iFileHandle, out, 2, &iError); // write header

	fwrite(iFileHandle, filebuffer, cLength * 2, &iError); // write text

	out[0] = cXORCheck;
	fwrite(iFileHandle, out, 2, &iError); // write XOR check

	fclose(iFileHandle, &iError);
		
	
	mfree(filebuffer);
	mfree(out);
}

void decodeTMOfile(char *src, char *dest)
{
	unsigned int iSize;
	unsigned int i;
	iSize = src[0];
	for (i = 0; i < iSize; i++) {
		dest[i] = src[i * 2 + 2];
	}
	dest[iSize] = 0x00;
}

void chartounicode(char *src, char *dest)
{
	unsigned int count = 0;
	unsigned int count2 = 0;
	while(src[count] != 0) {
		dest[count2] = src[count++];
		dest[count2+1] = 0x00;
		count2 += 2;
	}
}

unsigned char XORCheck(char *str)
{
	unsigned char chk = 0;
	unsigned int i=0;
	while(str[i] != 0) chk ^= str[i++];
	return chk;
}

void copystrtowstr(char *src, unsigned short *dest, unsigned char *count) {
	while(*src != 0) {
		*dest++ = *src++;
		*count += 1;
	}	
}

Geändert von Acidmrp (12.05.2005 um 05:46 Uhr)
Acidmrp ist offline   Mit Zitat antworten
Alt 11.05.2005, 17:21   #2
arsh0r
Benutzer
Registriert seit: 13.07.2003
Beiträge: 46
0.9

decodeTMOfile hat den unicode support gekillt (blöd für andere zeichensätze).
hab versucht die isNewNet routine mit ner variable im RAM zu lösen(wär doch viel prozessorschonender), aber irgendwas hab ich verdummt, blick nimmer durch der schreibt den scheiss wert einfach nich ins ram, vielleicht weiss ja einer von euch weiter...
die c datei überschreitet die maximale zeichen länge...
http://www.2chaos.de/discord23/download/minigps0.9.c
arsh0r ist offline   Mit Zitat antworten
Alt 11.05.2005, 20:00   #3
Acidmrp
Handy Gott
Benutzerbild von Acidmrp
Registriert seit: 17.11.2002
Beiträge: 2.723
hab mir auch überlegt das mir einer Variablen im RAM zu machen, aber woher wissen wir welche RAM Position nicht verwendet wird? eine globale Variable wär super...

Ich schau mir dein C File gleich mal an.
Acidmrp ist offline   Mit Zitat antworten
Alt 12.05.2005, 01:21   #4
arsh0r
Benutzer
Registriert seit: 13.07.2003
Beiträge: 46
der komplette bereich von A8100000-A81FFFFF ist normalerweise frei, wird dann wahrscheinlich für java verwendet. wenn unsere variable dort überschrieben wird... wen jukts?... minigps wird sowieso nur im mainscreen/screensaver aufgerufen, da iss der bereich ja frei, dann schreibt er halt einmal mehr network change in den log...

edit: hab da nochn kleinen bug gefunden:
Code:
 		else {
 			if (isNewNet(iCID)) {
 				// create logfile entry
 				sprintf(out, "no network\0");
 				addLogFileEntry(out);
 			}
 		}
glaub das sprintf gehört vor das if sonst gibt er später den buffer aus, ohne das was reingeschrieben wurde...

Geändert von arsh0r (12.05.2005 um 01:54 Uhr)
arsh0r ist offline   Mit Zitat antworten
Alt 12.05.2005, 05:24   #5
Acidmrp
Handy Gott
Benutzerbild von Acidmrp
Registriert seit: 17.11.2002
Beiträge: 2.723
ja, du hast recht, dass ist noch ein Fehler. Ich werde den heute raus machen und
mal testen ob ich die Sache mit Lastnet im RAM zum laufen bekomme. Wär schon um
einiges besser.

Zwei Sachen hab ich mir noch überlegt:
1) Die Commands etwas zu ändern:
z.B.:
"V " -> vibriert 2 mal, "V3 " vibriert drei mal
"P5 " -> Profil 5

oder gar:
"V,P5" -> 2 mal vibrieren und zu Profil 5 schalten

2) Skript Files, wo man z.B. festlegen kann:
wenn das Handy in Netz A, B, C war und dann in Netz D, E, F kommt soll der Wecker
klingeln.

Das mit dem Skript würd ich sehr einfach halten, man müsste immer 3 alternativen
angeben, wenn die nicht benötigt werden muss man halt drei mal das gleiche Netz
angeben.

Das ist z.B. sinnvoll wenn man abends mit dem Zug heimfährt und am Zielbahnhof
geweckt werden will. Dann klingelt das Handy nicht immer wenn man sich in das
Netz einbucht, sondern wirklich nur auf der Heimfahrt.

EDIT: mit der v9 bekomm ich Probleme. Ich hab einen "Data_Abort!"
ich hab darum mal zwei Änderungen an der v8 gemacht:

Hier war ein kleiner Bug, wenn sich das Netz ändert muss das neue
geschrieben werden, nicht wenn es gleich bleibt, sonst wird nie was
geschrieben (klappt nun auch):

Code:
int isNewNet(unsigned int iCID)
{
	unsigned int* iLastNet = (unsigned int*)0xA8101000;
	int iReturn;
	
	if (iCID != *iLastNet) {
		*iLastNet = iCID;
		iReturn = 1;	
	}
	else {
		iReturn = 0;
	}
	return iReturn;
}
und dann noch die "no net" Sache.

Geändert von Acidmrp (12.05.2005 um 05:41 Uhr)
Acidmrp ist offline   Mit Zitat antworten
Alt 12.05.2005, 10:56   #6
arsh0r
Benutzer
Registriert seit: 13.07.2003
Beiträge: 46
ou ich depp, hab mich echt gewundert, warum der da sich weigert was ins ram zu schreiben...
skripts wär scho ne coole sache. da könnte man z.b. auch in der netztabelle(s-0-6) nach speziellen kennungen suchen um die standortbestimmung genauer zu machen(bei mir im zimmer wechselt er immer zwischen 2 cids. ausserdem wär nen configfile net schlecht, wo z.b. den logging modus ausschalten kann (zu debuggen iss er ja ganz sinnvoll, aber sonst wächst die datei immer weiter an...)
arsh0r ist offline   Mit Zitat antworten
Alt 12.05.2005, 22:47   #7
Osiu
Benutzer
Registriert seit: 13.07.2004
Beiträge: 14
Fände es ganz praktisch wenn man die Ordner umbennen könnte also z.B. nach dem Ort/Stadtteil: "Schwabing-xxxxxx" xxx = iLAC
Weil sonst hat man irgendwann tausend Ordner und kein Plan was wohin gehört. Kann allerdings sein, dass das ganze so zu kompliziert/zu läßtig für das Handy wird (jeden Ordner zu überprüfen).

Grüße
Osiu ist offline   Mit Zitat antworten
Alt 13.05.2005, 08:37   #8
Acidmrp
Handy Gott
Benutzerbild von Acidmrp
Registriert seit: 17.11.2002
Beiträge: 2.723
die Ordner selber umzubenennen ist kaum machbar. Aber so viele Ordner wird es gar nicht geben. Ich hab bei den ~1200 Netzen die ich eigetragen hab nun 20 Ordner
Ich denke mal bis 200 Ordner sind keine Probleme zu erwarten. Das wären dann ja
immerhin 12000 und somit halb Deutschland. Wenn es wirklich mehr werden, sollte
man über eine Datenbank nachdenken oder über ein richtigs GPS
Acidmrp ist offline   Mit Zitat antworten
Alt 14.05.2005, 00:08   #9
monolan
Neuer Benutzer
Registriert seit: 02.07.2004
Beiträge: 4
Also toll wäre es, wenn die log-Datei nach einem Tag gelöscht/überschrieben werden würde, oder wenn man, wie oben bereits erwähnt, die log-Funktion deaktivieren könnte.

Eine weitere Sache wär die, dass der aktuelle Position, also das was auf dem Mainscreen angezeigt wird, gleichzeitig in eine Datei geschrieben wird, die dann immer wieder überschrieben wird.
monolan ist offline   Mit Zitat antworten
Alt 14.05.2005, 08:45   #10
Acidmrp
Handy Gott
Benutzerbild von Acidmrp
Registriert seit: 17.11.2002
Beiträge: 2.723
Zitat:
Zitat von sikomedia
Eine weitere Sache wär die, dass der aktuelle Position, also das was auf dem Mainscreen angezeigt wird, gleichzeitig in eine Datei geschrieben wird, die dann immer wieder überschrieben wird.
was soll das bringen?
Acidmrp ist offline   Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
A50 problem mit source code Brain Allgemein 3 28.02.2007 12:11
trying to port miniGPS for S55/S55 entry points list misko903 Softwaremoddingzone 0 14.10.2005 00:31
Windows Source Code MULTIFUND Computer & Internet 0 21.02.2004 08:46
Windows Source Code MULTIFUND Off Topic 0 21.02.2004 08:43


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.


Powered by vBulletin®, Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.