Giter Site home page Giter Site logo

generic_hmi's Introduction

Getting Started

Get an instance of SDL Core running

Note: This requires you to use Ubuntu 18.04 or 20.04.

Clone the SDL Core repository and follow the setup instructions for the project. After the project is built, run an instance of SDL Core in your terminal.

Dependencies

  • nvm
  • chromium-browser
  • python3 and pip
  • ffmpeg
  • ffmpeg-python
  • pyopenssl
sudo apt install chromium-browser ffmpeg python3 python3-pip -y
python3 -m pip install ffmpeg-python pyopenssl

Check out nvm on github to learn how to install and use nvm!

Build and Run the HMI

Once SDL Core is running, follow these steps to set up the Generic HMI.

First, clone this repository. Once cloned, you can initialize the git submodules in this project by running the following commands:

cd generic_hmi
git submodule init
git submodule update

Alternatively, you can clone this repository with the --recurse-submodules flag.

The build directory is not included in the github repository. In order to use the generic HMI you must build the application yourself.

Note: These instructions are written for Node version 12

Install NVM and use node version 12

nvm use 12

Install dependencies (you might need to clean the node_modules folder):

npm install

Build the project:

npm run build

Note: This command must be run before launching the HMI in the browser.

After running the build command, you can launch the Generic HMI in a web browser:

chromium-browser generic_hmi/build/index.html

NOTE Chromium is the only supported and tested browser. Browsers built on top of Chromium (Google Chrome) should work but are not officially supported.

HMI Backend

The generic_hmi includes an additional backend component that is required for some features, such as in-browser video streaming, policy table updates using the vehicle modem and accessing the webengine app store.

  1. Run deploy_server.sh in the root folder
  2. Start and run the HMI normally

Connection status icon

The backend connection status is indicated by an icon in the hmi settings page (top-right).

The icon will contain a check mark if the backend server is connected/cross if the backend server is disconnected.

Clicking on the icon will display a prompt allowing the user to set the url for the backend. Once the URL is set, the HMI will attempt to re-connect to the backend server.

Features

The following features can be used in the hmi if the backend server is connected.

HMI PTU

Select the PTU using in-vehicle modem checkbox to enable the feature

Video streaming

Start a video service from the SDL app. The video stream should start in the browser.

Video streaming also requires you to have all the aforementioned dependencies installed.

Webengine app store

The app store can be accessed from the hmi settings page. Clicking on any of the listed webengine apps will allow you to download the webengine app.

Developing/Modifying the HMI

The main third-party technologies we use to develop this HMI are React, React-Redux, and React-Router. The HMI component of SDL is responsible for processing and responding to RPCs which are received from a connected SDL Core instance.

Key Files

src/index.js

This is the main entry point for the entire application. It sets up the routes and highest level components in the React app. Once the application is loaded, it attempts to connect to an instance of SDL Core.

Controllers/Controller.js

This is the main path to all things SDL related. The Controller routes RPCs coming from SDL to sub-controllers so that they can be handled, and responds to SDL. Sub-controllers all implement a handleRPC() function. The handleRPC function returns true if the Controller should respond with a generic success to SDL, return false for a generic false, return an object with a key of rpc to respond with a custom RPC, and return null if the Controller should not respond (such as in the case of incoming notifications from SDL). The Controller also implements a sanitize function which can be used to manipulate RPCs before they're sent off to a sub-controller to be handled.

Implementing an RPC

Implementing an RPC is the main activity when developing this HMI as it related to communicating with SDL Core. There are three basic behaviors that can be implemented

  1. An RPC comes in from SDL Core which changes some information displayed to the user in a view (Implementing Requests)
  2. The user takes action on an element in the React Application which generates a message to SDL Core (Sending messages to SDL Core)
  3. An RPC comes in from SDL Core which forces the current view in the React Application to change (Changing the router history)

Implementing Requests

First, add a case statement to the appropriate Sub-Controller. If the RPC is named UI.something, the appropriate sub-controller is the UIController. The case statement should dispatch a method to the store that you'll define shortly. Import that method name from actions at the top of the Controller. Head over to actions.js, add a new string to the Actions const and export a new method of the same name which returns an object containing the same parameters you passed and a type property which is the new Action you defined. In reducers.js you can now add a case statement for the Action name you created. Return a new state object based on the parameters passed into the action from the Controller. This state will be used in a container to send the appropriate information to a React Component. For more information about actions and reducers check out http://redux.js.org/docs/basics/index.html. Example of all this below.

// UIController.js
import {
    show // Importing the new action for use with store.dispatch
} from '../actions'
...
handleRPC(rpc) {
    ...
        case "Show":
            store.dispatch(show( // dispatching the action with the needed info
                rpc.params.appID,
                rpc.params.showStrings,
                rpc.params.graphic,
                rpc.params.softButtons
            ))
            return true
    ...

// actions.js
export const Actions = {
    SHOW: "SHOW" // Defining the new type
}
...
export const show = (appID, showStrings, graphic, softButtons) => { // exporting the show action
    return {
        type: Actions.SHOW, // Specifying the new type
        appID: appID,
        showStrings: showStrings,
        graphic: graphic,
        softButtons: softButtons
    }
}

// reducers.js
function ui(state = {}, action) {
    switch (action.type) {
        case Actions.SHOW: // implementing the reducer, you can do this in any of the functions that are to be reduced into state
            var newState = { ...state } // Copy over the old state
            var app = newState[action.appID] ? newState[action.appID] : newAppState() // Find the app specified by the action that we're changing state for or create a new one
            newState[action.appID] = app // set it back in case we created a new one
            if (action.showStrings && action.showStrings.length > 0) {
                app.showStrings = action.showStrings // Change show strings if they changed
            }
            if (action.graphic) { // Add the graphic to the state if it exists
                app.graphic = action.graphic
            }
            if (action.softButtons && action.softButtons.length > 0) { // Change soft buttons if they changed
                app.softButtons = action.softButtons
            }
            return newState // self explanatory
...

At this point, you'll need to think about what component needs the information in the React application which you've just added to the state. In the example above, the information in the Show RPC is used in the MediaPlayerBody component as MetaData. So create a file for the container which will be hooked up directly to the React Component which needs the information about show. Below is a commented version of the Metadata container which parses out the useful information added to the state by the Show RPC for use in the React Component.

// Metadata.js
import { connect } from 'react-redux' // so we can connect this container with the appropriate react component
import MediaPlayerBody from '../MediaPlayerBody' // this is the React component we're connecting it which will use the props we create off the state

const mapStateToProps = (state) => { // a function you always have to implement
    var activeApp = state.activeApp // The active application in the react component
    var metadata = state.ui[activeApp] // The UI metadata for that application (we created all this in reducers.js when we implemented Actions.SHOW)
    if (metadata === undefined) return {} // Do nothing if there is no metadata yet
    var props = { // Default mainfields for the react component
        mainField1: null,
        mainField2: null,
        mainField3: null
    }
    metadata.showStrings.map ((textField) => { // Iterate all the strings added by the show
        switch (textField.fieldName) { // Each textField has a fieldName which is its type
            case "mainField1": // Map types to props that'll be used by the Component
                props.mainField1 = textField.fieldText
                break
            case "mainField2":
                props.mainField2 = textField.fieldText
                break
            case "mainField3":
                props.mainField3 = textField.fieldText
                break
        }
    })
    // If there is a graphic, add it to the props
    props.graphic = metadata.graphic ? metadata.graphic.value : "http://www.unrecorded.mu/wp-content/uploads/2014/02/St.-Vincent-St.-Vincent1.jpg"
    return props // Return the props to the component
}

// This is where we would implement a way to communicate back to redux if there was some action the user can take to change our state. More on that later
const mapDispatchToProps = (dispatch) => {
    return {}
}

// Connect this container with the component which will use it and export it
export const MediaMetadata = connect(
    mapStateToProps,
    mapDispatchToProps
)(MediaPlayerBody)

export default MediaMetadata

The last thing we need to do is make sure that in our react application we are now using our container instead of the original react component which is not connected, and that the react component is using the properly named props which were passed by the container in render. In this example, this was done in MediaPlayer.js

// MediaPlayer.js
...
import { MediaMetadata } from './containers/Metadata';

export default class MediaPlayer extends React.Component {
    constructor() {
        super();
    }

    render() {
        return ( // We created the MediaMetadata container in this tutorial
            <div>
                <AppHeader backLink="/" menuName="Apps"/>
                <MediaMetadata />
                <ProgressBar />
                <Buttons />
            </div>
        )
    }
}

The component we actually connected was the MediaPlayerBody, let's take a look to see how the props we created off the state in the container are used

import React from 'react';

import AlbumArt from './AlbumArt';
import MediaTrackInfo from './containers/MediaTrackInfo_c'

export default class MediaPlayerBody extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            // mainFields and graphic - Perfect. Those exist because this component is connected to our redux state by the container.
            // Any time SDL changes the state that is tied to this component, this component will re-render and update. 
            <div className="media-player-body">
                <AlbumArt image={this.props.graphic} />
                <div className="media-track">
                    <p className="t-small t-medium th-f-color">{this.props.mainField3}</p>
                    <p className="t-large t-light th-f-color">{this.props.mainField1}</p>
                    <p className="t-large t-light th-f-color-secondary">{this.props.mainField2}</p>
                    <MediaTrackInfo />
                </div>
            </div>
        )
    }
}

Sending Messages to SDL Core

There are many situations where a user's action in the React Application needs to trigger a message to be sent to SDL. For example, after an application uses the AddCommand RPC to add items to the App's in-HMI menu, and the user selects one of those items, we need to be able to tell SDL about that selection by sending the notification called UI.OnCommand to SDL Core so it can be relayed to the connected application. We do this by implementing the mapDispatchToProps function in our container. For the menu, this function does two things - changes state by called dispatch (in the same way we changed our state before in our sub-controller) and sending a message to a sub controller to notify SDL Core about the event.

const mapDispatchToProps = (dispatch) => {
    return {
        onSelection: (appID, cmdID, menuID) => { // Our function is called onSelection, so the component can use this.props.onSelection()
            if (menuID) {
                dispatch(activateSubMenu(appID, menuID)) // We can used the passed in dispatch to change state (don't forget to define and import the action activateSubMenu)
            }
            else if (cmdID) {
                uiController.onSystemContext("MAIN", appID) // We can call functions on uiController (again, don't forget to import) which send messages to SDL
                uiController.onCommand(cmdID, appID)
            }
        }
    }
}

From here, the only thing left to do is implement the functions called on the sub controller. When the sub controllers imported by the main Controller, the main controller adds a function called addListener. The sub-controller can use the listener to send messages directly to SDL Core.

// UIController.js
onSystemContext(context, appID) {
    this.listener.send(RpcFactory.OnSystemContextNotification(context, appID))
}
onCommand(cmdID, appID) {
    this.listener.send(RpcFactory.OnCommandNotification(cmdID, appID))
}

The only thing left to do now is to make sure the connected React Component is properly using the method we defined in mapDispatchToProps. In this example, it's the HScrollMenu which passes the onSelection prop to an HScrollMenuItem which calls onSelection as we've defined

// HScrollMenuItem.js
onClick={() => this.props.onSelection(this.props.appID, this.props.cmdID, this.props.menuID)}>

Changing the router history

The last common activity required to implement an SDL HMI completely is the ability to change views based on messages received by SDL. Views in the React Application are defined by Routes. When a user selects an item that changes the view, a route is taken such as /inapplist. We can force a route to be taken using React Routers withRouter. Right now, since the AppHeader component is rendered in every single view, it is responsible for forcing a change to routing history (thereby changing the view) when it renders. So the flow is

  1. Message comes into SDL
  2. Dispatch to store
  3. Implement Action and change app state in Reducer
  4. AppHeader is rendered
  5. AppHeader checks state to see if a change needs to be forced
  6. If a change needs to be forced, AppHeader makes the change
  7. Everything re-renders

This forced change is done in the React lifecycle method called componentWillReceiveProps, which gives the AppHeader access to the nextProps that will be used in the components render before it's rendered and in time to make a change.

// AppHeader.js
// withRouter will give us access to router on this components props
import { withRouter } from 'react-router';
...
    componentWillReceiveProps (nextProps) {
        if (nextProps.isDisconnected) {
            this.props.history.push("/") // The app got disconnected so we force a change back to the menu
        }
    }
...
export default withRouter(AppHeader) // Hook this component up with router.

Create React App

This project was bootstrapped with Create React App.

Available Scripts

In the project directory, you can run:

npm start

Runs the app in the development mode.
Open http://localhost:3000 to view it in the browser.

The page will reload if you make edits.
You will also see any lint errors in the console.

npm test

Launches the test runner in the interactive watch mode.
See the section about running tests for more information.

npm run build

Builds the app for production to the build folder.
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.
Your app is ready to be deployed!

See the section about deployment for more information.

npm run eject

Note: this is a one-way operation. Once you eject, you can’t go back!

If you aren’t satisfied with the build tool and configuration choices, you can eject at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except eject will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

You don’t have to ever use eject. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

generic_hmi's People

Contributors

akalinich-luxoft avatar cmaylone avatar crokita avatar gabekelley avatar icollin avatar jack-byrne avatar jacobkeeler avatar justinjdickow avatar liliiashlikhtluxoft avatar nicoleyarroch avatar shobhitad avatar theresalech avatar valeriimalkov avatar ymalovanyi avatar yuriiyefimenko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

generic_hmi's Issues

No escaping from menu

When selecting the menu of a media app, the user is forced to either exit to the apps list or make a menu selection.

When viewing menu, the user should be able to press the menu button again to close the menu view.

[SDL 0031] Mobile Projection

Proposal: Mobile Projection

The aim of the Mobile Projection feature is to allow application developers to create custom application use experiences that are not limited by HMI templates. Mobile Projection applications will be able to stream a video feed to the system and allow users to interact with the application by touching the system's screen.

Review: smartdevicelink/sdl_evolution#97

SDLC Steering Committee Decision:

All members of the Steering Committee agreed this proposal is a good idea and should be accepted.

[SDL 0055] System Capabilities Query

Proposal: System Capabilities Query

This proposal is to define how to convey more detailed information to the developer about the currently connected system's capabilities.

Review: smartdevicelink/sdl_evolution#166

Steering Committee Decision:

There was much discussion over this proposal, and the Steering Committee ultimately agreed to accept. They've also agreed that any desired changes to the implementation of this proposal can be addressed by members during the implementation.

Resumption & Activation Error

If the user selects to activate an app while Core/HMI are resuming a previously connected app, then the user experiences a routing error where it takes multiple clicks to put the app into full. This also causes some weird navigation behaviors while using the HMI.

[SDL 0071] SDL Remote Control Baseline (no zones, no driver/passenger, immediate control)

Proposal: SDL Remote Control Baseline (no zones, no driver/passenger, immediate control)

SmartDeviceLink provides a framework that connects in-vehicle infotainment system to mobile phone applications. SDL enables a driver to interact with their mobile phone applications using common in-vehicle interfaces such as a touch screen display, embedded voice recognition, steering wheel controls and various vehicle knobs and buttons. Although SDL provides some RPCs to allow mobile applications to obtain some vehicle status information, it does not allow a mobile application to change the vehicle settings, i.e. to control the vehicle. SDL remote control (or previously known as reverse SDL) provides the ability for mobile applications to control certain settings of the vehicle, such as, radio and climate.

Review: smartdevicelink/sdl_evolution#206

Steering Committee Decision:

Now that the requested revisions noted on the review issue have been incorporated, the Steering Committee has agreed to accept this proposal.

Perform interaction broken

Perform interaction with spotify causes the app view to exit back to the app list. Perform interaction never shows up.

[SDL 0058] Add video streaming capabilities

Proposal: Add video streaming capabilities

This proposal extends SDL video streaming feature by 1) notifying video streaming capabilities of HMI to SDL proxy, and 2) adding "video format negotiation" procedure.

Review: smartdevicelink/sdl_evolution#176

Steering Committee Decision:

The Steering Committee has decided to accept this proposal with revisions. The Xevo team (@shoamano83 @jhludwig) revised, based on the discussion in the Steering Committee meeting:

  1. Codecs and streaming transports need information in their descriptions to let develops know which ones are currently supported and which ones aren’t.
  2. Xevo will create first draft of the fallback streaming combination order.

The following changes were incorporated into the proposal:

  1. Added a note that not all video formats are supported yet.
  2. Added a suggested mechanism to pick a video format during video negotiation, including a fall back flow.

Generic HMI Missing Policy Related RPCs

  • GetUserFriendlyMessages
  • OnAllowSDLFunctionality
  • OnReceivedPolicyUpdate
  • OnPolicyUpdate
  • GetListOfPermissions
  • OnAppPermissionConsent
  • OnAppPermisisonChanged
  • OnSDLConsentNeeded
  • UpdateSDL
  • GetStatusUpdate
  • OnStatusUpdate
  • OnSystemError
  • AddStatisticsInfo
  • GetUrls
  • OnSystemRequest
  • SystemRequest
  • PolicyUpdate
  • GetSystemInfo
  • OnSystemInfoChanged
  • OnIgnitionCycleOver
  • DecryptCertificate
  • SDL.ActivateApp

README is very misleading

The instructions on the README don't really match up to how this project should be used. Especially in how to use it with sdl_core. There is no need to install or start webpack if you don't need to make changes, that should be made clear. I believe the sdl_core docker images are also out of date so I don't believe it even makes sense to include that info there.

[SDL 0083] Expandable Design for Proprietary Data Exchange

Proposal: Expandable Design for Proprietary Data Exchange

The SystemRequest/OnSystemRequest RPCs provide a mechanism for various components within the head unit to exchange data with app(s) written specifically to communicate with those components. With the growing popularity of SDL as a means of data exchange between head units and the outside world, there is a need to provide service to more such components. Today, the list of such components is limited to the 'RequestType' enum. Expanding this list everytime would not be an ideal solution. This document proposes a new mechanism for an expandable design in such scenarios by introducing a new string field called 'RequestSubType' to be used along with a new 'RequestType' enum called 'OEM_SPECIFIC'.

Review: smartdevicelink/sdl_evolution#249

Steering Committee Decision:

When discussing this proposal, there was an ask for an example of the data that would be exchanged. Ford provided the example of an embedded navigation getting traffic information from a companion app. The Steering Committee then voted to accept this proposal.

Add LICENSE file

Need to add a License file for generic_hmi with the following content:

Copyright (c) 2017, SmartDeviceLink Consortium, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

  • Neither the name of SmartDeviceLink Consortium, Inc. nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Generic HMI Missing Standard UI Templates

Currently the Generic HMI only has a media template implemented in master. A view for the nonmedia template has been created and is in develop.

There are plenty of other predefined layouts for SDL that need to be implemented.

Here is the full list as defined in the SDL core mobile api XML

  <enum name="PredefinedLayout" platform="documentation">
    <description>Predefined screen layout.</description>

    <element name="DEFAULT" rootscreen="true">
    	<description>
    		Default media / non-media screen.
    		Can be set as a root screen.
    	</description>
    </element>
    <element name="MEDIA" rootscreen="true">
    	<description>
    		Default Media screen.
    		Can be set as a root screen.
    	</description>
    </element>
    <element name="NON-MEDIA" internal_name="NON_MEDIA" rootscreen="true">
    	<description>
    		Default Non-media screen.
    		Can be set as a root screen.
    	</description>
    </element>
    <element name="ONSCREEN_PRESETS" rootscreen="true">
    	<description>
    		Custom root media screen containing app-defined onscreen presets.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="NAV_FULLSCREEN_MAP" rootscreen="true" >
    	<description>
    		Custom root template screen containing full screen map with navigation controls.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="NAV_LIST" rootscreen="true" >
    	<description>
    		Custom root template screen containing video represented list.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="NAV_KEYBOARD" rootscreen="true" >
    	<description>
    		Custom root template screen containing video represented keyboard.
    		Can be set as a root screen.    		
    	</description>
    </element>    
    <element name="GRAPHIC_WITH_TEXT" rootscreen="true">
    	<description>
    		Custom root template screen containing half-screen graphic with lines of text.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="TEXT_WITH_GRAPHIC" rootscreen="true">
    	<description>
    		Custom root template screen containing lines of text with half-screen graphic.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="TILES_ONLY" rootscreen="true">
    	<description>
    		Custom root template screen containing only tiled SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="TEXTBUTTONS_ONLY" rootscreen="true">
    	<description>
    		Custom root template screen containing only text SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>        
    <element name="GRAPHIC_WITH_TILES" rootscreen="true">
    	<description>
    		Custom root template screen containing half-screen graphic with tiled SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="TILES_WITH_GRAPHIC" rootscreen="true">
    	<description>
    		Custom root template screen containing tiled SoftButtons with half-screen graphic.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS" rootscreen="true">
    	<description>
    		Custom root template screen containing half-screen graphic with text and SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC" rootscreen="true">
    	<description>
    		Custom root template screen containing text and SoftButtons with half-screen graphic.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="GRAPHIC_WITH_TEXTBUTTONS" rootscreen="true">
    	<description>
    		Custom root template screen containing half-screen graphic with text only SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="TEXTBUTTONS_WITH_GRAPHIC" rootscreen="true">
    	<description>
    		Custom root template screen containing text only SoftButtons with half-screen graphic.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="LARGE_GRAPHIC_WITH_SOFTBUTTONS" rootscreen="true">
    	<description>
    		Custom root template screen containing a large graphic and SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>    
    <element name="DOUBLE_GRAPHIC_WITH_SOFTBUTTONS" rootscreen="true">
    	<description>
    		Custom root template screen containing two graphics and SoftButtons.
    		Can be set as a root screen.    		
    	</description>
    </element>
    <element name="LARGE_GRAPHIC_ONLY" rootscreen="true">
   	<description>
    		Custom root template screen containing only a large graphic.
    		Can be set as a root screen.    		
    	</description>
    </element> 
  </enum>

Dark theme MEDIA template timer text is mis-colored

On the dark MEDIA template theme, the timer text is not themed properly, in my estimation. The text should is generic hmi blue/black and should be primaryColor/white. Similarly the white theme is black/black and should be primaryColor/black.

Different soft buttons return same button id

Reported by @NicoleYarroch via slack:
I’ve noticed that when I click on different soft buttons in the media template in Manticore, I get the same button id in the response back from Manticore. I’ve checked that I am sending different button ids for the soft buttons. It works fine on a TDK so it looks like an issue with Manticore. I am using SDL_iOS and Chrome.

This is the response I am getting back for a button press:
"OnButtonEvent (notification)\n{\n buttonEventMode = BUTTONDOWN;\n buttonName = \"CUSTOM_BUTTON\";\n customButtonID = 103;\n}

Sending Show updates can cause disappearing text fields

Sending a Show update with a main field, then sending another Show with out a main field can cause previous main fields to disappear from the screen. It should not clear text fields that are not included in a Show.

This is the exact flow that was failing:

  1. Show with mainField1 "SmartDeviceLink", mainField2 "Example App", soft buttons not included
  2. Show with mainField1 "SmartDeviceLink", mainField2 not included, soft buttons included

C. Only "SmartDeviceLink" and soft buttons are shown

[SDL 0192] Button Subscription response from HMI

Proposal: Button Subscription response from HMI

This proposal is to replace OnButtonSubscription notification
with SubscribeButton request/response,UnsubscribeButton request/response to HMI.

Review: smartdevicelink/sdl_evolution#568

Steering Committee Decision:

The Steering Committee voted to accept this proposal with the following revisions:

  • Proposal will be updated to include the XML structure described in this comment
  • References to "UnSubscribe" within XML should be updated to "Unsubscribe".

The proposal .md file was updated to reflect these revisions on 8/13/18.

[SDL 0042] SDL must transfer RPC’s with invalid image reference parameters to the HMI

Proposal: SDL must transfer RPC’s with invalid image reference parameters to the HMI

Update SDL Core behavior to more gracefully handle RPC requests that provide an invalid image reference. Any RPC that provides a reference to an image that is not located in the AppStoreFolder is considered invalid (the AppStoreFolder is specified in the SmartDeviceLink.ini.)

Review: smartdevicelink/sdl_evolution#128

Steering Committee Decision:

The Steering Committee has agreed to accept this proposal. They also recommended that an additional proposal be submitted for the additional post loading of content.

If the menu button is selected while a PICS is being show, the PICS will not be shown again

If the the menu button (i.e. the hamburger icon in the upper right hand corner that opens the menu) is selected while a perform interaction choice set (PICS) is being shown over the root menu, the PICS menu is closed by the system and the root menu is visible. When I try to show the PICS menu again, the root menu is closed by the system but the PICS is not shown.

I get this error back for the PerformInteraction RPC:

2018-08-10 13:17:34.390993-0400 Livio Music[6600:327494] [] Message received: PerformInteraction (response)
{
    info = "VR, UI component does not respond";
    resultCode = "GENERIC_ERROR";
    success = 0;
}

Node Module Dependency Issue

After webpacking the generic HMI and running it on a embedded/lite type browser some things are getting left aligned that are meant to be centered.

I only started seeing this issue this week and it happens if I blow away the node_modules directory included in the generic hmi repository and rerun npm install.

I originally thought the problem was related newer versions of dependencies being installed but I made sure to set the npm module versions to the same versions as what is included in github and I still see the same issue.

Wondering if anyone has run into this type of issue before with webpack on other projects recently?

Here is the old (working) css of the app header copied from the browser’s web inspector

.app__header {
display: -webkit-box;
Invalid property value.display: -moz-box;
Invalid property value.display: box;
display: -webkit-flex;
Invalid property value.display: -moz-flex;
Invalid property value.display: -ms-flexbox;
Invalid property value.display: flex;
Unknown property name.box-align: center;
-webkit-align-items: center;
Unknown property name.-moz-align-items: center;
Unknown property name.-ms-align-items: center;
Unknown property name.-o-align-items: center;
Unknown property name.align-items: center;
Unknown property name.-ms-flex-align: center;
Unknown property name.box-pack: justify;
-webkit-justify-content: space-between;
Unknown property name.-moz-justify-content: space-between;
Unknown property name.-ms-justify-content: space-between;
Unknown property name.-o-justify-content: space-between;
Unknown property name.justify-content: space-between;
Unknown property name.-ms-flex-pack: justify;
position: relative;
z-index: 1000;
height: 75px;
padding: 0 25px;
}

and here is the new (broken) css of the app header copied from the browsers web inspector

.app__header {
display: -webkit-box;
Invalid property value.display: -moz-box;
Invalid property value.display: box;
Invalid property value.display: -moz-flex;
Invalid property value.display: -ms-flexbox;
Invalid property value.display: flex;
Unknown property name.box-align: center;
Unknown property name.-moz-align-items: center;
Unknown property name.-ms-align-items: center;
Unknown property name.-o-align-items: center;
Unknown property name.align-items: center;
Unknown property name.-ms-flex-align: center;
Unknown property name.box-pack: justify;
Unknown property name.-moz-justify-content: space-between;
Unknown property name.-ms-justify-content: space-between;
Unknown property name.-o-justify-content: space-between;
Unknown property name.justify-content: space-between;
Unknown property name.-ms-flex-pack: justify;
position: relative;
z-index: 1000;
height: 75px;
padding: 0 25px;
}

Notice certain properties are missing like

display: -webkit-flex;
-webkit-align-items: center;
-webkit-justify-content: space-between;

Update License to 2018

License file should be updated from "Copyright (c) 2017 SmartDeviceLink Consortium, Inc." to "Copyright (c) 2017 - 2018 SmartDeviceLink Consortium, Inc."

Wrong Default Layout for NonMedia

When an app registers and it is not a media app, if no SetDisplayLayout is sent by the app, the generic hmi will go to a media template.

The expected behavior is that the default layout will be NonMedia until a new display layout is set.

"Perform Interaction > Menu > Perform Interaction" Hangs Until Timeout

If the user selects the menu button while viewing a perform interaction, picks a menu item, and then selects a perform interaction, the media app while display "Loading" until the specified timeout occurs.

If the user selects menu while at a perform interaction view, the hmi should send a failed perform interaction for the initial perform interaction.

> 6 soft buttons breaks templates

Issue:
Sending a show with >6 soft buttons causes none of the buttons to render. The capability of most templates is max of 6 soft buttons (except 2 for media).

Expected:
If >6 soft buttons are sent in a show, the first 6 soft buttons should be rendered.

Alert soft buttons have formatting issues

The soft buttons in alerts have formatting issues.

  1. Button images are not templated
  2. The transparent sections of PNG images show up as white
  3. The button image does not fit in the button background

soft buttons in alerts

> 6 Softbuttons in an Alert

Issue:
Sending an alert with >6 soft buttons causes none of the buttons to render. The capability of an alerts is a max of 6 soft buttons.

Expected:
If >6 soft buttons are sent in a an alert, the first 6 soft buttons should be rendered.

Inaccurate supported text fields in DisplayCapability

HMI sometimes sends Inaccurate supported text fields in DisplayCapability in both RAI response and SetDisplayLayoutResponse. So for example, if we use DEFAULT for the app HMI type, the display capability in RAI response says that textfield4 is supported. While practically, the default template cannot actually display the text field 4.

Add the ability to highlight soft buttons

Add the ability to highlight soft buttons. This can come in useful if developers want to have a selected and unselected state for a soft button as with the addition of the templated image feature we can no longer use icon color as an indicator of state change.

[SDL 0075] OEM specific Human Interface Device support as Plug-in architecture in SDL proxy

Proposal: OEM specific Human Interface Device support as Plug-in architecture in SDL proxy

Many OEM head units (ex. Lexus Remote Touch, Mazda Commander Control, BMW Gesture Control, Audi MMI) do not support direct touch interaction, but rather support a focus and select model driven by physical controls. This proposal describes a proxy plug-in interface that models the physical controls as HID devices with OEM-specific plug-in implementations. Note: From conclusion in Steering Committee, this proposal was changed to alt#1 (specify proper RPC, not plug-in architecture).

Review: smartdevicelink/sdl_evolution#219

Steering Committee Decision:

The Steering Committee has agreed to move forward with a revised version of Alternative 1 for this proposal, and focus on RPC changes only. While this would typically warrant "returning for revisions," the Steering Committee has decided to make an exception and "accept with revisions" so that the feature can meet the deadline to be contained within the Core 4.4 Release.

This proposal has been accepted with the following revisions, to be made by the Xevo team:

  • Alternative 1 will be the planned approach, with focus only on RPC changes - a separate proposal describing a fuller structure around proxy implementation should be entered at a later date
  • Add ID to SpatialStruct
  • Change HapticSpatialData array from mandatory to optional
  • Increase the maximum size of the HapticSpatialData array (to at least 100, possibly 999)
  • Add the following to the description of SendHapticData RPC: when a request is sent, if successful, it will replace all spatial data previously sent through RPC

These changes have now been reflected in .md file.

CSS issue when isTemplate is set to true

I noticed some css issues when setting isTemplate to true for an image. The image occupies more space than its actual size:

This is how the image looks when isTemaplate is set to true. Notice that it takes up a big square area even though the image is rectangular.

screen shot 2018-10-29 at 3 17 34 pm

This is how it looks when isTemaplte is set to false

screen shot 2018-10-29 at 3 18 08 pm

In App Menu Issues

There is no back button after the user selects a menu, so they must either press a menu item or return to the app list.

Also after making a menu item selection, the app is navigated to the MEDIA template regardless of previously set display layouts.

Implement a Progress Indicator

An Alert has a progressIndicator that can alert the user that something is loading (i.e. a spinning wheel or hourglass). The generic_hmi does not implement this feature.

Video streaming does not work.

If I connect to the phone from linux OS and I switch to video streaming I see only a black screen. I have the newest src from generic_hmi, sdl_video_streaming_android_sample and SDL_core. Is it an error? What do I have to do?

[SDL 0198] - Media Skip Indicators

Proposal: Media Skip Indicators

This feature is similar to SDL-0109 Audio Streaming Indicator except that it affects the next and previous buttons. These buttons should have the ability to show time skip buttons that are commonly used by podcast & audiobook media.

Review: smartdevicelink/sdl_evolution#596

Steering Committee Decision:

The Steering Committee voted to accept this proposal with the following revisions:

  • Incorporate the feedback agreed to in this comment by the author.
  • Ensure that conditions of SeekIndicatorType are documented, as requested in this comment.

The proposal .md file was updated to reflect these revisions on 9/20/18.

Add third_party file

Add markdown file containing list of third party libraries information used within repo.

The `DeleteCommand` RPC always fails with `GENERIC_ERROR`

Issue

The DeleteCommand RPC always fails with GENERIC_ERROR.

Reproduce:

  1. Send an AddCommand RPC
  2. Send a DeleteCommand RPC with the same cmdId as the AddCommand

# What Happens:

The menu item being deleted disappears in the web browser but the resultCode returned is GENERIC_ERROR. If I try to reuse thecmdId, I get an INVALID_ID error when I send the AddCommand.

[SDL 0048] Add H.264 over RTP format support for video streaming

Proposal: Add H.264 over RTP format support for video streaming

This proposal aims to achieve more robust and smooth video streaming for navigation and projection by adding timestamp information to a video stream.

Review: smartdevicelink/sdl_evolution#143

Steering Committee Decision:

The Steering Committee has agreed to accept this proposal with revisions based on the outcome of #176 (how the flow should work, enum versus string format).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.