Two errors in the device handler to fix. Adjust the receiving of the packet in the 0.18s window and solve the problem of automatic passage to MODE OFf.

This commit is contained in:
mmode 2021-09-15 20:46:06 +02:00
parent 02bde1133e
commit d366b3ca22
9 changed files with 25 additions and 8 deletions

View File

@ -111,7 +111,7 @@ void InitMission::createTasks(){
FixedTimeslotTaskIF* arduinoTask = TaskFactory::instance()-> FixedTimeslotTaskIF* arduinoTask = TaskFactory::instance()->
createFixedTimeslotTask("ARDUINO_TASK",40, createFixedTimeslotTask("ARDUINO_TASK",40,
PeriodicTaskIF::MINIMUM_STACK_SIZE, 3.2, nullptr); PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, nullptr);
result = pollingSequenceArduinoFunction(arduinoTask); result = pollingSequenceArduinoFunction(arduinoTask);
if(result != HasReturnvaluesIF::RETURN_OK) { if(result != HasReturnvaluesIF::RETURN_OK) {
sif::error << "InitMission::createTasks:ArduinoPST initialization failed!" sif::error << "InitMission::createTasks:ArduinoPST initialization failed!"
@ -151,13 +151,13 @@ void InitMission::createTasks(){
//Main thread sleep //Main thread sleep
sif::debug << "Starting Tasks in 3.2 seconds" << std::endl; sif::debug << "Starting Tasks in 3.2 seconds" << std::endl;
TaskFactory::delayTask(3200); TaskFactory::delayTask(1600);
distributerTask->startTask(); distributerTask->startTask();
udpBridgeTask->startTask(); udpBridgeTask->startTask();
udpPollingTask->startTask(); udpPollingTask->startTask();
//serializeTask->startTask(); //serializeTask->startTask();
//arduinoTask->startTask(); arduinoTask->startTask();
controllerTask->startTask(); //controllerTask->startTask();
//payloadTask->startTask(); //payloadTask->startTask();
eventTask->startTask(); eventTask->startTask();

View File

@ -78,6 +78,7 @@ ReturnValue_t DeviceHandlerBase::performOperation(uint8_t counter) {
performOperationHook(); performOperationHook();
} }
if (mode == MODE_OFF) { if (mode == MODE_OFF) {
sif::debug<<"DH_base: Mode off"<<std::endl;
return RETURN_OK; return RETURN_OK;
} }
switch (getComAction()) { switch (getComAction()) {
@ -293,6 +294,7 @@ void DeviceHandlerBase::doStateMachine() {
} }
break; break;
case _MODE_POWER_DOWN: case _MODE_POWER_DOWN:
sif::debug<<"DH_base: mode power down"<<std::endl;
commandSwitch(PowerSwitchIF::SWITCH_OFF); commandSwitch(PowerSwitchIF::SWITCH_OFF);
setMode(_MODE_WAIT_OFF); setMode(_MODE_WAIT_OFF);
break; break;
@ -322,6 +324,7 @@ void DeviceHandlerBase::doStateMachine() {
} }
break; break;
case _MODE_WAIT_OFF: { case _MODE_WAIT_OFF: {
sif::debug<<"DH_base: mode power down"<<std::endl;
uint32_t currentUptime; uint32_t currentUptime;
Clock::getUptime(&currentUptime); Clock::getUptime(&currentUptime);
@ -358,6 +361,7 @@ void DeviceHandlerBase::doStateMachine() {
break; break;
default: default:
triggerEvent(OBJECT_IN_INVALID_MODE, mode, submode); triggerEvent(OBJECT_IN_INVALID_MODE, mode, submode);
sif::debug<<"object in invalid mode"<<std::endl;
setMode(_MODE_POWER_DOWN, 0); setMode(_MODE_POWER_DOWN, 0);
break; break;
} }
@ -661,9 +665,10 @@ void DeviceHandlerBase::parseReply(const uint8_t* receivedData,
// scanForReply routines. // scanForReply routines.
uint32_t remainingLength = receivedDataLen; uint32_t remainingLength = receivedDataLen;
for (uint32_t count = 0; count < receivedDataLen; count++) { for (uint32_t count = 0; count < receivedDataLen; count++) {
sif::debug<<"DH_base: debug0"<<std::endl;
result = scanForReply(receivedData, remainingLength, &foundId, result = scanForReply(receivedData, remainingLength, &foundId,
&foundLen); &foundLen);
sif::debug<<"DH_base: debug01"<<std::endl;
switch (result) { switch (result) {
case RETURN_OK: case RETURN_OK:
handleReply(receivedData, foundId, foundLen); handleReply(receivedData, foundId, foundLen);
@ -684,6 +689,7 @@ void DeviceHandlerBase::parseReply(const uint8_t* receivedData,
case IGNORE_FULL_PACKET: case IGNORE_FULL_PACKET:
return; return;
default: default:
sif::debug<<"DH_base: debug02"<<std::endl;
//We need to wait for timeout.. don't know what command failed and who sent it. //We need to wait for timeout.. don't know what command failed and who sent it.
replyRawReplyIfnotWiretapped(receivedData, foundLen); replyRawReplyIfnotWiretapped(receivedData, foundLen);
triggerEvent(DEVICE_READING_REPLY_FAILED, result, foundLen); triggerEvent(DEVICE_READING_REPLY_FAILED, result, foundLen);
@ -911,6 +917,7 @@ Mode_t DeviceHandlerBase::getBaseMode(Mode_t transitionMode) {
return _MODE_TO_ON; return _MODE_TO_ON;
} }
if (transitionMode == _MODE_SHUT_DOWN) { if (transitionMode == _MODE_SHUT_DOWN) {
sif::debug<<"mode shut down"<<std::endl;
return _MODE_POWER_DOWN; return _MODE_POWER_DOWN;
} }
return transitionMode return transitionMode

View File

@ -31,10 +31,13 @@ ReturnValue_t DeviceHandlerFailureIsolation::eventReceived(EventMessage* event)
if(isFdirInActionOrAreWeFaulty(event)) { if(isFdirInActionOrAreWeFaulty(event)) {
return RETURN_OK; return RETURN_OK;
} }
sif::debug<<"DH_FDIR: event received"<<std::endl;
ReturnValue_t result = RETURN_FAILED; ReturnValue_t result = RETURN_FAILED;
switch (event->getEvent()) { switch (event->getEvent()) {
case HasModesIF::MODE_TRANSITION_FAILED: case HasModesIF::MODE_TRANSITION_FAILED:
case HasModesIF::OBJECT_IN_INVALID_MODE: case HasModesIF::OBJECT_IN_INVALID_MODE:
sif::debug<<"DH_FDIR: event received 1"<<std::endl;
//We'll try a recovery as long as defined in MAX_REBOOT. //We'll try a recovery as long as defined in MAX_REBOOT.
//Might cause some AssemblyBase cycles, so keep number low. //Might cause some AssemblyBase cycles, so keep number low.
handleRecovery(event->getEvent()); handleRecovery(event->getEvent());
@ -44,6 +47,7 @@ ReturnValue_t DeviceHandlerFailureIsolation::eventReceived(EventMessage* event)
case DeviceHandlerIF::DEVICE_UNREQUESTED_REPLY: case DeviceHandlerIF::DEVICE_UNREQUESTED_REPLY:
case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: //Some DH's generate generic reply-ids. case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: //Some DH's generate generic reply-ids.
case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED: case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED:
sif::debug<<"DH_FDIR: event received 2"<<std::endl;
//These faults all mean that there were stupid replies from a device. //These faults all mean that there were stupid replies from a device.
if (strangeReplyCount.incrementAndCheck()) { if (strangeReplyCount.incrementAndCheck()) {
handleRecovery(event->getEvent()); handleRecovery(event->getEvent());
@ -53,6 +57,7 @@ ReturnValue_t DeviceHandlerFailureIsolation::eventReceived(EventMessage* event)
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED: case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
//The two above should never be confirmed. //The two above should never be confirmed.
case DeviceHandlerIF::DEVICE_MISSED_REPLY: case DeviceHandlerIF::DEVICE_MISSED_REPLY:
sif::debug<<"DH_FDIR: event received 3"<<std::endl;
result = sendConfirmationRequest(event); result = sendConfirmationRequest(event);
if (result == HasReturnvaluesIF::RETURN_OK) { if (result == HasReturnvaluesIF::RETURN_OK) {
break; break;
@ -64,14 +69,17 @@ ReturnValue_t DeviceHandlerFailureIsolation::eventReceived(EventMessage* event)
break; break;
case StorageManagerIF::GET_DATA_FAILED: case StorageManagerIF::GET_DATA_FAILED:
case StorageManagerIF::STORE_DATA_FAILED: case StorageManagerIF::STORE_DATA_FAILED:
sif::debug<<"DH_FDIR: event received 4"<<std::endl;
//Rather strange bugs, occur in RAW mode only. Ignore. //Rather strange bugs, occur in RAW mode only. Ignore.
break; break;
case DeviceHandlerIF::INVALID_DEVICE_COMMAND: case DeviceHandlerIF::INVALID_DEVICE_COMMAND:
sif::debug<<"DH_FDIR: event received 5"<<std::endl;
//Ignore, is bad configuration. We can't do anything in flight. //Ignore, is bad configuration. We can't do anything in flight.
break; break;
case HasHealthIF::HEALTH_INFO: case HasHealthIF::HEALTH_INFO:
case HasModesIF::MODE_INFO: case HasModesIF::MODE_INFO:
case HasModesIF::CHANGING_MODE: case HasModesIF::CHANGING_MODE:
sif::debug<<"DH_FDIR: event received 6"<<std::endl;
//Do nothing, but mark as handled. //Do nothing, but mark as handled.
break; break;
//****Power***** //****Power*****
@ -98,6 +106,7 @@ ReturnValue_t DeviceHandlerFailureIsolation::eventReceived(EventMessage* event)
case ThermalComponentIF::COMPONENT_TEMP_HIGH: case ThermalComponentIF::COMPONENT_TEMP_HIGH:
case ThermalComponentIF::COMPONENT_TEMP_OOL_LOW: case ThermalComponentIF::COMPONENT_TEMP_OOL_LOW:
case ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH: case ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH:
sif::debug<<"DH_FDIR: event received 7"<<std::endl;
//Well, the device is not really faulty, but it is required to stay off as long as possible. //Well, the device is not really faulty, but it is required to stay off as long as possible.
setFaulty(event->getEvent()); setFaulty(event->getEvent());
break; break;
@ -228,6 +237,7 @@ ReturnValue_t DeviceHandlerFailureIsolation::getParameter(uint8_t domainId,
} }
void DeviceHandlerFailureIsolation::setFaulty(Event reason) { void DeviceHandlerFailureIsolation::setFaulty(Event reason) {
sif::debug<<"DH_FDIR: setFaulty"<<std::endl;
throwFdirEvent(FDIR_TURNS_OFF_DEVICE, EVENT::getEventId(reason)); throwFdirEvent(FDIR_TURNS_OFF_DEVICE, EVENT::getEventId(reason));
setOwnerHealth(HasHealthIF::FAULTY); setOwnerHealth(HasHealthIF::FAULTY);
setFdirState(AWAIT_SHUTDOWN); setFdirState(AWAIT_SHUTDOWN);

View File

@ -41,7 +41,7 @@ ReturnValue_t ArduinoDH::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
void ArduinoDH::doTransition(Mode_t modeFrom, Submode_t submodeFrom) { void ArduinoDH::doTransition(Mode_t modeFrom, Submode_t submodeFrom) {
if (mode == _MODE_TO_NORMAL) { if (mode == _MODE_TO_NORMAL) {
std::cout<<"Arduino device -> Transition to Normal mode"<<std::endl; std::cout<<"Arduino device is in Normal mode"<<std::endl;
} else { } else {
setMode(_MODE_TO_NORMAL); setMode(_MODE_TO_NORMAL);
} }
@ -127,7 +127,7 @@ ReturnValue_t ArduinoDH::interpretDeviceReply(DeviceCommandId_t id,
} }
// All data are here printed to monitor from the three vectors of data measurements. // All data are here printed to monitor from the three vectors of data measurements.
printf( /*printf(
"\n***********************************************************************************************\n"); "\n***********************************************************************************************\n");
printf("TEMPERATURE parameters are: "); printf("TEMPERATURE parameters are: ");
@ -230,7 +230,7 @@ ReturnValue_t ArduinoDH::interpretDeviceReply(DeviceCommandId_t id,
printf("\nTimestamp: %u", vecAcc[3 * k + 2].Timestamp[i]); printf("\nTimestamp: %u", vecAcc[3 * k + 2].Timestamp[i]);
} }
printf("\nEnd: %7s", vecAcc[3 * k + 2].end_string); printf("\nEnd: %7s", vecAcc[3 * k + 2].end_string);
} }*/
std::cout << "\n\nEnd reading data.\n" << std::endl; std::cout << "\n\nEnd reading data.\n" << std::endl;