Library os_mbox




Require Import os_code_defs.
Require Import os_code_notations.
Require Import os_ucos_h.

Open Scope code_scope.

Definition OSMboxCreate_impl :=
OS_EVENT ·OSMboxCreate·(message @ Void )··{
           
              pevent @ OS_EVENT
           ;

            ENTER_CRITICAL;ₛ
            pevent =ₑ OSEventFreeList;ₛ
            If (OSEventFreeList !=ₑ NULL){
                OSEventFreeList =ₑ OS_EVENT OSEventFreeListOSEventListPtr
            };ₛ
           If (pevent !=ₑ NULL) {
               OS_EventWaitListInitpevent­);ₛ
               peventOSEventType =ₑ OS_EVENT_TYPE_MBOX;ₛ
               peventOSEventCnt =ₑ 0;ₛ
               peventOSEventPtr =ₑ message;ₛ
               pevent OSEventListPtr =ₑ OSEventList ;ₛ
               OSEventList =ₑ pevent
           };ₛ
           EXIT_CRITICAL;ₛ
           RETURN pevent
.

Definition OSMboxDel_impl :=
 Int8u ·OSMboxDel·( pevent @ OS_EVENT )··{
        
         tasks_waiting @ Int8u;
         legal @ Int8u
        ;
         
        If (pevent ==ₑ NULL){
             RETURN MBOX_DEL_NULL_ERR
        };ₛ
        ENTER_CRITICAL;ₛ
        legal =ᶠ OS_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN MBOX_DEL_P_NOT_LEGAL_ERR
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_MBOX){
            EXIT_CRITICAL;ₛ
            RETURN MBOX_DEL_WRONG_TYPE_ERR
        };ₛ
        IF (peventOSEventGrp !=ₑ 0){
            tasks_waiting =ₑ 1
        }ELSE{
            tasks_waiting =ₑ 0
        };ₛ
        IF (tasks_waiting ==ₑ 0){
            OS_EventRemovepevent­);ₛ
            peventOSEventType =ₑ OS_EVENT_TYPE_UNUSED;ₛ
            peventOSEventListPtr =ₑ OSEventFreeList;ₛ
            OSEventFreeList =ₑ pevent;ₛ
            EXIT_CRITICAL;ₛ
            RETURN MBOX_DEL_SUCC
        }ELSE{
            EXIT_CRITICAL;ₛ
            RETURN MBOX_DEL_TASK_WAITING_ERR
        }
  .

Definition OSMboxAccept_impl :=
 Void ·OSMboxAccept·(pevent @ OS_EVENT)··{
        
          message @ Void ;
          legal @ Int8u
        ;
               
          If(pevent ==ₑ NULL){
              RETURN Void NULL
          };ₛ
          ENTER_CRITICAL;ₛ
          legal =ᶠ OS_EventSearchpevent·);ₛ
          If (legal ==ₑ 0){
              EXIT_CRITICAL;ₛ
              RETURN Void NULL
          };ₛ
          If (peventOSEventType !=ₑ OS_EVENT_TYPE_MBOX){
            EXIT_CRITICAL;ₛ
            RETURN Void NULL
          };ₛ
          message =ₑ peventOSEventPtr;ₛ
          peventOSEventPtr =ₑ NULL;ₛ
          EXIT_CRITICAL;ₛ
          RETURN message
  .

Definition OSMboxPost_impl :=
 Int8u ·OSMboxPost·(pevent @ OS_EVENT ; message @ Void)··{
         
                 legal @ Int8u
         ;
         If (pevent ==ₑ NULL){
                 RETURN OS_ERR_PEVENT_NULL
         };ₛ
         If (message ==ₑ NULL){
                 RETURN OS_ERR_POST_NULL_PTR
         };ₛ
         ENTER_CRITICAL;ₛ
         legal =ᶠ OS_EventSearchpevent·);ₛ
         If (legal ==ₑ 0){
                 EXIT_CRITICAL;ₛ
                 RETURN MBOX_POST_P_NOT_LEGAL_ERR
         };ₛ
         If (peventOSEventType !=ₑ OS_EVENT_TYPE_MBOX){
                 EXIT_CRITICAL;ₛ
                 RETURN OS_ERR_EVENT_TYPE
         };ₛ
         If (peventOSEventGrp !=ₑ 0) {
                 legal =ₑ OS_STAT_MBOX;ₛ
                 OS_EventTaskRdypevent, message, legal ­);ₛ
                 EXIT_CRITICAL;ₛ
                 OS_Sched(­);ₛ
                 RETURN OS_NO_ERR
         };ₛ
         If (peventOSEventPtr !=ₑ NULL) {
                 EXIT_CRITICAL;ₛ
                 RETURN MBOX_POST_FULL_ERR
         };ₛ
         peventOSEventPtr =ₑ message;ₛ
         EXIT_CRITICAL;ₛ
         RETURN OS_NO_ERR
  .

Definition OSMboxPend_impl :=
 Int8u ·OSMboxPend·( pevent @ OS_EVENT ; timeout @ Int16u )··{
         
         message @ Void;
         legal @ Int8u
        ;

        If (pevent ==ₑ NULL){
             RETURN MBOX_PEND_NULL_ERR
        };ₛ
        ENTER_CRITICAL;ₛ
        legal =ᶠ OS_EventSearchpevent·);ₛ
        If (legal ==ₑ 0){
            EXIT_CRITICAL;ₛ
            RETURN MBOX_PEND_P_NOT_LEGAL_ERR
        };ₛ
        If (peventOSEventType !=ₑ OS_EVENT_TYPE_MBOX){
            EXIT_CRITICAL;ₛ
            RETURN MBOX_PEND_WRONG_TYPE_ERR
        };ₛ
        If (OSTCBCurOSTCBPrio ==ₑ OS_IDLE_PRIO){
            EXIT_CRITICAL;ₛ
            RETURN MBOX_PEND_FROM_IDLE_ERR
        };ₛ
        If ( (OSTCBCurOSTCBStat !=ₑ OS_STAT_RDY) ||ₑ (OSTCBCurOSTCBDly !=ₑ 0)){
            EXIT_CRITICAL;ₛ
            RETURN MBOX_PEND_NOT_READY_ERR
        };ₛ
        message =ₑ peventOSEventPtr;ₛ
        If (message !=ₑ NULL) {
            peventOSEventPtr =ₑ NULL;ₛ
            OSTCBCurOSTCBMsg =ₑ message;ₛ
            EXIT_CRITICAL;ₛ
            RETURN MBOX_PEND_SUCC
        };ₛ
        OSTCBCurOSTCBMsg =ₑ NULL;ₛ
        OSTCBCurOSTCBStat =ₑ OS_STAT_MBOX;ₛ
        OSTCBCurOSTCBDly =ₑ timeout;ₛ
        OS_EventTaskWaitpevent­);ₛ
        EXIT_CRITICAL;ₛ
        OS_Sched(­);ₛ
        ENTER_CRITICAL;ₛ
        message =ₑ OSTCBCurOSTCBMsg;ₛ
        If (message !=ₑ NULL){
          
            EXIT_CRITICAL;ₛ
            RETURN MBOX_PEND_SUCC
        };ₛ
        EXIT_CRITICAL;ₛ
        RETURN MBOX_PEND_TIMEOUT_ERR
   .

Close Scope code_scope.