|
|
#1 |
|
Handy Gott
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) |
|
|
|
|
|
#2 |
|
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 |
|
|
|
|
|
#3 |
|
Handy Gott
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. |
|
|
|
|
|
#4 |
|
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);
}
}
Geändert von arsh0r (12.05.2005 um 01:54 Uhr) |
|
|
|
|
|
#5 |
|
Handy Gott
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;
}
Geändert von Acidmrp (12.05.2005 um 05:41 Uhr) |
|
|
|
|
|
#6 |
|
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...) |
|
|
|
|
|
#7 |
|
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 |
|
|
|
|
|
#8 |
|
Handy Gott
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 |
|
|
|
|
|
#9 |
|
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. |
|
|
|
|
|
#10 | |
|
Handy Gott
Registriert seit: 17.11.2002
Beiträge: 2.723
![]() |
Zitat:
|
|
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
|
|
Ä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.










Linear-Darstellung

