Желаю всем здравия, други мои.
Скультивировал тут намедни приблуду на базе ЕСП8266 и прикол в том, что на написание VCL-проги поддержки (с параллельной дошлифовкой прошивки) ушло пару-тройку дней (хоть в той же ХЕ2), а вот с Андрюхиной поддержкой - вторую неделю бьюсь (как рыба об лёд). Во-первых: возможность компилить под Андрюху появилась (по-моему) только в ХЕ5, но она с поставленной задачей если и справилась, то весьма и весьма дерьмовенько и, не испытывая судьбу с ХЕ6 и ХЕ7, скачал сразу аж ХЕ8 и о-ля-ля, но есть одна бЯда: на точки останова - ноль эмоций (т.е. отладка на RedMi4Pro - невозможна и как следствие - вместо Exception-мессагов типа нет ВаВай-пермишенсов или "память не может быть реад": выпадение через чёрный экран на рабочий стол - может lSuper чё-то нужное вырезал?) и как следствие - следующий шаг: 10.4.1 Сидней(от того же lSuper'a)... Но тут другая бЯда: функции ВаВайСкан и ВаВайКоннект не работают никак: отлаживай-не отлаживай, трассируй - не трассируй(тут Exception-мессаги изобилуют)... Но это - предыстория (с параллельным подвопросом: нет ли между ХЕ8 и Сиднеем (ведь как обычно - пока он не дойдёт до ипостаси где-то 10.4.5 - так и будет не одно, так другое дерьмецо подсовывать) какой-нить ХЕ9 или может где-то есть инструкции по настройке той же ХЕ8?), а суть вопроса темы - это: во-вторых... Так вот Во-вторых: (что под ХЕ8, что под Сиднеем) если процедура хочет что-то сообщить пользователю при чём не однократно, а раз эдак 5-6, то пользователь видит только 1-е из сообщений (при чём если кто-то из последующих более ресурсоёмок по тексту, то видно только его затенённые края) и приходится 5-6 раз жать "ОК" (и тут принцип стека LIFO - никто не отменял: сообщение, появившееся последним, пропадает (так и оставшись непрочитанным) первым) и ЧЁ там процедура натворила? - Х его З: ведь там "внизу" могли быть не только сообщения, но и диалоги, а касание мимо окна диалога расценивается как No, Cancel, Abort и т.д. но прочитать что за вопрос был - уже не судьба... При курении справки на этот предмет (в разделе где-то/что-то/как-то так TDialogService) на поверхность выплыло, что метод .Sync (синхронно т.е. когда ShowMessage ждёт нажатия "ОК") работает только для Win/Lin/Mac/Огрызка, а для Андрюхи - только .АSync (поэтому и все 6 "форточек" появляются "синхронно", а процедура давно першагнула "end;"). Пришлось, слегка поЯndexив, изобретать собственный лИсАпед который я и хочу вынести на всеобщий(ее) суд(обозрение):
var
Form2:TForm2;DlgMR:TModalResult;Step: byte =0;
tsWS, tsESP:TStringList;GlobIterator: integer =0;
implementation
{$R *.fmx}
uses
UMyMsgDlg;
procedure TForm2.MyShwMsg(Msg: string);
var
mY:TMyMsgDlg;Begin
mY :=TMyMsgDlg.Create(Msg, mbОК, self, nil, nil);
mY.ShowMe;End;
procedure TForm2.MyMsgDlg(Msg: string;AButtons:TMyMsgDlgBtn);
var
mY:TMyMsgDlg;Begin
mY :=TMyMsgDlg.Create(Msg,AButtons, self,
procedure // btOkClick
begin
caseAButtons of
mbДаНет:DlgMR:= mrYes;
mbОКейОтмена:DlgMR:= mrOk;
mbПовторПрервать:DlgMR:= mrRetry;
end;Inc(Step);
end,
procedure // btCancelClick
begin
caseAButtons of
mbДаНет:DlgMR:= mrNo;
mbОКейОтмена:DlgMR:= mrCancel;
mbПовторПрервать:DlgMR:= mrAbort;
end;Inc(Step);
end);
mY.ShowMe;End;
procedure TForm2.btTimerDlgClick(Sender:TObject);
begin
DlgTimer.Enabled:=True;IfNotWifiManager.isWifiEnabled then
MyMsgDlg('При инициализации ВаФайМанагера оказалось, что РадиоМодуль обесточен.'+' ТипО "Включить ВайВай?"', mbДаНет){ElseBegin// WiFi включен
inc(Step);// вместо MyMsgDlg : без тимераFirstStep(mrNone);End;}end;ProcedureTForm2.FirstStep(MesRes:TModalResult);
begin
ifMesRes= mrYes then
BeginifWifiManager.setWifiEnabled(true) then
MyMsgDlg('WiFi включен. Провести сканирование в пределах видимости '+'на предмет обнаружения наших железяк?', mbПовторПрервать);EndElse// MesRes = mrNoBeginIfWiFiScan('ESP-007', tsESP)=0Then// Step = 1MyMsgDlg('В эфире не обнаружено ни '+#10 + #13 +'одной железяки. Продолжаем?', mbОКейОтмена);// Step =>> 2; mbДаНетElse// если железяки морзируют тоннамиifFileExists(TPath.Combine(TPath.GetSharedDocumentsPath,'AP_Name.txt')) then ~ tstmp.ЛоадФромФилеifWiFiConnect(tstmp.Strings[0]) then
BeginMyShwMsg('Сетевое Имя агрегата найдено в файле, соединение - установлено');DlgTimer.Enabled:=false;End;Else//File_Not_Exists 'AP_Name.txt'MyMsgDlg('Файл AP_Name.txt не обнаружен - вычисляем сетевое Имя агрегата по алгоритму?', mbДаНет);End;
end;ProcedureTForm2.SecondStep(MesRes:TModalResult);
begin
caseMesRes of
mrYes:Begin// вычисляем сетевое Имя агрегата по алгоритмуif tsESP.Count<2 then
BeginMyMsgDlg('Необходимо подтвердить что найденная в эфире железяка - твоя', mbОКейОтмена);Endelse// tsESP.Count = 2 or > 2BeginWiFiConnect(tsESP.Strings[GlobIterator]);{GlobIterator=0}BuzTimer.Enabled:=True;MyMsgDlg('Слышите звуковые сигналы с интервалом пол-секунды?111', mbДаНет);End;End;
mrNo:BeginMyShwMsg('???');DlgTimer.Enabled:=false;End;
mrOk:Begin// В эфире не обнаружено ни одной железяки. Продолжаем?ifWiFiScan('ESP-007', tsESP)=0 then // т.е. все=Выкл и ESP-007.1, и ESP-007.2, и ... ESP-007.999999BeginMyShwMsg('Включите агрегат в сеть 220в, нажмите на нём кнопку "WiFi" и повторите процедуру');DlgTimer.Enabled:=false;Endelse{"tsESP.Count <> 0"}Begin tsESP.Free;Dec(Step);FirstStep(mrNo);// MesRes = mrNo : WiFi включенEnd;
mrCancel:BeginMyShwMsg('Перезапустите агрегат: 220в= Выкл/Вкл, нажмите на нём кнопку "WiFi" и повторите процедуру');DlgTimer.Enabled:=false;End;
mrRetry:Begin// Провести сканирование в пределах видимостиDec(Step);// "синхронизация" тимераFirstStep(mrNo);End;
mrAbort:BeginMyShwMsg('Ну-у-у... Так мы никогда не узнаем что в окрУге творится');DlgTimer.Enabled:=false;End;
end;
end;ProcedureTForm2.ThirdStep(MesRes:TModalResult);
begin
caseMesRes of
mrOk:Begin{Необходимоподтвердить}WiFiConnect(tsESP.Strings[0]);Sleep(50);BuzTimer.Enabled:=True;MyMsgDlg('Слышите звуковые сигналы'+#10 + #13 +'с интервалом пол-секунды?222', mbДаНет);End;
mrCancel:BeginMyShwMsg('А зря отказался : вдруг железяка, что в эфире - твоя?');DlgTimer.Enabled:=false;End;
mrYes:SaveFile;//Слышите звуковые сигналы
mrNo:Begin// He Слышите звуковые сигналыifGlobIterator< tsESP.Count-1 then
BeginInc(GlobIterator);Dec(Step);ifWiFiConnect(tsESP.Strings[GlobIterator]) then BuzTimer.Enabled:=True;MyMsgDlg('Слышите звуковые сигналы с интервалом пол-секунды?333', mbДаНет);EndElseBegin// список кончилсяMyShwMsg('Проверьте: агрегат запитан от 220в? Кнопка "WiFi" нажата? И повторите процедуру - '+'похоже, что звуковые сигналы звучали на соседской кухне...');DlgTimer.Enabled:=false;Step:=255;End;End;
mrRetry:Begin// Из SecondStep не вызывалосьEnd;
mrAbort:Begin// Из SecondStep не вызывалосьEnd;
end;
end;ProcedureTForm2.FourtStep(MesRes:TModalResult);
begin
ifMesRes= mrYes then // Слышите звуковые сигналыSaveFile;
end;ProcedureTForm2.SaveFile;Var
s: string;BeginBuzTimer.Enabled:=False;
s:= tsESP.Strings[GlobIterator];
tsESP.Clear;
tsESP.Add(s);
tsESP.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath,'AP_Name.txt'));MyShwMsg('Спасибо. Агрегат детектирован, сетевое Имя сохранено.');DlgTimer.Enabled:=false;End;
procedure TForm2.DlgTimerTimer(Sender:TObject);
begin
ifDlgMR<> mrNone then
BeginCaseStep of
0:;// ждём ответа юзверя = mrYes1:FirstStep(DlgMR);2:SecondStep(DlgMR);3:ThirdStep(DlgMR);4:FourtStep(DlgMR);End;DlgMR:= mrNone;End;
end;
end.
Прошу учесть что это - лишь урезанный до нельзя (но чтобы можно было понять принцип синхронизации) скелет реально работающей проги. И да - за саму идею огромное спасибо krapotkin'у и ZuBy (исходники прикрепляю). И при чём можно было бы ещё чётче синхронизировать (но у меня почему-то не получилось: на 3-ем шаге - висюк):
ProcedureTForm2.DlgTimerTimer(Sender:TObject);BeginifDlgMR<> mrNone then
BegincaseStep of
....End;DlgMR:= mrNone;ifStep<>2 then // 3-ка норм. не запускаетсяDlgTimer.Enabled:=false;End;End;
но тогда при каждом вызове MyMsgDlg надо запускать DlgTimer тогда будет работать так: например FirstStep вывесила окно диалога и завершила свою работу, а таймер ежесекундно опрашивает результат диалога и как только результат стал вменяемым (а не mrNone) таймер запускает следующую (в соответствии с переменной Step) процедуру с полученным результатом и останавливается до следующего вызова MyMsgDlg.
З.Ы. И на закуску - второй подподвопрос: существует ли эмулятор Андрюхи который может реально общаться с внешним миром через ВаВай-свисток например D-Link DWA125?
Вопрос
UFO 007
Желаю всем здравия, други мои.
Скультивировал тут намедни приблуду на базе ЕСП8266 и прикол в том, что на написание VCL-проги поддержки (с параллельной дошлифовкой прошивки) ушло пару-тройку дней (хоть в той же ХЕ2), а вот с Андрюхиной поддержкой - вторую неделю бьюсь (как рыба об лёд). Во-первых: возможность компилить под Андрюху появилась (по-моему) только в ХЕ5, но она с поставленной задачей если и справилась, то весьма и весьма дерьмовенько и, не испытывая судьбу с ХЕ6 и ХЕ7, скачал сразу аж ХЕ8 и о-ля-ля, но есть одна бЯда: на точки останова - ноль эмоций (т.е. отладка на RedMi4Pro - невозможна и как следствие - вместо Exception-мессагов типа нет ВаВай-пермишенсов или "память не может быть реад": выпадение через чёрный экран на рабочий стол - может lSuper чё-то нужное вырезал?) и как следствие - следующий шаг: 10.4.1 Сидней(от того же lSuper'a)... Но тут другая бЯда: функции ВаВайСкан и ВаВайКоннект не работают никак: отлаживай-не отлаживай, трассируй - не трассируй(тут Exception-мессаги изобилуют)... Но это - предыстория (с параллельным подвопросом: нет ли между ХЕ8 и Сиднеем (ведь как обычно - пока он не дойдёт до ипостаси где-то 10.4.5 - так и будет не одно, так другое дерьмецо подсовывать) какой-нить ХЕ9 или может где-то есть инструкции по настройке той же ХЕ8?), а суть вопроса темы - это: во-вторых... Так вот Во-вторых: (что под ХЕ8, что под Сиднеем) если процедура хочет что-то сообщить пользователю при чём не однократно, а раз эдак 5-6, то пользователь видит только 1-е из сообщений (при чём если кто-то из последующих более ресурсоёмок по тексту, то видно только его затенённые края) и приходится 5-6 раз жать "ОК" (и тут принцип стека LIFO - никто не отменял: сообщение, появившееся последним, пропадает (так и оставшись непрочитанным) первым) и ЧЁ там процедура натворила? - Х его З: ведь там "внизу" могли быть не только сообщения, но и диалоги, а касание мимо окна диалога расценивается как No, Cancel, Abort и т.д. но прочитать что за вопрос был - уже не судьба... При курении справки на этот предмет (в разделе где-то/что-то/как-то так TDialogService) на поверхность выплыло, что метод .Sync (синхронно т.е. когда ShowMessage ждёт нажатия "ОК") работает только для Win/Lin/Mac/Огрызка, а для Андрюхи - только .АSync (поэтому и все 6 "форточек" появляются "синхронно", а процедура давно першагнула "end;"). Пришлось, слегка поЯndexив, изобретать собственный лИсАпед который я и хочу вынести на всеобщий(ее) суд(обозрение):
Прошу учесть что это - лишь урезанный до нельзя (но чтобы можно было понять принцип синхронизации) скелет реально работающей проги. И да - за саму идею огромное спасибо krapotkin'у и ZuBy (исходники прикрепляю). И при чём можно было бы ещё чётче синхронизировать (но у меня почему-то не получилось: на 3-ем шаге - висюк):
но тогда при каждом вызове MyMsgDlg надо запускать DlgTimer тогда будет работать так: например FirstStep вывесила окно диалога и завершила свою работу, а таймер ежесекундно опрашивает результат диалога и как только результат стал вменяемым (а не mrNone) таймер запускает следующую (в соответствии с переменной Step) процедуру с полученным результатом и останавливается до следующего вызова MyMsgDlg.
З.Ы. И на закуску - второй подподвопрос: существует ли эмулятор Андрюхи который может реально общаться с внешним миром через ВаВай-свисток например D-Link DWA125?
Заранее благодарен.
0_для форума.zip
Изменено пользователем UFO_007Ссылка на комментарий
7 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.