ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:34:48 2017 +0800
Revision:
45:2aa9f933c8d2
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TMBOY 45:2aa9f933c8d2 1 /*
TMBOY 45:2aa9f933c8d2 2 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
TMBOY 45:2aa9f933c8d2 3 *
TMBOY 45:2aa9f933c8d2 4 * Licensed under the Apache License, Version 2.0 (the "License");
TMBOY 45:2aa9f933c8d2 5 * you may not use this file except in compliance with the License.
TMBOY 45:2aa9f933c8d2 6 * You may obtain a copy of the License at
TMBOY 45:2aa9f933c8d2 7 *
TMBOY 45:2aa9f933c8d2 8 * http://www.apache.org/licenses/LICENSE-2.0
TMBOY 45:2aa9f933c8d2 9 *
TMBOY 45:2aa9f933c8d2 10 * Unless required by applicable law or agreed to in writing, software
TMBOY 45:2aa9f933c8d2 11 * distributed under the License is distributed on an "AS IS" BASIS,
TMBOY 45:2aa9f933c8d2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TMBOY 45:2aa9f933c8d2 13 * See the License for the specific language governing permissions and
TMBOY 45:2aa9f933c8d2 14 * limitations under the License.
TMBOY 45:2aa9f933c8d2 15 */
TMBOY 45:2aa9f933c8d2 16 package com.baidu.duer.dcs.framework;
TMBOY 45:2aa9f933c8d2 17
TMBOY 45:2aa9f933c8d2 18 import com.baidu.duer.dcs.devicemodule.system.HandleDirectiveException;
TMBOY 45:2aa9f933c8d2 19 import com.baidu.duer.dcs.devicemodule.system.SystemDeviceModule;
TMBOY 45:2aa9f933c8d2 20 import com.baidu.duer.dcs.framework.DcsResponseDispatcher.IDcsResponseHandler;
TMBOY 45:2aa9f933c8d2 21 import com.baidu.duer.dcs.framework.message.ClientContext;
TMBOY 45:2aa9f933c8d2 22 import com.baidu.duer.dcs.framework.message.DcsRequestBody;
TMBOY 45:2aa9f933c8d2 23 import com.baidu.duer.dcs.framework.message.DcsResponseBody;
TMBOY 45:2aa9f933c8d2 24 import com.baidu.duer.dcs.framework.message.DcsStreamRequestBody;
TMBOY 45:2aa9f933c8d2 25 import com.baidu.duer.dcs.framework.message.Directive;
TMBOY 45:2aa9f933c8d2 26 import com.baidu.duer.dcs.framework.message.Event;
TMBOY 45:2aa9f933c8d2 27 import com.baidu.duer.dcs.systeminterface.IPlatformFactory;
TMBOY 45:2aa9f933c8d2 28 import com.baidu.duer.dcs.util.LogUtil;
TMBOY 45:2aa9f933c8d2 29
TMBOY 45:2aa9f933c8d2 30 import java.util.ArrayList;
TMBOY 45:2aa9f933c8d2 31 import java.util.HashMap;
TMBOY 45:2aa9f933c8d2 32
TMBOY 45:2aa9f933c8d2 33 /**
TMBOY 45:2aa9f933c8d2 34 * dcs业务处理框架,用于分发指令(directives)、发送事件(events)和创建deviceModule等
TMBOY 45:2aa9f933c8d2 35 * <p>
TMBOY 45:2aa9f933c8d2 36 * Created by shenguanghao、wuruisheng on 2017/5/31.
TMBOY 45:2aa9f933c8d2 37 */
TMBOY 45:2aa9f933c8d2 38 public class DcsFramework {
TMBOY 45:2aa9f933c8d2 39 private static final String TAG = DcsFramework.class.getSimpleName();
TMBOY 45:2aa9f933c8d2 40 // 管理平台相关的对象
TMBOY 45:2aa9f933c8d2 41 private final IPlatformFactory platformFactory;
TMBOY 45:2aa9f933c8d2 42 // 管理deviceModules
TMBOY 45:2aa9f933c8d2 43 private final HashMap<String, BaseDeviceModule> dispatchDeviceModules;
TMBOY 45:2aa9f933c8d2 44 // 创建会话Id
TMBOY 45:2aa9f933c8d2 45 private final DialogRequestIdHandler dialogRequestIdHandler;
TMBOY 45:2aa9f933c8d2 46 // 基于通道活跃状态和优先级进行mediaPlayer调度
TMBOY 45:2aa9f933c8d2 47 private final BaseMultiChannelMediaPlayer multiChannelMediaPlayer;
TMBOY 45:2aa9f933c8d2 48 // 创建deviceModule工厂
TMBOY 45:2aa9f933c8d2 49 private DeviceModuleFactory deviceModuleFactory;
TMBOY 45:2aa9f933c8d2 50 // 和服务器端保持长连接、发送events和接收directives和维持心跳
TMBOY 45:2aa9f933c8d2 51 private DcsClient dcsClient;
TMBOY 45:2aa9f933c8d2 52 // 用于DeviceModules发送events
TMBOY 45:2aa9f933c8d2 53 private IMessageSender messageSender;
TMBOY 45:2aa9f933c8d2 54 // 服务器端返回response调度中心
TMBOY 45:2aa9f933c8d2 55 private DcsResponseDispatcher dcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 56
TMBOY 45:2aa9f933c8d2 57 public DcsFramework(IPlatformFactory platformFactory) {
TMBOY 45:2aa9f933c8d2 58 this.platformFactory = platformFactory;
TMBOY 45:2aa9f933c8d2 59 dispatchDeviceModules = new HashMap<>();
TMBOY 45:2aa9f933c8d2 60 dialogRequestIdHandler = new DialogRequestIdHandler();
TMBOY 45:2aa9f933c8d2 61 multiChannelMediaPlayer = new PauseStrategyMultiChannelMediaPlayer(platformFactory);
TMBOY 45:2aa9f933c8d2 62
TMBOY 45:2aa9f933c8d2 63 createMessageSender();
TMBOY 45:2aa9f933c8d2 64 createDcsClient();
TMBOY 45:2aa9f933c8d2 65 createDeviceModuleFactory();
TMBOY 45:2aa9f933c8d2 66 }
TMBOY 45:2aa9f933c8d2 67
TMBOY 45:2aa9f933c8d2 68 public void release() {
TMBOY 45:2aa9f933c8d2 69 for (BaseDeviceModule deviceModule : dispatchDeviceModules.values()) {
TMBOY 45:2aa9f933c8d2 70 deviceModule.release();
TMBOY 45:2aa9f933c8d2 71 }
TMBOY 45:2aa9f933c8d2 72 dcsClient.release();
TMBOY 45:2aa9f933c8d2 73 dcsResponseDispatcher.release();
TMBOY 45:2aa9f933c8d2 74 }
TMBOY 45:2aa9f933c8d2 75
TMBOY 45:2aa9f933c8d2 76 public DeviceModuleFactory getDeviceModuleFactory() {
TMBOY 45:2aa9f933c8d2 77 return deviceModuleFactory;
TMBOY 45:2aa9f933c8d2 78 }
TMBOY 45:2aa9f933c8d2 79
TMBOY 45:2aa9f933c8d2 80 private ArrayList<ClientContext> clientContexts() {
TMBOY 45:2aa9f933c8d2 81 ArrayList<ClientContext> clientContexts = new ArrayList<>();
TMBOY 45:2aa9f933c8d2 82 for (BaseDeviceModule deviceModule : dispatchDeviceModules.values()) {
TMBOY 45:2aa9f933c8d2 83 ClientContext clientContext = deviceModule.clientContext();
TMBOY 45:2aa9f933c8d2 84 if (clientContext != null) {
TMBOY 45:2aa9f933c8d2 85 clientContexts.add(clientContext);
TMBOY 45:2aa9f933c8d2 86 }
TMBOY 45:2aa9f933c8d2 87 }
TMBOY 45:2aa9f933c8d2 88
TMBOY 45:2aa9f933c8d2 89 return clientContexts;
TMBOY 45:2aa9f933c8d2 90 }
TMBOY 45:2aa9f933c8d2 91
TMBOY 45:2aa9f933c8d2 92 private void handleDirective(Directive directive) {
TMBOY 45:2aa9f933c8d2 93 String namespace = directive.header.getNamespace();
TMBOY 45:2aa9f933c8d2 94 try {
TMBOY 45:2aa9f933c8d2 95 BaseDeviceModule deviceModule = dispatchDeviceModules.get(namespace);
TMBOY 45:2aa9f933c8d2 96 if (deviceModule != null) {
TMBOY 45:2aa9f933c8d2 97 deviceModule.handleDirective(directive);
TMBOY 45:2aa9f933c8d2 98 } else {
TMBOY 45:2aa9f933c8d2 99 String message = "No device to handle the directive";
TMBOY 45:2aa9f933c8d2 100 throw new HandleDirectiveException(
TMBOY 45:2aa9f933c8d2 101 HandleDirectiveException.ExceptionType.UNSUPPORTED_OPERATION, message);
TMBOY 45:2aa9f933c8d2 102 }
TMBOY 45:2aa9f933c8d2 103 } catch (HandleDirectiveException exception) {
TMBOY 45:2aa9f933c8d2 104 getSystemDeviceModule().sendExceptionEncounteredEvent(directive.rawMessage,
TMBOY 45:2aa9f933c8d2 105 exception.getExceptionType(), exception.getMessage());
TMBOY 45:2aa9f933c8d2 106 } catch (Exception exception) {
TMBOY 45:2aa9f933c8d2 107 getSystemDeviceModule().sendExceptionEncounteredEvent(directive.rawMessage,
TMBOY 45:2aa9f933c8d2 108 HandleDirectiveException.ExceptionType.INTERNAL_ERROR,
TMBOY 45:2aa9f933c8d2 109 exception.getMessage()
TMBOY 45:2aa9f933c8d2 110 );
TMBOY 45:2aa9f933c8d2 111 }
TMBOY 45:2aa9f933c8d2 112 }
TMBOY 45:2aa9f933c8d2 113
TMBOY 45:2aa9f933c8d2 114 private void createDcsClient() {
TMBOY 45:2aa9f933c8d2 115 IDcsResponseHandler responseHandler = new IDcsResponseHandler() {
TMBOY 45:2aa9f933c8d2 116 @Override
TMBOY 45:2aa9f933c8d2 117 public void onResponse(final DcsResponseBody responseBody) {
TMBOY 45:2aa9f933c8d2 118 platformFactory.getMainHandler().post(new Runnable() {
TMBOY 45:2aa9f933c8d2 119 @Override
TMBOY 45:2aa9f933c8d2 120 public void run() {
TMBOY 45:2aa9f933c8d2 121 LogUtil.d(TAG, "DcsResponseBodyEnqueue-handleDirective-MSG:"
TMBOY 45:2aa9f933c8d2 122 + responseBody.getDirective().rawMessage);
TMBOY 45:2aa9f933c8d2 123 handleDirective(responseBody.getDirective());
TMBOY 45:2aa9f933c8d2 124 }
TMBOY 45:2aa9f933c8d2 125 });
TMBOY 45:2aa9f933c8d2 126 }
TMBOY 45:2aa9f933c8d2 127
TMBOY 45:2aa9f933c8d2 128 @Override
TMBOY 45:2aa9f933c8d2 129 public void onParseFailed(String unParsedMessage) {
TMBOY 45:2aa9f933c8d2 130 LogUtil.d(TAG, "DcsResponseBodyEnqueue-handleDirective-onParseFailed");
TMBOY 45:2aa9f933c8d2 131 String message = "parse failed";
TMBOY 45:2aa9f933c8d2 132 getSystemDeviceModule().sendExceptionEncounteredEvent(unParsedMessage,
TMBOY 45:2aa9f933c8d2 133 HandleDirectiveException.ExceptionType.UNEXPECTED_INFORMATION_RECEIVED,
TMBOY 45:2aa9f933c8d2 134 message);
TMBOY 45:2aa9f933c8d2 135 }
TMBOY 45:2aa9f933c8d2 136 };
TMBOY 45:2aa9f933c8d2 137
TMBOY 45:2aa9f933c8d2 138 dcsResponseDispatcher = new DcsResponseDispatcher(dialogRequestIdHandler, responseHandler);
TMBOY 45:2aa9f933c8d2 139 dcsClient = new DcsClient(dcsResponseDispatcher, new DcsClient.IDcsClientListener() {
TMBOY 45:2aa9f933c8d2 140 @Override
TMBOY 45:2aa9f933c8d2 141 public void onConnected() {
TMBOY 45:2aa9f933c8d2 142 LogUtil.d(TAG, "onConnected");
TMBOY 45:2aa9f933c8d2 143 getSystemDeviceModule().sendSynchronizeStateEvent();
TMBOY 45:2aa9f933c8d2 144 }
TMBOY 45:2aa9f933c8d2 145
TMBOY 45:2aa9f933c8d2 146 @Override
TMBOY 45:2aa9f933c8d2 147 public void onUnconnected() {
TMBOY 45:2aa9f933c8d2 148 LogUtil.d(TAG, "onUnconnected");
TMBOY 45:2aa9f933c8d2 149 }
TMBOY 45:2aa9f933c8d2 150 });
TMBOY 45:2aa9f933c8d2 151 dcsClient.startConnect();
TMBOY 45:2aa9f933c8d2 152 }
TMBOY 45:2aa9f933c8d2 153
TMBOY 45:2aa9f933c8d2 154 private void createMessageSender() {
TMBOY 45:2aa9f933c8d2 155 messageSender = new IMessageSender() {
TMBOY 45:2aa9f933c8d2 156 @Override
TMBOY 45:2aa9f933c8d2 157 public void sendEvent(Event event, DcsStreamRequestBody streamRequestBody,
TMBOY 45:2aa9f933c8d2 158 IResponseListener responseListener) {
TMBOY 45:2aa9f933c8d2 159 DcsRequestBody requestBody = new DcsRequestBody(event);
TMBOY 45:2aa9f933c8d2 160 requestBody.setClientContext(clientContexts());
TMBOY 45:2aa9f933c8d2 161 dcsClient.sendRequest(requestBody, streamRequestBody, responseListener);
TMBOY 45:2aa9f933c8d2 162 }
TMBOY 45:2aa9f933c8d2 163
TMBOY 45:2aa9f933c8d2 164 @Override
TMBOY 45:2aa9f933c8d2 165 public void sendEvent(Event event, IResponseListener responseListener) {
TMBOY 45:2aa9f933c8d2 166 sendEventRequest(event, null, responseListener);
TMBOY 45:2aa9f933c8d2 167 }
TMBOY 45:2aa9f933c8d2 168
TMBOY 45:2aa9f933c8d2 169 @Override
TMBOY 45:2aa9f933c8d2 170 public void sendEvent(Event event) {
TMBOY 45:2aa9f933c8d2 171 sendEventRequest(event, null, null);
TMBOY 45:2aa9f933c8d2 172 }
TMBOY 45:2aa9f933c8d2 173
TMBOY 45:2aa9f933c8d2 174 @Override
TMBOY 45:2aa9f933c8d2 175 public void sentEventWithClientContext(Event event, IResponseListener responseListener) {
TMBOY 45:2aa9f933c8d2 176 sendEventRequest(event, clientContexts(), responseListener);
TMBOY 45:2aa9f933c8d2 177 }
TMBOY 45:2aa9f933c8d2 178 };
TMBOY 45:2aa9f933c8d2 179 }
TMBOY 45:2aa9f933c8d2 180
TMBOY 45:2aa9f933c8d2 181 private void sendEventRequest(Event event,
TMBOY 45:2aa9f933c8d2 182 ArrayList<ClientContext> clientContexts,
TMBOY 45:2aa9f933c8d2 183 IResponseListener responseListener) {
TMBOY 45:2aa9f933c8d2 184 DcsRequestBody dcsRequestBody = new DcsRequestBody(event);
TMBOY 45:2aa9f933c8d2 185 dcsRequestBody.setClientContext(clientContexts);
TMBOY 45:2aa9f933c8d2 186 dcsClient.sendRequest(dcsRequestBody, responseListener);
TMBOY 45:2aa9f933c8d2 187 }
TMBOY 45:2aa9f933c8d2 188
TMBOY 45:2aa9f933c8d2 189 private void createDeviceModuleFactory() {
TMBOY 45:2aa9f933c8d2 190 deviceModuleFactory = new DeviceModuleFactory(new DeviceModuleFactory.IDeviceModuleHandler() {
TMBOY 45:2aa9f933c8d2 191 @Override
TMBOY 45:2aa9f933c8d2 192 public IPlatformFactory getPlatformFactory() {
TMBOY 45:2aa9f933c8d2 193 return platformFactory;
TMBOY 45:2aa9f933c8d2 194 }
TMBOY 45:2aa9f933c8d2 195
TMBOY 45:2aa9f933c8d2 196 @Override
TMBOY 45:2aa9f933c8d2 197 public DialogRequestIdHandler getDialogRequestIdHandler() {
TMBOY 45:2aa9f933c8d2 198 return dialogRequestIdHandler;
TMBOY 45:2aa9f933c8d2 199 }
TMBOY 45:2aa9f933c8d2 200
TMBOY 45:2aa9f933c8d2 201 @Override
TMBOY 45:2aa9f933c8d2 202 public IMessageSender getMessageSender() {
TMBOY 45:2aa9f933c8d2 203 return messageSender;
TMBOY 45:2aa9f933c8d2 204 }
TMBOY 45:2aa9f933c8d2 205
TMBOY 45:2aa9f933c8d2 206 @Override
TMBOY 45:2aa9f933c8d2 207 public BaseMultiChannelMediaPlayer getMultiChannelMediaPlayer() {
TMBOY 45:2aa9f933c8d2 208 return multiChannelMediaPlayer;
TMBOY 45:2aa9f933c8d2 209 }
TMBOY 45:2aa9f933c8d2 210
TMBOY 45:2aa9f933c8d2 211 @Override
TMBOY 45:2aa9f933c8d2 212 public void addDeviceModule(BaseDeviceModule deviceModule) {
TMBOY 45:2aa9f933c8d2 213 DcsFramework.this.addDeviceModule(deviceModule);
TMBOY 45:2aa9f933c8d2 214 }
TMBOY 45:2aa9f933c8d2 215
TMBOY 45:2aa9f933c8d2 216 @Override
TMBOY 45:2aa9f933c8d2 217 public DcsResponseDispatcher getResponseDispatcher() {
TMBOY 45:2aa9f933c8d2 218 return dcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 219 }
TMBOY 45:2aa9f933c8d2 220 });
TMBOY 45:2aa9f933c8d2 221 }
TMBOY 45:2aa9f933c8d2 222
TMBOY 45:2aa9f933c8d2 223 private void addDeviceModule(BaseDeviceModule deviceModule) {
TMBOY 45:2aa9f933c8d2 224 dispatchDeviceModules.put(deviceModule.getNameSpace(), deviceModule);
TMBOY 45:2aa9f933c8d2 225 }
TMBOY 45:2aa9f933c8d2 226
TMBOY 45:2aa9f933c8d2 227 private SystemDeviceModule getSystemDeviceModule() {
TMBOY 45:2aa9f933c8d2 228 return deviceModuleFactory.getSystemDeviceModule();
TMBOY 45:2aa9f933c8d2 229 }
TMBOY 45:2aa9f933c8d2 230 }