#include "CAN_FW.h"
#include "Can.h"
#include "IO.h"
#include "Utils.h"

void OutputChanged (TCanFwMem * vars, uint32_t aOutputNum, bool aSwitchedOn)
{
 TCanPkt pkt;

    switch (aOutputNum)
    {
    case CIO::oLights:
            if(aSwitchedOn)
            {
                if (vars->ELight.tmr.Value() > 800 &&  vars->ELight.step == 0)
                {
                    CoreFunc->RunSequence(SEQ(oEmergency, seqProg8));               // Выход на кнопку аварийки импульс 250 ms
                    vars->PeriodicTask.SetTimeout (PELightButton, 260);
                    vars->ELight.step++;
                    vars->ELight.cnt = 0;
                    vars->ELight.seized = true;
                    //tt(0x10);
                }
            }
            break;

    case CIO::oCloseWindows:
            if (aSwitchedOn)    vars->cmf = true;
            break;


    case CIO::oFoldMirrors:
            if (aSwitchedOn)	vars->mirror = true;
            break;
    }
}

void ELight_Button2(TCanFwMem * vars)             // Нажатия на триггерную кнопку аварийки с ожиданием вспышки
{
        switch (vars->ELight.step)
        {
        case 1:
                if (!vars->ELight.hazlamp)
                {
                    if (vars->ELight.cnt < 8)                                   // ожидаем когда лампа загориться
                    {
                        vars->PeriodicTask.SetTimeout (PELightButton, 50);          // подождем еще
                        vars->ELight.cnt++;
                        //tt(0x15);
                    }
                    else    {vars->ELight.step = 0; /*tt(3);*/}                     // не удалось зажечь
                }
                else                                                            // если лампа загорелась (~440mS для Monjaro)
                {
                    vars->PeriodicTask.SetTimeout (PELightButton, 150);             // пусть погорит хотя бы 150mS
                    vars->ELight.step++;
                    //tt(0x20);
                }
                break;
        case 2:                                                                     //    лампа горит уже 150m
                CoreFunc->RunSequence(SEQ(oEmergency, seqProg9));                   // гасим ее импульсом не менее 150 мс ( 100mS для Monjaro мало)
                vars->PeriodicTask.SetTimeout (PELightButton, 160);
                vars->ELight.step++;
                break;
        case 3:
                if (!vars->ELight.hazlamp)                                      // ожидаем когда лампа погаснет
                {

                    vars->ELight.step = 0;
                    vars->ELight.seized = false;
                     //tt(0x0F);
                }
                else    vars->PeriodicTask.SetTimeout (PELightButton, 10);
                break;
        }
}


// события arm, disarm, alarm, ...
void Command (TCanFwMem * vars, TCanFwCommands aCmd, uint32_t aCmdParam)
{
 TCanPkt pkt;
 uint8_t i;

        switch (aCmd)
        {

            case ccLockDoors:
                            Wake_CAN(vars);
                            pkt.id = 0x020;
                            pkt.data_len = 8;
                            pkt.SetData("\x28\x12\x28\x2B\xAA\x00\x00\x68"); // FL=0x2X RL=0xX2 FR=0x2X RR=0x2X
                            for (i=0; i<4; i++)     CoreFunc->CanSend (CANch1, &pkt, 18);
                            break;
            case ccUnLockDoors:                                             // можно сделать mccPriority
                            Wake_CAN(vars);
                            pkt.id = 0x020;
                            pkt.data_len = 8;
                            pkt.SetData("\x18\x11\x18\x1B\xAA\x00\x00\x68");
                            for (i=0; i<4; i++)     CoreFunc->CanSend (CANch1, &pkt, 18);
                            break;

            case ccSendObdReq:
                            pkt.id = 0x7DF;
                            pkt.data_len = 8;
                            pkt.data[0] = 0x01;
                            pkt.data[1] = aCmdParam;
                            CoreFunc->CanSend (CANch2, &pkt, 1);
                            break;
            case ccUpdateVin:                                                                                   // отправить запрос VIN-кода
                            DiagReq (vars, 0x09, 0x02, CANch2);
                            break;

            default:        break;
    }
}

//============== Пробуждение ==================================================
void Wake_CAN(TCanFwMem * vars)
{
 TCanPkt pkt;
//  uint8_t i;

    if (CoreFunc->CanGetRxTimeout (CANch1) < 1000) return;  // Если шина не спит то не будим!

    pkt.id = 0x501;
    pkt.data_len = 8;
    pkt.SetData("\x01\x40\x26\x00\x01");
    CoreFunc->CanSend (CANch1, &pkt, 2);
    CoreFunc->CanSend (CANch1, &pkt, 20);
}