• Forbidden You don't have permission to access this resource. Как исправить?

    @OSBoy
    Посмотрите владельца и группу директории Вашего апача:
    la -la /var/www
    Если владелец/группа, например: www/www, то для конкретного файла:
    chown www:www /var/www/html/path/to/your/file
    или сразу для всего содержимого /var/www/html:
    chown -R www:www /var/www/html/*
    Ответ написан
  • Как подключить пк через lan порт роутера в сеть?

    @OSBoy
    Если Вам не нужно предоставлять доступ к своему ПК из внешней локальной сети, а только получить доступ к сети с ПК, то по-моему, проще традиционным способом, через NAT:
    Свою домашнюю сеть (та что за Вашем роутером) можно при этом настроить так, чтобы её адреса были в другой подсети, либо вообще из другого диапазона адресов. Если внешняя сеть использует диапазон 192.168.0.0/24, то во внутренней - можно использовать, например, 192.168.1.0/24, или 10.0.0.0/24.
    А во-вторых, в зависимости от конфигурации внешней сети и способа подключения к интернету, на роутере, возможно, требуется прописать статический маршрут к адресам внешней локальной сети через определённый шлюз (по идее в настройках сети на ПК он у Вас должен был быть прописан до подключения к роутеру, если локалка работала одновременно с интернетом). Но статический маршрут обычно требуется, если шлюз в сеть и шлюз в интернет - разные, в противном случае - достаточно прописать правильный адрес основного шлюза.
    Ну а если хотите без NATа, тогда подключаайте роутер к внешней сети не через WAN, а через LAN порт, и задавайте роутеру, ПК и прочем устройствам адреса из той же подсети, что и внешняя локалка (неважно - DHCP, или статически, главное, чтобы они не конфликтовали с адресами во внешней локалке). Ну и статический маршрут тогда опять же, в локалку надо будет прописать (если я не прав - поправьте меня).
    Имхо, вариант с NATом более простой, логичный, и часто используемый. А если Вам выделен только один IP в сети, то тем более, второй вариант отпадает.
    Кстати, подключение к интернету как осуществляется? Просто через шлюз в сети, или через какой-нибудь pptp, ppoe и т.п.?
    Ответ написан
  • Как обработать удержание кнопки в МК AVR?

    @OSBoy
    Я, например, вот так сделал (для обработки коротких и длинных нажатий трёх кнопок):
    uint8_t buttonFlags = 0; // буфер флагов зарегистрированных нажатий
    
    // ОПРОС КНОПОК
    void buttons_check(void)
    {
    	uint8_t buttonState = 0; // буфер для текущего состояния кнопок
    	static uint8_t buttonPressCounter[] = { 0, 0, 0 }; // счётчики продолжительности нажатия кнопок
    	buttonState = ( BUTTON0_STATE | BUTTON1_STATE << 1 | BUTTON2_STATE << 2 ) ^ 0x07;
    	for ( uint8_t i = 0; i <= 2; i++ ) // для каждой из 3 кнопок проверяем:
    	{
    		if ( ((buttonState >> i) & 1) ) // если кнопка нажата
    		{
    			buttonPressCounter[i]++; // увеличиваем значение счётчика
    			if ( buttonPressCounter[i] == 3 ) // если кнопка нажата около 50мс
    			{
    				buttonFlags |= ( 1 << i ); // фиксируем короткое нажатие
    			}
    			else if ( buttonPressCounter[i] == 95 ) // если кнопка нажата около 1.5 секунд
    			{
    				buttonFlags |= ( 1 << i ) | ( 1 << (i+3) ); // фиксируем длинное нажатие
    				buttonPressCounter[i] = 80; // повторяем действие длинного нажатия при удерживании кнопки (примерно 4 раза в секунду)
    			}
    			else
    			{
    			buttonFlags &= ~( 1 << i ); // сбрасываем флаг короткого нажатия кнопки
    			}
    		}
    		else // если кнопка отпущена
    		{
    			buttonPressCounter[i] = 0; // сбрасываем счётчик
    			buttonFlags &= ~( ( 1 << i ) | ( 1 << (i+3)) ); // сбрасываем флаги нажатия кнопки
    		}
    	}
    }

    Функция вызывается в теле обработчика прерывания по таймеру, перед функцией - обработчиком нажатий, в зависимости от текущего состояния переменной buttonFlags, и там же, делаем другие нужные нам вещи, типа обновления информации на дисплее, и т.д.) Таким образом, всего одним таймером убиваем сразу всех зайцев :)
    P.S. Значения счётчиков - 3, 80 и 95 - с расчётом, что прерывание по таймеру срабатывает каждые 16мс.
    P.P.S. Если чё, сильно не пинять - я ни разу не программист, а так, балуюсь немножко ))
    Ответ написан