Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

450 lines
12 KiB

  1. /*
  2. *
  3. * NOTES:
  4. *
  5. * REVISIONS:
  6. * ker25NOV92 Initial OS/2 Revision
  7. * pcy07Dec92: DeepGet no longer needs aCode
  8. * pcy11Dec92: Rework
  9. * pcy22Jan93: Included the threshold value in the event
  10. * cad26Aug93: Coordinating yes/no as well as updating ini file
  11. * cad31Aug93: Forcing two decimal places, seen occ in front end
  12. * cad14Sep93: rewrote checkState() to avoid chattering
  13. * cad04Mar94: doing get/set of thresh values properly
  14. * pcy08Apr94: Trim size, use static iterators, dead code removal
  15. * cad22Jun94: Doing cfgmgr gets via codes, fixes lost comm problem
  16. * related to cache not being around after startup
  17. * djs17May96: Added multi-phase voltage parameters
  18. *
  19. * v-stebe 29Jul2000 Fixed PREfix errors (bugs #112611, #112612)
  20. */
  21. #define INCL_BASE
  22. #define INCL_DOS
  23. #define INCL_NOPM
  24. #include "cdefine.h"
  25. extern "C" {
  26. #if (C_OS & C_OS2)
  27. #include <os2.h>
  28. #endif
  29. #include <stdlib.h>
  30. #include <stdio.h>
  31. #include <malloc.h>
  32. #include <string.h>
  33. }
  34. #include "thsensor.h"
  35. #include "cfgmgr.h"
  36. #include "event.h"
  37. #include "dispatch.h"
  38. #include "isa.h"
  39. #if (C_OS & C_UNIX)
  40. #include "utils.h"
  41. #endif
  42. //Constructor
  43. ThresholdSensor :: ThresholdSensor(PDevice aParent,
  44. PCommController aCommController,
  45. INT aSensorCode,
  46. ACCESSTYPE anACCESSTYPE)
  47. : Sensor(aParent, aCommController, aSensorCode, anACCESSTYPE),
  48. theMaxThresholdValue((FLOAT)0.0), theMinThresholdValue((FLOAT)0.0),
  49. theMaxThresholdControl(OFF), theMinThresholdControl(OFF),
  50. theThresholdState(IN_RANGE)
  51. {
  52. }
  53. typedef struct cfg_code {
  54. INT isa_code;
  55. INT low_enable_code, high_enable_code;
  56. INT low_code, high_code;
  57. } CFGCODE;
  58. static CFGCODE cfg_codes[] = {
  59. { BATTERYVOLTAGESENSOR,
  60. CFG_BATTVOLT_ENABLED_LOW_THRESHOLD,
  61. CFG_BATTVOLT_ENABLED_HIGH_THRESHOLD,
  62. CFG_BATTVOLT_VALUE_LOW_THRESHOLD,
  63. CFG_BATTVOLT_VALUE_HIGH_THRESHOLD },
  64. { OUTPUTFREQUENCYSENSOR,
  65. CFG_FREQUENCY_ENABLED_LOW_THRESHOLD,
  66. CFG_FREQUENCY_ENABLED_HIGH_THRESHOLD,
  67. CFG_FREQUENCY_VALUE_LOW_THRESHOLD,
  68. CFG_FREQUENCY_VALUE_HIGH_THRESHOLD },
  69. { LINEVOLTAGESENSOR,
  70. CFG_LINE_VOLTAGE_ENABLED_LOW_THRESHOLD,
  71. CFG_LINE_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  72. CFG_LINE_VOLTAGE_VALUE_LOW_THRESHOLD,
  73. CFG_LINE_VOLTAGE_VALUE_HIGH_THRESHOLD },
  74. { MAXLINEVOLTAGESENSOR,
  75. CFG_MAX_LINEV_ENABLED_LOW_THRESHOLD,
  76. CFG_MAX_LINEV_ENABLED_HIGH_THRESHOLD,
  77. CFG_MAX_LINEV_VALUE_LOW_THRESHOLD,
  78. CFG_MAX_LINEV_VALUE_HIGH_THRESHOLD },
  79. { MINLINEVOLTAGESENSOR,
  80. CFG_MIN_LINEV_ENABLED_LOW_THRESHOLD,
  81. CFG_MIN_LINEV_ENABLED_HIGH_THRESHOLD,
  82. CFG_MIN_LINEV_VALUE_LOW_THRESHOLD,
  83. CFG_MIN_LINEV_VALUE_HIGH_THRESHOLD },
  84. { OUTPUTVOLTAGESENSOR,
  85. CFG_OUTPUT_VOLTAGE_ENABLED_LOW_THRESHOLD,
  86. CFG_OUTPUT_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  87. CFG_OUTPUT_VOLTAGE_VALUE_LOW_THRESHOLD,
  88. CFG_OUTPUT_VOLTAGE_VALUE_HIGH_THRESHOLD },
  89. { UPSLOADSENSOR,
  90. CFG_UPS_LOAD_ENABLED_LOW_THRESHOLD,
  91. CFG_UPS_LOAD_ENABLED_HIGH_THRESHOLD,
  92. CFG_UPS_LOAD_VALUE_LOW_THRESHOLD,
  93. CFG_UPS_LOAD_VALUE_HIGH_THRESHOLD },
  94. { UPSTEMPERATURESENSOR,
  95. CFG_UPS_TEMP_ENABLED_LOW_THRESHOLD,
  96. CFG_UPS_TEMP_ENABLED_HIGH_THRESHOLD,
  97. CFG_UPS_TEMP_VALUE_LOW_THRESHOLD,
  98. CFG_UPS_TEMP_VALUE_HIGH_THRESHOLD },
  99. { AMBIENTTEMPERATURESENSOR,
  100. CFG_AMB_TEMP_ENABLED_LOW_THRESHOLD,
  101. CFG_AMB_TEMP_ENABLED_HIGH_THRESHOLD,
  102. CFG_AMB_TEMP_VALUE_LOW_THRESHOLD,
  103. CFG_AMB_TEMP_VALUE_HIGH_THRESHOLD },
  104. { HUMIDITYSENSOR,
  105. CFG_HUMIDITY_ENABLED_LOW_THRESHOLD,
  106. CFG_HUMIDITY_ENABLED_HIGH_THRESHOLD,
  107. CFG_HUMIDITY_VALUE_LOW_THRESHOLD,
  108. CFG_HUMIDITY_VALUE_HIGH_THRESHOLD },
  109. { PHASEAINPUTVOLTAGESENSOR ,
  110. CFG_PHASE_A_INPUT_VOLTAGE_ENABLED_LOW_THRESHOLD,
  111. CFG_PHASE_A_INPUT_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  112. CFG_PHASE_A_INPUT_VOLTAGE_VALUE_LOW_THRESHOLD,
  113. CFG_PHASE_A_INPUT_VOLTAGE_VALUE_HIGH_THRESHOLD },
  114. /* { PHASEBINPUTVOLTAGESENSOR,
  115. CFG_PHASE_B_VOLTAGE_ENABLED_LOW_THRESHOLD,
  116. CFG_PHASE_B_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  117. CFG_PHASE_B_VOLTAGE_VALUE_LOW_THRESHOLD,
  118. CFG_PHASE_B_VOLTAGE_VALUE_HIGH_THRESHOLD },
  119. { PHASECINPUTVOLTAGESENSOR,
  120. CFG_PHASE_C_VOLTAGE_ENABLED_LOW_THRESHOLD,
  121. CFG_PHASE_C_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  122. CFG_PHASE_C_VOLTAGE_VALUE_LOW_THRESHOLD,
  123. CFG_PHASE_C_VOLTAGE_VALUE_HIGH_THRESHOLD },
  124. { PHASEAOUTPUTVOLTAGESENSOR,
  125. CFG_PHASE_A_OUTPUT_VOLTAGE_ENABLED_LOW_THRESHOLD,
  126. CFG_PHASE_A_OUTPUT_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  127. CFG_PHASE_A_OUTPUT_VOLTAGE_VALUE_LOW_THRESHOLD,
  128. CFG_PHASE_A_OUTPUT_VOLTAGE_VALUE_HIGH_THRESHOLD },
  129. { PHASEBOUTPUTVOLTAGESENSOR,
  130. CFG_PHASE_B_OUTPUT_VOLTAGE_ENABLED_LOW_THRESHOLD,
  131. CFG_PHASE_B_OUTPUT_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  132. CFG_PHASE_B_OUTPUT_VOLTAGE_VALUE_LOW_THRESHOLD,
  133. CFG_PHASE_B_OUTPUT_VOLTAGE_VALUE_HIGH_THRESHOLD },
  134. { PHASECOUTPUTVOLTAGESENSOR,
  135. CFG_PHASE_C_OUTPUT_VOLTAGE_ENABLED_LOW_THRESHOLD,
  136. CFG_PHASE_C_OUTPUT_VOLTAGE_ENABLED_HIGH_THRESHOLD,
  137. CFG_PHASE_C_OUTPUT_VOLTAGE_VALUE_LOW_THRESHOLD,
  138. CFG_PHASE_C_OUTPUT_VOLTAGE_VALUE_HIGH_THRESHOLD },
  139. */
  140. { 0, NO_CODE, NO_CODE, NO_CODE, NO_CODE }
  141. };
  142. VOID ThresholdSensor::getConfigThresholds()
  143. {
  144. PCHAR s_name = lookupSensorName(IsA());
  145. INT err = ErrNO_ERROR;
  146. CHAR value[32];
  147. CFGCODE * code = cfg_codes;
  148. while ((code->isa_code != 0) && (code->isa_code != IsA())) {
  149. code++;
  150. }
  151. if (code->low_enable_code != NO_CODE) {
  152. _theConfigManager->Get(code->low_enable_code, value);
  153. if(_strcmpi(value, "YES") == 0) {
  154. theMinThresholdControl = ON;
  155. }
  156. else {
  157. theMinThresholdControl = OFF;
  158. }
  159. }
  160. if (code->low_code != NO_CODE) {
  161. _theConfigManager->Get(code->low_code, value);
  162. theMinThresholdValue = (float)atof(value);
  163. }
  164. if (code->high_enable_code != NO_CODE) {
  165. _theConfigManager->Get(code->high_enable_code, value);
  166. if(_strcmpi(value, "YES") == 0) {
  167. theMaxThresholdControl = ON;
  168. }
  169. else {
  170. theMaxThresholdControl = OFF;
  171. }
  172. }
  173. if (code->high_code != NO_CODE) {
  174. _theConfigManager->Get(code->high_code, value);
  175. theMaxThresholdValue = (float)atof(value);
  176. }
  177. }
  178. //Member Functions
  179. INT ThresholdSensor::storeValue(const PCHAR aValue)
  180. {
  181. INT err = ErrNO_ERROR;
  182. if((err = Sensor::storeValue(aValue)) == ErrNO_ERROR) {
  183. checkState();
  184. }
  185. return err;
  186. }
  187. VOID ThresholdSensor :: checkState()
  188. {
  189. if (theValue) {
  190. THSTATE new_state = IN_RANGE;
  191. float val = (float)atof(theValue);
  192. if ((theMaxThresholdControl == TRUE) &&
  193. (val >= theMaxThresholdValue)) {
  194. new_state = ABOVE_RANGE;
  195. if (theThresholdState != ABOVE_RANGE) {
  196. GenerateAboveMessage();
  197. }
  198. }
  199. else if ((theMinThresholdControl == TRUE) &&
  200. (val <= theMinThresholdValue)) {
  201. new_state = BELOW_RANGE;
  202. if (theThresholdState != BELOW_RANGE) {
  203. GenerateBelowMessage();
  204. }
  205. }
  206. if ((new_state == IN_RANGE) && (theThresholdState != IN_RANGE)) {
  207. GenerateInRangeMessage();
  208. }
  209. }
  210. }
  211. //Private Functions
  212. INT ThresholdSensor::GetMaxThresholdValue(PCHAR aValue)
  213. {
  214. sprintf(aValue,"%.2f",theMaxThresholdValue);
  215. return ErrNO_ERROR;
  216. }
  217. INT ThresholdSensor::GetMinThresholdValue(PCHAR aValue)
  218. {
  219. sprintf(aValue,"%.2f",theMinThresholdValue);
  220. return ErrNO_ERROR;
  221. }
  222. INT ThresholdSensor::SetMaxThresholdValue(const PCHAR aValue)
  223. {
  224. INT err = ErrNO_ERROR;
  225. //TBD do we want range checking on these???
  226. // theMaxThresholdValue=atof(aValue);
  227. if (sscanf(aValue, "%f", &theMaxThresholdValue) == EOF) {
  228. err = ErrREAD_FAILED;
  229. }
  230. // _theConfigManager->Set(lookupSensorName(IsA()), "HighThresholdValue", aValue);
  231. checkState();
  232. return err;
  233. }
  234. INT ThresholdSensor::SetMinThresholdValue(const PCHAR aValue)
  235. {
  236. INT err = ErrNO_ERROR;
  237. // theMinThresholdValue=atof(aValue);
  238. if (sscanf(aValue, "%f", &theMinThresholdValue)==EOF) {
  239. err = ErrREAD_FAILED;
  240. }
  241. // _theConfigManager->Set(lookupSensorName(IsA()), "LowThresholdValue", aValue);
  242. checkState();
  243. return err;
  244. }
  245. INT ThresholdSensor::GetMaxThresholdControl(PCHAR aValue)
  246. {
  247. sprintf(aValue, "%d", theMaxThresholdControl);
  248. return ErrNO_ERROR;
  249. }
  250. INT ThresholdSensor::GetMinThresholdControl(PCHAR aValue)
  251. {
  252. sprintf(aValue, "%d", theMinThresholdControl);
  253. return ErrNO_ERROR;
  254. }
  255. INT ThresholdSensor::SetMaxThresholdControl(const PCHAR aValue)
  256. {
  257. INT err = ErrNO_ERROR;
  258. if (_strcmpi(aValue, "YES") == 0) {
  259. theMaxThresholdControl = ON;
  260. }
  261. else if (_strcmpi(aValue, "NO") == 0) {
  262. theMaxThresholdControl = OFF;
  263. }
  264. else {
  265. INT the_temp_value=atoi(aValue);
  266. if ((the_temp_value == TRUE) || (the_temp_value == FALSE))
  267. {
  268. theMaxThresholdControl=the_temp_value;
  269. }
  270. else {
  271. err = ErrINVALID_VALUE;
  272. }
  273. }
  274. if (err == ErrNO_ERROR) {
  275. CHAR val[32];
  276. strcpy(val, theMaxThresholdControl ? "Yes" : "No");
  277. // _theConfigManager->Set(lookupSensorName(IsA()), "EnableHighThreshold", val);
  278. }
  279. return err;
  280. }
  281. INT ThresholdSensor::SetMinThresholdControl(const PCHAR aValue)
  282. {
  283. INT err = ErrNO_ERROR;
  284. if (_strcmpi(aValue, "YES") == 0) {
  285. theMinThresholdControl = ON;
  286. }
  287. else if (_strcmpi(aValue, "NO") == 0) {
  288. theMinThresholdControl = OFF;
  289. }
  290. else {
  291. INT the_temp_value=atoi(aValue);
  292. if ((the_temp_value == TRUE) || (the_temp_value == FALSE))
  293. {
  294. theMinThresholdControl=the_temp_value;
  295. }
  296. else {
  297. err = ErrINVALID_VALUE;
  298. }
  299. }
  300. if (err == ErrNO_ERROR) {
  301. CHAR val[32];
  302. strcpy(val, theMinThresholdControl ? "Yes" : "No");
  303. // _theConfigManager->Set(lookupSensorName(IsA()), "EnableLowThreshold", val);
  304. }
  305. return err;
  306. }
  307. INT ThresholdSensor::GenerateAboveMessage(void)
  308. {
  309. theThresholdState = ABOVE_RANGE;
  310. Event the_temp_event(theSensorCode, theValue);
  311. the_temp_event.AppendAttribute(HIGH_THRESHOLD_EXCEEDED,
  312. theMaxThresholdValue);
  313. INT the_return=UpdateObj::Update(&the_temp_event);
  314. return the_return;
  315. }
  316. INT ThresholdSensor::GenerateBelowMessage(void)
  317. {
  318. theThresholdState = BELOW_RANGE;
  319. Event the_temp_event(theSensorCode, theValue);
  320. the_temp_event.AppendAttribute(LOW_THRESHOLD_EXCEEDED,
  321. theMinThresholdValue);
  322. INT the_return=UpdateObj::Update(&the_temp_event);
  323. return the_return;
  324. }
  325. INT ThresholdSensor::GenerateInRangeMessage(void)
  326. {
  327. theThresholdState = IN_RANGE;
  328. Event the_temp_event(theSensorCode, theValue);
  329. the_temp_event.AppendAttribute(IN_THRESHOLD_RANGE, theValue);
  330. INT the_return=UpdateObj::Update(&the_temp_event);
  331. return the_return;
  332. }
  333. INT ThresholdSensor::Set(INT aCode, const PCHAR aValue)
  334. {
  335. INT err = ErrNO_ERROR;
  336. switch(aCode) {
  337. case LOW_THRESHOLD:
  338. SetMinThresholdValue(aValue);
  339. break;
  340. case HIGH_THRESHOLD:
  341. SetMaxThresholdValue(aValue);
  342. break;
  343. case LOW_THRESHOLD_ENABLED:
  344. SetMinThresholdControl(aValue);
  345. break;
  346. case HIGH_THRESHOLD_ENABLED:
  347. SetMaxThresholdControl(aValue);
  348. break;
  349. default:
  350. err = Sensor::Set(aCode, aValue);
  351. break;
  352. }
  353. return err;
  354. }
  355. INT ThresholdSensor::Get(INT aCode, PCHAR aValue)
  356. {
  357. INT err = ErrNO_ERROR;
  358. switch(aCode) {
  359. case LOW_THRESHOLD:
  360. GetMinThresholdValue(aValue);
  361. break;
  362. case HIGH_THRESHOLD:
  363. GetMaxThresholdValue(aValue);
  364. break;
  365. case LOW_THRESHOLD_ENABLED:
  366. GetMinThresholdControl(aValue);
  367. break;
  368. case HIGH_THRESHOLD_ENABLED:
  369. GetMaxThresholdControl(aValue);
  370. break;
  371. default:
  372. err = Sensor::Get(aCode, aValue);
  373. break;
  374. }
  375. return err;
  376. }