package com.integreight.onesheeld.shields.controller; import android.app.Activity; import com.integreight.onesheeld.enums.ArduinoPin; import com.integreight.onesheeld.enums.UIShield; import com.integreight.onesheeld.sdk.ShieldFrame; import com.integreight.onesheeld.shields.ControllerParent; import com.integreight.onesheeld.utils.BitsUtils; import java.util.Hashtable; import java.util.Map.Entry; public class SevenSegmentShield extends ControllerParent<SevenSegmentShield> { private SevenSegmentsEventHandler eventHandler; public Hashtable<String, Boolean> pinsStatus = new Hashtable<String, Boolean>(); public SevenSegmentShield() { super(); requiredPinsIndex = 0; shieldPins = new String[]{" A ", " B ", " C ", " D ", " E ", " F ", " G ", " DOT "}; for (int i = 0; i < shieldPins.length; i++) { pinsStatus.put(shieldPins[i], false); } } public SevenSegmentShield(Activity activity, String tag) { super(activity, tag); } @Override public ControllerParent<SevenSegmentShield> init(String tag) { return super.init(tag); } public Hashtable<String, Boolean> getSegmentsStatus() { return pinsStatus; } public Hashtable<String, Boolean> refreshSegments() { updateSegmentsStatusFromFirmata(); return pinsStatus; } @Override public void onDigital(int portNumber, boolean portData) { updateSegmentsStatusFromFirmata(); if (eventHandler != null) { eventHandler.onSegmentsChange(pinsStatus); } super.onDigital(portNumber, portData); } public void setSevenSegmentsEventHandler( SevenSegmentsEventHandler eventHandler) { this.eventHandler = eventHandler; updateSegmentsStatusFromFirmata(); } public static interface SevenSegmentsEventHandler { void onSegmentsChange(Hashtable<String, Boolean> segmentsStatus); } private synchronized void updateSegmentsStatusFromFirmata() { for (Entry<String, Boolean> entry : pinsStatus.entrySet()) { pinsStatus.put(entry.getKey(), false); } if (getApplication().isConnectedToBluetooth()) for (Entry<String, ArduinoPin> entry : matchedShieldPins.entrySet()) { pinsStatus.put(entry.getKey(), getApplication().getConnectedDevice().digitalRead(entry.getValue().microHardwarePin)); } } @Override public void onNewShieldFrameReceived(ShieldFrame frame) { if (frame.getShieldId() == UIShield.SEVENSEGMENT_SHIELD.getId() && frame.getFunctionId() == 0x01) for (int i = 0; i < shieldPins.length; i++) { pinsStatus.put(shieldPins[i], BitsUtils.isBitSet(frame.getArgument(0)[0], i)); if (eventHandler != null) { eventHandler.onSegmentsChange(pinsStatus); } } } @Override public void reset() { // TODO Auto-generated method stub } }