Window(C="Test - parameters";w=370;h=220;a=h)
{
    label(c="$%color=$00FFFF%fname=Tahoma%size=11%Пауза";left=5;top=5;height=20;width=715;name=lbstate)
    group(c = "VCC";left=5;top=30;height=95;width= 90)
    {
        button(c = "Включить";left=5;top=15;height=35;width=80;proc=on)    
        button(c = "ВЫключить";left=5;top=55;height=35;width=80;proc=off)    
    }
    group(c = "Настройки";left = 100;top=30;width=260;height=95)
    {
        Digit(c = "Скорость (кбит/сек)";left=115;top=15;width=50;name=baud;value = 250)
        Digit(c = "Тайм-аут (мс)";left=115;top=40;width=50;name=tx_timeout;value = 200)
        list(c = "ID11/ID29";left=115;top=65;width=50;value= 0;items = "11","29";name = mode)
        button(c = "Применить";left=170;top=15;height=70;width=80;proc=apply_param)    
    }
    group(c = "Сообщение";left =5;top = 125;width = 355;h=80)
    {
        hexedit(c = "ID (HEX)";left=53;top=20;width=60;name=tx_id)
        hexbytes(c = "Data";left=145;top=20;width=200;value= 8;items = "FF FF FF FF FF FF FF FF";name = tx_data)
        list(c= "Байт";left=53;top=45;width=60;value=7;items="1","2","3","4","5","6","7","8";name = tx_len)
        button(c = "Передать";left=145;top=45;height=22;width=70;proc=tx)    
        checkbox(c = "Повторять";left=235;top=47;height=22;width=70;name=auto_tx)    
    }
    group(c = "Прием";left =365;top = 30;width = 355;h=150)
    {
        list(c = "Режим";left=80;top=15;width=100;value=0;items = "Отключен","Слушать","Принимать";proc= rx_mode_change;name=rx_mode)
        hexbytes(c="ACC_CODE";left=80;top=40;width=100;value=4;items="FF FF FF FF";name=acc_code)
        hexbytes(c="ACC_MASK";left=80;top=65;width=100;value=4;items="FF FF FF FF";name=acc_mask)

        label(c="%color=$FF8080%fcolor=$FFFFFF%fname=fixedsys%0000 00 00 00 00 00 00 00 00";left=20;top=90;width=240;name=rx_msg)
    }
}        


Editor
{
 (C="EEPROM";size=512;mode=8;bytes=16)
}

$HOST

emem ebuf=0;
byte array[8];
byte rx_array[8];
string s;
byte working;
byte rx_enable;
word rx_per_sec;

proc on()
{
    var a;
    FAST_TIMER = 0;
    rx_per_sec = 0;
    working = 0;
    print("\nPower ON. ");
    a = device.on();
    if(a != 0)
    {
        if(a = 1) 
        {
            print("\nПитание уже включено.");
            working = 255;
        }
        if(a = 2) 
        {
            print("\nАдаптер не найден.");
            device.off();
            working = 0;
        }
        return;
    }
    print("\nАдаптер OK.");
    print("\nInit...");
    a = device.can_init(mode,baud,0xFFFFFFFF);
    if(a = 0) 
    {
        print("\nInit OK.");
        working = 255;
    }
    else 
    {
        device.off();
        print("\nInit error! "+#h1.a);
        working = 0;
    }
}

proc off() 
{ 
    device.off(); 
    working = 0;
}

proc apply_param()
{      
    var a,temp;

    a = device.can_init(mode,baud,0xFFFFFFFF);

    if(a = 0)   print("\nInit OK.");
    else        print("\nInit error! "+#h1.a);

}

proc tx()
{
    var a,temp,x;
    
    ebuf[0] = tx_len;

    for(a = 0;a < 8; a++)   array[a] = tx_data[a];

    memcopy(device.can_tx_data = array,8); 
    
    s = "\nПередача: ID="+#h2.tx_id;
    temp = tx_len+1;

    for(a = 0; a < temp; a++)
    {
        x = array[a]; 
        s = s+" "+#h1.x;
    }
    
    print(s);
    
    a = device.can_tx(tx_id,temp);
    
    if(a = 0) print("  OK");
    else print("  Ошибка");
}

proc rx_mode_change()
{
    var a;
    a = rx_mode;
    if(rx_mode = 0) rx_enable = 0;
    if(rx_mode > 0) rx_enable = 255;
    if(rx_mode = 1) device.can_set_listen_mode(1);
    else            device.can_set_listen_mode(0);
}


proc idle()
{
    var a,temp,b;
    a = FAST_TIMER;
    b = 0;
    if(a >= 1000)
    {
        FAST_TIMER = 0;
        b = 1;
    }
    if(working)
    {
        if(b)
        {
            b = rx_per_sec;
            rx_per_sec = 0;
            lbstate = "%color=$00FF00%Работа (прием: "+#i.b+" сообщений/сек).";        
        }

        if(rx_enable)
        {
            a = device.can_missing_rx;
            if(a) print("\nПотерянное сообщение");
            a = device.can_rx_message();
            if(a > 0)
            {
                rx_per_sec = rx_per_sec + 1;
                memcopy(rx_array=device.can_rx_data,8);
                temp = device.can_rx_id();
                s = #h2.temp;
                for(temp = 0; temp < a;temp++)
                {
                    b = rx_array[temp];
                    s = s + " "+#h1.b;
                }
                rx_msg = s;
                print("\n  Прием: "+s);      
            }    
        }
        else
        {
            lbstate = "%color=$00FF00%Работа (прием выключен).";        
        }    
        if(auto_tx)
        {
            a = tx_data[1];
            a++;
            tx_data[1] = a;
            tx();
        }
    }
    else
    {
        lbstate = "%color=$00FFFF%Пауза";        
    }
}

$DEVICE

byte working;

word id;

#include "can.inc"

proc on()
{
    var a;
    if(POWER & 1)   return(1);      // питание уже включено, выход
    POWER = 3;                      // включаем питание адаптера
    delay(300000);                  // время на установку питания и выполнения сброса SJA1000
    can_io_init();                  // инициализация портов для работы с адаптером
    a = can_check_adapter();        // проверка подключения адаптера
    if(a) return(2);                // адаптер не найден
    return(0);                      // OK
}

proc off()
{
    POWER = 0;
    PWM0 = 0;
}


proc get_power()
{
    return(POWER & 1);
}

