mirror of
https://github.com/KostyaSha/arduino-iebus.git
synced 2026-08-28 00:20:14 +00:00
Move one variant, create other for sniffing
This commit is contained in:
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
AVCLan mini, connecting 'duino to AVCLan bus.
|
||||
Created by Kochetkov Aleksey, 04.08.2010
|
||||
Version 0.1.7
|
||||
*/
|
||||
|
||||
#define AVCLAN_VERSION "0.1.7"
|
||||
|
||||
#include <EEPROM.h>
|
||||
#include <AVCLanDrv.h>
|
||||
#include <AVCLanCDch.h>
|
||||
#include <BuffSerial.h>
|
||||
#include <config.h>
|
||||
|
||||
byte readSeq = 0;
|
||||
byte s_len = 0;
|
||||
byte s_dig = 0;
|
||||
byte s_c[2];
|
||||
byte data_tmp[32];
|
||||
byte i;
|
||||
|
||||
// адреса eeprom
|
||||
#define E_MASTER1 0 // адрес головы, старший байт
|
||||
#define E_MASTER2 1 // адрес головы, младший байт
|
||||
#define E_READONLY 2 // режим "только чтение", если 1, то устройств не регистрируем, только слушаем шину
|
||||
#define E_INIT 3 // признак инициализации EEPROM
|
||||
|
||||
#define LED_ON sbi(LED_PORT, LED_OUT);
|
||||
#define LED_OFF cbi(LED_PORT, LED_OUT);
|
||||
|
||||
void setup(){
|
||||
// setup led
|
||||
sbi(LED_DDR, LED_OUT);
|
||||
cbi(LED_PORT, LED_OUT);
|
||||
|
||||
bSerial.begin(250000);
|
||||
avclan.begin();
|
||||
avclanDevice.begin();
|
||||
EERPOM_read_config();
|
||||
bSerial.print_p(PSTR("AVCLan mini. Kochetkov Aleksey. v"));
|
||||
bSerial.println(AVCLAN_VERSION);
|
||||
bSerial.println();
|
||||
}
|
||||
|
||||
void loop(){
|
||||
|
||||
if (INPUT_IS_SET){
|
||||
LED_ON;
|
||||
byte res = avclan.readMessage();
|
||||
LED_OFF;
|
||||
if (!res){
|
||||
if (!avclan.readonly) avclanDevice.getActionID();
|
||||
if (avclan.actionID != ACT_NONE) {
|
||||
avclanDevice.processAction((AvcActionID)avclan.actionID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (avclan.event != EV_NONE){
|
||||
avclanDevice.processEvent((AvcEventID)avclan.event);
|
||||
avclan.event = EV_NONE;
|
||||
}
|
||||
|
||||
if (bSerial.rxEnabled()) {
|
||||
uint8_t readkey = bSerial.rxRead();
|
||||
|
||||
switch (readkey){
|
||||
case 'P': // print config
|
||||
bSerial.print_p(PSTR("head="));
|
||||
bSerial.printHex8(avclan.headAddress >> 8);
|
||||
bSerial.printHex8(avclan.headAddress);
|
||||
bSerial.print_p(PSTR(", eeprom="));
|
||||
bSerial.printHex8(EEPROM.read(E_MASTER1));
|
||||
bSerial.printHex8(EEPROM.read(E_MASTER2));
|
||||
bSerial.println();
|
||||
bSerial.print_p(PSTR("device="));
|
||||
bSerial.printHex8(avclan.deviceAddress >> 8);
|
||||
bSerial.printHex8(avclan.deviceAddress);
|
||||
bSerial.println();
|
||||
bSerial.print_p(PSTR("readonly="));
|
||||
bSerial.printHex8(avclan.readonly);
|
||||
bSerial.println();
|
||||
bSerial.print_p(PSTR("Overflow: "));
|
||||
bSerial.printHex8(bSerial.txOverflow >> 8);
|
||||
bSerial.printHex8(bSerial.txOverflow);
|
||||
bSerial.println();
|
||||
break;
|
||||
case 'T': //send test message
|
||||
bSerial.println("S");
|
||||
sendMess();
|
||||
break;
|
||||
case 'M': //readonly mode on/off
|
||||
avclan.readonly ^= (1 << 0);
|
||||
EEPROM.write(E_READONLY, avclan.readonly);
|
||||
break;
|
||||
case 'h': // set hi level
|
||||
bSerial.println("H set");
|
||||
AVC_OUT_EN;
|
||||
OUTPUT_SET_1;
|
||||
break;
|
||||
case 'l': // set low level
|
||||
bSerial.println("L set");
|
||||
AVC_OUT_EN;
|
||||
OUTPUT_SET_0;
|
||||
break;
|
||||
case 'i': // output disable. Input mode on
|
||||
bSerial.println("Out dis");
|
||||
AVC_OUT_DIS;
|
||||
break;
|
||||
case 'V': // version
|
||||
bSerial.print_p (PSTR("AVCLan mini. Kochetkov Aleksey. v"));
|
||||
bSerial.println_p(PSTR(AVCLAN_VERSION));
|
||||
bSerial.print_p (PSTR(" Driver type: "));
|
||||
bSerial.println_p(PSTR(AVCLANDRIVER_TYPE));
|
||||
bSerial.print_p (PSTR(" BuffServial v"));
|
||||
bSerial.println_p(PSTR(BUFFSERIAL_VERSION));
|
||||
bSerial.print_p (PSTR(" AVCLanDrv v"));
|
||||
bSerial.println_p(PSTR(AVCLANDRV_VERSION));
|
||||
bSerial.print_p (PSTR(AVCLANDEVICE_NAME));
|
||||
bSerial.print_p (PSTR(". v"));
|
||||
bSerial.println_p(PSTR(AVCLANDEVICE_VERSION));
|
||||
break;
|
||||
case '?':
|
||||
bSerial.println_p(PSTR("P - config\r\nV - version\r\nM - readonly mode on/off\r\n-- send command --\r\nS - start\r\nW - end direct\r\nQ - end broadcast\r\nH - end of set Head ID, 0000 - auto\r\n-- debug command --\r\nh - Output mode. Set Hi level\r\nl - Output mode. Set Low level\r\ni - Input mode"));
|
||||
break;
|
||||
case 'S': // start command
|
||||
readSeq = 1;
|
||||
s_len=0;
|
||||
s_dig=0;
|
||||
s_c[0] = s_c[1] = 0;
|
||||
break;
|
||||
case 'W': // end of direct command
|
||||
readSeq=0;
|
||||
avclan.dataSize = s_len;
|
||||
avclan.broadcast = AVC_MSG_DIRECT;
|
||||
avclan.masterAddress = avclan.deviceAddress;
|
||||
avclan.slaveAddress = avclan.headAddress;
|
||||
for (i=0; i<s_len; i++)
|
||||
avclan.message[i]=data_tmp[i];
|
||||
avclan.sendMessage();
|
||||
break;
|
||||
case 'Q' : // end of broadcast command
|
||||
readSeq=0;
|
||||
avclan.dataSize = s_len;
|
||||
avclan.broadcast = AVC_MSG_BROADCAST;
|
||||
avclan.masterAddress = avclan.deviceAddress;
|
||||
avclan.slaveAddress = 0x01FF;
|
||||
for (i=0; i<s_len; i++)
|
||||
avclan.message[i]=data_tmp[i];
|
||||
avclan.sendMessage();
|
||||
break;
|
||||
case 'H' : // end of set Head Unid ID
|
||||
readSeq=0;
|
||||
avclan.headAddress = (data_tmp[0] << 8) + data_tmp[1];
|
||||
EEPROM.write(E_MASTER1, data_tmp[0]);
|
||||
EEPROM.write(E_MASTER2, data_tmp[1]);
|
||||
break;
|
||||
default :
|
||||
if (readSeq==1) {
|
||||
if (readkey!=' ') {
|
||||
s_c[s_dig]=readkey;
|
||||
s_dig++;
|
||||
if (s_dig==2) {
|
||||
if (s_c[0]<':'){
|
||||
s_c[0] -= 48;
|
||||
}else{
|
||||
s_c[0] -= 55;
|
||||
}
|
||||
data_tmp[s_len] = 16 * s_c[0];
|
||||
if (s_c[1]<':'){
|
||||
s_c[1] -= 48;
|
||||
}else{
|
||||
s_c[1] -= 55;
|
||||
}
|
||||
data_tmp[s_len] += s_c[1];
|
||||
s_len++;
|
||||
s_dig=0;
|
||||
s_c[0]=s_c[1]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sendMess(){
|
||||
avclan.broadcast = AVC_MSG_DIRECT;
|
||||
avclan.masterAddress = 0x0360;
|
||||
avclan.slaveAddress = 0x0140;
|
||||
avclan.dataSize = 0x05;
|
||||
avclan.message[0] = 0x00;
|
||||
avclan.message[1] = 0x01;
|
||||
avclan.message[2] = 0x12;
|
||||
avclan.message[2] = 0x10;
|
||||
avclan.message[3] = 0x63;
|
||||
byte res = avclan.sendMessage();
|
||||
}
|
||||
|
||||
// Чтение конфигурации из EEPROM
|
||||
void EERPOM_read_config(){
|
||||
if (EEPROM.read(E_INIT) != 'T'){
|
||||
EEPROM.write(E_MASTER1, 0x01);
|
||||
EEPROM.write(E_MASTER2, 0x40);
|
||||
EEPROM.write(E_READONLY, 0);
|
||||
EEPROM.write(E_INIT, 'T');
|
||||
}else{
|
||||
avclan.headAddress = (EEPROM.read(E_MASTER1) << 8) + EEPROM.read(E_MASTER2);
|
||||
avclan.readonly = EEPROM.read(E_READONLY);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
2010-07-22 0.1.6
|
||||
+ во время приема сообщения из шины, загорается светодиод. Настройки порта для подключения светодиода в AVCLanDrv\config.h
|
||||
+ добавлен вывод типа драйвера при печати версий компонентов по кнопке "V"
|
||||
+ добавлен режим только чтение, плата не будет слать никаких сообщений в шину. Включение выключение по кнопке "M". Текущее значение сохраняется в EEPROM
|
||||
|
||||
2010-04-26 0.1.5
|
||||
+ Вывод помощи по кнопке "?"
|
||||
+ Установка адреса головы по команде вида S[адрес головы]H (0000 - автоматическое определение адреса). Сохранение адреса головы в EERPOM
|
||||
* изменено назначение кнопок
|
||||
h - Output mode On. Set Hi level
|
||||
l - Output mode On. Set Low level
|
||||
i - Input mode On. Read AVC-Lan
|
||||
+ добавлена обработка событий avclan.event
|
||||
+ после чтения сообщения запускается функция определения его ID (avclanDevice.getActionID), если ID найдено, запускается обработка сообщений (avclanDevice.processAction)
|
||||
|
||||
2009-11-31 0.1.4
|
||||
+ При включении выводится номер текущей версии
|
||||
+ Вывод версий компонентов по кнопке "V"
|
||||
+ При печати конфигурации выводятся адрес головы и устройства
|
||||
|
||||
Reference in New Issue
Block a user