00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdio.h>
00022 #include <stdlib.h>
00023 #include <time.h>
00024 #include <string.h>
00025
00026 #if defined(_WIN32)
00027 # include "pthread_w32.h"
00028 #else
00029 # include <pthread.h>
00030 # include <errno.h>
00031 #endif
00032
00033 #include "lcd.h"
00034 #include "config.h"
00035 #include "trace.h"
00036 #include "vector.h"
00037 #include "screen.h"
00038 #include "module.h"
00039 #include "display.h"
00040 #include "parserImpl.h"
00041
00042
00043 #define IILC_MODULE MODULE_TYPE_APP
00044
00045 #if defined(_WIN32)
00046 # define DEFAULT_CONFIG_FILE "iilc.conf"
00047 #else
00048 # define DEFAULT_CONFIG_FILE "/etc/iilc.conf"
00049 #endif
00050
00051
00052 static int processConfigFile(LPCONFIG_FILE pFile,
00053 LPVECTOR pVector);
00054
00055 static int processConfigDisplay(LPCONFIG_DISPLAY pDisplay,
00056 LPDISPLAY * ppDisplay);
00057
00058
00059 typedef struct _tag_module_map
00060 {
00061 const char * pszModuleName;
00062
00063 LPMODULE pModule;
00064 }
00065 MODULE_MAP;
00066
00067 int main(int argc, char ** argv)
00068 {
00069
00070 LPCONFIG_FILE pFile = NULL;
00071
00072
00073 LPVECTOR pDisplayVector = NULL;
00074
00075
00076 int i = 0, nCount = 0;
00077
00078
00079 int rc = 0;
00080
00081 IILC_TRACE_ENTRY(IILC_MODULE, T_main);
00082
00083 if (argc > 1) {
00084 printf("%s\n", argv[1]);
00085 g_bSev0Enabled = 1;
00086 g_bSev1Enabled = 1;
00087 }
00088
00089
00090 vectorCreate(&pDisplayVector);
00091
00092
00093
00094
00095
00096 rc = parserParse(&pFile, "../conf/lcd.conf");
00097 if (rc > 0) { goto end_of_function; }
00098
00099
00100
00101
00102
00103
00104
00105 rc = configFileValidate(pFile);
00106 if (rc > 0) { goto end_of_function; }
00107
00108
00109
00110
00111
00112
00113
00114 rc = processConfigFile(pFile, pDisplayVector);
00115 if (rc > 0) { goto end_of_function; }
00116
00117
00118
00119 vectorGetSize(pDisplayVector, &nCount);
00120 for (i = 0; (i < nCount) && (rc == 0); i++) {
00121 LPDISPLAY pDisplay = NULL;
00122 rc = vectorGetElementAt(pDisplayVector, i, (void **) &pDisplay);
00123 if (!rc) {
00124 rc = displayStart(pDisplay);
00125 }
00126 }
00127
00128 if (rc) {
00129 goto end_of_function;
00130 }
00131
00132
00133 SLEEP(10000);
00134
00135
00136 for (i = 0; (i < nCount) && (rc == 0); i++) {
00137
00138 LPDISPLAY pDisplay = NULL;
00139
00140
00141 rc = vectorGetElementAt(pDisplayVector, i, (void **) &pDisplay);
00142
00143
00144 vectorRemove(pDisplayVector, pDisplay);
00145
00146
00147 if (!rc) {
00148 rc = displayStop(pDisplay);
00149 }
00150
00151
00152 if (!rc) {
00153 rc = displayDispose(&pDisplay);
00154 }
00155 }
00156
00157 if (rc) {
00158 goto end_of_function;
00159 }
00160
00161
00162 vectorDestroy(&pDisplayVector);
00163
00164 end_of_function:
00165
00166
00167 if (pFile != NULL) {
00168 configFileDispose(&pFile);
00169 }
00170
00171 IILC_TRACE_EXIT_RC(rc);
00172 return rc;
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00189 int processConfigFile(LPCONFIG_FILE pConfigFile, LPVECTOR pVector)
00190 {
00191 int rc = 0;
00192 int i = 0, nCount = 0;
00193
00194 IILC_TRACE_ENTRY(IILC_MODULE, T_processConfigFile);
00195 traceDebug(IILC_TRACE_CONTEXT, "pFile %p, pVector %p", pConfigFile, pVector);
00196
00197
00198 rc = configFileGetDisplayCount(pConfigFile, &nCount);
00199 if (rc) { goto end_of_function; }
00200
00201
00202 if (nCount == 0) {
00203 rc = ERR_INVALID_CONFIG;
00204 traceError(IILC_TRACE_CONTEXT, "No displays configured for application. Exiting");
00205 goto end_of_function;
00206 }
00207
00208
00209 for (i = 0; (i < nCount) && (rc == 0); i++) {
00210
00211 LPCONFIG_DISPLAY pConfigDisplay = NULL;
00212 LPDISPLAY pDisplay = NULL;
00213
00214
00215 rc = configFileGetDisplay(pConfigFile, i, &pConfigDisplay);
00216 if (!rc) {
00217 rc = processConfigDisplay(pConfigDisplay, &pDisplay);
00218 }
00219
00220
00221 vectorAdd(pVector, pDisplay);
00222 }
00223
00224 end_of_function:
00225
00226 IILC_TRACE_EXIT_RC(rc);
00227 return rc;
00228 }
00229
00230
00235 int processConfigDisplay(LPCONFIG_DISPLAY pConfigDisplay, LPDISPLAY * ppDisplay)
00236 {
00237 int rc = 0;
00238 int i = 0, j = 0;
00239 int nCount = 0;
00240 int nModuleCount = 0;
00241
00242 LPCONFIG_DEVICE pConfigDevice = NULL;
00243
00244 LPDISPLAY pDisplay = NULL;
00245 MODULE_MAP * pModuleMap = NULL;
00246
00247
00248 char * pszClass = NULL;
00249 char * pszPort = NULL;
00250
00251 IILC_TRACE_ENTRY(IILC_MODULE, T_processConfigDisplay);
00252 traceDebug(IILC_TRACE_CONTEXT,
00253 "pConfigDisplay %p, ppDisplay %p", pConfigDisplay, ppDisplay);
00254
00255
00256
00257
00258 configDisplayGetDevice(pConfigDisplay, &pConfigDevice);
00259
00260
00261 configDeviceGetClass(pConfigDevice, &pszClass);
00262 configDeviceGetPort(pConfigDevice, &pszPort);
00263
00264
00265 displayCreate(pszClass, pszPort, &pDisplay);
00266
00267
00268
00269
00270
00271 configDisplayGetModuleCount(pConfigDisplay, &nModuleCount);
00272
00273
00274 pModuleMap = (MODULE_MAP *) calloc(nCount, sizeof(MODULE_MAP));
00275
00276 for (i = 0; (i < nModuleCount) && (rc == 0); i++) {
00277
00278 LPCONFIG_MODULE pConfigModule = NULL;
00279 const char * pszModuleName = NULL;
00280 LPMODULE pModule = NULL;
00281 int nReports = 0;
00282
00283
00284 configDisplayGetModule(pConfigDisplay, i, &pConfigModule);
00285
00286
00287 configModuleGetLibrary(pConfigModule, &pszModuleName);
00288
00289
00290 moduleInit(pszModuleName, &pModule);
00291
00292
00293 pModuleMap[i].pszModuleName = pszModuleName;
00294 pModuleMap[i].pModule = pModule;
00295
00296
00297
00298
00299 configModuleGetReportCount(pConfigModule, &nReports);
00300 for (j = 0; (j < nReports) && (rc == 0); j++) {
00301
00302 LPCONFIG_OBJECT pConfigObject = NULL;
00303 enum displayObjectType type;
00304 unsigned int nId;
00305 char * pszReportName = NULL;
00306
00307
00308 configModuleGetReportObject(pConfigModule, j, &pConfigObject);
00309
00310
00311 configObjectGetId(pConfigObject, &nId);
00312 configObjectGetName(pConfigObject, &pszReportName);
00313
00314
00315 configObjectGetType(pConfigObject, &type);
00316 switch (type) {
00317
00318 case OBJECT_TYPE_FAN:
00319 displayAddFanReportListener(pDisplay, nId, pModule, pszReportName);
00320 break;
00321
00322 case OBJECT_TYPE_TEMP:
00323 displayAddTempReportListener(pDisplay, nId, pModule, pszReportName);
00324 break;
00325
00326 case OBJECT_TYPE_LED:
00327 default:
00328 break;
00329 }
00330
00331 }
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341 }
00342
00343
00344
00345
00346
00347
00348 configDisplayGetScreenCount(pConfigDisplay, &nCount);
00349 for (i = 0; (i < nCount) && (rc == 0); i++) {
00350
00351 LPCONFIG_SCREEN pConfigScreen = NULL;
00352 LPSCREEN pScreen = NULL;
00353 int nWindowCount;
00354
00355
00356 screenCreate(&pScreen, 20, 4);
00357
00358
00359 configDisplayGetScreen(pConfigDisplay, i, &pConfigScreen);
00360
00361
00362 configScreenGetWindowCount(pConfigScreen, &nWindowCount);
00363 for (j = 0; (j < nWindowCount) && (rc == 0); j++) {
00364
00365 LPCONFIG_WINDOW pConfigWindow = NULL;
00366 LPMODULE pModule = NULL;
00367 int x, y, width, height;
00368 const char * pszModuleName = NULL;
00369 int m = 0;
00370
00371
00372 configScreenGetWindow(pConfigScreen, j, &pConfigWindow);
00373
00374
00375 configWindowGetLocation(pConfigWindow, &x, &y);
00376 configWindowGetSize(pConfigWindow, &width, &height);
00377
00378
00379 configWindowGetModuleName(pConfigWindow, &pszModuleName);
00380
00381
00382 for (m = 0; m < nModuleCount; m++) {
00383 if (strcmp(pModuleMap[m].pszModuleName, pszModuleName) == 0) {
00384 pModule = pModuleMap[m].pModule;
00385 break;
00386 }
00387 }
00388
00389
00390 if (pModule != NULL) {
00391
00392
00393 screenAddWindow(pScreen, x, y, width, height, pModule);
00394 }
00395 else {
00396 printf("Module %s not found!\n", pszModuleName);
00397 }
00398 }
00399
00400
00401 displayScreenAdd(pDisplay, pScreen);
00402 }
00403
00404
00405
00406
00407
00408 *ppDisplay = pDisplay;
00409
00410
00411 IILC_TRACE_EXIT_RC(rc);
00412 return rc;
00413 }
00414
00415