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); } }
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; }
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); } }
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; } }
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"); } }
/* _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); } }
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; } }
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; }
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; }
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; }
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); }