PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Проекты (http://pccar.ru/forumdisplay.php?f=21)
-   -   TOYOTA Prius 11S CarPC (http://pccar.ru/showthread.php?t=5003)

ashu 20.11.2008 18:34

Ahk-скрипт переписал.

Скрипт к предыдущему функционалу получил теперь умения:
- поддерживать интернет-соединение
- показывать "возраст" файла пробок СитиГида
- СитиГид запускается сразу с включенным GPS
- нормальная обработка ошибок подключения к Интернету
- нормальная обработка ошибки WinAmp'а из-за долгой инициализации звуковой usb-карты

В скине РоадРаннера:
- переменная $OnlineStatus$ показывает статус подключения в Интернету (проверяется пингом);
- переменная $OnlineSwitch$ показывает состояние переключателя "поддерживать соединение с Интернетом или нет";
- переменная $MYJAMG$ показывает "возраст" пробочного файла СитиГида зеленым цветом;
- переменная $MYJAMR$ показывает "возраст" пробочного файла СитиГида красным цветом (предполагается, что координаты надписи будут такими же, как и у $MYJAMG$; пример см. ниже).

Для включения/отключения/переключения поддержателя соединения с Интернетом из RR надо дать команду (например, повесить это на отдельную кнопку):
SENDMSG;avc_control.ahk;online - поддерживать соединение
SENDMSG;avc_control.ahk;offline - не поддерживать соединение (при получении команды соединение разрывается)
SENDMSG;avc_control.ahk;switch - поменять состояние поддерживать/не поддерживать

avc_control.ahk:
Код:

#NoTrayIcon                ; не отображать значок скрипта в трее
#SingleInstance force        ; перезагрузить скрипт, если он уже запущен
DetectHiddenWindows, On        ; искать в скрытых окнах
#NoEnv                        ; запрещаем имена переменных как у переменных окружения
SendMode Input                ; ускорренный ввод
#Persistent                ; держать скрипт запущенным
SetTitleMatchMode 2        ; 2 - заголовок окна должен содержать значение, заданное в параметре

; ----------- редактируемые переменные - настройки ------------

winampid        := "RRWinamp"                                ; идентификатор класса окна винампа
cityguide        := "City Guide"                                ; название окна CityGuide
myconnection        := "BluetoothConnection"                ; название подключения к Инету
btadapter        := "Jabra - A320s"                        ; название адаптера bluetooth
pinghost1        := "www.relcom.ru"                        ; кого мучаем пингами в первую очередь (www.relcom.ru)
pinghost2        := "www.ru"                                ; кого мучаем пингами во вторую очередь (www.ru)
onlinestr        := "В сети"                                ; сообщение "Online" на экране (переменная RR OnlineStatus)
offlinestr        := "---"                                ; сообщение "Offline" на экране
chkonline        := "+                +"                ; сообщение "постоянное подключение" на экране
pstripwin        := "Меры предосторожности"                ; название стартового окна восстановления PowerStrip'а
svhostwin        := "svchost.exe - Ошибка приложения"        ; название окна ошибки службы (вероятнее всего служба Windows Audio)
winamperror        := "NullSoft DirectSound output"        ; название окна винампа с ошибкой звукового устройства
checkperiod        := 40                                        ; через сколько секунд (примерно) запускаем процедуру проверки сети и пробок СитиГида
myjamfile        := "C:\Program Files\City Guide\78SPb.jam" ; за каким файлом пробок следим (боевой)
;myjamfile        := "C:\CityGuide\City Guide 2.2\78SPb.jam" ; за каким файлом пробок следим (тестовый)
jamgreen        := 8                                        ; до скольки минут считать возраст пробок зеленым
jamred                := 40                                        ; до скольки минут считать возраст пробок красным
empty                := "нет"                                ; что пишем на экране, если пробочный файл очень старый

; -------- конец редактируемых переменных - настроек ----------


WinAmpActive := 0
CityGuideActive := 0
day := 1
online := 0
setoffline := 0
oncheckonline := 0
Lastcheck := 0
checkperiod := - checkperiod * 1000

; Создаем пустое окно и сразу его прячем. Окно необходимо для получения команд управления от RR
Gui, Show
WinHide, avc_control.ahk

; Устанавливаем обработчик для приёма команд через WM_COPYDATA от RR
OnMessage(0x4A, "OnCopyData")

SetTimer, CheckWarnings, -1000
SetTimer, CheckInternet, %checkperiod%, -1 ; периодическая проверка подключения к Интернету (с пониженным приоритетом)

StartWinAmp:
        SendMessage, 0x400,, 104,, ahk_class %winampid% ; проверка воспроизведения
        If ErrorLevel = 0 ; если не воспроизводится, то...
                PostMessage, 0x111, 40045,,, ahk_class %winampid% ; включить воспроизведение
; наверняка было выключение, поэтому проверяем подключение к Инету
; инициируем новый цикл проверки Интернета через 1 секунду
        If (oncheckonline <> 1)
                SetTimer, CheckInternet, -1000, -1
        return

CheckWarnings:
; Обработчик варнингов
        If WinAmpActive = 0
        {
                IfWinExist, ahk_class %winampid%
                {
; WinAmp не был запущен, а сейчас найден в списке окон
                        Gosub StartWinAmp
                        WinAmpActive := 1
                }
        }
        Else
        {
                IfWinNotExist, ahk_class %winampid%
                {
                        WinAmpActive := 0
                }
                Else
                {
                        If (Lastcheck + 30000 < A_TickCount)
                        {
                                ; WinAmp был запущен и существует до сих пор, но
                                ; давно не было проверок, возможно, работа останавливалась
                                SetTimer, StartWinAmp, -1000
                        }
                }
        }
        If CityGuideActive = 0
        {
                IfWinExist, %cityguide%
                {
; CityGuide не был запущен, а сейчас найден в списке окон
                        WinActivate
                        Send, 5 ; включить GPS
                        CityGuideActive := 1
                }
        }
        Else
        {
                IfWinNotExist, %cityguide%
                {
                        CityGuideActive := 0
                }
        }
        IfWinExist, %pstripwin%
        {
; Найдено стартовое окно восстановления PowerStrip'а
                WinActivate
                Send, Д
        }
        IfWinExist, %winamperror%
        {
; Найдено окно WinAmp'а с ошибкой звукового устройства
; Вероятнее всего звуковая usb-карта не успела проинициализироваться
; закрываем окно с ошибкой и через 5 секунд пытаемся запустить PLAY
                WinActivate
                Send, {Enter}
                SetTimer, StartWinAmp, -5000
        }
        IfWinExist, %svhostwin%
        {
; Скидываем полученную ошибку приложения (вероятнее всего служба Windows Audio)
                WinActivate
                Send, {Esc}
                SetTimer, RestartAudio, -1000
        }
        Lastcheck := A_TickCount
        SetTimer, CheckWarnings, On
        return

RestartAudio:
        RunWait, net stop AudioSrv,, Hide
        RunWait, net start AudioSrv,, Hide
        return

CheckInternet:
; Обработчик интернет-проверок
        If(oncheckonline = 1)
                return
        Else
                oncheckonline := 1
        If (setoffline = 1)
                Gosub DoOffline
        Gosub DoOnline

; Получаем время файла пробок
        FileGetTime, OutputVar, %myjamfile%
        mhour := Substr(OutputVar, 9, 2)
        mmin := Substr(OutputVar, 11, 2)

; Собираем текущую отметку времени (в минутах)
        currconntimestamp := A_Min + A_Hour*60

        lastjamtimestamp := mmin + mhour*60

        If (currconntimestamp < lastjamtimestamp)
                currconntimestamp := currconntimestamp + 24*60

; Получаем возраст файла пробок
        jamtime := currconntimestamp - lastjamtimestamp

        jamexpired := 0
        If (currconntimestamp > lastjamtimestamp + jamgreen)
                jamexpired := 1
        If (currconntimestamp > lastjamtimestamp + jamred)
                jamtime := empty

; тут надо нарисовать цветом возраст пробочного файла
        If (jamexpired = 0)
        {
; Делаем зеленым
                SendToRR("SETVAR;MYJAMR||SETVAR;MYJAMG;" . jamtime)
        }
        Else
        {
; Делаем красным
                SendToRR("SETVAR;MYJAMG||SETVAR;MYJAMR;" . jamtime)
        }
        SetTimer, CheckInternet, %checkperiod%, -1
        oncheckonline := 0
        return ; конец процедуры CheckInternet

DoOffline:
        If (online = 1)
                SendToRR("SETVAR;OnlineSwitch;" . chkonline)
        Else
                SendToRR("SETVAR;OnlineSwitch")
        setoffline := 0

        RunWait, rasdial %myconnection% /DISCONNECT,, Hide
        SendToRR("SETVAR;OnlineStatus;" . offlinestr)

        return

DoOnline:
        If (online = 1)
                SendToRR("SETVAR;OnlineSwitch;" . chkonline)
        Else
                SendToRR("SETVAR;OnlineSwitch")
        Loop, 5 ; предпринимаем 5 попыток подключиться
        {
                RunWait, ping -n 3 -f -w 2000 %pinghost1%,, UseErrorLevel|Hide
                If (ErrorLevel = 0)
                {
                        SendToRR("SETVAR;OnlineStatus;" . onlinestr)
                        Break
                }
                Else
                {
                        If (online = 1)
                                Sleep, 5000
                        RunWait, ping -n 3 -f -w 2000 %pinghost2%,, UseErrorLevel|Hide
                        If (ErrorLevel = 0)
                        {
                                SendToRR("SETVAR;OnlineStatus;" . onlinestr)
                                Break
                        }
                        Else
                        {
                                SendToRR("SETVAR;OnlineStatus;" . offlinestr)
                        }
                }
                If (online = 1)
                {
                        Gosub DoOffline
                        Sleep, 2000
                        If (A_Index > 4)
                        {
; 4 попытки подключиться прошли напрасно - принимаем радикальные меры
; Отключаем и снова подключаем адаптер bluetooth
                                RunWait, C:\Tools\usr.exe stop -n "%btapapter%",, Hide
                                RunWait, C:\Tools\usr.exe return -n "%btadapter%",, Hide
                                Sleep, 5000 ; даём системе прийти в себя после такого надругательства
                        }
                        RunWait, rasdial %myconnection%,, Hide
                }
                Else
                {
                        Break
                }
        }
        return

OnCopyData(wparam, lparam)
{
; функция получения входящего сообщение WM_COPYDATA
; Сюда приходит вызов с полученным сообщением-командой от RR

        local pStr
        pStr := NumGet(lparam+8), len := NumGet(lparam+4)
        RecvMessage := SubStr(DllCall("MulDiv", "Int", pStr, "Int",1, "Int",1, "str"),1,len)

        If (RecvMessage = "switch") {
                If (online = 1)
                        online := 0
                Else
                        online := 1
        }
        Else
        {
                If (RecvMessage = "online")
                        online := 1
                Else
                        online := 0
        }
        If (online = 1)
        {
                setoffline := 0
                SendToRR("SETVAR;OnlineSwitch;" . chkonline)
        }
        Else
        {
                setoffline := 1
                SendToRR("SETVAR;OnlineSwitch")
        }

        If (oncheckonline <> 1)
                SetTimer, CheckInternet, -1000, -1 ; инициируем новый цикл проверки Интернета

        return 1 ; подтверждаем успешный приём сообщения
}

; Функция отправки команды в RoadRunner
SendToRR(msg="")
{
        len := StrLen(msg)
        port := 1 ; RR слушает команды, приходящие на порт 1
        VarSetCapacity(CopyDataStruct, 12, 0)
        NumPut(port, CopyDataStruct, 0)
        NumPut(len, CopyDataStruct, 4) ; тут именно len, а не len+1 как пишут в некоторых примерах
        NumPut(&msg, CopyDataStruct, 8)
        SendMessage, 0x4A,, &CopyDataStruct,, RoadRunner
}


; Далее - обычные реакции на хоткеи


^!+c::^!5                ; AutoHide для указателя мышки

^!+b::Click right        ; имитация правой кнопки мышки

^!+a::                        ; screenshot текущего экрана
        RunWait, nircmd savescreenshot C:\PrScr.png,, Hide
        FileGetTime, OutputVar, C:\PrScr.png, C
        FileMove C:\PrScr.png, C:\Scrns\ss_%OutputVar%.png
        return

^!+e::                        ; Команда NEXT для WinAmp'а
        PostMessage, 0x111, 40048,,, ahk_class RRWinamp ; следующий трек
        return

^!+f::                        ; Команда PREV для WinAmp'а
        PostMessage, 0x111, 40044,,, ahk_class RRWinamp ; предыдущий трек
        return

^!+h::                        ; Команда PLAY/PAUSE для WinAmp'а
        SendMessage, 0x400,, 104,, ahk_class RRWinamp ; проверка воспроизведения
        If ErrorLevel = 0 ; если не воспроизводится, то...
                PostMessage, 0x111, 40045,,, ahk_class RRWinamp ; включить воспроизведение
        Else ; если воспроизводится, то...
                PostMessage, 0x111, 40046,,, ahk_class RRWinamp ; поставить на паузу
        return

^!+i::                        ; Переключатель профилей PowerStrip'а день/ночь
        if(!day)
        {
                Send, ^!1
                day := 1
        }
        else
        {
                Send, ^!2
                day := 0
        }
        return

Пример показа СитиГида в скине DigitalFX 3.0 через External_GPS.skin:
Код:

RoadRunner Skin
RRScreen CityGuide
IGUIDANCE_OFF.png,IGUIDANCE_OFF.png,IGUIDANCE_ON.png,IGUIDANCE_OFF.png
INC,DFX_Font_Color.txt
 
/, L, x, y, w, h, color R;RGB, G, B, font size;FONT, font name, Code;LABELCODES, Tooltip;LABELALIGNMENT
L,2,94,71,41,#DFX1R#,#DFX1G#,#DFX1B#,24,"Arial","GPSALT","CENTER"
L,8,402,36,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Sat:","RIGHT"
L,6,504,75,17,#DFX2R#,#DFX2G#,#DFX2B#,8,"Arial","=$OnLineSwitch$","LEFT"
L,0,503,75,17,#DFX1R#,#DFX1G#,#DFX1B#,10,"Arial","=$OnLineStatus$","CENTER"
L,45,402,33,26,#DFX1R#,#DFX1G#,#DFX1B#,16,"Arial","GPSSAT","LEFT"
L,0,468,75,26,#DFX1R#,#DFX1G#,#DFX1B#,24,"Arial:B","=$MYJAMG$","CENTER"
L,0,466,75,26,#DFX2R#,#DFX2G#,#DFX2B#,26,"Arial:B","=$MYJAMR$","CENTER"
L,0,549,75,26,#DFX1R#,#DFX1G#,#DFX1B#,17,"Arial","=MENU","CENTER"
L,0,266,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=ExtPos","CENTER"
L,0,193,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=CurPos","CENTER"
L,0,237,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Mem","CENTER"
L,0,165,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Mem","CENTER"
L,0,313,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Toggle","CENTER"
L,0,339,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Track","CENTER"
L,1,6,72,59,#DFX1R#,#DFX1G#,#DFX1B#,36,"Arial:B","GPSSPD","CENTER"
 
/, B, x, y, w, h, Command;COMMANDCODES, Tooltip
B,1,229,73,73,"LOCOSK",
B,0,302,73,73,"ACTIVATE;City Guide||SENDKEY;^t",
B,0,375,75,74,"SENDMSG;CamGrabber;SAVE",""
B,-1,451,75,74,"SENDMSG;avc_control.ahk;switch",""
B,1,523,75,74,"MAIN",""
B,0,150,75,75,"LOC",
 
/, A, x, y, w, h, color R;RGB, G, B
A,77,1,724,599,,,

END

Содержимое DFX_Font_Color.txt:
Код:

/DEFINE DFX1R 3
/DEFINE DFX1G 255
/DEFINE DFX1B 5
/DEFINE DFX2R 255
/DEFINE DFX2G 3
/DEFINE DFX2B 5


vad3 25.11.2008 07:39

Цитата:

Сообщение от ashu (Сообщение 76886)
Новости с поля боя...

Недавно я писал:
Обнаружилось, что я некоторых случаях гад СитиГид успевает всё-таки снова начать подключение к Интернету и в этом состоянии засыпает, что, логично, приводит опять-таки к зависанию компьютера при просыпании.

Решилось "контрольным в голову" - отключением при помощи утилиты USB Safely Remove usb-адаптера bluetooth сразу после отключения Интернета (ну, и, соответственно, включением usb-адаптера обратно при включении или выходе компьютера из спящего режима).

При засыпании компа RR теперь выполняет такую последовательность:
Код:

"RUNQ;rasdial|-d||RUNQW;$SkinPath$Scripts\usr" "stop" "-n" "Jabra - A320s"
При включении и выходе из спящего режима:
Код:

"RUNQW;$SkinPath$Scripts\usr" "return" "-n" "Jabra - A320s"
Заодно повесил на одну из кнопок RR команду отключения внешнего usb-накопителя (флешки) - люблю, когда работа устройства корректно останавливается :)
Код:

"RUNQW;$SkinPath$Scripts\usr" "stop" "-d" "F"

Подскажи, где и как прописыал эти команды?

ashu 25.11.2008 09:18

Цитата:

Сообщение от vad3 (Сообщение 79157)
Подскажи, где и как прописыал эти команды?

В ExecTBL.ini в каталоге скина RoadRunner'а.

ashu 26.11.2008 15:05

Как очередное продолжение ;)

Глюки, ошибки и зависоны на данный момент решены обслуживающим ahk-скриптом. Упреждающие действия с выключением/включением bluetooth-адаптера и остановом/запуском WinAmp'а и СитиГида удалены из ExecTBL.ini (оставлены только останов/запуск для avc_usb.exe и camgrabber.exe), так как возникающие иногда ошибки теперь устраняются тем же обслуживающим скриптом. Это позволило сократить время от момента включения компа до полной готовности системы.

ashu 23.05.2009 01:02

Чем кончилась борьба с подключением к Интернету через bluetooth...

Usb-bluetooth адаптер Jabra с родными widcomm'овскими дровами.
После выхода из сна иногда (далеко не всегда) возникала ситуация, что всё работает, но rasdial не может подключиться к Интернету. Помогает либо ручная операция физически вынуть-вставить сам донгл в комп, либо перезагрузка компа.
Ни то, ни другое меня не устраивало (донгл вообще глубоко закопан в подлокотник), хотелось полного автоматизма и без каких-либо перезагрузок компа (из сна комп просыпается намного быстрее обычной загрузки).

Пробовал отключать/включать устройство при помощи devcon'а, идущего в комплекте RR, - не помогло. Пытался отключать/включать устройство при помощи SafelyRemove, - вроде б иногда помогало, но не всегда. Игры с rasdial'ом вообще мимо кассы, - максимум, что добивался, так это исчезновения ярлыка bluetooth-подключения вообще (до перезагрузки).

Когда в очередной раз после выхода из сна rasdial отказался подключаться к Интернету, я стал искать какими манипуляциями всё ж можно добиться восстановления работы rasdial'а... И нашел, что если кликнуть правой кнопкой в трее по иконке bttray.exe (значек блютуса) и в появившемся меню выбрать самый нижний пункт - отключение блютуса, а потом через несколько секунд провести все те же действия и через нижний пункт меню включить блютус, то rasdial снова начинает весело подключаться к Интернету!
Осталось дело за малым - автоматизировать этот процесс ;)

Подключением и отключением от Интернета у меня занимается мой обслуживающий ahk-скрипт, поэтому и решение искать я стал в рамках autohotkey'я. Подробно метод выяснения какую команду надо послать в окно (в том числе и скрытое) описан здесь.
В случае с жаброй всё свелось к двум командам с паузами (в случае нескольких неудачных попыток подключиться к Интернету):

PostMessage, 0x111, 7049,,, ahk_class AfxWnd42 ; bluetooth off
Sleep, 4000 ; ждем примерно 4 секунды
PostMessage, 0x111, 7048,,, ahk_class AfxWnd42 ; bluetooth on
Sleep, 8000 ; ждём примерно 8 секунд

Всё! Тырнет уже месяц есть всегда без перезагрузки! :)


P.S. Скрипт еще немного доработал - теперь показывается не только возраст пробочного файла в минутах, но и название карты, для которого этот пробочный файл скачан.

http://img22.imageshack.us/img22/642...1492230.th.png

ashu 28.07.2009 13:09

Вот нигде гайцы не шакалят на дороге, кроме РФ и Украины...

Видеорегистратор - очень полезная вещь. Очень почему-то хотелось установить его до путешествия в Болгарию... И не зря - сэкономил мне кучу нервов и права на полгода ;)

В Ленобласти меня попытались раскрутить на обгон через сплошную и лишение прав на полгода... Показал гайцу видеозапись - гаец вернул права с улыбкой: "Хорошая у Вас штука установлена" ;)

http://img269.imageshack.us/img269/7013/obgon1.th.png

Похожая история была и на Украине, но там до просмотра видео дело не дошло. :)

MiD_E34 28.07.2009 15:40

а разве у тебя КамГраббер не стоял? Почему им не стал пользоваться?

ashu 28.07.2009 18:44

Цитата:

Сообщение от MiD_E34 (Сообщение 105345)
а разве у тебя КамГраббер не стоял? Почему им не стал пользоваться?

Стоял, но... Во-первых, мой слабенький комп с трудом тянул запись одной камеры, а хотелось больше... А во-вторых, требовалась надёжность, т.е. гарантированность записи, чем камграббер пока похвастаться не может.

(vS) 28.07.2009 23:37

а чем это ты пишешь?

ashu 28.07.2009 23:52

Цитата:

Сообщение от (vS) (Сообщение 105437)
а чем это ты пишешь?

Да, всё тем же корейским регистратором, о котором писал тут: http://forum.pccar.ru/showthread.php?t=8935


Часовой пояс GMT +4, время: 09:36.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot