DAT290 / kod / Motion_alarm / MotionAlarm_messageHandlers.c
MotionAlarm_messageHandlers.c
Raw
#include "MotionAlarm_messageHandlers.h"
#include "MotionAlarm_messages.h"
#include <Network_protocol/CAN_interface.h>
#include <Network_protocol/CAN_messageTypes.h>
#include "Vibration_sensor/SW_18010P.h"
#include <Timer/TIM.h>

static uint8_t auxId;

static void auxActivate(Message* msg) {
    AuxActivateRequest auxActivate = *(AuxActivateRequest*) &(msg->data);

    switch (auxActivate.sensor.sensorType) {
        case DISTANCE:
            // TODO
            break;
        case VIBRATION:
            SW_18010P_init(SW_18010P_getSensitivity());
            break;
    }
}

static void auxDeactivate(Message* msg) {
    AuxDeactivateRequest auxDeactivate = *(AuxDeactivateRequest*) &(msg->data);

    switch (auxDeactivate.sensor.sensorType) {
        case DISTANCE:
            // TODO
            break;
        case VIBRATION:
            SW_18010P_deinit();
            break;
    }
}

static void auxConfig(Message* msg) {
    AuxConfigRequest auxConfig = *(AuxConfigRequest*) &(msg->data);

    if (auxConfig.sensor.sensorType == DISTANCE) {
        // TODO
    } else if (auxConfig.sensor.sensorType == VIBRATION) {
        SW_18010P_setSensitivity(auxConfig.sensitivity);
    }
}

static void auxInfo(Message* msg) {
    AuxInfoRequest auxInfoRequest = *(AuxInfoRequest*) &(msg->data);
    AuxInfoResponse auxInfoResponse;

    switch (auxInfoRequest.sensor.sensorType) {
        case DISTANCE:
            // TODO
            break;
        case VIBRATION:
            auxInfoResponse.sensitivity = SW_18010P_getSensitivity();
            auxInfoResponse.calibration = 0;
            auxInfoResponse.currentValue = SW_18010P_getCurrentValue();
            break;
    }

    CAN_send(auxId, AUX_INFO, &auxInfoResponse, sizeof(auxInfoResponse));
}

static uint8_t timer;

static void auxInit(Message* msg) {
    TIM_cancelTimer(timer);
    auxId = msg->id.auxId;
    CAN_registerMessageHandler(AUX_ACTIVATE, auxActivate);
    CAN_registerMessageHandler(AUX_DEACTIVATE, auxDeactivate);
    CAN_registerMessageHandler(AUX_CONFIG, auxConfig);
    CAN_registerMessageHandler(AUX_INFO, auxInfo);
}

static void requestAuxiliaryInit() {
    CAN_auxRequestInit(MOTION_ALARM);
}

void MotionAlarm_communicationInit() {
    CAN_init(false);
    CAN_registerMessageHandler(AUXILIARY_INIT, auxInit);
    requestAuxiliaryInit();
    timer = TIM_startRepeatingTimer(1000, requestAuxiliaryInit);
}

void MotionAlarm_triggerAlarm() {
    CAN_send(auxId, ALARM, 0, 0);
}