Exemplo n.º 1
0
void PMC_API _on_config(PCRTK_PACKET packet, HVBUS bus)
{
#if 0
	if(get_power_state() != PWR_RUNNING){
		return;
	}
#endif

#define HANDLE_IT(type, func)\
	case type:\
		func(packet);\
		break
	switch(packet->packet_type){
	case PT_AddTag | PF_ACK:
	case PT_EditTag | PF_ACK:
		_on_add_edit_tags(packet, true);
		break;
	case PT_DropTag | PF_ACK:
		_on_drop_tags(packet);
		break;
	case PT_AddGroup | PF_ACK:
	case PT_EditGroup | PF_ACK:
		_on_add_edit_groups(packet, true);
		break;
	case PT_DropGroup | PF_ACK:
		_on_drop_groups(packet);
		break;
	HANDLE_IT(PT_AddDevice, _on_add_device);
	HANDLE_IT(PT_EditDevice, _on_edit_device);
	HANDLE_IT(PT_DelDevice, _on_del_device);
	HANDLE_IT(PT_DiscoverTags | PF_ACK, _on_add_edit_tags);
	}
}
Exemplo n.º 2
0
int fill_power_state(void)
{
	struct chipset_power_state *ps = get_power_state();

	ps->prev_sleep_state = 0;
	printk(BIOS_SPEW, "prev_sleep_state %d\n", ps->prev_sleep_state);
	return ps->prev_sleep_state;
}
Exemplo n.º 3
0
void clear_smi_and_wake_events(void)
{
	struct chipset_power_state *ps;

	/* Clear SMI and wake events */
	ps = get_power_state();
	if (ps->prev_sleep_state != 3) {
		printk(BIOS_SPEW, "Clearing SMI interrupts and wake events\n");
		reg_script_run_on_dev(LPC_BDF,
			clear_smi_and_wake_events_script);
	}
}
Exemplo n.º 4
0
void PMC_API _on_alarm(PCRTK_PACKET packet, HVBUS bus)
{
	TAG_NAME	tn;
	RTK_ALARM_PACKET *p;
	//RTK_CURSOR crNode;

#if 0
	if(get_power_state() != PWR_RUNNING){
		return;
	}
#endif

	switch(packet->packet_type){
	case PT_Alarm:
		p = (RTK_ALARM_PACKET*)packet->data;
		if(p->Class == AC_Online){
			host_to_node(&packet->src.host, &tn.node);
			DEBUG_PRINTF((
				"Got online broadcast from %s.\n",
				(char*)CNodeName(tn.node)
				));
			if(g_Worker){
				memset(&tn.sname, 0, sizeof(tn.sname));
				g_Worker->inform_load(&tn, 1);
			}
		}else if(p->Class == AC_Offline){
			/*
			host_to_node(&packet->src.host, &tn.node);
			DEBUG_PRINTF((
				"Got offline broadcast from %s.\n",
				(char*)CNodeName(tn.node)
				));			
			if(lock_rtdb(__true, 500)){
				crNode = open_node(&tn.node);
				if(crNode){
					cursor_delete(crNode);
				}
				unlock_rtdb();
			}
			*/
		}
		rtk_queue_event(
			PT_Alarm, 
			p->Rank, 
			p->Class, 
			p->Msg, 
			&packet->src
			);
		break;
	}
}
Exemplo n.º 5
0
int
main()
{
    while(1) {
        command_t cmd = read_command();

        print_command(&cmd);
        printf("Checksum:      %s\n", verify_checksums(&cmd) ? "valid" : "invalid");
        printf("Temperature:   %d C\n", get_temperature(&cmd));
        printf("Power:         %s\n", get_power_state(&cmd) ? "on" : "off");

        switch(get_mode(&cmd)) {
        case 0:
            printf("Mode:          auto\n");
            break;
        case 2:
            printf("Mode:          dry\n");
            break;
        case 3:
            printf("Mode:          cool\n");
            break;
        case 4:
            printf("Mode:          heat\n");
            break;
        case 6:
            printf("Mode:          fan\n");
            break;
        default:
            printf("Mode:          unknown?\n");
            break;
        }

        if(get_fan_strength(&cmd) & 0x8) {
            printf("Fan strength:  auto\n");
        } else {
            printf("Fan strength:  %d/5\n", get_fan_strength(&cmd) - 2);
        }

        printf("Swing mode:    %s\n", get_swing_mode(&cmd) ? "on" : "off");
        printf("Powerful mode: %s\n", get_powerful_mode(&cmd) ? "on" : "off");

        printf("\n");
    }
}
Exemplo n.º 6
0
/*
	_on_system()
*/
void PMC_API _on_system(PCRTK_PACKET packet, HVBUS bus)
{
#if 0
	if(get_power_state() != PWR_RUNNING){
		return;
	}
#endif
	{
		static __bool priorityBoosted = __false;
		if(!priorityBoosted){
			DWORD boost;
			boost = GetPrivateProfileInt(
				"vbus", 
				"SystemBoost", 
				THREAD_PRIORITY_ABOVE_NORMAL,
				get_config_file()
				);
			SetThreadPriority(GetCurrentThread(), boost);
			priorityBoosted = __true;
		}
	}

	if(packet->packet_type != PT_ServerClaim){
		return;
	}
	if(!lock_rtdb(__false, 1000)){
		return;
	}
	RTK_CURSOR	hNode;
	PRTK_NODE	pNode;
	TAG_NAME	tn;
	host_to_node(&packet->src.host, &tn.node);
	hNode = open_node(&tn.node);
	pNode = (PRTK_NODE)cursor_get_item(hNode);
	if(pNode){
		pNode->dogcount = g_NodeLife;
	}
	close_handle(hNode);
	unlock_rtdb();
	if(!pNode && g_Worker){
		memset(&tn.sname, 0, sizeof(tn.sname));
		g_Worker->inform_load(&tn, 1);
	}
}
Exemplo n.º 7
0
void PMC_API _on_rtdb(PCRTK_PACKET packet, HVBUS bus)
{
	// check for unknown node
	TAG_NAME	tn;
	PRTK_NODE pNode;

#if 0
	if(get_power_state() != PWR_RUNNING){
		return;
	}
#endif

	if(g_Worker){
		if(lock_rtdb(__false, 100)){
			RTK_CURSOR hNode;
			host_to_node(&packet->src.host, &tn.node);
			hNode = open_node(&tn.node);
			pNode = (PRTK_NODE)cursor_get_item(hNode);
			if(pNode){
				pNode->dogcount = g_NodeLife;
			}
			close_handle(hNode);
			unlock_rtdb();
			if(!hNode){
				memset(&tn.sname, 0, sizeof(tn.sname));
				// unknown node
				g_Worker->inform_load(&tn, 1);
			}			
			if(!hNode){
				return;
			}
		}
	}

	switch(PACKET_TYPE(packet)){
	case PT_ChangedData:
		update_changed_data(packet, __false);
		break;
	case PT_QueryData:
		_on_queried_data(packet);
		break;
	}
}
Exemplo n.º 8
0
bool bring_up_backups()
{
	CBringupBackups * tr;
	
	/*
		mode probing must be done in backup mode
	*/
	assert(PWR_BACKUP == get_power_state());
	
	utils_trace("Bringing up backup sites ...\n");
	tr = new CBringupBackups(2000);
	if(tr->m_bOk){
		utils_trace("Backup site acknowledged, no off-line broadcast will be made.\n");
		return true;
	}else if(tr->m_bTimeout){
		utils_trace("Backup site not found, continue unloading.\n");
	}else{
		utils_trace("Backup site mode-switch failed, continue unloading.\n");
	}
	return false;
}
Exemplo n.º 9
0
bool CRtkService::_uninit()
{
	bool is_server;

	is_server = get_power_state()==PWR_RUNNING? true : false;

	utils_trace("Please stand-by ...\n");		
	
	switch_to_backup();

	uninit_ioss();
	utils_trace("IO subsystem stopped.\n");
	destroy_rtdb();
	utils_trace("Realtime Database Subsystem closed.\n");	
#ifdef _WIN32
	uninit_spac();
#endif
	utils_trace("IO Subsystem closed.\n");

	if(is_server){
		if(!bring_up_backups()){
			offline_broadcast();
		}
	}
	
	unregister_power_callback(power_state_changed, 0);

	uninit_network();
	utils_trace("Networking subsystem closed.\n");

	utils_trace("%s stopped.\n",  versionString.c_str());

	uninit_config();
	uninit_server_shell();
	
	return true;
}
Exemplo n.º 10
0
bool CRtkService::_init()
{
	char serverName[rtkm_node_key_length + 1];

	m_bPending = __true;
	
	PrimaryCheckInterval = GetPrivateProfileInt(
		"PMC",
		"PrimaryCheckInterval",
		500,
		get_config_file()
		);
	if(PrimaryCheckInterval < 50 || PrimaryCheckInterval > 5000){
		utils_error(
			"Warning : PrimaryCheckInterval=%d is invalid, reset to 500.\n",
			PrimaryCheckInterval
			);
		PrimaryCheckInterval = 500;
	}
	MaxPrimaryWatchDogCounter = GetPrivateProfileInt(
		"PMC",
		"PrimaryWatchDogCounter",
		8,
		get_config_file()
		);
	if(MaxPrimaryWatchDogCounter < 3 || MaxPrimaryWatchDogCounter > 50){
		utils_error(
			"Warning : PrimaryWatchDogCounter=%d is invalid, reset to 20.\n",
			PrimaryWatchDogCounter
			);
		MaxPrimaryWatchDogCounter = 8;
	}
	PrimaryWatchDogCounter = MaxPrimaryWatchDogCounter;
	
	m_bPending = __false;

	init_powermgr();

#ifdef _WIN32
	init_spac();//初始化得到security descriptor、mutex对象句柄数组mutics[]和event对象句柄数组events[]
#endif
	
	init_server_shell();//创建g_shell

	init_config();//空函数。。。
	
	GetPrivateProfileString(
		"PMC",
		"ServerName",
		"",
		serverName,
		sizeof(serverName),
		get_config_file()
		);
	//若pmc.ini中没有给出节点名,取本机名为节点名
	if(!serverName[0]){
		DWORD len;
		len = sizeof(serverName);
		GetComputerName(serverName, &len);
	}
	
	//初始化网络,即设定一些值,创建链表g_buses,<bus_id, CRtkVBus*>,并开启5个VBUS线程
	if(!init_network(RTK_INIT_AS_SERVER, serverName)){
		return false;
	}
	//给g_buses中的4个元素的CRtkVBus的成员赋值
	connect_vbus(
		BUSID_RTDB, 
		VBUS_CONNECT_AS_SERVER, 
		on_rtdb, 
		rtdb_filter
		);
	connect_vbus(
		BUSID_SYSTEM, 
		VBUS_CONNECT_AS_SERVER, 
		on_system, 
		server_filter
		);
	connect_vbus(
		BUSID_OPERATION, 
		VBUS_CONNECT_AS_SERVER, 
		on_operation, 
		server_filter
		);
	connect_vbus(
		BUSID_CONFIG, 
		VBUS_CONNECT_AS_SERVER, 
		on_config, 
		server_filter
		);
	utils_trace("Networking Subsystem initialized.\n"); 	

	register_power_callback(power_state_changed, 0);//创建一个CALLBACK_ITEM,用形参给其成员赋值,并链接上RTK_LIST_ENTRY
	// checking primary site
	if(!setup_running_state()){
		return false;
	}	

	setup_rtdb();//在pmc.ini中寻找组名,加载组名对应的*.csv文件中的标签到内存,并开启一个线程。
	utils_trace("Realtime Database Subsystem initialized.\n");
	init_ioss();
	utils_trace("IO Susbsystem initialized.\n");	

	utils_trace("%s started...\n",  versionString.c_str());

	if(get_power_state() == PWR_RUNNING){
		online_broadcast();//发送一个报警数据包,RTK_ALARM_PACKET型
	}

	return true;
}
Exemplo n.º 11
0
void CRtkService::Run(__uint, char **)
#endif
{
	
	__uint res;

	// report to the SCM that we're about to start
	utils_trace("Starting %s...\n", versionString.c_str());

	ReportStatus(SERVICE_START_PENDING);

	signal(SIGINT, _ctrl_c);

	try{
		if(!_init()){
			throw(this);
		}
	
		ReportStatus(SERVICE_RUNNING);		
		__int logCounter = 24*3600*1000/PrimaryCheckInterval;
		
		while(!bExit){
			res = m_hStop.Wait(PrimaryCheckInterval);
			switch(res){
			case WAIT_OBJECT_0:
				switch(m_dwStopReason){
				case 0:
					bExit = true;
					break;
				case 1:
					_restart();
					ReportStatus(SERVICE_RUNNING);
					break;
				case 2:
					break;
				}
				if(get_power_state()==PWR_RUNNING){
					notify_active();
				}
				break;
			case WAIT_TIMEOUT:
				switch(get_power_state()){
				case PWR_RUNNING:
					notify_active();
					break;
				case PWR_BACKUP:
					PrimaryWatchDogCounter--;
					if(PrimaryWatchDogCounter <= 0){
						utils_trace("Primary site failed, resuming responsibility.\n");
						switch_to_primary();
					}
					break;
				}
				logCounter--;
				if(logCounter <= 0){
					close_log();
					open_log();
					logCounter = 24*3600*1000/PrimaryCheckInterval;
				}
				break;
			}
		}
		_uninit();
	}catch(CRtkService *){
		utils_error("Aborted.\n");
	}

	ReportStatus(SERVICE_STOPPED);
}