void incoming_ring() // Выполняется при любом входящем звонке { LED_RED_ON; unsigned char mode = (mode_temp != 0) ? mode_temp : mode_current; // Текущий режим // Сообщение о звонке, указываем текущий режим clunet_send(CLUNET_BROADCAST_ADDRESS, CLUNET_PRIORITY_INFO, CLUNET_COMMAND_INTERCOM_RING, (char*)&mode, 1); if (mode != 3 && mode != 0xFF) intercom_bell(); while (clunet_ready_to_send()); // Ждём, пока будем готовы к передаче if (mode_temp) // Обнуляем временный режим { mode_temp = 0; save_mode(); } if (!LINE_POWER) // Аварийное откртие двери, если набрали и сразу сбросили { mode_temp = 0xFF; save_mode(); } if (mode) { switch (mode) { case 1: // Автоответчик, долго ждёт ответа, потом записывает answer_record(AUTOLONG_WAV, SAVED_FAKE_WAV, 0); break; case 2: // Автоответчик, сразу записывает answer_record(AUTOFAST_WAV, SAVED_WAV, 1); break; case 3: // Приветствует хозяина, открывает дверь answer_play_open(OPENME_WAV); break; case 4: // Приветствует гостя, открывает дверь answer_play_open(OPEN_WAV); break; case 5: // Долго ждёт ответа. Сообщение не пишет. answer_play(WAITLONG_WAV); break; case 9: // Здрасти, здрастите. Проходи, братишка, проходи. answer_play_open(MODE9_WAV); break; case 0xFF: // Аварийное откртие двери answer_play_open(EMERGENCY_OPEN_WAV); } MODE_NORMAL; _delay_ms(500); // На случай, если контакты снятия трубки не успели разомкнуться HANGUP; } while (LINE_POWER); // Ждём пока не пропадёт сигнал LED_RED_OFF; while (OFFHOOK); // И пользователь не положит трубку _delay_ms(100); // Защита от дребезга контактов }
void select_mode(char istemp) // Выбот режима { say_mode(istemp); while (!CONTROL && OFFHOOK) play_wav_auto_pgm(MODELIST_WAV); if (!CONTROL) return; int cnt = count_disk(); if (cnt >= 10) cnt = 0; if (!istemp) { mode_current = cnt; say_mode(0); } else { mode_temp = cnt; say_mode(1); } save_mode(); }
void data_received(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size) { if (command == CLUNET_COMMAND_TIME && size >= 6) // Синхронизация времени { set_time(data[3]+1900, data[4], data[5], data[0],data[1],data[2]); } else if (command == CLUNET_COMMAND_INTERCOM_MODE_REQUEST) // У нас запрашивают режим { send_current_mode(src_address); } else if (command == CLUNET_COMMAND_INTERCOM_MODE_SET) // Установка режима { if (size >= 1 && (unsigned char)data[0] != 0xFF) mode_current = data[0]; if (size >= 2 && (unsigned char)data[1] != 0xFF) mode_temp = data[1]; save_mode(); } else if (command == CLUNET_COMMAND_INTERCOM_RECORD_REQUEST) // Передача записей { if (size == 4) transfer_start(*((unsigned long int*)data), src_address); // Начинаем передачу else if (size == 1 && data[0] == 1) transfer_ack(); // Подтвержают приём, переходим к следующему куску else if (size == 1 && data[0] == 0) transfer_stop(); // Прекращение передачи данных } }
void MainLoop() { int a=0,b=0; while(1) { you.player_move = true; if(you.s_timestep) { turn_skip(); Sleep(16); continue; } int char_ = waitkeyinput(); you.prev_hp[1] = you.hp; you.prev_mp[1] = you.mp; switch(char_) { case 'j': Move(coord_def(you.position.x,you.position.y-1)); //위 break; case 'k': Move(coord_def(you.position.x,you.position.y+1)); //아래 break; case 'h': Move(coord_def(you.position.x-1,you.position.y)); //왼쪽 break; case 'l': Move(coord_def(you.position.x+1,you.position.y)); //오른쪽 break; case 'b': Move(coord_def(you.position.x-1,you.position.y+1)); break; case 'n': Move(coord_def(you.position.x+1,you.position.y+1)); break; case 'y': Move(coord_def(you.position.x-1,you.position.y-1)); break; case 'u': Move(coord_def(you.position.x+1,you.position.y-1)); break; case 'x': //주위탐색 Search(); break; case 's': //턴스킵 case '.': //턴스킵 turn_skip(); break; case 'g': case ',': //줍기 PickUp(); break; case 'i': //아이템확인 iteminfor(); break; case 'd': //아이템버리기 iteminfor_discard(); break; case 'D': //마지막에 먹은 아이템 버리기 fast_discard(); break; case 'w': //무기장착 Equip_Weapon(); break; case 'W': //방어구장착 Equip_Armor(); break; case 'T': //방어구해제 Unequip_Armor(); break; case 'C': //문닫기 Close_door(); break; case 'O': //문열기 Open_door(); break; case 'o': //자동이동 auto_Move(); break; case '5': //100턴넘기기 long_rest(); break; case 0x88: //컨트롤P - 로그 view_log(); break; case 15: //컨트롤o if(isNormalGame()) dungeonView(); break; case 'e': //먹기 Eatting(); break; case 'q': //마시기 Drinking(); break; case 'r': //읽기 Reading(); break; case 'm': //스킬정보창 skill_view(); break; case 'P': //장신구장착 Equip_Jewelry(); break; case 'R': //장신구해제 Unequip_Jewelry(); break; case 'S': //체크후 종료 saveandcheckexit(); break; case 0x89: //강제종료 nosaveandexit(); break; case 0x8A: //저장과 종료 saveandexit(); break; case 'X': //넓은탐색 Wide_Search(); break; case 'f': //던지기(빠른) Quick_Throw(you.GetThrowIter(),you.GetTargetIter()); break; case 'F': //던지기(선택) Select_Throw(); break; case '\\': //식별템 확인 Iden_Show(); break; case '>': Stair_move(true); break; case '<': Stair_move(false); break; case '%': stat_view(); break; case '}': Weapon_Show(); break; case '[': Armour_Show(); break; case ']': rune_Show(); break; case '\"': Amulet_Show(); break; case '@': Simple_State_Show(); break; case 'N': //sendScore(); break; case 'E': Experience_Show(); break; //case 'c': // Spelllcard_Declare(); // //Eat_Power(); // break; case 'v': case 'V': Spelllcard_Evoke(); break; case 'p': Pray(); break; case '#': if(isNormalGame() && Dump(0,NULL)) printlog("덤프에 성공했습니다.",true,false,false,CL_normal); break; case 'Z': case 'z': SpellUse(); break; case 'I': SpellView(); break; case 'a': SkillUse(); break; case 'A': PropertyView(); break; case 'M': run_spell(); break; case 't': shout(); break; case '^': God_show(); break; case '&': //위자드모드! //waitkeyinput(); wiz_mode(); break; case '_': save_mode(); break; case 0x8B: auto_pick_onoff(false); break; case '?'://도움말 Help_Show(); break; case VK_ESCAPE://esc escape(); break; case VK_TAB: auto_battle(); break; default: break; } } }
int main(void) { DDRB |= (1 << PWM_PIN); // Set PWM pin to output, enable main channel TCCR0A = FAST; // Set timer to do PWM for correct output pin and set prescaler timing TCCR0B = 0x01; // Set timer to do PWM for correct output pin and set prescaler timing restore_state(); // Read config values and saved state count_modes(); // Enable the current mode group // check button press time, unless we're in group selection mode if (mode_idx != GROUP_SELECT_MODE) { if ( we_did_a_fast_press() ) { // sram hasn't decayed yet, must have been a short press increment_fast_presses(); next_mode(); // Will handle wrap arounds } else { // Long press, keep the same mode reset_fast_presses(); if( !memory_is_enabled() ) {mode_idx = 0;} // if memory is turned off, set mode_idx to 0 } } save_mode(); // Turn features on or off as needed #ifdef VOLTAGE_MON ADC_on(); #else ADC_off(); #endif uint8_t output; uint8_t i = 0; uint16_t ticks = 0; #ifdef TURBO_RAMP_DOWN uint8_t adj_output = 255; #endif #ifdef VOLTAGE_MON uint8_t lowbatt_cnt = 0; uint8_t voltage; ADCSRA |= (1 << ADSC); // Make sure voltage reading is running for later #endif if(mode_idx > num_modes) { output = mode_idx; } // special modes, override output else { output = modes[mode_idx]; } while(1) { if (fast_presses[0] >= 12) { // Config mode if 12 or more fast presses _delay_s(); // wait for user to stop fast-pressing button reset_fast_presses(); // exit this mode after one use toggle_mode(GROUP_SELECT_MODE, 1); // Enter the mode group selection mode? toggle_options((options ^ 0b00010000), 2); // memory toggle_options((options ^ 0b00100000), 3); // hidden blinkies toggle_options((options ^ 0b01000000), 4); // hidden battcheck toggle_options((options ^ 0b10000000), 5); // turbo timer toggle_options(DEFAULTS, 6); // reset to defaults } else if (output == STROBE) { // 10Hz tactical strobe for(i=0;i<8;i++) { set_level(RAMP_SIZE); _delay_ms(33); set_output(0); _delay_ms(67); } } else if (output == BEACON) { set_level(RAMP_SIZE); _delay_ms(10); set_output(0); _delay_s(); _delay_s(); } else if (output == SOS) { // dot = 1 unit, dash = 3 units, space betwen parts of a letter = 1 unit, space between letters = 3 units #define SOS_SPEED 200 // these speeds aren't perfect, but they'll work for the [never] times they'll actually get used blink(3, SOS_SPEED); // 200 on, 400 off, 200 on, 400 off, 200 on, 400 off _delay_ms(SOS_SPEED); // wait for 200 blink(3, SOS_SPEED*5/2); // 500 on, 1000 off, 500 on, 1000 off, 500 on, 1000 off (techically too long on that last off beat, but oh well) blink(3, SOS_SPEED); // 200 on, 400 off, 200 on, 400 off, 200 on, 400 off _delay_s(); _delay_s(); } else if (output == BATT_CHECK) { blink(battcheck(), BLINK_SPEED/4); _delay_s(); _delay_s(); } else if (output == GROUP_SELECT_MODE) { mode_idx = 0; // exit this mode after one use for(i=0; i<NUM_MODEGROUPS; i++) { toggle_options(((options & 0b11110000) | i), i+1); } _delay_s(); } else { if ((output == TURBO) && ( ttimer_is_enabled() ) && (ticks > (TURBO_MINUTES * TICKS_PER_MINUTE))) { #ifdef TURBO_RAMP_DOWN if (adj_output > TURBO_LOWER) { adj_output = adj_output - 2; } set_output(adj_output); #else set_output(TURBO_LOWER); #endif } else { ticks ++; // count ticks for turbo timer set_level(output); } _delay_ms(500); // Otherwise, just sleep. } reset_fast_presses(); #ifdef VOLTAGE_MON if (ADCSRA & (1 << ADIF)) { // if a voltage reading is ready voltage = ADCH; // get the waiting value if (voltage < ADC_LOW) { // See if voltage is lower than what we were looking for lowbatt_cnt ++; } else { lowbatt_cnt = 0; } if (lowbatt_cnt >= 8) { // See if it's been low for a while, and maybe step down //set_output(0); _delay_ms(100); // blink on step-down: if (output > RAMP_SIZE) { // blinky modes output = RAMP_SIZE / 2; // step down from blinky modes to medium } else if (output > 1) { // regular solid mode output = output - 1; // step down from solid modes somewhat gradually } else { // Already at the lowest mode set_output(0); // Turn off the light set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Power down as many components as possible sleep_mode(); } set_level(output); lowbatt_cnt = 0; _delay_s(); // Wait before lowering the level again } ADCSRA |= (1 << ADSC); // Make sure conversion is running for next time through } #endif // ifdef VOLTAGE_MON } }
void save_state() { // central method for writing complete state save_mode(); eeprom_write_byte((uint8_t *)OPT_options, options); }