Hej,
Troszke pobawilem sie w debugging radia, zeby bardziej zrozumiec cala sytuacje, chociaz jak na zlosc akurat teraz radio dziala dobrze i nie chce odmowic posluszenstwa, mozliwe ze to przez upgrade OTA 2.3.4. W kazdym razie, aby uniknac niespodzianek pod tytulem 'nikt nie moze sie do mnie dodzwonic przez 20min' przyjrzalem sie pracy radia i sprawa wyglada tak, ze jak pewnie wiekszosc osob wie jak radio GSM/UMTS pracuje to znajduje sie w trybie 'service'. Na samym poczatku jak stracimy zasieg to telefon przelacza sie w tryb 'noservice' oraz sila sygnalu ma wartosc 0 lub -1. Najciekawsze zaczyna sie teraz (o czym nie wiedzialem). Otoz po jakiejs minucie braku zasiegu telefon wychodzi z trybu 'noservice' i przez jakis czas nie jest w zadnym trybie, aby po kilkunastu sekundach przejsc w tryb 'emergency'. I tutaj kolejna ciekawostka - czesto sila sygnalu pokazywana jest jako maksymalna (czyli 8 ). Oczywiscie po utracie sygnalu nie odczytamy biezacego CellID czy nazwy operatora. Procedura ta pozwolila mi napisac krotki skrypcik w programie Tasker (swoja droga genialne narzedzie do zautomatyzowania wszystkiego).
Tutaj zalozylem, ze wejscie w tryb 'emergency' jest wystarczajace do rozpoczecia procedury, chociaz mozna jeszcze dodac dodatkowe warunki (np. %TNET i %CELLID jest unset). W kazdym razie ten pseudo-skrypt po wykryciu przejscia telefonu w tryb 'emergency' czeka jeszcze 6 min (72 powtorzenia, kazde po 5 sekund) i sprawdza czy w tym czasie nie odzyskamy zasiegu (jestesmy w trybie service) lub czy przypadkiem nie przejdziemy do trybu airplane (np. ja mam profil w nocy, ktory o 3 wlacza w telefonie tryb airplane) - wowczas telefon jest w trybie 'nopower', a wiec mozemy latwo to wykryc. Jesli nie wydarzy sie to w ciagu tych 6 min skrypt spowoduje wygenerowanie wibracji, odtworzenie wskazanego pliku dzwiekowego oraz wlaczy tryb airplane (wylaczajac tym samym radio, ale tez bluetooth i wifi - dla zrootowanych urzadzen mozna wykorzystac polecenie wylaczajace tylko radio). Odczeka 15 sekund (mozna zmniejszyc troche) i potem wylacza tryb airplane, tym samym wlaczajac radio. Odczeka 1 minute i jesli nadal nie bedziemy mieli zasiegu sprobuje wykonac to samo, az do skutku (mozna dodac jeden warunek, ktory przerywa skrypt po kilkunastu probach). W miedzyczasie skrypt zapisuje wszystko co wykonal do pliku SD/Tasker/log/reacquire_radio_signal.txt.
Ponizej zawartosc skryptu. Mozna zapisac jako plik XML i zaimportowac bezposrednio do programu Tasker. Skrypt jest poki co srednio stestowany, a wiec obserwujcie telefon czy wszystko dziala jak trzeba.
Profile: ReacquireRadioSignal (49)
Priority: 6 CoolDown: 60
State: Variable Value %CELLSRV, Matches, *emergency*
Enter: ReacquireRadioSignal (47)
Stay Awake
A1: Variable Set [ Name:%COUNTER1_MS To:1 Do Maths:Off Append:Off]
A2: Wait [ MS:0 Seconds:5 Minutes:0 Hours:0 Days:0]
A3: Stop [ With Error:Off] If [ %CELLSRV ~ *nopower* ]
A4: Stop [ With Error:Off] If [ %CELLSRV !~ *unknown*/*noservice*/*emergency*/*nopower* ]
A5: Variable Add [ Name:%COUNTER1_MS Value:1 Wrap Around:0]
A6: Goto Action [ Number:2] If [ %COUNTER1_MS < 72 ]
A7: Variable Set [ Name:%COUNTER2_MS To:0 Do Maths:Off Append:Off]
A8: Goto Action [ Number:16]
A9: Variable Set [ Name:%RADIOSTATUS_MS To:0 Do Maths:Off Append:Off]
A10: Stop [ With Error:Off] If [ %CELLSRV ~ *nopower* ]
A11: Variable Set [ Name:%RADIOSTATUS_MS To:1 Do Maths:Off Append:Off] If [ %CELLSRV !~ *unknown*/*noservice*/*emergency*/*nopower* ]
A12: If If [ %RADIOSTATUS_MS = 1 ]
A13: Write File [ File:Tasker/log/reacquire_radio_signal.txt Text:%DATE %TIME - Signal recovered successfully after #%COUNTER2_MS attempts (strength = %CELLSIG, network = %TNET, cell state = %CELLSRV) Append:On]
A14: Stop [ With Error:Off]
A15: End If
A16: Vibrate [ Time:400]
A17: Music Play [ File:notifications/Alert-Sonar.mp3 Start:0 Loop:Off]
A18: Airplane Mode [ Set:On]
A19: Wait [ MS:0 Seconds:15 Minutes:0 Hours:0 Days:0]
A20: Airplane Mode [ Set:Off]
A21: Variable Add [ Name:%COUNTER2_MS Value:1 Wrap Around:0]
A22: Write File [ File:Tasker/log/reacquire_radio_signal.txt Text:%DATE %TIME - Signal recovery attempt #%COUNTER2_MS Append:On]
A23: Wait [ MS:0 Seconds:0 Minutes:1 Hours:0 Days:0]
A24: Goto Action [ Number:9]