次のコードがあります
typedef struct{
uint8_t carOpening:2;
uint8_t fCarElement:4;
}lockState_t;
enum Doors
{
DRIVER_DOOR = 0,
PASSENGER_DOOR,
...
NUMBER_OF_ELEMENTS
};
class DoorState
{
public:
DoorState(Doors door, uint8_t initialState)
{
fState.fCarElement = static_cast<uint8_t>(door);
if(initialState == SIG_VAL_DOOR_CLOSED)
{
fState.carOpening = static_cast<uint8_t>(DOOR_CLOSED);
}
else if(initialState == SIG_VAL_DOOR_OPENED)
{
fState.carOpening = static_cast<uint8_t>(DOOR_OPENED);
}
else
{
fState.carOpening = static_cast<uint8_t>(DOOR_UNKNOWN);
}
};
void checkSignal(uint8_t signal);
enum tState { DOOR_UNKNOWN = 0, DOOR_CLOSED, DOOR_OPENED };
private:
static const uint8_t SIG_VAL_DOOR_CLOSED = 0x00;
static const uint8_t SIG_VAL_DOOR_OPENED = 0x01;
lockState_t fState;
};
次に、次のようなこのクラスのインスタンスがいくつかあります。
DoorState fDriverDoorState;
DoorState fPassengerDoorState;
これは私がインスタンスを初期化する方法です:
, fDriverDoorState(DRIVER_DOOR
, DS::instance().get<uint8_t>(DS::ComStatZvKlappen_StDswDrd_ID))
, fPassengerDoorState(PASSENGER_DOOR, DS::instance().get<uint8_t>(DS::ComStatZvKlappen_StDswPsd_ID))
次に、ドアの状態が変化したかどうかを確認し、変化した場合はメッセージを公開しています。
tState doorState = DOOR_UNKNOWN;
if (SIG_VAL_DOOR_CLOSED == signal)
{
doorState = DOOR_CLOSED;
}
else if (SIG_VAL_DOOR_OPENED == signal)
{
doorState = DOOR_OPENED;
}
if(doorState != static_cast<tState>(fState.carOpening))
{
fState.carOpening = static_cast<uint8_t>(doorState);
if(DOOR_UNKNOWN != doorState)
{
LooperEventBroker::publish(::csm::events::CsmEvents::VEHICLE_LOCK_STATE_EVENT(), &fState);
Logger::info(VEHICLE, "Door %s event published for %s",
doorState == DOOR_OPENED ? "openend" : "closed", opening2string(fState.fCarElement));
}
}
ほとんどの場合、それは完全に機能しています。奇妙な点は、「INVALID DOOR に対して発行されたドアが閉じられたイベント」というログが投稿されているのを時々目にすることです。これは、インスタンスが INVALID DOOR で初期化されておらず、ドアの種類を格納する fCarElement が変更されていないため発生しないはずです。つまり、何らかの理由で fCarElement が破損するということです。質問は、どこで、またはなぜですか?
ここで要求されているのは、opening2string 関数の実装です。
static const char* opening2string(uint8_t opening)
{
switch (opening)
{
case DRIVER_DOOR:
return "DRIVER DOOR";
case PASSENGER_DOOR:
return "PASSENGER DOOR";
...
default:
return "INVALID DOOR";
}
}
よろしく、ガブリエル