Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/intercom.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2013-09-26 22:18:46 +0400
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2013-09-26 22:18:46 +0400
commit2571b22f6fbde9b0078c9514fb5fbbd3d081e714 (patch)
tree96de79f7639f8112703341c47f4419fb1e576518
parent593314450f7d4c27d298e004fcad27248a36e3b5 (diff)
CLUNET moved but working!
-rw-r--r--Makefile8
-rw-r--r--bits.h12
-rw-r--r--clunet.c326
-rw-r--r--clunet.h223
4 files changed, 4 insertions, 565 deletions
diff --git a/Makefile b/Makefile
index e46d8c5..5eb682b 100644
--- a/Makefile
+++ b/Makefile
@@ -5,8 +5,8 @@ OBJ = intercom.o ff.o diskio.o rtc.o clunet.o sound.o transfer.o
#HFUSE = D9
#MCU_PROGRAMMER = m8
+CLUNET_PATH = ../clunet
CLUNET_FLASHER = D:/Soft/Soft/ClunetFlasher/clunetflasher.exe
-//CLUNET_IP = 127.0.0.1
CLUNET_IP = 10.13.0.254
CLUNET_PORT = 10009
CLUNET_DEVICE_ID = 7
@@ -70,7 +70,7 @@ CC = avr-gcc
# Override is only needed by avr-lib build system.
-override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
+override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) -I. -I$(CLUNET_PATH)
override LDFLAGS = -Wl,-Map,$(PRG).map
OBJCOPY = avr-objcopy
@@ -81,8 +81,8 @@ all: $(PRG).elf lst text eeprom
$(PRG).elf: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
-# dependency:
-demo.o: demo.c
+clunet.o:
+ $(CC) $(CFLAGS) -c -o $@ $^ $(CLUNET_PATH)/clunet.c
clean:
rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
diff --git a/bits.h b/bits.h
deleted file mode 100644
index 737199f..0000000
--- a/bits.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#define set(reg,value) reg |= (value)
-#define unset(reg,value) reg &= ~(value)
-#define set_bit(reg,value) reg |= (_BV(value))
-#define set_bit2(reg,value1,value2) reg |= (_BV(value1) | _BV(value2))
-#define set_bit3(reg,value1,value2,value3) reg |= (_BV(value1) | _BV(value2) | _BV(value3))
-#define set_bit4(reg,value1,value2,value3,value4) reg |= (_BV(value1) | _BV(value2) | _BV(value3) | _BV(value4))
-#define set_bit5(reg,value1,value2,value3,value4,value5) reg |= (_BV(value1) | _BV(value2) | _BV(value3) | _BV(value4) | _BV(value5))
-#define unset_bit(reg,value) reg &= ~(_BV(value))
-#define unset_bit2(reg,value1,value2) reg &= ~(_BV(value1) | _BV(value2))
-#define unset_bit3(reg,value1,value2,value3) reg &= ~(_BV(value1) | _BV(value2) | _BV(value3))
-#define unset_bit4(reg,value1,value2,value3,value4) reg &= ~(_BV(value1) | _BV(value2) | _BV(value3) | _BV(value4))
-#define unset_bit5(reg,value1,value2,value3,value4,value5) reg &= ~(_BV(value1) | _BV(value2) | _BV(value3) | _BV(value4) | _BV(value5))
diff --git a/clunet.c b/clunet.c
deleted file mode 100644
index 1c00e58..0000000
--- a/clunet.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/* Name: clunet.c
- * Project: CLUNET network driver
- * Author: Alexey Avdyukhin
- * Creation Date: 2013-09-09
- * License: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- */
-
-
-#include "defines.h"
-#include "clunet_config.h"
-#include "bits.h"
-#include "clunet.h"
-#include <avr/io.h>
-#include <avr/interrupt.h>
-
-void (*on_data_received)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size) = 0;
-void (*on_data_received_sniff)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size) = 0;
-
-volatile unsigned char clunetSendingState = CLUNET_SENDING_STATE_IDLE;
-volatile unsigned short int clunetSendingDataLength;
-volatile unsigned char clunetSendingCurrentByte;
-volatile unsigned char clunetSendingCurrentBit;
-volatile unsigned char clunetReadingState = CLUNET_READING_STATE_IDLE;
-volatile unsigned char clunetReadingCurrentByte;
-volatile unsigned char clunetReadingCurrentBit;
-volatile unsigned char clunetCurrentPrio;
-
-volatile unsigned char clunetReceivingState = 0;
-//volatile unsigned char clunetReceivingPrio = 0;
-volatile unsigned char clunetTimerStart = 0;
-volatile unsigned char clunetTimerPeriods = 0;
-
-volatile char dataToSend[CLUNET_SEND_BUFFER_SIZE];
-volatile char dataToRead[CLUNET_READ_BUFFER_SIZE];
-
-char check_crc(char* data, unsigned char size)
-{
- uint8_t crc=0;
- uint8_t i,j;
- for (i=0; i<size;i++)
- {
- uint8_t inbyte = data[i];
- for (j=0;j<8;j++)
- {
- uint8_t mix = (crc ^ inbyte) & 0x01;
- crc >>= 1;
- if (mix)
- crc ^= 0x8C;
-
- inbyte >>= 1;
- }
- }
- return crc;
-}
-
-ISR(CLUNET_TIMER_COMP_VECTOR)
-{
- unsigned char now = CLUNET_TIMER_REG; // Запоминаем текущее время
-
- switch (clunetSendingState)
- {
- case CLUNET_SENDING_STATE_PREINIT: // Нужно подождать перед отправкой
- CLUNET_TIMER_REG_OCR = now + CLUNET_T;
- clunetSendingState = CLUNET_SENDING_STATE_INIT; // Начинаем следующую фазу
- return;
- case CLUNET_SENDING_STATE_STOP: // Завершение передачи, но надо ещё подождать
- CLUNET_SEND_0; // Отпускаем линию
- CLUNET_TIMER_REG_OCR = now + CLUNET_T;
- clunetSendingState = CLUNET_SENDING_STATE_DONE;
- return;
- case CLUNET_SENDING_STATE_DONE: // Завершение передачи
- CLUNET_DISABLE_TIMER_COMP; // Выключаем таймер-сравнение
- clunetSendingState = CLUNET_SENDING_STATE_IDLE; // Ставим флаг, что передатчик свободен
- return;
- }
-
- if (/*!((clunetReadingState == CLUNET_READING_STATE_DATA) && // Если мы сейчас не [получаем данные
- (clunetCurrentPrio > clunetReceivingPrio) // И приоритет получаемых данных не ниже
- && (clunetSendingState == CLUNET_SENDING_STATE_INIT)) // И мы не пытаемся начать инициализацию]
- &&*/ (!CLUNET_SENDING && CLUNET_READING)) // То идёт проверка на конфликт. Если мы линию не держим, но она уже занята
- {
- CLUNET_DISABLE_TIMER_COMP; // Выключаем таймер-сравнение
- clunetSendingState = CLUNET_SENDING_STATE_WAITING_LINE; // Переходим в режим ожидания линии
- return; // И умолкаем
- }
-
- CLUNET_SEND_INVERT; // Сразу инвртируем значение сигнала, у нас это запланировано
-
- if (!CLUNET_SENDING) // Если мы отпустили линию...
- {
- CLUNET_TIMER_REG_OCR = now + CLUNET_T; // То вернёмся в это прерывание через CLUNET_T единиц времени
- return;
- }
- switch (clunetSendingState)
- {
- case CLUNET_SENDING_STATE_INIT: // Инициализация
- CLUNET_TIMER_REG_OCR = now + CLUNET_INIT_T;
- clunetSendingState = CLUNET_SENDING_STATE_PRIO1; // Начинаем следующую фазу
- return;
- case CLUNET_SENDING_STATE_PRIO1: // Фаза передачи приоритета, старший бит
- if ((clunetCurrentPrio-1) & 2) // Если 1, то ждём 3T, а если 0, то 1T
- CLUNET_TIMER_REG_OCR = now + CLUNET_1_T;
- else CLUNET_TIMER_REG_OCR = now + CLUNET_0_T;
- clunetSendingState = CLUNET_SENDING_STATE_PRIO2;
- return;
- case CLUNET_SENDING_STATE_PRIO2: // Фаза передачи приоритета, младший бит
- if ((clunetCurrentPrio-1) & 1) // Если 1, то ждём 3T, а если 0, то 1T
- CLUNET_TIMER_REG_OCR = now + CLUNET_1_T;
- else CLUNET_TIMER_REG_OCR = now + CLUNET_0_T;
- clunetSendingState = CLUNET_SENDING_STATE_DATA;
- return;
- case CLUNET_SENDING_STATE_DATA: // Фаза передачи данных
- if (dataToSend[clunetSendingCurrentByte] & (1 << clunetSendingCurrentBit)) // Если 1, то ждём 3T, а если 0, то 1T
- CLUNET_TIMER_REG_OCR = now + CLUNET_1_T;
- else CLUNET_TIMER_REG_OCR = now + CLUNET_0_T;
- clunetSendingCurrentBit++; // Переходим к следующему биту
- if (clunetSendingCurrentBit >= 8)
- {
- clunetSendingCurrentBit = 0;
- clunetSendingCurrentByte++;
- }
- if (clunetSendingCurrentByte >= clunetSendingDataLength) // Данные закончились
- {
- clunetSendingState = CLUNET_SENDING_STATE_STOP; // Следующая фаза
- }
- return;
- }
-}
-
-
-void clunet_start_send()
-{
- CLUNET_SEND_0;
- if (clunetSendingState != CLUNET_SENDING_STATE_PREINIT) // Если не нужна пауза...
- clunetSendingState = CLUNET_SENDING_STATE_INIT; // Инициализация передачи
- clunetSendingCurrentByte = clunetSendingCurrentBit = 0; // Обнуляем счётчик
- CLUNET_TIMER_REG_OCR = CLUNET_TIMER_REG+CLUNET_T; // Планируем таймер, обычно почему-то прерывание срабатывает сразу
- CLUNET_ENABLE_TIMER_COMP; // Включаем прерывание таймера-сравнения
-}
-
-void clunet_send(unsigned char address, unsigned char prio, unsigned char command, char* data, unsigned char size)
-{
- if (CLUNET_OFFSET_DATA+size+1 > CLUNET_SEND_BUFFER_SIZE) return; // Не хватает буфера
- CLUNET_DISABLE_TIMER_COMP;CLUNET_SEND_0; // Прерываем текущую передачу, если есть такая
- // Заполняем переменные
- if (clunetSendingState != CLUNET_SENDING_STATE_PREINIT)
- clunetSendingState = CLUNET_SENDING_STATE_IDLE;
- clunetCurrentPrio = prio;
- dataToSend[CLUNET_OFFSET_SRC_ADDRESS] = CLUNET_DEVICE_ID;
- dataToSend[CLUNET_OFFSET_DST_ADDRESS] = address;
- dataToSend[CLUNET_OFFSET_COMMAND] = command;
- dataToSend[CLUNET_OFFSET_SIZE] = size;
- unsigned char i;
- for (i = 0; i < size; i++)
- dataToSend[CLUNET_OFFSET_DATA+i] = data[i];
- dataToSend[CLUNET_OFFSET_DATA+size] = check_crc((char*)dataToSend, CLUNET_OFFSET_DATA+size);
- clunetSendingDataLength = CLUNET_OFFSET_DATA + size + 1;
- if (
- (clunetReadingState == CLUNET_READING_STATE_IDLE) // Если мы ничего не получаем в данный момент, то посылаем сразу
-// || ((clunetReadingState == CLUNET_READING_STATE_DATA) && (prio > clunetReceivingPrio)) // Либо если получаем, но с более низким приоритетом
- )
- clunet_start_send(); // Запускаем передачу сразу
- else clunetSendingState = CLUNET_SENDING_STATE_WAITING_LINE; // Иначе ждём линию
-}
-
-inline void clunet_data_received(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)
-{
- if (on_data_received_sniff)
- (*on_data_received_sniff)(src_address, dst_address, command, data, size);
-
- if (src_address == CLUNET_DEVICE_ID) return; // Игнорируем сообщения от самого себя!
-
- if ((dst_address != CLUNET_DEVICE_ID) &&
- (dst_address != CLUNET_BROADCAST_ADDRESS)) return; // Игнорируем сообщения не для нас
-
- if (command == CLUNET_COMMAND_REBOOT) // Просто ребут. И да, ребутнуть себя мы можем
- {
- cli();
- set_bit(WDTCR, WDE);
- while(1);
- }
-
- if ((clunetSendingState == CLUNET_SENDING_STATE_IDLE) || (clunetCurrentPrio <= CLUNET_PRIORITY_MESSAGE))
- {
- if (command == CLUNET_COMMAND_DISCOVERY) // Ответ на поиск устройств
- {
-#ifdef CLUNET_DEVICE_NAME
- char buf[] = CLUNET_DEVICE_NAME;
- int len = 0; while(buf[len]) len++;
- clunetSendingState = CLUNET_SENDING_STATE_PREINIT;
- clunet_send(src_address, CLUNET_PRIORITY_MESSAGE, CLUNET_COMMAND_DISCOVERY_RESPONSE, buf, len);
-#else
- clunetSendingState = CLUNET_SENDING_STATE_PREINIT;
- clunet_send(src_address, CLUNET_PRIORITY_MESSAGE, CLUNET_COMMAND_DISCOVERY_RESPONSE, 0, 0);
-#endif
- }
- else if (command == CLUNET_COMMAND_PING) // Ответ на пинг
- {
- clunetSendingState = CLUNET_SENDING_STATE_PREINIT;
- clunet_send(src_address, CLUNET_PRIORITY_COMMAND, CLUNET_COMMAND_PING_REPLY, data, size);
- }
- }
-
- if (on_data_received)
- (*on_data_received)(src_address, dst_address, command, data, size);
-
- if ((clunetSendingState == CLUNET_SENDING_STATE_WAITING_LINE) && !CLUNET_READING) // Если есть неотосланные данные, шлём, линия освободилась
- {
- clunetSendingState = CLUNET_SENDING_STATE_PREINIT;
- clunet_start_send();
- }
-}
-
-ISR(CLUNET_TIMER_OVF_VECTOR)
-{
- if (clunetTimerPeriods < 3)
- clunetTimerPeriods++;
- else // Слишком долго нет сигнала, сброс и отключение прерывания
- {
- CLUNET_SEND_0; // А вдруг мы забыли линию отжать? Хотя по идее не должно...
- clunetReadingState = CLUNET_READING_STATE_IDLE;
- if ((clunetSendingState == CLUNET_SENDING_STATE_IDLE) && (!CLUNET_READING))
- CLUNET_DISABLE_TIMER_OVF;
- if ((clunetSendingState == CLUNET_SENDING_STATE_WAITING_LINE) && (!CLUNET_READING)) // Если есть неотосланные данные, шлём, линия освободилась
- clunet_start_send();
- }
-}
-
-
-ISR(CLUNET_INT_VECTOR)
-{
- unsigned char time = (unsigned char)((CLUNET_TIMER_REG-clunetTimerStart) & 0xFF);
- if (!CLUNET_READING) // Линию отпустило
- {
- CLUNET_ENABLE_TIMER_OVF;
- if (time >= (CLUNET_INIT_T+CLUNET_1_T)/2) // Если кто-то долго жмёт линию, это инициализация
- {
- clunetReadingState = CLUNET_READING_STATE_PRIO1;
- }
- else switch (clunetReadingState) // А если не долго, то смотрим на этап
- {
- case CLUNET_READING_STATE_PRIO1: // Получение приоритета, клиенту он не нужен
- /*
- if (time > (CLUNET_0_T+CLUNET_1_T)/2)
- clunetReceivingPrio = 3;
- else clunetReceivingPrio = 1;
- */
- clunetReadingState = CLUNET_READING_STATE_PRIO2;
- break;
- case CLUNET_READING_STATE_PRIO2: // Получение приоритета, клиенту он не нужен
- /*
- if (time > (CLUNET_0_T+CLUNET_1_T)/2)
- clunetReceivingPrio++;
- */
- clunetReadingState = CLUNET_READING_STATE_DATA;
- clunetReadingCurrentByte = 0;
- clunetReadingCurrentBit = 0;
- dataToRead[0] = 0;
- break;
- case CLUNET_READING_STATE_DATA: // Чтение всех данных
- if (time > (CLUNET_0_T+CLUNET_1_T)/2)
- dataToRead[clunetReadingCurrentByte] |= (1 << clunetReadingCurrentBit);
- clunetReadingCurrentBit++;
- if (clunetReadingCurrentBit >= 8) // Переходим к следующему байту
- {
- clunetReadingCurrentByte++;
- clunetReadingCurrentBit = 0;
- if (clunetReadingCurrentByte < CLUNET_READ_BUFFER_SIZE)
- dataToRead[clunetReadingCurrentByte] = 0;
- else // Если буфер закончился
- {
- clunetReadingState = CLUNET_READING_STATE_IDLE;
- return;
- }
- }
- if ((clunetReadingCurrentByte > CLUNET_OFFSET_SIZE) && (clunetReadingCurrentByte > dataToRead[CLUNET_OFFSET_SIZE]+CLUNET_OFFSET_DATA))
- {
- // Получили данные полностью, ура!
- clunetReadingState = CLUNET_READING_STATE_IDLE;
- char crc = check_crc((char*)dataToRead,clunetReadingCurrentByte); // Проверяем CRC
- if (crc == 0)
- clunet_data_received(dataToRead[CLUNET_OFFSET_SRC_ADDRESS], dataToRead[CLUNET_OFFSET_DST_ADDRESS], dataToRead[CLUNET_OFFSET_COMMAND], (char*)(dataToRead+CLUNET_OFFSET_DATA), dataToRead[CLUNET_OFFSET_SIZE]);
- }
- break;
- }
- }
- else
- {
- clunetTimerStart = CLUNET_TIMER_REG;
- clunetTimerPeriods = 0;
- CLUNET_ENABLE_TIMER_OVF;
- }
-}
-
-void clunet_init()
-{
- sei();
- CLUNET_SEND_INIT;
- CLUNET_READ_INIT;
- CLUNET_TIMER_INIT;
- CLUNET_INIT_INT;
-#ifdef CLUNET_ENABLE_INT
- CLUNET_ENABLE_INT;
-#warning CLUNET_ENABLE_INT is deprecated
-#endif
- char reset_source = MCUCSR;
- clunet_send(CLUNET_BROADCAST_ADDRESS, CLUNET_PRIORITY_MESSAGE, CLUNET_COMMAND_BOOT_COMPLETED, &reset_source, 1);
- MCUCSR = 0;
-}
-
-int clunet_ready_to_send() // Возвращает 0, если готов к передаче, иначе приоритет текущей задачи
-{
- if (clunetSendingState == CLUNET_SENDING_STATE_IDLE) return 0;
- return clunetCurrentPrio;
-}
-
-void clunet_set_on_data_received(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size))
-{
- on_data_received = f;
-}
-
-void clunet_set_on_data_received_sniff(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size))
-{
- on_data_received_sniff = f;
-}
-
diff --git a/clunet.h b/clunet.h
deleted file mode 100644
index 5869611..0000000
--- a/clunet.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Name: clunet.h
- * Project: CLUNET network driver
- * Author: Alexey Avdyukhin
- * Creation Date: 2013-09-09
- * License: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- */
-
-#ifndef __clunet_h_included__
-#define __clunet_h_included__
-
-#include "bits.h"
-#include "clunet_config.h"
-
-#define CLUNET_SENDING_STATE_IDLE 0
-#define CLUNET_SENDING_STATE_INIT 1
-#define CLUNET_SENDING_STATE_PRIO1 2
-#define CLUNET_SENDING_STATE_PRIO2 3
-#define CLUNET_SENDING_STATE_DATA 4
-#define CLUNET_SENDING_STATE_WAITING_LINE 6
-#define CLUNET_SENDING_STATE_PREINIT 7
-#define CLUNET_SENDING_STATE_STOP 8
-#define CLUNET_SENDING_STATE_DONE 9
-
-#define CLUNET_READING_STATE_IDLE 0
-#define CLUNET_READING_STATE_INIT 1
-#define CLUNET_READING_STATE_PRIO1 2
-#define CLUNET_READING_STATE_PRIO2 3
-#define CLUNET_READING_STATE_HEADER 4
-#define CLUNET_READING_STATE_DATA 5
-
-#define CLUNET_OFFSET_SRC_ADDRESS 0
-#define CLUNET_OFFSET_DST_ADDRESS 1
-#define CLUNET_OFFSET_COMMAND 2
-#define CLUNET_OFFSET_SIZE 3
-#define CLUNET_OFFSET_DATA 4
-#define CLUNET_BROADCAST_ADDRESS 0xFF
-
-#define CLUNET_COMMAND_DISCOVERY 0x00
-/* Поиск других устройств, параметров нет */
-
-#define CLUNET_COMMAND_DISCOVERY_RESPONSE 0x01
-/* Ответ устройств на поиск, в качестве параметра - название устройства (текст) */
-
-#define CLUNET_COMMAND_BOOT_CONTROL 0x02
-/* Работа с загрузчиком. Данные - субкоманда.
-<-0 - загрузчик запущен
-->1 - перейти в режим обновления прошивки
-<-2 - подтверждение перехода, плюс два байта - размер страницы
-->3 запись прошивки, 4 байта - адрес, всё остальное - данные (равные размеру страницы)
-<-4 блок прошивки записан
-->5 выход из режима прошивки */
-
-#define CLUNET_COMMAND_REBOOT 0x03
-/* Перезагружает устройство в загрузчик. */
-
-#define CLUNET_COMMAND_BOOT_COMPLETED 0x04
-/* Посылается устройством после инициализации библиотеки, сообщает об успешной загрузке устройства. Параметр - содержимое MCU регистра, говорящее о причине перезагрузки. */
-
-#define CLUNET_COMMAND_DOOR_INFO 0x05
-/*Информация об открытии двери.
-0 - закрыта
-1 - открыта
-2 - тревога */
-
-#define CLUNET_COMMAND_DEVICE_POWER_INFO_REQUEST 0x06
-/* Запрашивает информацию о состоянии выключателей */
-
-#define CLUNET_COMMAND_DEVICE_POWER_INFO 0x07
-/* Состояние выключателей. Параметр - битовая маска состояния выключателей. */
-
-#define CLUNET_COMMAND_DEVICE_POWER_COMMAND 0x08
-/* Включает/выключает выключатели. Параметр - битовая маска. Для света 0xFE - убавить свет, а 0xFF - прибавить. */
-
-#define CLUNET_COMMAND_SET_TIMER 0x09
-/* Установка таймера. Параметр - кол-во секунд (два байта) */
-
-#define CLUNET_COMMAND_RC_BUTTON_PRESSED 0x0A
-/* Нажата кнопка на пульте. Первый байт - тип кода, далее - номер кнопки.
-На данный момент 01 - самый популярный стандарт (Sony вроде?) длина кода кнопки - 4 байта.
-02 - удержание кнопки его же. */
-
-#define CLUNET_COMMAND_RC_BUTTON_PRESSED_RAW 0x0B
-/* Недекодированные данные о нажатой кнопке на пульте для нестандартных пультов. Идут пачками по 4 байта. 2 из которых - длительность сигнала и 2 - длительность его отсутствия в 0.032 долях миллисекунды. (1/8000000*256 сек) */
-
-#define CLUNET_COMMAND_RC_BUTTON_SEND 0x0C
-/* Заэмулировать кнопку пульта. Формат данных аналогичен CLUNET_COMMAND_RC_BUTTON_PRESSED, плюс в конце опциональный байт длительности удержания кнопки (кол-во дополнительных сигналов), для Sony это ~30мс */
-
-#define CLUNET_COMMAND_RC_BUTTON_SEND_RAW 0x0D
-/* Заэмулировать кнопку пульта на основе сырых данных. Формат данных аналогичен CLUNET_COMMAND_RC_BUTTON_PRESSED_RAW. */
-
-#define CLUNET_COMMAND_LIGHT_LEVEL 0x0E
-/* Сообщает об уровне освещения. Параметр - 2 байта (0x0000 - 0x1FFF, где 0x1FFF - 0 вольт между фотодиодом и землёй, а 0x0000 - 5 вольт). */
-
-#define CLUNET_COMMAND_ONEWIRE_START_SEARCH 0x0F
-/* Запуск поиска 1-wire устройств, данные пустые. */
-
-#define CLUNET_COMMAND_ONEWIRE_DEVICE_FOUND 0x10
-/* Сообщает о найденном 1-wire устройсте. Данные - 8 байт, включающие тип устройства, серийный номер и CRC. */
-
-#define CLUNET_COMMAND_TEMPERATURE 0x11
-/* Сообщает о температуре. 1 байт - тип устройства, 6 - серийник, 2 - температура в формате устройства (смотреть на тип, чтобы декодировать!) */
-
-#define CLUNET_COMMAND_TIME 0x12
-/* Сообщает время. Шесть байт - часы, минуты, секунды, год (от 1900), месяц (от 0), день (от 1) */
-
-#define CLUNET_COMMAND_WHEEL 0x13
-/* Сообщает обороты колеса мыши, первый байт - ID колеса, далее два байта - обороты */
-
-#define CLUNET_COMMAND_VOLTAGE 0x14
-/* Сообщает напряжение на батарейке, первый байт - ID устройства, далее два байта - вольтаж, где 0x3FF = 5.12 */
-
-#define CLUNET_COMMAND_MOTION 0x15
-/* Сообщает, что в помещении есть движение, первый байт - ID датчика/камеры */
-
-#define CLUNET_COMMAND_INTERCOM_RING 0x16
-/* Звонок в домофон */
-
-#define CLUNET_COMMAND_INTERCOM_MESSAGE 0x17
-/* Новое сообщение на автоответчике домофона, в данных 4 байта - номер сообщения */
-
-#define CLUNET_COMMAND_INTERCOM_MODE_REQUEST 0x18
-/* Запрашивает режим работы домофона */
-
-#define CLUNET_COMMAND_INTERCOM_MODE_INFO 0x19
-/* Сообщает режим работы домофона, первый байт - постоянный режим, второй - временный */
-
-#define CLUNET_COMMAND_INTERCOM_MODE_SET 0x1A
-/* Задаёт режим работы домофона, первый байт - постоянный режим (или 0xFF, чтобы не трогать), второй - временный (опционально) */
-
-#define CLUNET_COMMAND_INTERCOM_RECORD_REQUEST 0x1B
-/* Запрашивает запись у домофона, подтверждает доставку или завершает передачу
- Если 4 байта, то это номер запрашиваемой записи
- Если 1 байт, то 1 в случае подтверждения получения пакета, 0 - завершение передачи */
-
-#define CLUNET_COMMAND_INTERCOM_RECORD_DATA 0x1C
-/* Передаёт кусок записи с автоответчика. Первые 4 байта - номер записи, далее 4 байта - смещение от начала файла, всё далее - данные из файла */
-
-#define CLUNET_COMMAND_PING 0xFE
-/* Пинг, на эту команду устройство должно ответить следующей командой, возвратив весь буфер */
-
-#define CLUNET_COMMAND_PING_REPLY 0xFF
-/* Ответ на пинг, в данных то, что было прислано в предыдущей команде */
-
-#define CLUNET_PRIORITY_NOTICE 1
-/* Приоритет пакета 1 - неважное уведомление, которое вообще может быть потеряно без последствий */
-
-#define CLUNET_PRIORITY_INFO 2
-/* Приоритет пакета 2 - какая-то информация, не очень важная */
-
-#define CLUNET_PRIORITY_MESSAGE 3
-/* Приоритет пакета 3 - сообщение с какой-то важной информацией */
-
-#define CLUNET_PRIORITY_COMMAND 4
-/* Приоритет пакета 4 - команда, на которую нужно сразу отреагировать */
-
-#ifndef CLUNET_T
-#define CLUNET_T ((F_CPU / CLUNET_TIMER_PRESCALER) / 15625)
-#endif
-#if CLUNET_T < 8
-# error Timer frequency is too small, increase CPU frequency or decrease timer prescaler
-#endif
-#if CLUNET_T > 24
-# error Timer frequency is too big, decrease CPU frequency or increase timer prescaler
-#endif
-
-#define CLUNET_0_T (CLUNET_T)
-#define CLUNET_1_T (3*CLUNET_T)
-#define CLUNET_INIT_T (10*CLUNET_T)
-
-#define CLUNET_CONCAT(a, b) a ## b
-#define CLUNET_OUTPORT(name) CLUNET_CONCAT(PORT, name)
-#define CLUNET_INPORT(name) CLUNET_CONCAT(PIN, name)
-#define CLUNET_DDRPORT(name) CLUNET_CONCAT(DDR, name)
-
-#ifndef CLUNET_WRITE_TRANSISTOR
-# define CLUNET_SEND_1 CLUNET_DDRPORT(CLUNET_WRITE_PORT) |= (1 << CLUNET_WRITE_PIN)
-# define CLUNET_SEND_0 CLUNET_DDRPORT(CLUNET_WRITE_PORT) &= ~(1 << CLUNET_WRITE_PIN)
-# define CLUNET_SENDING (CLUNET_DDRPORT(CLUNET_WRITE_PORT) & (1 << CLUNET_WRITE_PIN))
-# define CLUNET_SEND_INVERT CLUNET_DDRPORT(CLUNET_WRITE_PORT) ^= (1 << CLUNET_WRITE_PIN)
-# define CLUNET_SEND_INIT { CLUNET_OUTPORT(CLUNET_WRITE_PORT) &= ~(1 << CLUNET_WRITE_PIN); CLUNET_SEND_0; }
-#else
-# define CLUNET_SEND_1 CLUNET_OUTPORT(CLUNET_WRITE_PORT) |= (1 << CLUNET_WRITE_PIN)
-# define CLUNET_SEND_0 CLUNET_OUTPORT(CLUNET_WRITE_PORT) &= ~(1 << CLUNET_WRITE_PIN)
-# define CLUNET_SENDING (CLUNET_OUTPORT(CLUNET_WRITE_PORT) & (1 << CLUNET_WRITE_PIN))
-# define CLUNET_SEND_INVERT CLUNET_OUTPORT(CLUNET_WRITE_PORT) ^= (1 << CLUNET_WRITE_PIN)
-# define CLUNET_SEND_INIT { CLUNET_DDRPORT(CLUNET_WRITE_PORT) |= (1 << CLUNET_WRITE_PIN); CLUNET_SEND_0; }
-#endif
-
-#define CLUNET_READ_INIT { CLUNET_DDRPORT(CLUNET_READ_PORT) &= ~(1 << CLUNET_READ_PIN); CLUNET_OUTPORT(CLUNET_READ_PORT) |= (1 << CLUNET_READ_PIN); }
-#define CLUNET_READING (!(CLUNET_INPORT(CLUNET_READ_PORT) & (1 << CLUNET_READ_PIN)))
-
-#ifndef CLUNET_SEND_BUFFER_SIZE
-# error CLUNET_SEND_BUFFER_SIZE is not defined
-#endif
-#ifndef CLUNET_READ_BUFFER_SIZE
-# error CLUNET_READ_BUFFER_SIZE is not defined
-#endif
-#if CLUNET_SEND_BUFFER_SIZE > 255
-# error CLUNET_SEND_BUFFER_SIZE must be <= 255
-#endif
-#if CLUNET_READ_BUFFER_SIZE > 255
-# error CLUNET_READ_BUFFER_SIZE must be <= 255
-#endif
-
-// Инициализация
-void clunet_init();
-
-// Отправка пакета
-void clunet_send(unsigned char address, unsigned char prio, unsigned char command, char* data, unsigned char size);
-
-// Возвращает 0, если готов к передаче, иначе приоритет текущей задачи
-int clunet_ready_to_send();
-
-// Установка функций, которые вызываются при получении пакетов
-// Эта - получает пакеты, которые адресованы нам
-void clunet_set_on_data_received(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size));
-
-// А эта - абсолютно все, которые ходят по сети, включая наши
-void clunet_set_on_data_received_sniff(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size));
-
-char check_crc(char* data, unsigned char size);
-
-#endif