text: /* Copyright (C) 2012 mbed.org, MIT License
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
   * and associated documentation files (the "Software"), to deal in the Software without restriction,
   * including without limitation the rights to use, copy, modify, merge, publish, distribute,
   * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in all copies or
   * substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
   * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
   * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   */
  #ifndef __ARCH_SYS_ARCH_H__
  #define __ARCH_SYS_ARCH_H__
  
  #include "lwip/opt.h"
  
  #if NO_SYS == 0
  #include "cmsis_os.h"
  
  // === SEMAPHORE ===
  typedef struct {
      osSemaphoreId    id;
      osSemaphoreDef_t def;
  #ifdef CMSIS_OS_RTX
      uint32_t         data[2];
  #endif
  } sys_sem_t;
  
  #define sys_sem_valid(x)        (((*x).id == NULL) ? 0 : 1)
  #define sys_sem_set_invalid(x)  ( (*x).id = NULL)
  
  // === MUTEX ===
  typedef struct {
      osMutexId    id;
      osMutexDef_t def;
  #ifdef CMSIS_OS_RTX
      int32_t      data[3];
  #endif
  } sys_mutex_t;
  
  // === MAIL BOX ===
  #define MB_SIZE      8
  
  typedef struct {
      osMessageQId    id;
      osMessageQDef_t def;
  #ifdef CMSIS_OS_RTX
      uint32_t        queue[4+MB_SIZE]; /* The +4 is required for RTX OS_MCB overhead. */
  #endif
  } sys_mbox_t;
  
  #define SYS_MBOX_NULL               ((uint32_t) NULL)
  #define sys_mbox_valid(x)           (((*x).id == NULL) ? 0 : 1 )
  #define sys_mbox_set_invalid(x)     ( (*x).id = NULL )
  
  #if ((DEFAULT_RAW_RECVMBOX_SIZE) > (MB_SIZE)) || \
      ((DEFAULT_UDP_RECVMBOX_SIZE) > (MB_SIZE)) || \
      ((DEFAULT_TCP_RECVMBOX_SIZE) > (MB_SIZE)) || \
      ((DEFAULT_ACCEPTMBOX_SIZE)   > (MB_SIZE)) || \
      ((TCPIP_MBOX_SIZE)           > (MB_SIZE))
  #   error Mailbox size not supported
  #endif
  
  // === THREAD ===
  typedef struct {
      osThreadId    id;
      osThreadDef_t def;
  } sys_thread_data_t;
  typedef sys_thread_data_t* sys_thread_t;
  
  #define SYS_THREAD_POOL_N                   6
  #define SYS_DEFAULT_THREAD_STACK_DEPTH      DEFAULT_STACK_SIZE
  
  // === PROTECTION ===
  typedef int sys_prot_t;
  
  #else
  #ifdef  __cplusplus
  extern "C" {
  #endif
  
  /** \brief  Init systick to 1ms rate
   *
   *  This init the systick to 1ms rate. This function is only used in standalone
   *  systems.
   */
  void SysTick_Init(void);
  
  
  /** \brief  Get the current systick time in milliSeconds
   *
   *  Returns the current systick time in milliSeconds. This function is only
   *  used in standalone systems.
   *
   *  /returns current systick time in milliSeconds
   */
  uint32_t SysTick_GetMS(void);
  
  /** \brief  Delay for the specified number of milliSeconds
   *
   *  For standalone systems. This function will block for the specified
   *  number of milliSconds. For RTOS based systems, this function will delay
   *  the task by the specified number of milliSeconds.
   *
   *  \param[in]  ms Time in milliSeconds to delay
   */
  void osDelay(uint32_t ms);
  
  #ifdef  __cplusplus
  }
  #endif
  #endif
  
  #endif /* __ARCH_SYS_ARCH_H__ */
  