FreeCalypso > hg > tcs211-c139
comparison g23m/condat/ms/src/bmi/MmiHomezone.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 /******************************************************************************* | |
2 | |
3 CONDAT (UK) | |
4 | |
5 ******************************************************************************** | |
6 | |
7 This software product is the property of Condat (UK) Ltd and may not be | |
8 disclosed to any third party without the express permission of the owner. | |
9 | |
10 ******************************************************************************** | |
11 | |
12 $Project name: Basic MMI | |
13 $Project code: BMI | |
14 $Module: | |
15 $File: MmiHomezone.c | |
16 $Revision: 1.0 | |
17 | |
18 $Author: Condat(UK) | |
19 $Date: 15/02/02 | |
20 | |
21 ******************************************************************************** | |
22 | |
23 Description: Homezone functionality in MMI | |
24 | |
25 | |
26 | |
27 ******************************************************************************** | |
28 | |
29 $History: MmiHomezone.c | |
30 | |
31 15/02/02 Original Condat(UK) BMI version. | |
32 28/05/02 Latest Condat(UK) BMI version | |
33 | |
34 Mar 14, 2006 DR: OMAPS00061468 - x0035544. | |
35 Description: SAT 27.22.4.22.2 SET UP IDLE MODE TEXT (Icon support) fails | |
36 Solution : In the function homezoneUpdateDisplay(), additional parameter has been added to the | |
37 function call addSatMessage() under the flag FF_MMI_SAT_ICON to support SAT Icon for IDLE TEXT display. | |
38 | |
39 Dec 15, 2005 REF: MMI-FIX-OMAPS00058684 x0035544 | |
40 Description: OMAPS00045726 / MMI-FIX-30439 Follow-Up : ifdef for FF Home Zone forgotten. | |
41 Solution: Added Feature flag FF_HOMEZONE for the function sms_homezoneCBToggle(U8 Activate_CB) | |
42 in this file as it has got the prototype for this function. | |
43 | |
44 Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
45 Description: The homezone/cityzone tags were not being displayed properly. | |
46 Solution: Modified to save the tags properly in caches and also made the | |
47 appropriate modifications to update the same properly during mobility. | |
48 | |
49 $End | |
50 | |
51 *******************************************************************************/ | |
52 #include <string.h> | |
53 #include <stdio.h> | |
54 #include <stdlib.h> | |
55 | |
56 #if defined (NEW_FRAME) | |
57 | |
58 #include "typedefs.h" | |
59 #include "vsi.h" | |
60 #include "pei.h" | |
61 #include "custom.h" | |
62 #include "gsm.h" | |
63 | |
64 #else | |
65 | |
66 #include "STDDEFS.H" | |
67 #include "custom.h" | |
68 #include "gsm.h" | |
69 #include "vsi.h" | |
70 | |
71 #endif | |
72 | |
73 | |
74 #include "mfw_sys.h" | |
75 | |
76 #include "mfw_mfw.h" | |
77 #include "mfw_win.h" | |
78 #include "mfw_kbd.h" | |
79 /* SPR#1428 - SH - New Editor changes */ | |
80 #ifndef NEW_EDITOR | |
81 #include "mfw_edt.h" | |
82 #endif | |
83 #include "mfw_lng.h" | |
84 #include "mfw_icn.h" | |
85 #include "mfw_phb.h" | |
86 #include "mfw_sim.h" | |
87 #include "mfw_nm.h" | |
88 #include "ksd.h" | |
89 #include "psa.h" | |
90 #include "mfw_sms.h" | |
91 #include "mfw_smsi.h" | |
92 #include "mfw_mnu.h" | |
93 #include "mfw_sat.h" | |
94 #include "mfw_tim.h" | |
95 #include "mfw_cphs.h" | |
96 | |
97 #include "MmiMmi.h" | |
98 #include "MmiDummy.h" | |
99 #include "MmiDialogs.h" | |
100 #include "MmiLists.h" | |
101 | |
102 #include "MmiMain.h" | |
103 #include "MmiStart.h" | |
104 #include "MmiPins.h" | |
105 #include "MmiMenu.h" | |
106 #include "MmiSoftKeys.h" | |
107 #include "MmiSounds.h" | |
108 #include "mmiCall.h" | |
109 | |
110 #include "MmiBookController.h" | |
111 | |
112 #include "MmiIdle.h" | |
113 #include "Mmiicons.h" | |
114 #include "MmiNetwork.h" | |
115 #include "mmiSmsBroadcast.h" | |
116 #include "MmiHomezone.h" | |
117 | |
118 #include "cus_aci.h" | |
119 | |
120 #include "prim.h" | |
121 #ifndef PCM_2_FFS | |
122 #include "pcm.h" | |
123 #endif | |
124 | |
125 | |
126 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
127 // enable HZ trace | |
128 //#undef TRACE_MMIHOMEZONE | |
129 #define TRACE_MMIHOMEZONE 1 | |
130 | |
131 T_homezone_data homezoneData; | |
132 extern T_SMSCB_DATASTORE g_smscb_data; /* storage for Cell Broadcast lists */ | |
133 static int hzFlag = 0; //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
134 | |
135 //Dec 14, 2005 REF: MMI-FIX-OMAPS00058684 x0035544 | |
136 #ifdef FF_HOMEZONE | |
137 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
138 // Externed the function for activation\deactivation of Homezone. | |
139 extern void sms_homezoneCBToggle(U8 Activate_CB); | |
140 #endif | |
141 //void sms_homezoneCBToggle(U8 Activate_CB); | |
142 | |
143 /******************************************************************************* | |
144 | |
145 LOCALLY REFERENCED FUNCTIONS | |
146 | |
147 *******************************************************************************/ | |
148 | |
149 void homezoneReadParams(); | |
150 void homezoneLocate(); | |
151 static U32 calculateDecimal( char *string, int length ); | |
152 static U32 readHexFromSimfile( UBYTE *simFile, int length ); | |
153 static void writeHexToSimfile( UBYTE *simFile, U32 value, int length ); | |
154 | |
155 /******************************************************************************* | |
156 | |
157 $Function: homezoneInit | |
158 | |
159 $Description: Initialise homezone data structure. Reset the recent cache. | |
160 | |
161 $Returns: | |
162 | |
163 $Arguments: | |
164 *******************************************************************************/ | |
165 | |
166 void homezoneInit() | |
167 { | |
168 T_homezone_data *data = &homezoneData; | |
169 USHORT cacheIndex; | |
170 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
171 // Added the following local variables. | |
172 //begin 30439 | |
173 UBYTE version; | |
174 USHORT max_rcd; | |
175 EF_HZCACHE cache; | |
176 //end 30439 | |
177 | |
178 TRACE_FUNCTION("homezoneInit()"); | |
179 | |
180 /* Set all data to 0 */ | |
181 | |
182 memset((UBYTE *)data, 0, sizeof(T_homezone_data)); | |
183 | |
184 data->current_zone = HZ_NOT_IN_ZONE; // 0xFF = not in a homezone | |
185 data->recent_cell_index = HZ_RECENT_MAX-1; // Next entry will loop round & be at start of cache | |
186 | |
187 /* Set up recent cell cache */ | |
188 | |
189 for (cacheIndex = 0; cacheIndex<HZ_RECENT_MAX; cacheIndex++) | |
190 { | |
191 data->recent_cell[cacheIndex] = 0; | |
192 data->recent_cell_zone[cacheIndex] = HZ_NOT_IN_ZONE; | |
193 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
194 //begin 30439 | |
195 /* Read cache from PCM */ | |
196 if (pcm_ReadRecord((UBYTE *)EF_HZCACHE_ID, | |
197 (USHORT)(cacheIndex+1), | |
198 SIZE_EF_HZCACHE, | |
199 (UBYTE *)&cache, | |
200 &version, | |
201 &max_rcd) NEQ DRV_OK) | |
202 { | |
203 TRACE_EVENT ("Init cache read from PCM wrong"); | |
204 break; /* read error */ | |
205 } | |
206 else | |
207 { | |
208 if (cache.cid[0] != 0xFF AND cache.cid[1] != 0xFF) | |
209 { | |
210 data->recent_cell[cacheIndex] = readHexFromSimfile(&cache.cid[0],2); | |
211 data->recent_cell_zone[cacheIndex] = cache.zone; | |
212 } | |
213 } | |
214 TRACE_EVENT_P3("Init cache %d: CID %X, zone %X",cacheIndex, data->recent_cell[cacheIndex], data->recent_cell_zone[cacheIndex]); | |
215 //end 30439 | |
216 } | |
217 | |
218 data->new_cell_res = FALSE; | |
219 | |
220 return; | |
221 } | |
222 | |
223 | |
224 /******************************************************************************* | |
225 | |
226 $Function: homezoneReadSim | |
227 | |
228 $Description: Read homezone data in from SIM. Checks to see if conditions (SIM, | |
229 network) are correct for homezone; switches it off if not. | |
230 | |
231 $Returns: None. | |
232 | |
233 $Arguments: read_again - if this is HZ_READ_ONCE_ONLY, then SIM fields will not | |
234 be read in again if they have already been read in once. | |
235 If this is HZ_READ_SIM_AGAIN, they will be read in anyway. | |
236 | |
237 *******************************************************************************/ | |
238 | |
239 void homezoneReadSim(UBYTE read_again) | |
240 { | |
241 T_homezone_data *data = &homezoneData; | |
242 char IMSI[17]; | |
243 char MNC_MCC[6]; | |
244 T_ACI_RETURN result; | |
245 USHORT networkIndex; | |
246 UBYTE networkOK; | |
247 USHORT tries; | |
248 | |
249 /* Check if homezone is switched off */ | |
250 | |
251 if (data->received == HZ_RECEIVED_HZ_OFF) | |
252 return; | |
253 | |
254 /* SPR877 - If read_again specifies that SIM data should not be re-read, exit from function | |
255 * provided we have read it once. */ | |
256 | |
257 if (read_again == HZ_READ_ONCE_ONLY && data->received & HZ_RECEIVED_SIMDATA) | |
258 return; | |
259 | |
260 TRACE_FUNCTION("homezoneReadSim()"); | |
261 | |
262 /* Check if network operator is in list */ | |
263 | |
264 networkOK = FALSE; | |
265 | |
266 tries = 0; | |
267 | |
268 while ((result = qAT_PlusCIMI(CMD_SRC_LCL, IMSI)) != AT_CMPL && tries < 5) | |
269 { | |
270 tries++; | |
271 } | |
272 | |
273 strncpy(MNC_MCC, IMSI, 5); | |
274 MNC_MCC[5] =0; //terminate string | |
275 | |
276 #ifdef TRACE_MMIHOMEZONE | |
277 TRACE_EVENT_P1("MNC_MCC: %s", (char *)MNC_MCC); | |
278 #endif | |
279 | |
280 for (networkIndex=0; networkIndex<HZ_PERMITTED_NETWORKS; networkIndex++) | |
281 { | |
282 if (!strncmp((char *)MNC_MCC, homezoneMNC_MCC[networkIndex],5)) | |
283 { | |
284 #ifdef TRACE_MMIHOMEZONE | |
285 TRACE_EVENT_P1("Matches entry %d", networkIndex); | |
286 #endif | |
287 networkOK = TRUE; | |
288 } | |
289 } | |
290 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
291 //begin 30439 | |
292 /* Attempt to read first sim field */ | |
293 if (read_again == HZ_READ_SIM_AGAIN) | |
294 hzFlag = 1; | |
295 //end 30439 | |
296 | |
297 if (networkOK) | |
298 { | |
299 if (!Read_Sim(HZ_SIM_PARAMETERS, 0, HZ_SIM_PARAMETERS_SIZE, data->buffer)) | |
300 { | |
301 TRACE_EVENT("SIM read error 1: Homezone OFF"); /* SIM field not present, switch off homezone */ | |
302 data->received = HZ_RECEIVED_HZ_OFF; | |
303 hzFlag = 0; //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 - Seting the variable | |
304 } | |
305 } | |
306 else | |
307 { | |
308 TRACE_EVENT("Wrong network: Homezone OFF"); /* Network not in list, switch off homezone */ | |
309 data->received = HZ_RECEIVED_HZ_OFF; | |
310 hzFlag = 0; //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 - Seting the variable | |
311 } | |
312 | |
313 return; | |
314 } | |
315 | |
316 | |
317 /******************************************************************************* | |
318 | |
319 $Function: homezoneReadSimCb | |
320 | |
321 $Description: Callback, called when read sim has occurred. Fills up the homezone | |
322 data structure with the appropriate values retrieved from SIM. | |
323 | |
324 $Returns: None. | |
325 | |
326 $Arguments: field - the SIM field that was just read | |
327 record - the record in the SIM field that was read | |
328 result - the result code returned - 0 for successful. | |
329 *******************************************************************************/ | |
330 | |
331 void homezoneReadSimCb(USHORT field, USHORT record, USHORT result) | |
332 { | |
333 T_homezone_data *data = &homezoneData; | |
334 T_homezone *homezone = data->homezone; | |
335 UBYTE *simFile; | |
336 USHORT fileIndex; | |
337 USHORT hzIndex; | |
338 UBYTE keepLooking; | |
339 U8 Activate_cb =0; //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
340 //To activate/deactivate homezoneCB | |
341 TRACE_FUNCTION("homezoneReadSimCb()"); | |
342 | |
343 #ifdef TRACE_MMIHOMEZONE | |
344 TRACE_EVENT_P2("Have just read SIM file: %x record %d", field, record); | |
345 #endif | |
346 | |
347 /* Read in general homezone data. If reading first SIM field fails, switch homezone off */ | |
348 | |
349 if (field==HZ_SIM_PARAMETERS) | |
350 { | |
351 /* check SIM read result for homezone parameter */ | |
352 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
353 //begin 30439 | |
354 //Modified the conditional statement | |
355 //if (result) | |
356 if (result != 0x80FF) | |
357 //end 30439 | |
358 { | |
359 TRACE_EVENT("SIM read error 2: Homezone OFF"); | |
360 data->received = HZ_RECEIVED_HZ_OFF; | |
361 hzFlag = 0; //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 -Setting the variable | |
362 return; | |
363 } | |
364 homezoneReadParams(); | |
365 /*homezoneActivateCB();*/ /* Switch on cell broadcast */ | |
366 /* SH - this is already done at startup */ | |
367 record = HZ_CACHE_MAX; | |
368 } | |
369 | |
370 /* Read in records for each homezone cache */ | |
371 | |
372 /* check SIM read result for hoemzone cache */ | |
373 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
374 //begin 30439 | |
375 //Modified the conditional statement | |
376 //if (field>HZ_SIM_PARAMETERS && !result) | |
377 if (field>HZ_SIM_PARAMETERS && (result == 0x80FF)) | |
378 //end 30439 | |
379 { | |
380 hzIndex = field - HZ_SIM_CELL_CACHE; | |
381 simFile = data->buffer2; | |
382 fileIndex = 0; | |
383 | |
384 homezone[hzIndex].lac[record-1] = readHexFromSimfile(&simFile[fileIndex],2); | |
385 fileIndex+=2; | |
386 homezone[hzIndex].cid[record-1] = readHexFromSimfile(&simFile[fileIndex],2); | |
387 | |
388 #ifdef TRACE_MMIHOMEZONE | |
389 TRACE_EVENT_P2("read lac = %x, cid = %x", homezone[hzIndex].lac[record-1], homezone[hzIndex].cid[record-1]); | |
390 #endif | |
391 } | |
392 | |
393 /* Read in the next record */ | |
394 | |
395 keepLooking = TRUE; | |
396 | |
397 while (keepLooking) | |
398 { | |
399 /* check SIM read result for hoemzone cache */ | |
400 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
401 //begin 30439 | |
402 //Modified the conditional statement | |
403 //if (record==HZ_CACHE_MAX || result) | |
404 if (record==HZ_CACHE_MAX || (result != 0x80FF)) | |
405 //end 30439 | |
406 { | |
407 field++; // Look at next field | |
408 record = 1; | |
409 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
410 // Print the current feild. | |
411 TRACE_EVENT_P1("current field = %x", field); | |
412 } | |
413 else | |
414 record++; | |
415 | |
416 hzIndex = field-HZ_SIM_CELL_CACHE; | |
417 | |
418 if (hzIndex==HZ_ZONES_MAX) | |
419 { | |
420 keepLooking = FALSE; | |
421 /* Have read all sim data, set flag so icon etc will be updated */ | |
422 data->received |= HZ_RECEIVED_SIMDATA; | |
423 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
424 //begin 30439 | |
425 /* homezone display update after SIM REFRESH (when hzFlag set to 1) */ | |
426 TRACE_EVENT_P1("hzFlag = %d", hzFlag); | |
427 if (hzFlag) | |
428 { | |
429 // hzFlag = 0; | |
430 homezoneUpdate(0, 0, 1); | |
431 } | |
432 else | |
433 { | |
434 | |
435 TRACE_EVENT("activate homezone CB"); | |
436 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
437 //Call to activate the Homezone CB. | |
438 Activate_cb = 1; | |
439 sms_homezoneCBToggle(Activate_cb); | |
440 homezoneUpdate(0, 0, 1); /* new VO : speed up update */ | |
441 } | |
442 //end 30439 | |
443 | |
444 } | |
445 else if (homezone[hzIndex].active) | |
446 { | |
447 keepLooking = FALSE; | |
448 | |
449 #ifdef TRACE_MMIHOMEZONE | |
450 //TRACE_EVENT_P3("HZ READ HZ %d field %X record %d", hzIndex, field, record); | |
451 #endif | |
452 if (!Read_Sim_Record(field, record, HZ_SIM_CELL_CACHE_SIZE, data->buffer2)) | |
453 { | |
454 TRACE_EVENT("SIM reading error!"); | |
455 } | |
456 } | |
457 } | |
458 | |
459 return; | |
460 } | |
461 | |
462 | |
463 /******************************************************************************* | |
464 | |
465 $Function: homezoneReadParams | |
466 | |
467 $Description: Decode the homezone parameters from the first SIM field | |
468 | |
469 $Returns: None. | |
470 | |
471 $Arguments: None. | |
472 *******************************************************************************/ | |
473 | |
474 void homezoneReadParams() | |
475 { | |
476 T_homezone_data *data = &homezoneData; | |
477 T_homezone *homezone = data->homezone; | |
478 UBYTE *simFile; | |
479 USHORT fileIndex; | |
480 USHORT tagIndex; | |
481 USHORT hzIndex; | |
482 char character; | |
483 | |
484 TRACE_FUNCTION("homezoneReadParams()"); | |
485 | |
486 simFile = data->buffer; | |
487 fileIndex = HZ_SIM_FIRST_ZONE; // Point to the first homezone data | |
488 | |
489 for (hzIndex=0; hzIndex<HZ_ZONES_MAX; hzIndex++) // For each homezone... | |
490 { | |
491 homezone[hzIndex].zoneID = simFile[fileIndex]; // Read in the various parameters | |
492 fileIndex++; | |
493 | |
494 homezone[hzIndex].X = readHexFromSimfile(&simFile[fileIndex],4); | |
495 fileIndex += 4; | |
496 homezone[hzIndex].Y = readHexFromSimfile(&simFile[fileIndex],4); | |
497 fileIndex += 4; | |
498 homezone[hzIndex].Rsquared = readHexFromSimfile(&simFile[fileIndex],4); | |
499 fileIndex += 4; | |
500 | |
501 homezone[hzIndex].active = (BOOL) (simFile[fileIndex] & HZ_ACTIVE_FLAG)/HZ_ACTIVE_FLAG; | |
502 homezone[hzIndex].cityzone = (BOOL) (simFile[fileIndex] & HZ_CITYZONE_FLAG)/HZ_CITYZONE_FLAG; | |
503 fileIndex++; | |
504 | |
505 /* Read in the 12-character tag name */ | |
506 | |
507 for (tagIndex = 0; tagIndex<HZ_NAME_LENGTH; tagIndex++) | |
508 { | |
509 character = (char) simFile[fileIndex]; | |
510 fileIndex++; | |
511 if (character<32 || character>127) | |
512 character = 0; | |
513 homezone[hzIndex].Tag[tagIndex] = character; | |
514 } | |
515 homezone[hzIndex].Tag[HZ_NAME_LENGTH] = 0; // Make sure tag is null-terminated | |
516 | |
517 #ifdef TRACE_MMIHOMEZONE | |
518 TRACE_EVENT_P1("Homezone %d:", hzIndex); | |
519 TRACE_EVENT_P1("ID: %d", homezone[hzIndex].zoneID); | |
520 TRACE_EVENT_P1("Active: %d", (UBYTE)homezone[hzIndex].active); | |
521 TRACE_EVENT_P1("Cityzone: %d", (UBYTE)homezone[hzIndex].cityzone); | |
522 TRACE_EVENT_P1("X: %X", homezone[hzIndex].X); | |
523 TRACE_EVENT_P1("Y: %X", homezone[hzIndex].Y); | |
524 TRACE_EVENT_P1("Rsquared: %X", homezone[hzIndex].Rsquared); | |
525 TRACE_EVENT_P1("Homezone name: %s", homezone[hzIndex].Tag); | |
526 #endif | |
527 | |
528 } | |
529 | |
530 return; | |
531 } | |
532 | |
533 | |
534 /******************************************************************************* | |
535 | |
536 $Function: homezoneWriteSim | |
537 | |
538 $Description: Write homezone data to the SIM | |
539 SPR 877 - SH - now just writes a single record | |
540 | |
541 $Returns: None. | |
542 | |
543 $Arguments: cache, record | |
544 ********************************************************************************/ | |
545 | |
546 void homezoneWriteSim(USHORT field, USHORT record) | |
547 { | |
548 T_homezone_data *data = &homezoneData; | |
549 USHORT hzIndex; | |
550 UBYTE *simFile; | |
551 USHORT fileIndex; | |
552 | |
553 /* Check if homezone is already switched off */ | |
554 | |
555 if (data->received==HZ_RECEIVED_HZ_OFF) | |
556 return; | |
557 | |
558 TRACE_FUNCTION("homezoneWriteSim()"); | |
559 | |
560 hzIndex = field-HZ_SIM_CELL_CACHE; | |
561 | |
562 #ifdef TRACE_MMIHOMEZONE | |
563 TRACE_EVENT_P4("HZ WRITE field: %X record %d lac %X cid %X", field, record, data->homezone[hzIndex].lac[record-1], data->homezone[hzIndex].cid[record-1]); | |
564 #endif | |
565 | |
566 if (data->homezone[hzIndex].active) | |
567 { | |
568 simFile = data->buffer2; | |
569 fileIndex = 0; | |
570 writeHexToSimfile(&simFile[fileIndex], data->homezone[hzIndex].lac[record-1], 2 ); | |
571 fileIndex += 2; | |
572 writeHexToSimfile(&simFile[fileIndex], data->homezone[hzIndex].cid[record-1], 2 ); | |
573 } | |
574 | |
575 if (!Write_Sim_Record(field, record, HZ_SIM_CELL_CACHE_SIZE, data->buffer2)) | |
576 { | |
577 TRACE_EVENT("SIM writing error!"); | |
578 } | |
579 return; | |
580 } | |
581 | |
582 | |
583 /******************************************************************************* | |
584 | |
585 $Function: homezoneWriteSimCb | |
586 | |
587 $Description: Write homezone data to the SIM. This function is called after a previous | |
588 SIM write (or, in the initial case, by homezoneWriteSim above). | |
589 SPR877 - SH - Previous functionality no longer required here. | |
590 | |
591 $Returns: None. | |
592 | |
593 $Arguments: field - the SIM field that is to be written | |
594 record - the SIM record that is to be written | |
595 result - the result of the last write attempt | |
596 *******************************************************************************/ | |
597 | |
598 void homezoneWriteSimCb(USHORT field, USHORT record, USHORT result) | |
599 { | |
600 T_homezone_data *data = &homezoneData; | |
601 T_homezone *homezone = data->homezone; | |
602 USHORT hzIndex; | |
603 UBYTE *simFile; | |
604 USHORT fileIndex; | |
605 UBYTE keepLooking; | |
606 | |
607 TRACE_FUNCTION("homezoneWriteSimCb()"); | |
608 | |
609 #ifdef TRACE_MMIHOMEZONE | |
610 TRACE_EVENT_P1("RESULT: %d", result); | |
611 #endif | |
612 | |
613 return; | |
614 } | |
615 | |
616 | |
617 /******************************************************************************* | |
618 | |
619 $Function: homezoneCBData | |
620 | |
621 $Description: Make sure correct homezone CB channel is set up and activate CB | |
622 | |
623 $Returns: None. | |
624 | |
625 $Arguments: message - The text of the cell broadcast message | |
626 *******************************************************************************/ | |
627 | |
628 void homezoneActivateCB(void) | |
629 { | |
630 T_homezone_data *data = &homezoneData; | |
631 USHORT index; | |
632 UBYTE stopSearch; | |
633 USHORT emptyID; | |
634 | |
635 /* Check if homezone is already switched off */ | |
636 | |
637 if (data->received==HZ_RECEIVED_HZ_OFF) | |
638 return; | |
639 | |
640 TRACE_FUNCTION("homezoneActivateCB()"); | |
641 | |
642 /* Check table to see if correct channel is included */ | |
643 | |
644 stopSearch = FALSE; | |
645 emptyID = 0xFFFF; | |
646 | |
647 for (index=0; index<MAX_MIDS && !stopSearch; index++) | |
648 { | |
649 TRACE_EVENT_P2("Mid %d is %X", index, g_smscb_data.CBTopics.entry[index].msg_id); | |
650 if (g_smscb_data.CBTopics.entry[index].msg_id==HZ_IDENTIFIER) | |
651 { | |
652 stopSearch = TRUE; | |
653 } | |
654 else if (g_smscb_data.CBTopics.entry[index].msg_id==NO_MID) | |
655 { | |
656 emptyID = index; | |
657 stopSearch = TRUE; | |
658 } | |
659 } | |
660 | |
661 TRACE_EVENT_P1("Emtpy ID %d", emptyID); | |
662 | |
663 if (emptyID!=0xFFFF && emptyID<MAX_MIDS-1) | |
664 { | |
665 strncpy (g_smscb_data.CBTopics.entry[emptyID].name, HZ_CB_NAME, CB_TAG_LENGTH); | |
666 g_smscb_data.CBTopics.entry[emptyID].msg_id = HZ_IDENTIFIER; | |
667 g_smscb_data.CBTopics.entry[emptyID].dcs = 0; | |
668 | |
669 // add a new entry | |
670 emptyID += 1; | |
671 g_smscb_data.CBTopics.length = emptyID; | |
672 } | |
673 | |
674 smscb_setCBsettings(SMSCB_SWITCH_ON); | |
675 return; | |
676 } | |
677 | |
678 | |
679 /******************************************************************************* | |
680 | |
681 $Function: homezoneCBData | |
682 | |
683 $Description: A cell broadcast message has been received, containing information about | |
684 the location of the current cell | |
685 | |
686 $Returns: None. | |
687 | |
688 $Arguments: message - The text of the cell broadcast message | |
689 *******************************************************************************/ | |
690 | |
691 void homezoneCBData(char *message) | |
692 { | |
693 T_homezone_data *data = &homezoneData; | |
694 | |
695 /* Check if homezone is already switched off */ | |
696 | |
697 if (data->received==HZ_RECEIVED_HZ_OFF) | |
698 return; | |
699 | |
700 TRACE_FUNCTION("homezoneCellData()"); | |
701 | |
702 /* Calculate the current position from the text of the message */ | |
703 | |
704 data->current_X = calculateDecimal( &message[0], HZ_COORD_DIGITS ); | |
705 data->current_Y = calculateDecimal( &message[HZ_COORD_DIGITS], HZ_COORD_DIGITS ); | |
706 | |
707 #ifdef TRACE_MMIHOMEZONE | |
708 TRACE_EVENT_P2("current_X: %X, current_Y: %X", data->current_X, data->current_Y); | |
709 #endif | |
710 | |
711 data->received |= HZ_RECEIVED_CB; // We now have received cell broadcast message. | |
712 | |
713 /* SPR877 - SH - now only call HZ algorithm if a cell res has recently taken place */ | |
714 | |
715 if (data->received==HZ_RECEIVED_ALL && data->new_cell_res) // If we've received everything, call algorithm. | |
716 { | |
717 homezoneLocate(); | |
718 data->new_cell_res = FALSE; | |
719 } | |
720 | |
721 return; | |
722 } | |
723 | |
724 | |
725 /******************************************************************************* | |
726 | |
727 $Function: homezoneLocate | |
728 | |
729 $Description: Looks at coordinates from cell broadcast message and calculates if | |
730 they are in a homezone | |
731 | |
732 $Returns: None | |
733 | |
734 $Arguments: None | |
735 | |
736 *******************************************************************************/ | |
737 | |
738 void homezoneLocate() | |
739 { | |
740 T_homezone_data *data = &homezoneData; | |
741 T_homezone *homezone = data->homezone; | |
742 long deltaX; | |
743 long deltaY; | |
744 USHORT hzIndex; | |
745 USHORT cacheIndex; | |
746 U32 Dsquared; | |
747 BOOL foundInCache; | |
748 USHORT cacheFreeSpace; | |
749 USHORT field; | |
750 USHORT record; | |
751 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
752 //begin 30439 | |
753 UBYTE version; | |
754 USHORT max_rcd; | |
755 EF_HZCACHE cache; | |
756 UBYTE exist = 0; | |
757 //end 30439 | |
758 | |
759 /* Check if homezone is already switched off */ | |
760 | |
761 if (data->received==HZ_RECEIVED_HZ_OFF) | |
762 return; | |
763 | |
764 TRACE_FUNCTION("homezoneLocate()"); | |
765 | |
766 data->current_zone = HZ_NOT_IN_ZONE; // We don't know if we're in a homezone yet (homezones = 0 to 3) | |
767 field = HZ_NOT_IN_ZONE; // The cache to update | |
768 | |
769 /* Work out if we're in a homezone using current_X and current_Y, received from CB message */ | |
770 | |
771 if (data->received == HZ_RECEIVED_ALL) | |
772 { | |
773 #ifdef TRACE_MMIHOMEZONE | |
774 TRACE_EVENT_P2("Current cell X: %X, Y: %X", data->current_X,data->current_Y); | |
775 #endif | |
776 | |
777 /* Check to see if (current_X,current_Y) is in any of the defined homezones */ | |
778 | |
779 for (hzIndex=0; hzIndex<HZ_ZONES_MAX && data->current_zone==HZ_NOT_IN_ZONE; hzIndex++) // For each homezone... | |
780 { | |
781 #ifdef TRACE_MMIHOMEZONE | |
782 TRACE_EVENT_P1("Homezone %d...", hzIndex); | |
783 TRACE_EVENT_P3("Has coords X: %X, Y: %X, R2: %X", homezone[hzIndex].X, homezone[hzIndex].Y, homezone[hzIndex].Rsquared); | |
784 #endif | |
785 | |
786 if (homezone[hzIndex].active) // Provided the homezone is active | |
787 { | |
788 #ifdef TRACE_MMIHOMEZONE // Calculate X and Y distance | |
789 TRACE_EVENT("Is active."); | |
790 #endif | |
791 deltaX = labs(data->current_X-homezone[hzIndex].X); // between centre of current cell | |
792 deltaY = labs(data->current_Y-homezone[hzIndex].Y); // and centre of the homezone | |
793 #ifdef TRACE_MMIHOMEZONE | |
794 TRACE_EVENT_P1("deltaX = %d",deltaX); | |
795 TRACE_EVENT_P1("deltaY = %d",deltaY); | |
796 #endif | |
797 if (deltaX<=HZ_DISTANCE_MAX && deltaY<=HZ_DISTANCE_MAX) // If not too far... | |
798 { | |
799 Dsquared = deltaX*deltaX+deltaY*deltaY; // Calculate the resultant distance squared | |
800 #ifdef TRACE_MMIHOMEZONE | |
801 TRACE_EVENT_P1("Dsquared = %d",Dsquared); | |
802 #endif | |
803 if (Dsquared <= homezone[hzIndex].Rsquared) // If within radius of homezone squared | |
804 { | |
805 #ifdef TRACE_MMIHOMEZONE | |
806 TRACE_EVENT("Contains the current cell."); | |
807 #endif | |
808 data->current_zone = hzIndex; // Current zone is this homezone | |
809 | |
810 if (!homezone[hzIndex].cityzone) // Then: if it's not a cityzone | |
811 { | |
812 #ifdef TRACE_MMIHOMEZONE | |
813 TRACE_EVENT("Is not a cityzone."); | |
814 #endif | |
815 foundInCache = FALSE; // Look through the cache for this | |
816 cacheFreeSpace = HZ_CACHE_MAX; // homezone to see if cell is listed | |
817 | |
818 for (cacheIndex=0; cacheIndex<HZ_CACHE_MAX && !foundInCache; cacheIndex++) | |
819 { | |
820 if (data->cid==homezone[hzIndex].cid[cacheIndex]) | |
821 { | |
822 foundInCache = TRUE; // We've found it! | |
823 } | |
824 if (homezone[hzIndex].cid[cacheIndex]==0 && cacheFreeSpace==HZ_CACHE_MAX) | |
825 cacheFreeSpace = cacheIndex; // Or we've found an empty space | |
826 } | |
827 | |
828 if (!foundInCache) // If not there, need to add it | |
829 { | |
830 #ifdef TRACE_MMIHOMEZONE | |
831 TRACE_EVENT("Is not in the cache."); | |
832 #endif | |
833 if (cacheFreeSpace==HZ_CACHE_MAX) // If we didn't find a free space... | |
834 { | |
835 cacheFreeSpace = rand() % HZ_CACHE_MAX; // Choose a random entry | |
836 } | |
837 homezone[hzIndex].cid[cacheFreeSpace] = data->cid; // And store current cell there | |
838 homezone[hzIndex].lac[cacheFreeSpace] = data->lac; // with its location area code | |
839 | |
840 field = hzIndex+HZ_SIM_CELL_CACHE; // We've changed the cache | |
841 record = cacheFreeSpace+1; | |
842 | |
843 #ifdef TRACE_MMIHOMEZONE | |
844 TRACE_EVENT_P1("Have added to cache, entry %d.",cacheFreeSpace); | |
845 #endif | |
846 } | |
847 } | |
848 } | |
849 else // If we're not in the homezone... | |
850 { | |
851 foundInCache = FALSE; // Look through the cache for this | |
852 // homezone to see if cell is listed | |
853 for (cacheIndex=0; cacheIndex<HZ_CACHE_MAX && !foundInCache; cacheIndex++) | |
854 { | |
855 if (data->cid==homezone[hzIndex].cid[cacheIndex]) | |
856 { | |
857 foundInCache = TRUE; // We've found it! | |
858 cacheFreeSpace = cacheIndex; // Record where it is | |
859 break; | |
860 } | |
861 } | |
862 | |
863 if (foundInCache) // If it's there... | |
864 { | |
865 #ifdef TRACE_MMIHOMEZONE | |
866 TRACE_EVENT("Is in the cache and shouldn't be."); | |
867 #endif | |
868 homezone[hzIndex].cid[cacheFreeSpace] = 0; // ...remove it | |
869 field = hzIndex+HZ_SIM_CELL_CACHE; // We've changed the cache | |
870 record = cacheFreeSpace+1; | |
871 data->current_zone = HZ_NOT_IN_ZONE; // We're not in this zone | |
872 } | |
873 #ifdef TRACE_MMIHOMEZONE | |
874 else | |
875 { | |
876 TRACE_EVENT("Isn't in the cache and shouldn't be."); | |
877 } | |
878 #endif | |
879 } | |
880 | |
881 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
882 //begin 30439 | |
883 /* check if the cid is already in cache */ | |
884 for (cacheIndex=0; cacheIndex<HZ_CACHE_MAX; cacheIndex++) | |
885 { | |
886 if (data->recent_cell[cacheIndex] == data->cid) | |
887 exist = 1; | |
888 } | |
889 /* Replace oldest cell in dynamic cache with new cell */ | |
890 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
891 //begin 30439 | |
892 //Added a conditional statement | |
893 if (!exist) | |
894 { | |
895 data->recent_cell_index++; | |
896 if (data->recent_cell_index>=HZ_RECENT_MAX) | |
897 data->recent_cell_index = 0; | |
898 #ifdef TRACE_MMIHOMEZONE | |
899 TRACE_EVENT_P1("Adding to recent list, index = %d", data->recent_cell_index); | |
900 #endif | |
901 data->recent_cell[data->recent_cell_index] = data->cid; | |
902 data->recent_cell_zone[data->recent_cell_index] = data->current_zone; | |
903 | |
904 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
905 //begin 30439 | |
906 /* write cache to PCM */ | |
907 writeHexToSimfile(&cache.cid[0], data->recent_cell[data->recent_cell_index], 2 ); | |
908 cache.zone = data->recent_cell_zone[data->recent_cell_index]; | |
909 /* write cache to PCM */ | |
910 pcm_WriteRecord((UBYTE *)EF_HZCACHE_ID, | |
911 (USHORT)(data->recent_cell_index+1), | |
912 SIZE_EF_HZCACHE, | |
913 &cache.cid[0]); | |
914 | |
915 } | |
916 //end 30439 | |
917 #ifdef TRACE_MMIHOMEZONE | |
918 for (cacheIndex = 0; cacheIndex<HZ_RECENT_MAX; cacheIndex++) | |
919 { | |
920 TRACE_EVENT_P3("Recent cache %d: CID %X, zone %X",cacheIndex, data->recent_cell[cacheIndex], data->recent_cell_zone[cacheIndex]); | |
921 } | |
922 #endif | |
923 } | |
924 | |
925 } | |
926 | |
927 } | |
928 | |
929 } | |
930 | |
931 #ifdef TRACE_MMIHOMEZONE | |
932 TRACE_EVENT("CACHES AFTER UPDATE"); | |
933 for (hzIndex=0; hzIndex<HZ_ZONES_MAX; hzIndex++) // For each homezone... | |
934 { | |
935 TRACE_EVENT_P2("Zone %d (%s)", hzIndex, homezone[hzIndex].Tag); | |
936 | |
937 if (homezone[hzIndex].active && !homezone[hzIndex].cityzone) // If it's active, and not a cityzone | |
938 { | |
939 for (cacheIndex=0; cacheIndex<HZ_CACHE_MAX; cacheIndex++) // Check the cache. | |
940 { | |
941 TRACE_EVENT_P3("Cache %d: lac %X, cid %X", cacheIndex, homezone[hzIndex].lac[cacheIndex], homezone[hzIndex].cid[cacheIndex]); | |
942 } | |
943 } | |
944 } | |
945 #endif | |
946 /* Update icon/text tag. */ | |
947 | |
948 homezoneUpdateDisplay(); | |
949 | |
950 /* Write data back to SIM if cache has changed & SIM files present */ | |
951 | |
952 if (field!=HZ_NOT_IN_ZONE && (data->received & HZ_RECEIVED_SIMDATA)) | |
953 { | |
954 homezoneWriteSim(field, record); | |
955 } | |
956 | |
957 return; | |
958 } | |
959 | |
960 | |
961 /******************************************************************************* | |
962 | |
963 $Function: homezoneUpdate | |
964 | |
965 $Description: Main homezone function; check whether MS is in a homezone or not | |
966 | |
967 $Returns: | |
968 | |
969 $Arguments: lac - the location area code of the current cell (on cell reselection) | |
970 cid - the ID of the current cell (on cell reselection) | |
971 keep - 1: no change in lac and cid | |
972 *******************************************************************************/ | |
973 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
974 //begin 30439 | |
975 //Added an extra argument in the function -- "keep" | |
976 void homezoneUpdate(USHORT lac, USHORT cid, UBYTE keep) | |
977 { | |
978 T_homezone_data *data = &homezoneData; | |
979 T_homezone *homezone = data->homezone; | |
980 USHORT hzIndex; | |
981 USHORT cacheIndex; | |
982 UBYTE cacheUpdate; | |
983 UBYTE recordUpdate; | |
984 UBYTE inCache = 0; | |
985 | |
986 /* Check if homezone is already switched off */ | |
987 | |
988 TRACE_EVENT_P1("Data received: %d", data->received); | |
989 | |
990 if (data->received==HZ_RECEIVED_HZ_OFF) | |
991 return; | |
992 | |
993 TRACE_FUNCTION("homezoneUpdate()"); | |
994 | |
995 data->current_zone = HZ_NOT_IN_ZONE; // We don't know if we're in a homezone yet (homezones = 0 to 3) | |
996 data->received |= HZ_RECEIVED_CELLRES; // Have received this event | |
997 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
998 //Modified to add a conditional statement | |
999 //begin 30439 | |
1000 if (!keep) | |
1001 { | |
1002 data->lac = lac; | |
1003 data->cid = cid; | |
1004 } | |
1005 /* keep the current lac and cid */ | |
1006 else | |
1007 { | |
1008 lac = data->lac; | |
1009 cid = data->cid; | |
1010 } | |
1011 //end 30439 | |
1012 | |
1013 #ifdef TRACE_MMIHOMEZONE | |
1014 TRACE_EVENT_P3("lac: %X, cid: %X, received: %d", lac, cid, data->received); | |
1015 #endif | |
1016 | |
1017 /* If either are zero or -1, the reselection data is invalid */ | |
1018 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
1019 //Modified to add a conditional statement | |
1020 if (((lac==0 || cid==0) || (lac==0xFFFF || cid==0xFFFF)) AND !keep) | |
1021 { | |
1022 TRACE_EVENT_P1("homezoneUpdateDisplay ~HZ_RECEIVED_CELLRES keep=%d", keep); | |
1023 //end 30439 | |
1024 data->received &= (~HZ_RECEIVED_CELLRES); | |
1025 homezoneUpdateDisplay(); | |
1026 return; | |
1027 } | |
1028 | |
1029 data->new_cell_res = TRUE; // Cell res just occurred | |
1030 | |
1031 /* Must have received SIM data to continue*/ | |
1032 | |
1033 if (!(data->received & HZ_RECEIVED_SIMDATA)) | |
1034 return; | |
1035 | |
1036 /* Check homezone cache for each homezone */ | |
1037 /* Can do this even if we haven't received the CB message */ | |
1038 | |
1039 #ifdef TRACE_MMIHOMEZONE | |
1040 TRACE_EVENT("Checking zone caches..."); | |
1041 #endif | |
1042 | |
1043 for (hzIndex=0; hzIndex<HZ_ZONES_MAX && data->current_zone==HZ_NOT_IN_ZONE; hzIndex++) // For each homezone... | |
1044 { | |
1045 #ifdef TRACE_MMIHOMEZONE | |
1046 TRACE_EVENT_P2("Zone %d (%s)", hzIndex, homezone[hzIndex].Tag); | |
1047 #endif | |
1048 | |
1049 if (homezone[hzIndex].active && !homezone[hzIndex].cityzone) // If it's active, and not a cityzone | |
1050 { | |
1051 #ifdef TRACE_MMIHOMEZONE | |
1052 TRACE_EVENT("Is Active."); | |
1053 #endif | |
1054 for (cacheIndex=0; cacheIndex<HZ_CACHE_MAX && data->current_zone==HZ_NOT_IN_ZONE; cacheIndex++) // Check the cache. | |
1055 { | |
1056 #ifdef TRACE_MMIHOMEZONE | |
1057 TRACE_EVENT_P3("Cache %d: lac %X, cid %X", cacheIndex, homezone[hzIndex].lac[cacheIndex], homezone[hzIndex].cid[cacheIndex]); | |
1058 #endif | |
1059 | |
1060 if (cid==homezone[hzIndex].cid[cacheIndex]) // If the current cell is in the cache.... | |
1061 { | |
1062 #ifdef TRACE_MMIHOMEZONE | |
1063 TRACE_EVENT_P1("Cell found in cache %d.",cacheIndex); | |
1064 #endif | |
1065 data->current_zone = hzIndex; // Then this is our current homezone! | |
1066 inCache = 1; | |
1067 } | |
1068 } | |
1069 if (!inCache AND hzFlag) | |
1070 { | |
1071 hzFlag = 0; | |
1072 TRACE_EVENT ("not in cache, caculate needed"); | |
1073 homezoneLocate(); | |
1074 return; | |
1075 } | |
1076 else | |
1077 inCache = 0; | |
1078 } | |
1079 } | |
1080 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
1081 //added a conditional statement | |
1082 //begin 30439 | |
1083 /* If we didn't find a homezone, check recent cells cache to see if we're in a cityzone */ | |
1084 for (hzIndex=0; hzIndex<HZ_ZONES_MAX && data->current_zone==HZ_NOT_IN_ZONE; hzIndex++) // For each homezone... | |
1085 { | |
1086 #ifdef TRACE_MMIHOMEZONE | |
1087 TRACE_EVENT_P2("Zone %d (%s)", hzIndex, homezone[hzIndex].Tag); | |
1088 #endif | |
1089 | |
1090 if (homezone[hzIndex].active && homezone[hzIndex].cityzone) // If it's active, and not a cityzone | |
1091 { | |
1092 #ifdef TRACE_MMIHOMEZONE | |
1093 TRACE_EVENT("Is Active."); | |
1094 #endif | |
1095 | |
1096 for (cacheIndex=0; cacheIndex<HZ_RECENT_MAX && data->current_zone==HZ_NOT_IN_ZONE; cacheIndex++) // Check the cache. | |
1097 { | |
1098 #ifdef TRACE_MMIHOMEZONE | |
1099 TRACE_EVENT_P5("Cache %d: lac %X, cid %X, data->recent_cell %X, data->recent_cell_zone %d", cacheIndex, homezone[hzIndex].lac[cacheIndex], homezone[hzIndex].cid[cacheIndex], data->recent_cell[cacheIndex], data->recent_cell_zone[cacheIndex]); | |
1100 #endif | |
1101 | |
1102 if (cid==data->recent_cell[cacheIndex] && data->recent_cell_zone[cacheIndex]!=HZ_NOT_IN_ZONE) // If we're in that cell | |
1103 { | |
1104 #ifdef TRACE_MMIHOMEZONE | |
1105 TRACE_EVENT_P1("FOUND cityzone in cache %d.",cacheIndex); | |
1106 #endif | |
1107 //Jun 14, 2005 REF: MMI-FIX-30439 x0018858 | |
1108 //Modified to directly assign value | |
1109 data->current_zone = hzIndex; // Then this is our current homezone! | |
1110 inCache = 1; | |
1111 } | |
1112 if (!inCache AND hzFlag) | |
1113 { | |
1114 hzFlag = 0; | |
1115 TRACE_EVENT ("not in cache, caculate needed"); | |
1116 homezoneLocate(); | |
1117 return; | |
1118 } | |
1119 else | |
1120 inCache = 0; | |
1121 } | |
1122 } | |
1123 } | |
1124 | |
1125 homezoneUpdateDisplay(); // Update icon/text tag. | |
1126 | |
1127 return; | |
1128 } | |
1129 | |
1130 | |
1131 /******************************************************************************* | |
1132 | |
1133 $Function: homezoneUpdateDisplay | |
1134 | |
1135 $Description: | |
1136 | |
1137 $Returns: Updates the homezone icon and text string appropriately | |
1138 | |
1139 $Arguments: none | |
1140 *******************************************************************************/ | |
1141 | |
1142 void homezoneUpdateDisplay(void) | |
1143 { | |
1144 T_homezone_data *data = &homezoneData; | |
1145 | |
1146 TRACE_FUNCTION("homezoneUpdateDisplay()"); | |
1147 | |
1148 iconsDeleteState(iconIdHomezone); | |
1149 | |
1150 #ifdef FF_MMI_SAT_ICON | |
1151 addSatMessage(NULL, 0, 0, NULL, FALSE, SAT_ICON_NONE); | |
1152 #else | |
1153 addSatMessage(NULL); | |
1154 #endif | |
1155 | |
1156 if (data->current_zone!=HZ_NOT_IN_ZONE) // If not in a homezone, leave blank | |
1157 { | |
1158 //x0035544 Mar 14, 2006 DR:OMAPS00061468 | |
1159 #ifdef FF_MMI_SAT_ICON | |
1160 addSatMessage(data->homezone[data->current_zone].Tag, 0, 0, NULL, FALSE, SAT_ICON_NONE); | |
1161 #else | |
1162 addSatMessage(data->homezone[data->current_zone].Tag); | |
1163 #endif | |
1164 if (!data->homezone[data->current_zone].cityzone) // Display icon if homezone rather than cityzone | |
1165 { | |
1166 iconsSetState(iconIdHomezone); | |
1167 } | |
1168 } | |
1169 | |
1170 return; | |
1171 } | |
1172 | |
1173 | |
1174 /******************************************************************************* | |
1175 | |
1176 $Function: calculateDecimal | |
1177 | |
1178 $Description: | |
1179 | |
1180 $Returns: Returns a decimal number from a string of ascii digits | |
1181 | |
1182 $Arguments: none | |
1183 *******************************************************************************/ | |
1184 | |
1185 static U32 calculateDecimal( char *string, int length ) | |
1186 { | |
1187 U32 total = 0; | |
1188 int index; | |
1189 | |
1190 /* decode each decimal character in turn */ | |
1191 for (index = 0; index < length; index++ ) | |
1192 { | |
1193 if (string[index]>='0' && string[index]<='9') | |
1194 { | |
1195 total = ( total * 10 ) + ( string[index] - '0' ); | |
1196 } | |
1197 } | |
1198 | |
1199 return total; | |
1200 } | |
1201 | |
1202 /******************************************************************************* | |
1203 | |
1204 $Function: readHexFromSimfile | |
1205 | |
1206 $Description: Reads a hex string (MSB first) from a sim file | |
1207 | |
1208 $Returns: The hex number | |
1209 | |
1210 $Arguments: simFile - the point in the simFile at which the string occurs | |
1211 length - the length of the string | |
1212 *******************************************************************************/ | |
1213 | |
1214 static U32 readHexFromSimfile( UBYTE *simFile, int length ) | |
1215 { | |
1216 U32 total = 0; | |
1217 int index; | |
1218 | |
1219 for ( index = 0; index < length; index++ ) | |
1220 { | |
1221 total = ( total << 8 ) + simFile[index]; | |
1222 } | |
1223 | |
1224 return total; | |
1225 } | |
1226 | |
1227 /******************************************************************************* | |
1228 | |
1229 $Function: writeHexToSimfile | |
1230 | |
1231 $Description: Writes a hex string (MSB first) to a sim file | |
1232 | |
1233 $Returns: None | |
1234 | |
1235 $Arguments: simFile - the point in the simFile at which the string occurs | |
1236 length - the length of the string | |
1237 *******************************************************************************/ | |
1238 | |
1239 static void writeHexToSimfile( UBYTE *simFile, U32 value, int length ) | |
1240 { | |
1241 int index; | |
1242 | |
1243 #ifdef TRACE_MMIHOMEZONE | |
1244 TRACE_EVENT_P1("Hex of %X is:", value); | |
1245 #endif | |
1246 | |
1247 /* Note: '-1' below clarification: | |
1248 * E.g. index=0, length=4: most significant byte is number shifted 3 bytes right. */ | |
1249 | |
1250 for ( index = 0; index < length; index++ ) | |
1251 { | |
1252 simFile[index] = (value >> ((length-index-1)*8)) & 0xFF; /* SPR877 - SH - wrong before, added *8 */ | |
1253 #ifdef TRACE_MMIHOMEZONE | |
1254 TRACE_EVENT_P2("Simfile %d is %X", index, simFile[index]); | |
1255 #endif | |
1256 } | |
1257 | |
1258 return; | |
1259 } |