|
вопрос по Си небольшой. |
|
|
|
 |
Ответов
|
Sep 6 2006, 06:24
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Что значит цикл case??? на case IDLE_HAS_KEY: вы попадете только когда оператор switch(State) выполнится заново и при этом State будет = IDLE_HAS_KEY switch - это всего лишь переключатель в зависимости от State делается JUMP в нужную точку если хотите в этой же итерации попасть туда используйте goto например так: Код switch(State) { ... case IDLE: // этот код выполняется если снято с охраны off(LED);
if( one_wire_main () ) { //если что-то приложили (ключ)
if(USER_KEYS()) { State = IDLE_HAS_KEY; goto _IDLE_HAS_KEY: } }
break;
case IDLE_HAS_KEY: _IDLE_HAS_KEY: ...
Сообщение отредактировал KRS - Sep 6 2006, 06:28
|
|
|
|
|
Sep 6 2006, 06:55
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(KRS @ Sep 6 2006, 10:24)  Что значит цикл case??? на case IDLE_HAS_KEY: вы попадете только когда оператор switch(State) выполнится заново и при этом State будет = IDLE_HAS_KEY switch - это всего лишь переключатель в зависимости от State делается JUMP в нужную точку если хотите в этой же итерации попасть туда используйте goto например так: Код switch(State) { ... case IDLE: // этот код выполняется если снято с охраны off(LED);
if( one_wire_main () ) { //если что-то приложили (ключ)
if(USER_KEYS()) { State = IDLE_HAS_KEY; goto _IDLE_HAS_KEY: } }
break;
case IDLE_HAS_KEY: _IDLE_HAS_KEY: ... Совет правильный, но вообще-то использование команды goto является плохим стилем программирования и очень затрудняет отладку. Лично я построил бы диспетчер следующим образом: Код do{
State = IDLE; off(LED); // этот код выполняется если снято с охраны ...
if( one_wire_main () && USER_KEYS()) //если приложили правильный ключ State = IDLE_HAS_KEY;
if( ... ) //другое событие State = ...;
if( ... ) //n-е событие State = ...;
}while(State == IDLE);
switch(state) { case IDLE_HAS_KEY: ... break;
case ...: ... break; default: ... break; } Ну и все это, разумеется, крутится в бесконечном цикле.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 6 2006, 08:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
ясно, с этим вроде разобрался, вот ещё не ясно как лучше сделать. Уже, наверное, понятно, что я пишу под ключ- таблетку. У меня есть мастер ключ, и есть юзер ключи. Теперь я хочу, чтобы если приложил кратковременно мастер, просто поменяло состояние на другое, а если его удерживаю хотя бы 5 сек, сразу попадаю в др. подпрограмму записи USER ключа. Как это лучше реализовать?
if( MasterKey () ) { //здесь- что, если приложен мастер //здесь опишем процесс, записи новых ключей, только из IDLE //если прижали мастер на 5 сек CntT0= 0; while (CntT0 !=95) //если в теч. 5 сек. приложили мастер, вызываю запись USERa ... WRITE_KEY(); ... State = IDLE_HAS_KEY; ...
State = IDLE_HAS_KEY; это состояние, куда я должен попать если кратковременно приложил- отпучтил ключ, а если 5 сек. удерживаю, то в ф-ю WRITE_KEY();
как бы это завернуть покрасивше?
Сообщение отредактировал Метценгерштейн - Sep 6 2006, 08:32
|
|
|
|
|
Sep 6 2006, 11:41
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(Метценгерштейн @ Sep 6 2006, 12:29)  ясно, с этим вроде разобрался, вот ещё не ясно как лучше сделать. Уже, наверное, понятно, что я пишу под ключ- таблетку. У меня есть мастер ключ, и есть юзер ключи. Теперь я хочу, чтобы если приложил кратковременно мастер, просто поменяло состояние на другое, а если его удерживаю хотя бы 5 сек, сразу попадаю в др. подпрограмму записи USER ключа. Как это лучше реализовать? ... Кстати, а как Вы собираетесь определять, что в течение всех этих 5 секунд был приложен мастер ключ? Постоянно считывать и проверять его код? - неудобно. В многих подобных системах используется след. алгоритм: 1. При кратковременном замыкании контактов считывателя переходим в режим ожидания мастер-ключа. 2. Если в течение заданного интервала обнаружили мастер - переходим в режим записи USER-ключа, иначе - возвращаемся в режим ожидания. 3. Ну, и если в режиме программирования в течение разумного промежутка не был обнаружен новый ключ или же при повтороном замыкании контактов считывателя - также возвращаемся в дежурный режим.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 8 2006, 07:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
немного конкретизирую задачу- при приложении мастер- ключа, устойчиво переходит из состояний охрана- снято. Но, я хочу, чтобы если подержал подольше мастер- ключ- секунды 4, то попадаю в ф-ю записи юзер- ключа. Для начала, надо, чтобы я устойчиво попадал в эту прогу, а там мигал хитро светодиодом. Подскажите, плз. Вот образец куска проги общей.
if( MasterKey () ) { //здесь- что, если приложен мастер //здесь опишем процесс, записи новых ключей, только из IDLE //если прижали мастер на 5 сек //**************************** ***************** ******************************* /* CntT0= 0; if( !one_wire_main () ) { //если отпустили ключ if (CntT0 < 95) //если не досчитал до 5 сек., то меняю сост. на IDLE_HAS_KEY State = IDLE_HAS_KEY; else WRITE_KEY(); } */ //************************************* **************** ************************ State = IDLE_HAS_KEY; } }
здесь закомментировано, так оно просто переключается между состояниями, ф-я записи ключей WRITE_KEY(); попав в неё, я хочу помигать лампочкой. Как лучше тут описать? Чтобы я держал ключ, как только время достигло 4 сек, оно прыгал в ту ф-ю, а не ждало пока я ключ отпущу, и потом только прыгало?
|
|
|
|
|
Sep 8 2006, 12:41
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(Метценгерштейн @ Sep 8 2006, 11:35)  ... Как лучше тут описать? Чтобы я держал ключ, как только время достигло 4 сек, оно прыгал в ту ф-ю, а не ждало пока я ключ отпущу, и потом только прыгало? По логике нужно использовать 1-й вариант - а то как пользователь узнает, что мастер-ключ уже можно отпускать.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 11 2006, 10:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
while ( MasterKey () ) { //пока ещё приложен ключ CntT0= 0; if (CntT0 == 95) { //если не досчитал до 5 сек., то меняю сост. на IDLE_HAS_KEY WRITE_KEY (); } } такая конструкция была бы правильной? В ф-ии WRITE_KEY (); я просто мигаю лампочкой. Но вот что- то оно не мигает....
|
|
|
|
Сообщений в этой теме
Метценгерштейн вопрос по Си небольшой. Sep 6 2006, 06:13   Метценгерштейн так корректно будет?
CntT0= 0;
if( !o... Sep 6 2006, 09:22       PaulS Цитата(Метценгерштейн @ Sep 11 2006, 14:2... Sep 11 2006, 10:54 Shurmas Пример с сетью 1-wire с "таблеткой" и др... Sep 11 2006, 13:41 Метценгерштейн ещё вопрос по Си (простой)
в таком виде
case ARME... Sep 14 2006, 11:17 dezzer ЦитатаНе понятно по скобкам, этот таймер у меня вн... Sep 14 2006, 11:44 Метценгерштейн всё правильно, я немного не так выразился, по прер... Sep 14 2006, 12:02  _Bill Цитата(Метценгерштейн @ Sep 14 2006, 15:0... Sep 14 2006, 12:21 xemul 2 Метценгерштейн
имхо, было бы неплохо нарисовать ... Sep 14 2006, 15:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|