Table of Contents
- 1. design pattern
- 1.1. OnStudioOperation : the op done by ds drill
- 1.2. get notice from OperationEvent to change the UI status in dashboard drill
- 1.3. UIEventService drill
- 1.4. delegate event function drill
- 1.5. method invoker drill
- 1.6. StudioEventService drill
- 1.7. get InvocationList drill
- 1.8. get resources from resource manager drill
- 1.9. get/set F11Touchpad in solutionFacade drill
- 1.10. gethashcode template drill
- 1.11. restore layout from xml file drill
- 1.12. save layout drill
- 1.13. list firstOrDefault drill
- 1.14. serrialize drill
- 1.15. sort csv by list drill
- 1.16. get flash identify value in dashboard drill
- 1.17. throw exception in func drill
- 1.18. singleton drill
- 1.19. read interrupt status drill
- 1.20. mvc, controller get data from RMIFacade drill
- 1.21. mvc, view : get notice from observer and get value from controller drill
- 1.22. launch one UIservice to notify other UI drill
- 1.23. another way to read resiter by _deviceHelper drill
- 1.24. RunTimeState : get status update from OnStudioOperation drill
- 1.25. RMIFunctionFacade, helper from solution.instance.registermap drill
- 1.26. RMIFunctionFacade from device drill
- 1.27. fire Studio Operation example drill
- 1.28. Ilist example drill
- 1.29. Ilist example : sortby drill
- 1.30. list find drill
- 1.31. ctor drill
- 1.32. copy ctor : copy one instance into this drill
- 1.33. Clone for RegisterMap drill
- 1.34. list where and select drill
- 1.35. KeyValuePair drill
- 1.36. get Enumerator drill
- 1.37. enumerator drill
- 1.38. dispose example drill
- 1.39. InterruptService : how to get int from dev drill
- 1.40. get data from device.instance drill
- 1.41. read interrupt by _deviceHelper drill
- 1.42. open external log drill
- 1.43. instance lock drill
- 1.44. method invoker drill
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:
- 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
- object sender
- 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);
}