enum MesCameraEvent {
    //% enumval=MES_CAMERA_EVT_TAKE_PHOTO block="take photo"
    TakePhoto,
    //% enumval=MES_CAMERA_EVT_START_VIDEO_CAPTURE block="start video capture"
    StartVideoCapture,
    //% enumval=MES_CAMERA_EVT_STOP_VIDEO_CAPTURE block="stop video capture"
    StopVideoCapture,
    //% enumval=MES_CAMERA_EVT_TOGGLE_FRONT_REAR block="toggle front-rear"
    ToggleFrontRear,
    //% enumval=MES_CAMERA_EVT_LAUNCH_PHOTO_MODE block="launch photo mode"
    LaunchPhotoMode,
    //% enumval=MES_CAMERA_EVT_LAUNCH_VIDEO_MODE block="launch video mode"
    LaunchVideoMode,
    //% enumval=MES_CAMERA_EVT_STOP_PHOTO_MODE block="stop photo mode"
    StopPhotoMode,
    //% enumval=MES_CAMERA_EVT_STOP_VIDEO_MODE block="stop video mode"
    StopVideoMode,
}

enum MesAlertEvent {
    //% enumval=MES_ALERT_EVT_DISPLAY_TOAST block="display toast"
    DisplayToast,
    //% enumval=MES_ALERT_EVT_VIBRATE block="vibrate"
    Vibrate,
    //% enumval=MES_ALERT_EVT_PLAY_SOUND block="play sound"
    PlaySound,
    //% enumval=MES_ALERT_EVT_PLAY_RINGTONE block="play ring tone"
    PlayRingtone,
    //% enumval=MES_ALERT_EVT_FIND_MY_PHONE block="find my phone"
    FindMyPhone,
    //% enumval=MES_ALERT_EVT_ALARM1 block="ring alarm"
    RingAlarm,
    //% enumval=MES_ALERT_EVT_ALARM2 block="ring alarm 2"
    RingAlarm2,
    //% enumval=MES_ALERT_EVT_ALARM3 block="ring alarm 3"
    RingAlarm3,
    //% enumval=MES_ALERT_EVT_ALARM4 block="ring alarm 4"
    RingAlarm4,
    //% enumval=MES_ALERT_EVT_ALARM5 block="ring alarm 5"
    RingAlarm5,
    //% enumval=MES_ALERT_EVT_ALARM6 block="ring alarm 6"
    RingAlarm6,
}

enum MesDeviceInfo {
    //% enumval=MES_DEVICE_INCOMING_CALL block="incoming call"
    IncomingCall,
    //% enumval=MES_DEVICE_INCOMING_MESSAGE block="incoming message"
    IncomingMessage,
    //% enumval=MES_DEVICE_ORIENTATION_LANDSCAPE block="orientation landscape"
    OrientationLandscape,
    //% enumval=MES_DEVICE_ORIENTATION_PORTRAIT block="orientation portrait"
    OrientationPortrait,
    //% enumval=MES_DEVICE_GESTURE_DEVICE_SHAKEN block="shaken"
    Shaken,
    //% enumval=MES_DEVICE_DISPLAY_OFF block="display off"
    DisplayOff,
    //% enumval=MES_DEVICE_DISPLAY_ON block="display on"
    DisplayOn,
}

enum MesRemoteControlEvent {
    //% enumval=MES_REMOTE_CONTROL_EVT_PLAY block="play"
    play,
    //% enumval=MES_REMOTE_CONTROL_EVT_PAUSE block="pause"
    pause,
    //% enumval=MES_REMOTE_CONTROL_EVT_STOP block="stop"
    stop,
    //% enumval=MES_REMOTE_CONTROL_EVT_NEXTTRACK block="next track"
    nextTrack,
    //% enumval=MES_REMOTE_CONTROL_EVT_PREVTRACK block="previous track"
    previousTrack,
    //% enumval=MES_REMOTE_CONTROL_EVT_FORWARD block="forward"
    forward,
    //% enumval=MES_REMOTE_CONTROL_EVT_REWIND block="rewind"
    rewind,
    //% enumval=MES_REMOTE_CONTROL_EVT_VOLUMEUP block="volume up"
    volumeUp,
    //% enumval=MES_REMOTE_CONTROL_EVT_VOLUMEDOWN block="volume down"
    volumeDown,
}

enum MesDpadButtonInfo {
    //% enumval=MES_DPAD_BUTTON_A_DOWN block="A down"
    ADown,
    //% enumval=MES_DPAD_BUTTON_A_UP block="A up"
    AUp,
    //% enumval=MES_DPAD_BUTTON_B_DOWN block="B down"
    BDown,
    //% enumval=MES_DPAD_BUTTON_B_UP block="B up"
    BUp,
    //% enumval=MES_DPAD_BUTTON_C_DOWN block="C down"
    CDown,
    //% enumval=MES_DPAD_BUTTON_C_UP block="C up"
    CUp,
    //% enumval=MES_DPAD_BUTTON_D_DOWN block="D down"
    DDown,
    //% enumval=MES_DPAD_BUTTON_D_UP block="D up"
    DUp,
    //% enumval=MES_DPAD_BUTTON_1_UP block="1 down"
    _1Down,
    //% enumval=MES_DPAD_BUTTON_1_DOWN block="1 up"
    _1Up,
    //% enumval=MES_DPAD_BUTTON_2_DOWN block="2 down"
    _2Down,
    //% enumval=MES_DPAD_BUTTON_2_UP block="2 up"
    _2Up,
    //% enumval=MES_DPAD_BUTTON_3_DOWN block="3 down"
    _3Down,
    //% enumval=MES_DPAD_BUTTON_3_UP block="3 up"
    _3Up,
    //% enumval=MES_DPAD_BUTTON_4_DOWN block="4 down"
    _4Down,
    //% enumval=MES_DPAD_BUTTON_4_UP block="4 up"
    _4Up,
}

//% color=156 weight=80
namespace devices {
    /**
     * Sends a ``camera`` command to the parent device.
     * @param event TODO
     */
    //% weight=30 help=devices/tell-camera-to shim=micro_bit::devices::camera
    //% blockId=devices_camera icon="\uf030" block="tell camera to|%property" blockGap=8
    export function tellCameraTo(event: MesCameraEvent): void { }

    /**
     * Sends a ``remote control`` command to the parent device.
     * @param event TODO
     */
    //% weight=29 help=devices/tell-remote-control-to shim=micro_bit::devices::remote_control
    //% blockId=devices_remote_control block="tell remote control to|%property" blockGap=14 icon="\uf144"
    export function tellRemoteControlTo(event: MesRemoteControlEvent): void { }

    /**
     * Sends an ``alert`` command to the parent device.
     * @param event TODO
     */
    //% weight=27 help=devices/raise-alert-to shim=micro_bit::devices::alert
    //% blockId=devices_alert block="raise alert to|%property" icon="\uf0f3"
    export function raiseAlertTo(event: MesAlertEvent): void { }

    /**
     * Registers code to run when the device notifies about a particular event.
     * @param event TODO
     * @param body TODO
     */
    //% shim=micro_bit::onDeviceInfo help=devices/on-notified
    //% weight=26
    //% blockId=devices_device_info_event block="on notified" icon="\uf10a"
    export function onNotified(event: MesDeviceInfo, body: Action): void { }

    /**
     * Register code to run when the micro:bit receives a command from the paired gamepad.
     * @param name TODO
     * @param body TODO
     */
    //% help=devices/on-gamepad-button weight=40 shim=micro_bit::onGamepadButton
    //% weight=25
    //% blockId=devices_gamepad_event block="on gamepad button|%NAME" icon="\uf11b"
    export function onGamepadButton(name: MesDpadButtonInfo, body: Action): void { }

    /**
     * Returns the last signal strength reported by the paired device.
     */
    //% help=devices/signal-strength weight=24 shim=micro_bit::signalStrength
    //% blockId=devices_signal_strength block="signal strength" blockGap=14 icon="\uf012" blockGap=14
    export function signalStrength(): number {
        return 0;
    }

    /**
     * Registers code to run when the device notifies about a change of signal strength.
     * @param body TODO
     */
    //% shim=micro_bit::onSignalStrengthChanged weight=23 help=devices/on-signal-strength-changed
    //% blockId=devices_signal_strength_changed_event block="on signal strength changed" icon="\uf012"
    export function onSignalStrengthChanged(body: Action): void { }
}