Table of Contents

1 design pattern

1.1 OnStudioOperation : the op done by ds   drill

  • note : someone launch operation event and let it be affected

1.1.1 code

private void SubscribeToEvents()
{
    DsEvents.Instance().OnStudioOperation += InterruptServices_OnStudioOperation;
}

private void InterruptServices_OnStudioOperation(object sender, StudioOperationArgs args)
{
    switch (args.Operation)
    {
        case StudioSpecialOperation.HID_FINGER_MODE:
            if (args.State == StudioOperationState.STARTED)
            {
                enableDisableUIDuringHIDFingerMode(false);
            }
            else if (args.State == StudioOperationState.FINISHED)
            {
                enableDisableUIDuringHIDFingerMode(true);
            }
            break;
    }
}

sudo apt-get install font-manager if it's called from main stream to update the ui :drill:

:DATE: [2017-09-23 六 22:24]

  • note :

1.1.2 code

private void enableDisableUIDuringHIDFingerMode(bool enable)
{
    if (this.InvokeRequired)
    {
        BeginInvoke(new Action<bool>(enableDisableUIDuringHIDFingerMode), enable);
        return;
    }

    //todo: port when need 
    //this.splitContainer1.Panel2Collapsed = !enable;
}

1.2 get notice from OperationEvent to change the UI status in dashboard   drill

  • note :

1.2.1 code

private void OnStudioOperation(object sender, StudioOperationArgs args)
{
    if (args.Operation == StudioSpecialOperation.FLASH)
    {
        if (args.State == StudioOperationState.STARTED)
        {
            EnableMe(false);
        }
        else if (args.State == StudioOperationState.FINISHED)
        {
            EnableMe(true);
        }
        else if (args.State == StudioOperationState.ERROR)
        {
            EnableMe(true);
        }
    }
    else if (args.Operation == StudioSpecialOperation.TUNING)
    {
        if ((args.Category == StudioOperationCategory.PENTUNING) && (args.State == StudioOperationState.STARTED))
        {
            EnableMe(false);
        }
        else if ((args.Category == StudioOperationCategory.PENTUNING) && (args.State == StudioOperationState.FINISHED))
        {
            EnableMe(true);
        }
    }
    else if (args.Operation == StudioSpecialOperation.PREPRODUCTION)
    {
        if (args.State == StudioOperationState.STARTED)
        {
            EnableMe(false);
        }
        else if (args.State == StudioOperationState.FINISHED)
        {
            EnableMe(true);
        }
    }
}

1.3 UIEventService   drill

  • note :

the para of delegate function must be

  1. object sender
  2. ToolEventArgs e

1.3.1 code

public delegate void ToolValueChangedEvent(ToolEventArgs e);
public delegate void ToolClickEvent(ToolClickEventArgs e);
public delegate void RegisterValueChangedEvent(object sender, RegisterType type);

public delegate void ReadAllRegistersNeededEvent(object sender);
public delegate void DoNotReportNextFwResetEvent(object sender);

public delegate void SolutionFileSelectionChangedEvent(object sender);
public delegate void ActivityWindowSelectionChangedEvent(object sender, bool hasSelection);
public delegate void StatusTextUpdateEvent(string msg, Color msgClr);
public delegate void ProgressBarEvent(bool start);

1.4 delegate event function   drill

  • note :

1.4.1 code

public delegate void ToolValueChangedEvent(ToolEventArgs e);
public static event ToolValueChangedEvent OnToolValueChanged;

public static void FireToolValueChanged(ToolEventArgs e)
{
    if (OnToolValueChanged != null)
    {
        OnToolValueChanged(e);
    }
}

// usage
// studiomain.cs
UIEventsService.FireToolValueChanged(e);
// what things it would do?
// see what function is +to the delegate function
UIEventsService.ToolValueChangedEvent += xxx

1.5 method invoker   drill

  • note :

1.5.1 code

public static event MethodInvoker OnSolutionOpen;

public static event MethodInvoker OnSolutionClosing;

public static event MethodInvoker OnSolutionClosed;

1.6 StudioEventService   drill

  • note :

1.6.1 code

public static IAsyncResult FireConnectionModeChanged(object sender, StatusEnum state)
{
    ConnectionModeEvent connectionModeDelegate = FireSyncConnectionModeChanged;
    return connectionModeDelegate.BeginInvoke(sender, state, null, null);
}

1.7 get InvocationList   drill

  • note :

1.7.1 code

public static void FireSyncConnectionModeChanged(object sender, StatusEnum state)
{
    L12n.UseInvariantCulture();

    ConnectionModeEvent handler = OnConnectionModeChanged;
    if (handler != null)
    {
        foreach (ConnectionModeEvent f in handler.GetInvocationList())
        {
            try
            {
                f(sender, state);
            }
            catch (Exception ex)
            {
                DsMessage.FireOnMessage(StudioPackageType.Biz, StudioMessageType.Error,
                    "FireConnectionModeEvent" + ":" + ex.Message);
                Logger.WriteError("FireConnectionModeEvent" + ": " + ex.Message + " : " + ex.StackTrace);
            }
        }
    }
}

1.8 get resources from resource manager   drill

  • note :

1.8.1 code

_resMgr = new ResMan("Synaptics.DSNG.UI.Res", Assembly.GetExecutingAssembly());

1.9 get/set F11Touchpad in solutionFacade   drill

  • note :

1.9.1 code

// dp : fly weight
        [XmlElement("Touchpads", typeof(F11TouchpadItem))]
        public List<F11TouchpadItem> Touchpads { get; set; }

         public F11TouchpadItem GetTouchpad()
         {
             DesignLayout layout = StudioSolutionManager.Instance.Experiment.Layout;
             if (layout.Touchpads.Count() == 0)
             {
                 layout.Touchpads.Add(new F11TouchpadItem());
             }
             return layout.Touchpads[0];
         }

         public F11TouchpadItem GetTouchpad(string name)
         {
             DesignLayout layout = StudioSolutionManager.Instance.Experiment.Layout;
             F11TouchpadItem result = layout.Touchpads.FirstOrDefault(item => item.ItemName.Equals(name));
             if (result == null)
             {
                 result = new F11TouchpadItem { ItemName = name };
                 layout.Touchpads.Add(result);
             }
             return result;
         }

         public void SetTouchpad(F11TouchpadItem item)
         {
             DesignLayout layout = StudioSolutionManager.Instance.Experiment.Layout;
             layout.Touchpads.RemoveAll(x => x.ItemName == item.ItemName);
             layout.Touchpads.Add(item);
         }

1.10 gethashcode template   drill

  • note :

1.10.1 code

public override int GetHashCode()
{
    unchecked
    {
        int result = base.GetHashCode();
        result = (result * 397) ^ (XSensorMap != null ? CollectionIdentity.GetHashCode(XSensorMap) : 0);
        result = (result * 397) ^ (YSensorMap != null ? CollectionIdentity.GetHashCode(YSensorMap) : 0);
        result = (result * 397) ^ (XSensitivities != null ? CollectionIdentity.GetHashCode(XSensitivities) : 0);
        result = (result * 397) ^ (YSensitivities != null ? CollectionIdentity.GetHashCode(YSensitivities) : 0);
        result = (result * 397) ^ VisualFeedback.GetHashCode();
        result = (result * 397) ^ Orientation.GetHashCode();
        result = (result * 397) ^ Origin.GetHashCode();
        result = (result * 397) ^ FingerDimension.GetHashCode();
        result = (result * 397) ^ XScalingFactor.GetHashCode();
        result = (result * 397) ^ YScalingFactor.GetHashCode();
        result = (result * 397) ^ TouchPadScale.GetHashCode();
        result = (result * 397) ^ ActivePenInkingWidth.GetHashCode();
        return result;
    }
}

1.11 restore layout from xml file   drill

  • note :

1.11.1 code

public void RestoreLayout()
{
    try
    {
        if (File.Exists(Application.StartupPath + "\\" + "DashboardLayout.xml"))
        {
            using (var reader = new StreamReader(Application.StartupPath + "\\" + "DashboardLayout.xml"))
            {
                var gp = (GroupProperty)new XmlSerializer(typeof(GroupProperty)).Deserialize(reader);
                this.ultraExplorerBarDashboard.NavigationMaxGroupHeaders = gp.MaxGroupHeaderValue;
                foreach (GroupValue gv in gp.GroupSetting)
                {
                    int grpId = this.ultraExplorerBarDashboard.Groups.IndexOf(gv.Name);
                    if (0 <= grpId)
                    {
                        UltraExplorerBarGroup g =
                            this.ultraExplorerBarDashboard.Groups[gv.Name];
                        if (g != null)
                        {
                            g.Visible = gv.Visible;
                        }
                    }
                }
                IComparer myComparer = new myReverserClass(gp.GroupSetting);
                this.ultraExplorerBarDashboard.Groups.Sort(myComparer);
            }
        }
    }
    catch (Exception ex)
    {
        DsMessage.FireOnMessage(StudioPackageType.Ui, StudioMessageType.Error, "Dashboard: " + ex.Message);
    }
}

1.12 save layout   drill

  • note :

1.12.1 code

public void SaveLayout()
{
    try
    {
        using (StreamWriter writer = new StreamWriter(Application.StartupPath + "\\" + "DashboardLayout.xml"))
        {
            GroupProperty gp = new GroupProperty();
            gp.MaxGroupHeaderValue = this.ultraExplorerBarDashboard.NavigationMaxGroupHeaders;
            foreach (UltraExplorerBarGroup group in this.ultraExplorerBarDashboard.Groups)
            {
                gp.GroupSetting.Add(new GroupValue(group.Key, group.Index, group.Visible));
            }
            new XmlSerializer(typeof(GroupProperty)).Serialize(writer, gp);
        }
    }
    catch
    {
        DsMessage.FireOnMessage(StudioPackageType.Ui, StudioMessageType.Error,
            "Can't save the Dashboard layout.");
    }
}

1.13 list firstOrDefault   drill

  • note :

1.13.1 code

xIndex = _GroupValueList.FirstOrDefault(g => g.Name == ((UltraExplorerBarGroup)x).Key).Index;
yIndex = _GroupValueList.FirstOrDefault(g => g.Name == ((UltraExplorerBarGroup)y).Key).Index; ;

1.14 serrialize   drill

  • note :

1.14.1 code

[Serializable]
public class GroupValue
{
    [XmlElement("Name")]
    public string Name;
    [XmlElement("Index")]
    public int Index;
    [XmlElement("Visible")]
    public bool Visible;

    public GroupValue()
    {
    }

    public GroupValue(string name, int index, bool visible)
    {
        Name = name;
        Index = index;
        Visible = visible;
    }
}

[Serializable]
[XmlInclude(typeof(GroupValue))]
public class GroupProperty
{
    private List<GroupValue> _groupsetting = new List<GroupValue>();
    public int MaxGroupHeaderValue { get; set; }

    [XmlElement("GroupSetting")]
    public List<GroupValue> GroupSetting
    {
        get { return _groupsetting; }
        set { _groupsetting = value; }
    }
}

1.15 sort csv by list   drill

  • note :

1.15.1 code

private string SortCsv(string csv)
{
    List<string> items = new List<string>();

    string[] strTokens = csv.Split(new char[] { ',' });
    foreach (string item in strTokens)
    {
        items.Add(item);
    }
    items.Sort();

    string output = string.Empty;
    foreach (string item in items)
    {
        output += item + ",";
    }

    if (output != string.Empty)
    {
        // Remove the trailing ","
        output = output.Substring(0, output.Length - 1);
    }
    return output;
}

1.16 get flash identify value in dashboard   drill

  • note :

1.16.1 code

ReflashParameters reflashParam = new ReflashParameters(
    SolutionDataFacade.Instance.GetDeviceProtocol(),
    SolutionDataFacade.Instance.GetHostInfo());

reflashParam.MPCSerialNumber = serial;

touchModuleInfo tInfo = null;

Dictionary<ReflashInfoBase.InfoKey, string> touchModInfo =
    FWMamager.Instance().FirmwareInfo(reflashParam);

1.17 throw exception in func   drill

  • note :

1.17.1 code

if (serialNumber == "")
    throw new Exception("Can't find Serial Number of MPC");
else
    throw new Exception(string.Format("Can't find MPC of serial number {0}", serialNumber));

1.18 singleton   drill

  • note :

1.18.1 code

public static DashBoardController GetInstance()
{
    if (theCtrler == null)
    {
        theCtrler = new DashBoardController();
    }
    return theCtrler;
}

private static DashBoardController theCtrler = null;

1.19 read interrupt status   drill

  • note :

1.19.1 code

public ulong CommandReadInterruptStatus()
{
    try
    {
        var f01Helper = RMIFunctionFacade.Instance._helpersFromDevi.GetF01Helper();
        if (f01Helper != null)
        {
            return f01Helper.GetInterrupt(true);
        }
    }
    catch (DsException ex)
    {
        DsMessage.FireOnMessage(StudioPackageType.Ui, StudioMessageType.Error, "Dashboard: " + ex.Message);
    }
    return ulong.MaxValue;
}

1.20 mvc, controller get data from RMIFacade   drill

  • note :

1.20.1 code

public byte GetSleepMode()
{
    return RMIFunctionFacade.Instance.GetSleepMode();
}

1.21 mvc, view : get notice from observer and get value from controller   drill

  • note :

1.21.1 code

private void UpdateControlRegisterValues()

1.22 launch one UIservice to notify other UI   drill

  • note :

1.22.1 code

private void ButtonForceUpdateClick(object sender, EventArgs e)
{
    buttonForceUpdate.Enabled = false;
    _Controller.SetForceUpdate();
    buttonForceUpdate.Enabled = true;
    // Bring back input focus, otherwise, the input focus go to the next control in the tab order.
    buttonForceUpdate.Focus();
    UIEventsService.FireExecuteDashboardCommandDuringDiagnostic();
}

1.23 another way to read resiter by _deviceHelper   drill

  • note :

1.23.1 code

_DeviceHelper.Read(0x1, RegisterTypeEnum.Data, 0, GetData(0x1));
return _F01.GetInterrupt(false);

1.24 RunTimeState : get status update from OnStudioOperation   drill

  • note :

1.24.1 code

private void OnStudioOperation(object sender, StudioOperationArgs args)

1.25 RMIFunctionFacade, helper from solution.instance.registermap   drill

  • note :

1.25.1 code

_helpersFromSoln = new HelpersFromSolution();
_f01Hlpr = new RMIFunction01Helper(StudioSolutionManager.Instance.RegisterMap);

1.26 RMIFunctionFacade from device   drill

  • note :

1.26.1 code

_helpersFromDevi = new HelpersFromDevice();
_f21Helper = new RMIFunction21Helper();

1.27 fire Studio Operation example   drill

  • note :

1.27.1 code

DsEvents.Instance().FireStudioOperation(this, new StudioOperationArgs(StudioSpecialOperation.RAMUNLOCK, StudioOperationState.STARTED));

1.28 Ilist example   drill

  • note :

1.28.1 code

public IList<RegisterInfo> FindRegistersByAddr(IList<ushort> addrList)
{
    Debug.Assert(addrList != null);
    RegisterMap map = GetCurrentRegisterMap();
    if (map == null)
    {
        return null;
    }
    RegisterMapHelper helper = new RegisterMapHelper(map);
    return addrList.Select(addr => helper.FindByAddress(addr)).ToList();
}

public IList<RegisterInfo> GetAllControlRegisters()
{
    return _RegisterMap.AllRegisters.Where(reg => reg.Type == RegisterTypeEnum.Control).ToList();
}

1.29 Ilist example : sortby   drill

  • note :

1.29.1 code

List<RegisterInfo> regs = map.AllRegisters.Where(x => x.Type == RegisterTypeEnum.Control).OrderBy(x => x.Address).ToList();

1.30 list find   drill

  • note :

1.30.1 code

public SolutionFileInfo Find(string name)
{
    return All.Find(e => e.Name == name);
}

public SolutionFileInfo FindFileName(string name)
{

    return All.Find(e => (e.LinkFileInfo != null) && (e.LinkFileInfo.Name == name));
}

1.31 ctor   drill

  • note :

1.31.1 code

public StudioSolution(StudioProject project)
{
    Project = project;
    Files = new SolutionFiles();
    FwReqDataChanged = false;
}

public StudioSolution() : this(null)
{
}

1.32 copy ctor : copy one instance into this   drill

  • note :

1.32.1 code

/// <summary>
/// Copy constructor
/// </summary>
/// <param name="src"></param>
public RegisterMap(RegisterMap src)
    : this(src.Name)
{
    Copy(src);
}

private void Copy(RegisterMap src)
{
    foreach (RegisterInfo registerInfo in src.AllRegisters)
    {
        PacketRegisterInfo packet = registerInfo as PacketRegisterInfo;
        if (packet != null)
        {
            AllRegisters.Add(new PacketRegisterInfo(packet));
        }
        else
        {
            AllRegisters.Add(new RegisterInfo(registerInfo));
        }
    }
    InterruptMasks.Clear();
    foreach (KeyValuePair<byte, ulong> interruptMask in src.InterruptMasks)
    {
        InterruptMasks.Add(interruptMask.Key, interruptMask.Value);
    }
    FunctionRevisions.Clear();
    foreach (KeyValuePair<byte, byte> functionRevision in src.FunctionRevisions)
    {
        FunctionRevisions.Add(functionRevision.Key, functionRevision.Value);
    }
    IsFunctionPublicFlags.Clear();
    foreach (KeyValuePair<byte, bool> pubflag in src.IsFunctionPublicFlags)
    {
        IsFunctionPublicFlags.Add(pubflag.Key, pubflag.Value);
    }
}

1.33 Clone for RegisterMap   drill

  • note :

1.33.1 code

/// <summary>
/// Default constructor
/// </summary>
public RegisterMap()
    : this("Master")
{
}

public RegisterMap Clone()
{
    return new RegisterMap(this);
}

1.34 list where and select   drill

  • note :

1.34.1 code

/// <summary>
/// All packet registers
/// </summary>
[XmlIgnore]
public List<PacketRegisterInfo> PacketRegisters
{
    get { return AllRegisters.Where(x => x is PacketRegisterInfo).Select(x => (PacketRegisterInfo)x).ToList(); }
}

1.35 KeyValuePair   drill

  • note :

1.35.1 code

foreach (KeyValuePair<byte, ulong> inter in interrupts)
{
    InterruptMasks.Add(inter.Key, inter.Value);
}
foreach (KeyValuePair<byte, byte> revision in functionRevision)
{
    FunctionRevisions.Add(revision.Key, revision.Value);
}
foreach (KeyValuePair<byte, bool> isPubFlag in functionPublicFlags)
{
    IsFunctionPublicFlags.Add(isPubFlag.Key, isPubFlag.Value);
}

1.36 get Enumerator   drill

  • note :

1.36.1 code

var e = registersInfo.Values.GetEnumerator();
e.MoveNext();
return e.Current;

1.37 enumerator   drill

  • note :

1.37.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.38 dispose example   drill

  • note :

1.38.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.39 InterruptService : how to get int from dev   drill

  • note :

1.39.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.40 get data from device.instance   drill

  • note :

1.40.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.41 read interrupt by _deviceHelper   drill

  • note :

1.41.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.42 open external log   drill

  • note :

1.42.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.43 instance lock   drill

1.43.1 code

var eNumber = registerCollection.Values.GetEnumerator();
eNumber.MoveNext();
var eSubNumber = eNumber.Current.GetEnumerator();
eSubNumber.MoveNext();
return AllRegisters[eSubNumber.Current.Value];

1.44 method invoker   drill

  • note :

1.44.1 code

internal void ChangeStartStop()
{
    MethodInvoker f;
    if (IsRunning)
    {
        f = Stop;
    }
    else
    {
        PreProcessForStart();
        f = () => Start(false);
    }
    f.BeginInvoke(null, null);
}

Author: raflin

Created: 2019-03-30 六 21:21

Validate