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.

269 lines
5.9 KiB

  1. /*
  2. * djs05Feb96: Added firmware rev codes
  3. * djs05Jun96: Broke into two objects: firmmanager/firmrevsensor
  4. * djs26Jul96: Added Max/Min line voltage ranges for DarkStar
  5. * djs28May97: Expanded range for Symmetra support
  6. * srt09JUn97: Passing a parent to the firmware rev mgr.
  7. * tjg11Jul97: Added CURRENT_FIRMWARE_REV code
  8. * tjg02Dec97: Changed darkstar to symmetra
  9. * tjg22Jan98: Updated IsSymmetra to use TokenString instead of strtok
  10. */
  11. #include "cdefine.h"
  12. #if (C_OS & C_OS2)
  13. #define INCL_BASE
  14. #define INCL_DOS
  15. #define INCL_NOPM
  16. #endif
  17. extern "C" {
  18. #if (C_PLATFORM & C_OS2)
  19. #include <os2.h>
  20. #endif
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <malloc.h>
  24. #include <string.h>
  25. }
  26. #include "apc.h"
  27. #include "_defs.h"
  28. #include "comctrl.h"
  29. #include "err.h"
  30. #include "codes.h"
  31. #include "cfgmgr.h"
  32. #include "firmrevs.h"
  33. #include "utils.h"
  34. #include "smartups.h"
  35. #include "dcfrmrev.h"
  36. #include "tokenstr.h"
  37. _CLASSDEF(CommController)
  38. _CLASSDEF(UpdateObj)
  39. _CLASSDEF(Device)
  40. //-------------------------------------------------------------------
  41. FirmwareRevSensor :: FirmwareRevSensor(PDevice aParent, PCommController aCommController)
  42. : Sensor(aParent, aCommController, FIRMWARE_REV)
  43. {
  44. theDevice = aParent;
  45. theDecimalFirmwareRevSensor = new DecimalFirmwareRevSensor(aParent, aCommController);
  46. DeepGet();
  47. theFirmwareRevManager = new FirmwareRevManager(aParent, theValue);
  48. }
  49. INT FirmwareRevSensor :: IsXL()
  50. {
  51. INT UPS_Is_An_XL = FALSE;
  52. CHAR UPS_Name[40];
  53. theDevice->Get(UPS_MODEL,UPS_Name);
  54. // If the UPS name contains the string "XL" then the UPS
  55. // is an XL. It doesn't take Lassie to figure this one out.
  56. PCHAR xl_string = strstr(UPS_Name,"xl");
  57. if (xl_string != NULL)
  58. {
  59. UPS_Is_An_XL = TRUE;
  60. }
  61. else
  62. {
  63. // Don't offend any UPS just because it's of the wrong case...
  64. xl_string = strstr(UPS_Name,"XL");
  65. if (xl_string != NULL)
  66. {
  67. UPS_Is_An_XL = TRUE;
  68. }
  69. }
  70. return UPS_Is_An_XL;
  71. }
  72. INT FirmwareRevSensor :: IsSymmetra()
  73. {
  74. INT is_symmetra = FALSE;
  75. CHAR value[20];
  76. INT err = Get(DECIMAL_FIRMWARE_REV, value);
  77. if (err == ErrNO_ERROR && value) {
  78. TokenString token_str(value, ".");
  79. // The UPSs SKU is the first element in the decimal firmware rev
  80. PCHAR sku_string = token_str.GetCurrentToken();
  81. if (sku_string != NULL) {
  82. INT sku_number = atoi(sku_string);
  83. if (sku_number >= 200 && sku_number <= 279) {
  84. is_symmetra = TRUE;
  85. }
  86. }
  87. }
  88. return is_symmetra;
  89. }
  90. INT FirmwareRevSensor::IsBackUpsPro()
  91. {
  92. INT is_bk_pro = FALSE;
  93. if (theValue) {
  94. // Back UPS Pro's (half wits) do not response correctly to 'V'
  95. if (_stricmp(theValue, "NA") == 0) {
  96. is_bk_pro = TRUE;
  97. }
  98. if (strlen(theValue) == 0) {
  99. is_bk_pro = TRUE;
  100. }
  101. }
  102. else {
  103. is_bk_pro = TRUE;
  104. }
  105. return is_bk_pro;
  106. }
  107. INT FirmwareRevSensor::Get(INT aCode, PCHAR aValue)
  108. {
  109. INT err = ErrNO_ERROR;
  110. switch(aCode)
  111. {
  112. case IS_EXT_SLEEP_UPS:
  113. err = theFirmwareRevManager->Get(aCode,aValue);
  114. break;
  115. case EXTERNAL_PACKS_CHANGEABLE:
  116. {
  117. if(!IsXL()) {
  118. strcpy(aValue,"No");
  119. }
  120. else {
  121. strcpy(aValue,"Yes");
  122. }
  123. }
  124. break;
  125. case IS_SYMMETRA:
  126. if (!IsSymmetra()) {
  127. strcpy(aValue,"No");
  128. }
  129. else {
  130. strcpy(aValue,"Yes");
  131. }
  132. break;
  133. case EXTERNAL_BATTERY_PACKS:
  134. if (!IsSymmetra()) {
  135. strcpy(aValue,"No");
  136. }
  137. else {
  138. strcpy(aValue,"Yes");
  139. }
  140. break;
  141. case DECIMAL_FIRMWARE_REV:
  142. {
  143. err = theDecimalFirmwareRevSensor->Get(DECIMAL_FIRMWARE_REV, aValue);
  144. }
  145. break;
  146. case FIRMWARE_REV:
  147. {
  148. err = Sensor::Get(FIRMWARE_REV, aValue);
  149. }
  150. break;
  151. case CURRENT_FIRMWARE_REV:
  152. {
  153. err = theDecimalFirmwareRevSensor->Get(DECIMAL_FIRMWARE_REV, aValue);
  154. INT args = 0;
  155. if (aValue) {
  156. INT i, j;
  157. CHAR c;
  158. args = sscanf(aValue, "%d.%d.%c", &i, &j, &c);
  159. }
  160. if (args != 3) {
  161. err = Sensor::Get(FIRMWARE_REV, aValue);
  162. }
  163. }
  164. break;
  165. case MIN_VOLTAGE_RANGE_VALUE:
  166. {
  167. if (IsSymmetra()){
  168. strcpy(aValue,"180");
  169. }
  170. else {
  171. err = theFirmwareRevManager->Get(aCode,aValue);
  172. }
  173. }
  174. break;
  175. case MAX_VOLTAGE_RANGE_VALUE:
  176. {
  177. if (IsSymmetra()){
  178. strcpy(aValue,"280");
  179. }
  180. else {
  181. err = theFirmwareRevManager->Get(aCode,aValue);
  182. }
  183. }
  184. break;
  185. case IS_FREQUENCY:
  186. case IS_BATTERY_CAPACITY:
  187. case IS_BATTERY_VOLTAGE:
  188. case IS_RUNTIME_REMAINING:
  189. case IS_SENSITIVITY:
  190. case IS_LOW_BATTERY_DURATION:
  191. case IS_ALARM_DELAY:
  192. case IS_TURN_ON_DELAY:
  193. case IS_SHUTDOWN_DELAY:
  194. case IS_MANUFACTURE_DATE:
  195. case IS_UTILITY_VOLTAGE:
  196. case IS_OUTPUT_VOLTAGE:
  197. case IS_UPS_LOAD:
  198. case IS_BATTERY_DATE:
  199. case IS_SELF_TEST_SCHEDULE:
  200. case IS_BATTERY_CALIBRATION:
  201. case IS_RATED_OUTPUT_VOLTAGE:
  202. case IS_HIGH_TRANSFER_VOLTAGE:
  203. case IS_LOW_TRANSFER_VOLTAGE:
  204. case IS_SMARTBOOST:
  205. case IS_SMARTTRIM:
  206. case IS_MIN_RETURN_CAPACITY:
  207. case IS_CTRL_Z:
  208. case IS_LOAD_SENSING:
  209. {
  210. if (IsBackUpsPro()) {
  211. strcpy(aValue,"No");
  212. }
  213. else {
  214. err = theFirmwareRevManager->Get(aCode,aValue);
  215. }
  216. }
  217. break;
  218. default:
  219. {
  220. err = theFirmwareRevManager->Get(aCode,aValue);
  221. }
  222. }
  223. return err;
  224. }