Beispiel #1
0
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;
    }
}
Beispiel #2
0
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;
}
Beispiel #3
0
//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;
}