package cc.blynk.server.hardware.handlers.hardware.logic; import cc.blynk.server.core.dao.SessionDao; import cc.blynk.server.core.model.DashBoard; import cc.blynk.server.core.model.auth.Session; import cc.blynk.server.core.model.enums.PinType; import cc.blynk.server.core.model.widgets.Widget; import cc.blynk.server.core.protocol.model.messages.StringMessage; import cc.blynk.server.core.session.HardwareStateHolder; import cc.blynk.utils.ParseUtil; import io.netty.channel.ChannelHandlerContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import static cc.blynk.server.core.protocol.enums.Command.SET_WIDGET_PROPERTY; import static cc.blynk.server.core.protocol.enums.Response.ILLEGAL_COMMAND_BODY; import static cc.blynk.utils.BlynkByteBufUtil.makeResponse; import static cc.blynk.utils.BlynkByteBufUtil.ok; import static cc.blynk.utils.StringUtils.split3; /** * Handler that allows to change widget properties from hardware side. * * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 2/1/2015. * */ public class SetWidgetPropertyLogic { private static final Logger log = LogManager.getLogger(SetWidgetPropertyLogic.class); private final SessionDao sessionDao; public SetWidgetPropertyLogic(SessionDao sessionDao) { this.sessionDao = sessionDao; } public void messageReceived(ChannelHandlerContext ctx, HardwareStateHolder state, StringMessage message) { String[] bodyParts = split3(message.body); if (bodyParts.length != 3) { log.debug("SetWidgetProperty command body has wrong format. {}", message.body); ctx.writeAndFlush(makeResponse(message.id, ILLEGAL_COMMAND_BODY), ctx.voidPromise()); return; } final int deviceId = state.deviceId; byte pin = ParseUtil.parseByte(bodyParts[0]); String property = bodyParts[1]; String propertyValue = bodyParts[2]; if (property.length() == 0 || propertyValue.length() == 0) { log.debug("SetWidgetProperty command body has wrong format. {}", message.body); ctx.writeAndFlush(makeResponse(message.id, ILLEGAL_COMMAND_BODY), ctx.voidPromise()); return; } DashBoard dash = state.user.profile.getDashByIdOrThrow(state.dashId); if (!dash.isActive) { return; } //for now supporting only virtual pins Widget widget = dash.findWidgetByPin(deviceId, pin, PinType.VIRTUAL); if (widget == null) { log.debug("No widget for SetWidgetProperty command. {}", message.body); ctx.writeAndFlush(makeResponse(message.id, ILLEGAL_COMMAND_BODY), ctx.voidPromise()); return; } try { widget.setProperty(property, propertyValue); dash.updatedAt = System.currentTimeMillis(); } catch (Exception e) { log.debug("Error setting widget property. Reason : {}", e.getMessage()); ctx.writeAndFlush(makeResponse(message.id, ILLEGAL_COMMAND_BODY), ctx.voidPromise()); return; } Session session = sessionDao.userSession.get(state.userKey); session.sendToApps(SET_WIDGET_PROPERTY, message.id, dash.id, deviceId, message.body); ctx.writeAndFlush(ok(message.id), ctx.voidPromise()); } }