void System::ApplyDamage(double damage) { if (!power_on) damage /= 10; if (components.size() > 0) { int index = rand() % components.size(); if (damage > 50) { damage/=2; components[index]->ApplyDamage(damage); index = rand() % components.size(); } components[index]->ApplyDamage(damage); if (safety < 0.5) SetPowerLevel(50); else if (safety < 1.0) SetPowerLevel(safety * 100); } else { availability -= (float) (damage/100.0f); if (availability < 0.01) availability = 0.0f; } }
void System::DoEMCON(int index) { int e = GetEMCONPower(index); if (power_level * 100 > e || emcon != index) { if (e == 0) { PowerOff(); } else { if (emcon != index) PowerOn(); SetPowerLevel(e); } } emcon = index; }
//thread to receive messages and respond void *ResponderMessageThread(void *arg) { uint8_t requestor; DEBUGPRINT("responder: thread started\n"); while (1) { psMessage_t *msg = GetNextMessage(&responderQueue); //check message for response requirement switch (msg->header.messageType) { case CONFIG: if (msg->configPayload.responder == XBEE) { requestor = msg->configPayload.requestor; DEBUGPRINT("responder: Send Config received\n"); configCount = 0; #define optionmacro(name, var, minV, maxV, def) sendOptionConfig(name, var, minV, maxV, requestor); #include "options.h" #undef optionmacro #define settingmacro(name, var, minV, maxV, def) sendSettingConfig(name, var, minV, maxV, requestor); #include "settings.h" #undef settingmacro { psMessage_t msg; psInitPublish(msg, CONFIG_DONE); msg.configPayload.requestor = requestor; msg.configPayload.responder = XBEE; msg.configPayload.count = configCount; RouteMessage(&msg); } DEBUGPRINT("responder: Config Done\n"); } break; case PING_MSG: { if (msg->header.source != OVERMIND) { DEBUGPRINT("responder: APP Ping received\n"); psMessage_t msg2; psInitPublish(msg2, PING_RESPONSE); strcpy(msg2.responsePayload.subsystem, "BEE"); msg2.responsePayload.flags = (startFlag ? RESPONSE_FIRST_TIME : 0) | (agentOnline ? RESPONSE_AGENT_ONLINE : 0); msg2.responsePayload.requestor = msg->requestPayload.requestor; startFlag = 0; RouteMessage(&msg2); PublishConditions(true); SendXBeeStats(); SendAgentStats(); } } break; case NEW_SETTING: DEBUGPRINT("responder: New Setting: %s = %f\n", msg->settingPayload.name, msg->settingPayload.value); #define settingmacro(n, var, minV, maxV, def) if (strncmp(n,msg->settingPayload.name,PS_NAME_LENGTH) == 0)\ var = msg->settingPayload.value;\ sendSettingConfig(n, var, minV, maxV, 0); #include "settings.h" #undef settingmacro if (strncmp("Power Level",msg->settingPayload.name,PS_NAME_LENGTH) == 0) SetPowerLevel((int) powerLevel); break; case SET_OPTION: DEBUGPRINT("responder: Set Option: %s = %i\n", msg->optionPayload.name, msg->optionPayload.value); #define optionmacro(n, var, minV, maxV, def) if (strncmp(n,msg->optionPayload.name,PS_NAME_LENGTH) == 0)\ var = msg->optionPayload.value;\ sendOptionConfig(n, var, minV, maxV, 0); #include "options.h" #undef optionmacro break; default: //ignore anything else break; } DoneWithMessage(msg); } return 0; }