00001
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <stdlib.h>
00050 #include <stdio.h>
00051
00052
00053 #include "FreeRTOS.h"
00054 #include "task.h"
00055
00056
00057 #include "conf_ctrlpanel.h"
00058 #include "tracedump.h"
00059
00060 #include "navigation.h"
00061 #include "com1shell.h"
00062 #include "datalog.h"
00063 #include "cptime.h"
00064 #include "sensor.h"
00065
00066 #include "MMI.h"
00067
00068 #include "shell.h"
00069 #include "syscmds.h"
00070
00071 #include "fsaccess.h"
00072
00073
00074
00075 #ifdef NW_INTEGRATED_IN_CONTROL_PANEL
00076 #include "ethernet.h"
00077 #include "netif/etharp.h"
00078 #include "BasicWEB.h"
00079 #endif
00080
00081 #ifdef USB_ENABLE
00082 #include "conf_usb.h"
00083 #include "usbsys.h"
00084 #include "usb_task.h"
00085 #include "usb_standard_request.h"
00086 #include "usb_drv.h"
00087 #endif
00088
00089
00090
00095 #define SUPERVISOR_STACK_SIZE ( configMINIMAL_STACK_SIZE + 192 )
00096
00099 #define SUPERVISOR_DEFAULT_PERIOD ( ( portTickType ) 100 / portTICK_RATE_MS ) // Every 100ms
00100
00102 #define SUPERVISOR_CHECK_OK 0
00104 #define SUPERVISOR_CHECK_KO (-1)
00105
00107 #define SUPERVISOR_DELAY_HEAPCHECK 600 // once per mn.
00108
00110 #define SUPERVISOR_DELAY_TIMEUPDATE 10 // once per sec.
00111
00112 #if DISPLAY_MMI_SECOND == 1
00114 #define SUPERVISOR_DELAY_MMI_TIMEUPDATE 10 // once per sec.
00115 #else
00117 #define SUPERVISOR_DELAY_MMI_TIMEUPDATE 600 // once per min.
00118 #endif
00119
00121 #define SUPERVISOR_DELAY_PRINTTASKLIST 600 // every mn.
00122
00125 #define mainCOMSH_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) // TODO: +1?
00126 #define mainETH_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
00127 #define mainDATALOG_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
00128
00130 #define SUPERVISOR_USER_ACTION_STACK_SIZE (configMINIMAL_STACK_SIZE+64)
00131
00133 #define SUPERVISOR_USER_ACTION_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
00134
00136 #define SUPERVISOR_QUEUE_SIZE 1
00137
00139
00141
00142 #ifdef USB_ENABLE
00143
00148 #define SUPERVISOR_USB_ROLE_NONE 0
00150 #define SUPERVISOR_USB_ROLE_DEVICE 1
00152 #define SUPERVISOR_USB_ROLE_HOST 2
00154
00155 #if USB_DEVICE_FEATURE == ENABLED
00157 #if NW_INTEGRATED_IN_CONTROL_PANEL
00158 #define SUPERVISOR_MAINTENANCE_NBMUTEX_TOTAKE 4
00159 #else
00160 #define SUPERVISOR_MAINTENANCE_NBMUTEX_TOTAKE 3
00161 #endif
00162 #endif
00163 #endif
00164
00165
00166
00168 extern time_t xcptime_LocalTime;
00169
00170 #if defined(__GNUC__)
00171 extern void __heap_start__;
00172 extern void __heap_end__;
00173
00174 portBASE_TYPE *pxHighestHeapAddr = (portBASE_TYPE *)&__heap_start__;
00175
00176 void prvCheckMallocHeap( void );
00177 #endif
00178
00179 #ifdef MMILCD_ENABLE
00180
00181 static xTaskHandle xSupervisorUserActionHndl = NULL;
00182 #endif
00183
00184 #ifdef USB_ENABLE
00185 #if USB_DEVICE_FEATURE == ENABLED
00186
00187 xSemaphoreHandle xUSBMutex;
00188 #endif
00189 #endif
00190
00191 #if NW_INTEGRATED_IN_CONTROL_PANEL
00192
00193 xSemaphoreHandle xWEBMutex;
00194 #endif
00195
00197 xSemaphoreHandle xLOGMutex;
00198
00200 xSemaphoreHandle xSHELLFSMutex;
00201
00203 xSemaphoreHandle xCFGMutex;
00204
00205 #ifdef USB_ENABLE
00206 #if USB_DEVICE_FEATURE == ENABLED
00207
00208 static Bool bIsInMaintenance = FALSE;
00209
00211 static Bool bOutOfMaintenance = FALSE;
00212
00214 static U8 u8CurrentUsbRole = SUPERVISOR_USB_ROLE_NONE;
00215
00216 #if configCTRLPANEL_TRACE == 1
00217 static int TempoVbusOn = 0;
00218 static int TempoVbusOff = 0;
00219 #endif
00220
00222 U8 u8IsMaintenanceRequired = 0;
00223 #endif
00224 #endif
00225
00226 #ifdef MMILCD_ENABLE
00227
00228 xQueueHandle xSUPERVISORQueue = 0;
00229
00231 signed short sMmiNavId;
00232 #endif
00233
00234
00235
00236
00237
00238
00239 static portTASK_FUNCTION_PROTO( vSupervisorTask, pvParameters );
00240 static void prv_v_leave_maintenance_mode( void );
00241 #ifdef MMILCD_ENABLE
00242 static portTASK_FUNCTION( vSupervisorUserActionTask, pvParameters );
00243 static void prv_v_manage_user_action( void );
00244 #endif
00245 #ifdef USB_ENABLE
00246 #if USB_DEVICE_FEATURE == ENABLED
00247 static void prv_v_common_leave_UsbDevice_mode( void );
00248 #endif
00249 #endif
00250
00251
00252
00253 void vSupervisor_Start( unsigned portBASE_TYPE uxPriority )
00254 {
00255
00256 xTaskCreate( vSupervisorTask, ( const signed portCHAR * )"SUPER",
00257 SUPERVISOR_STACK_SIZE, NULL, uxPriority, ( xTaskHandle * )NULL );
00258 }
00259
00260
00261
00267 static portTASK_FUNCTION( vSupervisorTask, pvParameters )
00268 {
00269 portTickType xDelayLength = SUPERVISOR_DEFAULT_PERIOD;
00270 portTickType xLastFocusTime;
00271 #if configHEAP_INIT == 1
00272 #if defined(__GNUC__)
00273 portLONG lCheckHeapDelay = 1;
00274 #endif
00275 #endif
00276 #if configCTRLPANEL_TRACE == 1
00277 portLONG lPrintTrace = 3;
00278 #endif
00279 portLONG lUpdateTimeDelay = 1;
00280 #ifdef MMILCD_ENABLE
00281 portLONG lUpdateMMITimeDelay = 1;
00282 portCHAR DateTime[21];
00283 struct tm *pxDate;
00284 Bool ms_connected_displayed = pdFALSE;
00285 Bool enum_connected_displayed = pdFALSE;
00286 #endif
00287
00288
00289 ( void )pvParameters;
00290
00291 #if configCTRLPANEL_TRACE == 1
00292
00293 itracedump_Init();
00294 #endif
00295
00296 #ifdef MMILCD_ENABLE
00297
00298 if( pdFALSE == bMMI_start() )
00299 {
00300
00301 while( 1 );
00302 }
00303 #endif
00304
00305
00306 vSemaphoreCreateBinary( xSHELLFSMutex );
00307 if( NULL == xSHELLFSMutex )
00308 {
00309
00310
00311 while( 1 );
00312 }
00313
00314 vStartCom1Shell( mainCOMSH_TASK_PRIORITY );
00315
00316
00317 vSemaphoreCreateBinary( xCFGMutex );
00318 if( NULL == xCFGMutex )
00319 {
00320
00321
00322 while( 1 );
00323 }
00324
00325
00326 if( FALSE == bsensor_start() )
00327 {
00328
00329
00330 while( 1 );
00331 }
00332
00333 #if NW_INTEGRATED_IN_CONTROL_PANEL
00334
00335 vSemaphoreCreateBinary( xWEBMutex );
00336 if( NULL == xWEBMutex )
00337 {
00338
00339
00340 while( 1 );
00341 }
00342
00343 vStartEthernetTaskLauncher( tskIDLE_PRIORITY + 1 );
00344 #endif
00345
00346
00347 vSemaphoreCreateBinary( xLOGMutex );
00348 if( NULL == xLOGMutex )
00349 {
00350
00351
00352 while( 1 );
00353 }
00354
00355 if( FALSE == bdatalog_start( mainDATALOG_TASK_PRIORITY ) )
00356 {
00357
00358
00359 while( 1 );
00360 }
00361
00362 #ifdef USB_ENABLE
00363 #if USB_DEVICE_FEATURE == ENABLED
00364
00365 vSemaphoreCreateBinary( xUSBMutex );
00366 if( NULL == xUSBMutex )
00367 {
00368
00369
00370 while( 1 );
00371 }
00372
00373
00374
00375
00376 while( pdFALSE == x_supervisor_SemaphoreTake( xUSBMutex, 0 ) );
00377 #endif
00378
00379 if( FALSE == b_usbsys_start() )
00380 {
00381
00382
00383 while( 1 );
00384 }
00385 #endif
00386
00387 #ifdef MMILCD_ENABLE
00388
00389 xSUPERVISORQueue = xQueueCreate( SUPERVISOR_QUEUE_SIZE, sizeof(Bool *) );
00390 if( 0 == xSUPERVISORQueue )
00391 {
00392
00393
00394 while( 1 );
00395 }
00396
00397
00398 fsaccess_take_mutex();
00399 sMmiNavId = fsaccess_alloc_nav_id();
00400 nav_select( sMmiNavId );
00401 fsaccess_give_mutex();
00402
00403
00404 if( pdPASS != xTaskCreate( vSupervisorUserActionTask,
00405 ( const signed portCHAR * )"MMIACT",
00406 SUPERVISOR_USER_ACTION_STACK_SIZE, NULL, SUPERVISOR_USER_ACTION_TASK_PRIORITY,
00407 &xSupervisorUserActionHndl ) )
00408 {
00409 vTaskDelete( xSupervisorUserActionHndl );
00410
00411
00412 while( 1 );
00413 }
00414 #endif // #ifdef MMILCD_ENABLE
00415
00416
00417 xLastFocusTime = xTaskGetTickCount();
00418
00419 #if defined(__GNUC__)
00420 NAKED_TRACE_COM2( "heap start @=%d, heap end @=%d", \
00421 (portBASE_TYPE *)&__heap_start__, \
00422 (portBASE_TYPE *)&__heap_end__ );
00423 #endif
00424
00425
00426
00427
00428 for(;;)
00429 {
00430
00431 vTaskDelayUntil( &xLastFocusTime, xDelayLength );
00432
00433
00434
00435
00436 #ifdef MMILCD_ENABLE
00437 #ifdef USB_ENABLE
00438
00439
00440 if (ms_connected == TRUE && ms_connected_displayed == pdFALSE)
00441 {
00442
00443 ms_connected_displayed = pdTRUE;
00444 vMMI_DisplayUSBState(ms_connected_displayed);
00445
00446 vMMI_SetUserMenuMode(eUserMenuUSBHost, pdTRUE);
00447
00448 }
00449
00450 if (ms_connected == FALSE && ms_connected_displayed == pdTRUE)
00451 {
00452
00453 ms_connected_displayed = pdFALSE;
00454 vMMI_DisplayUSBState(ms_connected_displayed);
00455
00456 vMMI_SetUserMenuMode(eUserMenuIdle, pdTRUE);
00457 }
00458
00459
00460 #if USB_DEVICE_FEATURE == ENABLED
00461
00462 if (Is_device_enumerated() && ( enum_connected_displayed == pdFALSE ) )
00463 {
00464 if( TRUE == bIsInMaintenance )
00465 {
00466
00467 enum_connected_displayed = pdTRUE;
00468 vMMI_DisplayUSBState(enum_connected_displayed);
00469
00470 vMMI_SetUserMenuMode(eUserMenuUSBDevice, pdTRUE);
00471 }
00472 }
00473
00474 else if (!Is_device_enumerated() && enum_connected_displayed == pdTRUE)
00475 {
00476
00477 enum_connected_displayed = pdFALSE;
00478 vMMI_DisplayUSBState(enum_connected_displayed);
00479
00480 vMMI_SetUserMenuMode(eUserMenuIdle, pdTRUE);
00481 }
00482 else
00483 {
00484
00485
00486 enum_connected_displayed = pdFALSE;
00487 vMMI_DisplayUSBState(enum_connected_displayed);
00488 }
00489
00490 #endif // #if USB_DEVICE_FEATURE == ENABLED
00491 #endif // #ifdef USB_ENABLE
00492 #endif // #ifdef MMILCD_ENABLE
00493
00494
00495 if( 0 == --lUpdateTimeDelay )
00496 {
00497
00498 lUpdateTimeDelay = SUPERVISOR_DELAY_TIMEUPDATE;
00499 xcptime_LocalTime++;
00500
00501 }
00502
00503 #ifdef MMILCD_ENABLE
00504
00505 if( 0 == --lUpdateMMITimeDelay)
00506 {
00507
00508 pxDate = gmtime( &xcptime_LocalTime );
00509
00510
00511
00512 if( pxDate->tm_year >= 100 ) pxDate->tm_year -= 100;
00513 #if DISPLAY_MMI_SECOND == 1
00514 sprintf( DateTime, "%02d/%02d/20%02d %02d:%02d:%02d", pxDate->tm_mon +1, pxDate->tm_mday,
00515 pxDate->tm_year, pxDate->tm_hour, pxDate->tm_min, pxDate->tm_sec );
00516 #else
00517 sprintf( DateTime, "%02d/%02d/20%02d %02d:%02d", pxDate->tm_mon +1, pxDate->tm_mday,
00518 pxDate->tm_year, pxDate->tm_hour, pxDate->tm_min );
00519 #endif
00520 vMMI_DisplayDateAndTime(DateTime);
00521 lUpdateMMITimeDelay = SUPERVISOR_DELAY_MMI_TIMEUPDATE;
00522 }
00523
00524
00525 vMMI_Manage();
00526
00527
00528 prv_v_manage_user_action();
00529 #endif // #ifdef MMILCD_ENABLE
00530
00531 #ifdef USB_ENABLE
00532 if( TRUE == bOutOfMaintenance )
00533 {
00534 prv_v_leave_maintenance_mode();
00535 }
00536 #endif
00537
00538
00539 v_cptime_ExecuteScheduledCmd();
00540
00541 #if configHEAP_INIT == 1
00542 #if defined(__GNUC__)
00543
00544 if( 0 == --lCheckHeapDelay )
00545 {
00546 lCheckHeapDelay = SUPERVISOR_DELAY_HEAPCHECK;
00547 prvCheckMallocHeap();
00548 }
00549 #endif
00550 #endif
00551
00552 #if configCTRLPANEL_TRACE == 1
00553
00554 if( 0 == --lPrintTrace )
00555 {
00556 lPrintTrace = SUPERVISOR_DELAY_PRINTTASKLIST;
00557 v_syscmds_display_traces();
00558 }
00559 #endif
00560
00561 }
00562 }
00563
00564
00565
00566 #ifdef MMILCD_ENABLE
00567
00572 static portTASK_FUNCTION( vSupervisorUserActionTask, pvParameters )
00573 {
00574 Bool (*pfUserAction) (void);
00575 Bool result;
00576
00577
00578 ( void ) pvParameters;
00579
00580 for(;;)
00581 {
00582
00583 vTaskSuspend( NULL );
00584
00585
00586
00587 if ( pdTRUE == xQueueReceive( xSUPERVISORQueue, &pfUserAction, ( portTickType ) 0 ) )
00588 {
00589
00590 if (pfUserAction != NULL)
00591 {
00592 result = pfUserAction();
00593 if (result)
00594 {
00595 NAKED_TRACE_COM2( "User function succeed");
00596 }
00597 else
00598 {
00599 NAKED_TRACE_COM2( "User function failed");
00600 }
00601 }
00602 }
00603 }
00604 }
00605 #endif // #ifdef MMILCD_ENABLE
00606
00607 #ifdef MMILCD_ENABLE
00608 #ifdef USB_ENABLE
00609
00617 Bool b_USBHostCopyLogs( void )
00618 {
00619 #if configCTRLPANEL_TRACE == 1
00620 eExecStatus xRet;
00621 #endif
00622
00623
00624
00625 vMMI_SetUserMenuMode(eUserMenuUSBHostActing, pdFALSE);
00626 vTaskDelay( 3 );
00627
00628 NAKED_TRACE_COM2( "Copy Logs" );
00629
00630
00631 #if configCTRLPANEL_TRACE == 1
00632 xRet =
00633 #endif
00634 e_usbsys_cp_logs_to_key( SYS_MODID_MMI, sMmiNavId, -1, NULL, NULL );
00635 #if configCTRLPANEL_TRACE == 1
00636 if( SHELL_EXECSTATUS_KO == xRet )
00637 NAKED_TRACE_COM2( "Copying logs from Ctrl Panel to USB MS device failed.")
00638 #endif
00639
00640
00641 vMMI_SetUserMenuMode(eUserMenuUSBHost, pdFALSE);
00642 return (pdTRUE);
00643 }
00644
00652 Bool b_USBHostMoveLogs( void )
00653 {
00654 #if configCTRLPANEL_TRACE == 1
00655 eExecStatus xRet;
00656 #endif
00657
00658
00659
00660 vMMI_SetUserMenuMode(eUserMenuUSBHostActing, pdFALSE);
00661 vTaskDelay( 3 );
00662
00663 NAKED_TRACE_COM2( "Move Logs" );
00664
00665
00666 #if configCTRLPANEL_TRACE == 1
00667 xRet =
00668 #endif
00669 e_usbsys_mv_logs_to_key( SYS_MODID_MMI, sMmiNavId, -1, NULL, NULL );
00670 #if configCTRLPANEL_TRACE == 1
00671 if( SHELL_EXECSTATUS_KO == xRet )
00672 NAKED_TRACE_COM2( "Copying logs from Ctrl Panel to USB MS device failed.")
00673 #endif
00674
00675
00676 vMMI_SetUserMenuMode(eUserMenuUSBHost, pdFALSE);
00677 return (pdTRUE);
00678 }
00679
00687 Bool b_USBHostCopyWeb( void )
00688 {
00689 #if configCTRLPANEL_TRACE == 1
00690 eExecStatus xRet;
00691 #endif
00692
00693
00694
00695 vMMI_SetUserMenuMode(eUserMenuUSBHostActing, pdFALSE);
00696 vTaskDelay( 3 );
00697
00698 NAKED_TRACE_COM2( "Copy Web Files" );
00699
00700
00701 #if configCTRLPANEL_TRACE == 1
00702 xRet =
00703 #endif
00704 e_usbsys_cp_web_to_local( SYS_MODID_MMI, sMmiNavId, -1, NULL, NULL );
00705 #if configCTRLPANEL_TRACE == 1
00706 if( SHELL_EXECSTATUS_KO == xRet )
00707 NAKED_TRACE_COM2( "Copying /WEB from USB MS device to Ctrl Panel failed.")
00708 #endif
00709
00710
00711 vMMI_SetUserMenuMode(eUserMenuUSBHost, pdFALSE);
00712 return (pdTRUE);
00713 }
00714
00722 Bool b_USBHostCopyCfg( void )
00723 {
00724 #if configCTRLPANEL_TRACE == 1
00725 eExecStatus xRet;
00726 #endif
00727
00728
00729
00730 vMMI_SetUserMenuMode(eUserMenuUSBHostActing, pdFALSE);
00731 vTaskDelay( 3 );
00732
00733 NAKED_TRACE_COM2( "Copy Config Files" );
00734
00735
00736 #if configCTRLPANEL_TRACE == 1
00737 xRet =
00738 #endif
00739 e_usbsys_cp_cfg_to_local( SYS_MODID_MMI, sMmiNavId, -1, NULL, NULL );
00740 #if configCTRLPANEL_TRACE == 1
00741 if( SHELL_EXECSTATUS_KO == xRet )
00742 NAKED_TRACE_COM2( "Copying /CFG from USB MS device to Ctrl Panel failed.")
00743 #endif
00744
00745
00746 vMMI_SetUserMenuMode(eUserMenuUSBHost, pdFALSE);
00747 return (pdTRUE);
00748 }
00749 #endif
00750
00751
00752 static void prv_v_manage_user_action( void )
00753 {
00754 unsigned portBASE_TYPE uxNbMsgsInQueue = 0;
00755
00756
00757 uxNbMsgsInQueue = uxQueueMessagesWaiting( xSUPERVISORQueue );
00758 if( 0 != uxNbMsgsInQueue )
00759 {
00760
00761 vTaskSuspend( xSupervisorUserActionHndl );
00762 vTaskResume( xSupervisorUserActionHndl );
00763
00764
00765
00766 }
00767 }
00768 #endif // #ifdef MMILCD_ENABLE
00769
00770
00778 portBASE_TYPE x_supervisor_SemaphoreTake( xSemaphoreHandle xSemaphore,portTickType xBlockTime )
00779 {
00780 #ifdef USB_ENABLE
00781 #if USB_DEVICE_FEATURE == ENABLED
00782
00783
00784 if( ( xSemaphore == xUSBMutex ) && ( TRUE == bOutOfMaintenance ) )
00785 return( pdFALSE );
00786 else
00787 #endif
00788 #endif
00789 return( xSemaphoreTake( xSemaphore, xBlockTime ) );
00790 }
00791
00792
00799 portBASE_TYPE x_supervisor_SemaphoreGive( xSemaphoreHandle xSemaphore )
00800 {
00801 #ifdef USB_ENABLE
00802 #if USB_DEVICE_FEATURE == ENABLED
00803 if( ( 0 != u8IsMaintenanceRequired ) && ( FALSE == bOutOfMaintenance ) )
00804 {
00805
00806
00807 u8IsMaintenanceRequired++;
00808
00809
00810 if( ( SUPERVISOR_MAINTENANCE_NBMUTEX_TOTAKE +1 ) == u8IsMaintenanceRequired )
00811 {
00812 fat_cache_flush();
00813 nav_reset();
00814
00815
00816
00817 xSemaphoreGive( xUSBMutex );
00818
00819
00820
00821
00822 if(TRUE == Is_usb_clock_frozen())
00823 {
00824 Usb_unfreeze_clock();
00825 }
00826
00827 if(FALSE == Is_usb_detached())
00828 {
00829 Usb_detach();
00830 }
00831 vTaskDelay(500);
00832 Usb_attach();
00833
00834 bIsInMaintenance = TRUE;
00835 u8IsMaintenanceRequired = 0;
00836 TRACE_COM2( "Entering maintenance mode");
00837 #ifdef MMILCD_ENABLE
00838 vMMI_SetUserMenuMode( eUserMenuWaitHost, pdTRUE );
00839 #endif
00840 }
00841 return( pdTRUE );
00842 }
00843 else
00844 #endif
00845 #endif
00846 return( xSemaphoreGive( xSemaphore ) );
00847 }
00848
00849
00853 void v_supervisor_Host_Connects( void )
00854 {
00855 #ifdef USB_ENABLE
00856 #if configCTRLPANEL_TRACE == 1
00857 TempoVbusOn++;
00858 #endif
00859 if(( 0 == u8IsMaintenanceRequired )&&( FALSE == bIsInMaintenance ))
00860 {
00861
00862
00863
00864 Usb_unfreeze_clock();
00865 Usb_detach();
00866 }
00867 if( SUPERVISOR_USB_ROLE_NONE == u8CurrentUsbRole )
00868 {
00869 u8CurrentUsbRole = SUPERVISOR_USB_ROLE_DEVICE;
00870 }
00871 #endif
00872 }
00873
00874
00881 void v_supervisor_Host_Disconnects( void )
00882 {
00883 #ifdef USB_ENABLE
00884 #if configCTRLPANEL_TRACE == 1
00885 TempoVbusOff++;
00886 #endif
00887 if( SUPERVISOR_USB_ROLE_DEVICE == u8CurrentUsbRole )
00888 {
00889 u8CurrentUsbRole = SUPERVISOR_USB_ROLE_NONE;
00890 if( TRUE == bIsInMaintenance )
00891 {
00892 bIsInMaintenance = FALSE;
00893 bOutOfMaintenance = TRUE;
00894 }
00895 }
00896 #endif
00897 }
00898
00899
00903 void v_supervisor_Device_Connects( void )
00904 {
00905 #ifdef USB_ENABLE
00906 if( SUPERVISOR_USB_ROLE_NONE == u8CurrentUsbRole )
00907 {
00908 u8CurrentUsbRole = SUPERVISOR_USB_ROLE_HOST;
00909 }
00910 #endif
00911 }
00912
00916 void v_supervisor_Device_Disconnects( void )
00917 {
00918 #ifdef USB_ENABLE
00919 if( SUPERVISOR_USB_ROLE_HOST == u8CurrentUsbRole )
00920 {
00921 u8CurrentUsbRole = SUPERVISOR_USB_ROLE_NONE;
00922 ms_new_device_connected = FALSE, ms_connected = FALSE;
00923 }
00924 #endif
00925 }
00926
00927
00928
00929
00930
00949 eExecStatus e_supervisor_switch_to_maintenance_mode( eModId xModId,
00950 signed short FsNavId,
00951 int ac, signed portCHAR *av[],
00952 signed portCHAR **ppcStringReply )
00953 {
00954 if( NULL != ppcStringReply )
00955 *ppcStringReply = NULL;
00956
00957 #ifdef USB_ENABLE
00958 #if USB_DEVICE_FEATURE == ENABLED
00959 if( ( FALSE == bIsInMaintenance )
00960 && ( 0 == u8IsMaintenanceRequired ) )
00961 {
00962
00963 if( 0 == u8IsMaintenanceRequired ) u8IsMaintenanceRequired++;
00964
00965
00966 if( TRUE == x_supervisor_SemaphoreTake( xLOGMutex, 0 ) ) u8IsMaintenanceRequired++;
00967 #if NW_INTEGRATED_IN_CONTROL_PANEL
00968 if( TRUE == x_supervisor_SemaphoreTake( xWEBMutex, 0 ) ) u8IsMaintenanceRequired++;
00969 #endif
00970 if( TRUE == x_supervisor_SemaphoreTake( xSHELLFSMutex, 0 ) ) u8IsMaintenanceRequired++;
00971 if( TRUE == x_supervisor_SemaphoreTake( xCFGMutex, 0 ) ) u8IsMaintenanceRequired++;
00972
00973
00974 if( ( SUPERVISOR_MAINTENANCE_NBMUTEX_TOTAKE +1 ) == u8IsMaintenanceRequired )
00975 {
00976 fat_cache_flush();
00977 nav_reset();
00978
00979
00980
00981 xSemaphoreGive( xUSBMutex );
00982
00983
00984
00985 if(TRUE == Is_usb_clock_frozen())
00986 {
00987 Usb_unfreeze_clock();
00988 }
00989
00990 if(FALSE == Is_usb_detached())
00991 {
00992 Usb_detach();
00993 }
00994 vTaskDelay(500);
00995 Usb_attach();
00996
00997 bIsInMaintenance = TRUE;
00998 u8IsMaintenanceRequired = 0;
00999 TRACE_COM2( "Entering maintenance mode");
01000 #ifdef MMILCD_ENABLE
01001 vMMI_SetUserMenuMode( eUserMenuWaitHost, pdTRUE );
01002 #endif
01003 }
01004
01005
01006 }
01007 else
01008 {
01009 NAKED_TRACE_COM2( "Won't go to maintenance mode:"CRLF"bIsInMaintenance=%d u8CurrentUsbRole=%d u8IsMaintenanceRequired=%d", bIsInMaintenance, u8CurrentUsbRole, u8IsMaintenanceRequired );
01010 }
01011 #endif
01012 #endif
01013
01014 return( SHELL_EXECSTATUS_OK );
01015 }
01016
01022 Bool b_supervisor_switch_to_maintenance_mode( void )
01023 {
01024 e_supervisor_switch_to_maintenance_mode( SYS_MODID_NONE, 0, 0, NULL, NULL );
01025 return (pdTRUE);
01026 }
01027
01028
01029 #ifdef USB_ENABLE
01030 #if USB_DEVICE_FEATURE == ENABLED
01031
01036 Bool b_supervisor_leave_waitingforhost_mode( void )
01037 {
01038 bIsInMaintenance = FALSE;
01039 prv_v_common_leave_UsbDevice_mode();
01040 return (pdTRUE);
01041 }
01042
01043
01048 Bool b_supervisor_leave_UsbMassStorage_mode( void )
01049 {
01050 Usb_detach();
01051 bIsInMaintenance = FALSE;
01052 prv_v_leave_maintenance_mode();
01053 return (pdTRUE);
01054 }
01055 #endif
01056 #endif
01057
01058
01059 #if configCTRLPANEL_TRACE == 1
01060
01063 void v_supervisor_trace( void )
01064 {
01065 #if configHEAP_INIT
01066 #if __GNUC__
01067 prvCheckMallocHeap();
01068 NAKED_TRACE_COM2( "SUP:<%d><%d><%d>", TempoVbusOn, TempoVbusOff, pxHighestHeapAddr );
01069 #endif
01070 #else
01071 NAKED_TRACE_COM2( "SUP:<%d><%d>", TempoVbusOn, TempoVbusOff );
01072 #endif
01073 }
01074 #endif
01075
01076
01077 #ifdef USB_ENABLE
01078 #if USB_DEVICE_FEATURE == ENABLED
01079
01084 Bool b_supervisor_IsInMaintenanceMode( void )
01085 {
01086 return( bIsInMaintenance );
01087 }
01088 #endif
01089 #endif
01090
01091
01092
01093
01094
01095
01096 #ifdef USB_ENABLE
01097 #if USB_DEVICE_FEATURE == ENABLED
01098
01102 static void prv_v_common_leave_UsbDevice_mode( void )
01103 {
01104
01105 xSemaphoreGive( xUSBMutex );
01106
01107
01108
01109 if( pdFALSE == xSemaphoreTake( xUSBMutex, 0 ) )
01110 {
01111 TRACE_COM2( "Unexpected SemaphoreTake( xUSBMutex ) failure!!!" );
01112 }
01113
01114
01115 xSemaphoreGive( xLOGMutex );
01116 xSemaphoreGive( xSHELLFSMutex );
01117 xSemaphoreGive( xCFGMutex );
01118 #if NW_INTEGRATED_IN_CONTROL_PANEL
01119 xSemaphoreGive( xWEBMutex );
01120 #endif
01121
01122 #ifdef MMILCD_ENABLE
01123 vMMI_SetUserMenuMode(eUserMenuIdle, pdTRUE);
01124 #endif
01125 }
01126 #endif
01127 #endif
01128
01133 static void prv_v_leave_maintenance_mode( void )
01134 {
01135 #ifdef USB_ENABLE
01136 #if USB_DEVICE_FEATURE == ENABLED
01137
01138 prv_v_common_leave_UsbDevice_mode();
01139
01140
01141 bOutOfMaintenance = FALSE;
01142
01143
01144 v_com1shell_mount_local_drive();
01145 #endif
01146 #endif
01147 NAKED_TRACE_COM2( "Leaving maintenance mode");
01148 }
01149
01150
01151 #ifdef __GNUC__
01152
01153 void prvCheckMallocHeap( void )
01154 {
01155 portBASE_TYPE *pxMem;
01156
01157
01158 pxMem = ((portBASE_TYPE *)&__heap_end__) -1;
01159 while( (portBASE_TYPE *)&__heap_start__ != pxMem )
01160 {
01161 if( (portBASE_TYPE)0xA5A5A5A5 != *pxMem )
01162 {
01163 if( pxHighestHeapAddr < pxMem )
01164 pxHighestHeapAddr = pxMem;
01165 NAKED_TRACE_COM2( "worst@=%d", pxHighestHeapAddr );
01166 break;
01167 }
01168 else pxMem--;
01169 }
01170 }
01171 #endif