using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Runtime.InteropServices;
using PVOID = System.IntPtr;
using DWORD = System.UIntPtr;
using Microsoft.Win32;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Speech;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;
using LibUsbDotNet;
using LibUsbDotNet.Usb;
namespace Fusion_Control_Centre_UberMDX
{
public partial class MainMDX : Form
{
#region Vote Opinion
///
/// Vote Opinion of yes, no, or indifferent
///
public enum Vote_Opinion
{
OUI, NON, MEH
}
#endregion
#region Vote Priority
///
/// Vote Priority of either high, medium, or low
///
public enum Vote_Priority
{
HIGH_PRIORITY, MEDIUM_PRIORITY, LOW_PRIORITY
}
#endregion
#region Window Handle Class
public class wndArrayClass
{
public IntPtr hWnd = IntPtr.Zero;
public string title = "";
public wndArrayClass(IntPtr inputHwd, string inputTitle)
{
hWnd = inputHwd;
title = inputTitle;
}
}
#endregion
#region Logical Vote
///
/// Logical Vote contains both an Opinion and a Priority
/// Opinion: What it thinks it should do in the form of yes/no/indifferent
/// Priority: How important its opinion is by rank of high/medium/low
///
public struct LogicalVote
{
public Vote_Opinion MyLogicalOpinion;
public Vote_Priority MyLogicalPriority;
public object toWhat;
}
#endregion
#region Functions
///
/// Usually external "macros" of a sort that have input parameters and return a value
///
public struct Functions
{
public XmlNode rawFunction;
public string functionName;
}
#endregion
#region Logic
public class Logic_Struct
{
public XmlNode _logicNode = null;
public DateTime _logicLastVoteTime = DateTime.MinValue;
public int _logicMinimumTimeBetweenVotes = 20;
public Logic_Struct(XmlNode _Node, int _TimeBetween)
{
_logicNode = _Node;
_logicMinimumTimeBetweenVotes = _TimeBetween;
}
}
#endregion
#region Variable
///
/// Has the name by which functions and if/then statements call it by as well as the value.
/// Can be either a double or boolean value
///
public class Variable
{
public object variableValue;
public string variableReferenceName;
public List WhatShouldMyValueBe = new List();
public Variable(string input_referenceName, object input_value)
{
variableValue = input_value;
variableReferenceName = input_referenceName;
}
}
#endregion
#region Log
///
/// Each item to monitor to a log file
///
public class LogClass
{
public string logReferenceName;
public string toMonitorName;
public string toMonitorType;
public string fireOnString = "logic";
public string saveToFile = "Fusion Control Centre Log File";
public bool monitorState = false;
public int NumberToLogBeforeDumping = 100;
public bool HoldingAStreamOpen = false;
public int StreamIndex = -1;
public string dataName = "Logged Value";
public string dataFrom = "value";
public List ShouldIBeLogging = new List();
public List MyDataPoints = new List();
public LogClass(string input_name, string input_monitorname, string input_monitortype, string input_fireOn)
{
logReferenceName = input_name;
toMonitorName = input_monitorname;
toMonitorType = input_monitortype;
fireOnString = input_fireOn;
}
}
#endregion
#region Log Streams
public class LogFileStream
{
public System.IO.FileStream MyFileStream;
public System.IO.StreamWriter MyStreamWriter;
public System.IO.StreamReader MyStreamReader;
public string CurrentData = "";
public LogFileStream(string input_stream_path)
{
MyFileStream = new System.IO.FileStream(input_stream_path + ".xml", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);
MyStreamReader = new System.IO.StreamReader(MyFileStream);
MyStreamWriter = new System.IO.StreamWriter(MyFileStream);
CurrentData = MyStreamReader.ReadToEnd();
MyStreamReader.Close();
}
}
#endregion
#region Log Data Point
public class LogDataPoint
{
public DateTime StoredDate = DateTime.Now;
public object StoredData = null;
public string StoredName = "";
public LogDataPoint(object newData, string newName)
{
StoredData = newData;
StoredName = newName;
}
public string GenerateXMLNode()
{
string newLogNode_String = " \r\n";
newLogNode_String += " " + StoredDate.ToLongDateString() + "\r\n";
newLogNode_String += " \r\n";
newLogNode_String += " " + StoredName + "\r\n";
newLogNode_String += " " + StoredData.ToString() + "\r\n";
newLogNode_String += " \r\n";
return newLogNode_String;
}
}
#endregion
#region COM Command
public class COM_Command
{
public string id = "";
public DateTime last_vote = DateTime.MinValue;
public int minimum_delta_vote_time = 0;
public List do_statements = new List();
public COM_Command(string input_id)
{
id = input_id;
}
}
#endregion
#region Other Voting Options
public static List CanDo_ShouldIChangePage = new List();
public static List CanDo_ShouldIChangeGUITimer = new List();
public static List CanDo_ShouldIChangeLogicTimer = new List();
//List CanDo_ShouldIChangeOutputTimer = new List();
//List CanDo_ShouldIChangeInputTimer = new List();
public static List CanDo_ShouldIChangeIOTimer = new List();
public static List CanDo_ShouldIChangeLogging = new List();
public static List CanDo_ShouldIPressAKey = new List();
public static List CanDo_ShouldIPlayASound = new List();
public static List CanDo_ShouldIGiveAWarning = new List();
public static List CanDo_ShouldISendAnEmail = new List();
#endregion
#region BrainVersion
public enum BrainVersion
{
Version_03, Version_04
}
#endregion
#region BrainID
///
/// Each Fusion Brain connected to the PC has a hardware instance ID
/// as well as a human name that can be referenced in functions and
/// if/then statements
///
public class BrainID
{
public string instanceID;
public string humanName;
public UsbDevice Device;
public UsbEndpointWriter Stream_Writer;
public UsbEndpointReader Stream_Reader;
public BrainVersion version;
//public string version_string_supposed_to_be = "";
public string Accurate_AnalogueScalingInput_Index_ReferenceID = "";
public int Accurate_AnalogueScalingInput_Index = -1;
private int[] AnalogueInputIndexArray_03 = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
private int[] DigitalOutputIndexArray_03 = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
private int[] DigitalInputIndexArray_03 = { -1, -1, -1, -1 };
private int[] AnalogueInputIndexArray_04 = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
private int[] DigitalOutputIndexArray_04 = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
private int[] DigitalInputIndexArray_04 = { };
public int[] AnalogueInputIndexArray_EX;
public int[] DigitalOutputIndexArray_EX;
public int[] DigitalInputIndexArray_EX;
public bool InitializeVersion(BrainVersion input_BrainVersion)
{
version = input_BrainVersion;
switch (input_BrainVersion)
{
case BrainVersion.Version_03:
AnalogueInputIndexArray_EX = AnalogueInputIndexArray_03;
DigitalOutputIndexArray_EX = DigitalOutputIndexArray_03;
DigitalInputIndexArray_EX = DigitalInputIndexArray_03;
return true;
case BrainVersion.Version_04:
AnalogueInputIndexArray_EX = AnalogueInputIndexArray_04;
DigitalOutputIndexArray_EX = DigitalOutputIndexArray_04;
DigitalInputIndexArray_EX = DigitalInputIndexArray_04;
return true;
default:
return false;
}
}
}
#endregion
#region Physical Relations
public const int FUSIONBRAIN_NUMBEROF_DIGITAL_OUTPUTS_VERSION_03 = 12;
public const int FUSIONBRAIN_NUMBEROF_ANALOGUE_INPUTS_VERSION_03 = 10;
public const int FUSIONBRAIN_NUMBEROF_DIGITAL_INPUTS_VERSION_03 = 4;
public const int FUSIONBRAIN_NUMBEROF_DIGITAL_OUTPUTS_VERSION_04 = 16;
public const int FUSIONBRAIN_NUMBEROF_ANALOGUE_INPUTS_VERSION_04 = 13;
public const int FUSIONBRAIN_NUMBEROF_DIGITAL_INPUTS_VERSION_04 = 0;
public static int FUSIONBRAIN_NUMBER_OF_DIGITAL_OUTPUTS(BrainVersion version)
{
switch (version)
{
case BrainVersion.Version_03:
return FUSIONBRAIN_NUMBEROF_DIGITAL_OUTPUTS_VERSION_03;
case BrainVersion.Version_04:
return FUSIONBRAIN_NUMBEROF_DIGITAL_OUTPUTS_VERSION_04;
default:
return 0;
}
}
public static int FUSIONBRAIN_NUMBER_OF_ANALOGUE_INPUTS(BrainVersion version)
{
switch (version)
{
case BrainVersion.Version_03:
return FUSIONBRAIN_NUMBEROF_ANALOGUE_INPUTS_VERSION_03;
case BrainVersion.Version_04:
return FUSIONBRAIN_NUMBEROF_ANALOGUE_INPUTS_VERSION_04;
default:
return 0;
}
}
public static int FUSIONBRAIN_NUMBER_OF_DIGITAL_INPUTS(BrainVersion version)
{
switch (version)
{
case BrainVersion.Version_03:
return FUSIONBRAIN_NUMBEROF_DIGITAL_INPUTS_VERSION_03;
case BrainVersion.Version_04:
return FUSIONBRAIN_NUMBEROF_DIGITAL_INPUTS_VERSION_04;
default:
return 0;
}
}
#endregion
#region MDX Image DirectX or GDI+
public bool MDX_use_GDI_not_DX = false;
public Graphics MDX_GDI_Graphics;
public Bitmap MDX_GDI_DisplayBitmap;
public class FusionImage_BitmapOrTexture
{
public Texture MDX_FusionTexture;
public Image MDX_FusionBitmap;
}
#endregion
#region MDX Image Generic
public class FusionImage
{
public FusionImage_BitmapOrTexture MDX_Image = new FusionImage_BitmapOrTexture();
//public Texture MDX_FusionTexture;
public ImageInformation MDX_FusionTextureInformation;
public Sprite MDX_InternalSprite = null;
//public Graphics MDX_InternalGraphics_GDI = null;
public Point MDX_Position = new Point(0, 0);
public Vector2 MDX_Scale = new Vector2(1.0f, 1.0f);
public float MDX_Rotation = 0.0f;
public Point MDX_Origin = new Point(0, 0);
public bool doesNotRequireTexture = false;
#region Draw 2D Texture to 3D Universe...
public void Draw(bool GDI_not_DX, Vector2 _AppScaling, Graphics _GraphicLayer)
{
if (GDI_not_DX)
{
if (_GraphicLayer == null || MDX_Image.MDX_FusionBitmap == null)
{
return;
}
else
{
Image _2use = MDX_Image.MDX_FusionBitmap;
if (MDX_Rotation != 0.0f) { _2use = RotateImage(MDX_Image.MDX_FusionBitmap, MDX_Rotation); }
int x = 0, y = 0, w = 0, h = 0;
x = (int)((float)MDX_Position.X * ((float)_AppScaling.X));
y = (int)((float)MDX_Position.Y * ((float)_AppScaling.Y));
w = (int)((float)MDX_Image.MDX_FusionBitmap.Width * (float)_AppScaling.X * (float)MDX_Scale.X);
h = (int)((float)MDX_Image.MDX_FusionBitmap.Height * (float)_AppScaling.Y * (float)MDX_Scale.Y);
_GraphicLayer.DrawImage(_2use, new Rectangle(x, y, w, h));
//_GraphicLayer.DrawRectangle(Color.FromArgb(new Random().Next()), new Rectangle(x, y, w, h));
}
}
else
{
if (MDX_Image.MDX_FusionTexture == null)
{
return;
}
else
{
Matrix _MatrixScaleSprite = new Matrix();
MDX_InternalSprite.Transform =
Matrix.Translation(-MDX_Position.X - MDX_FusionTextureInformation.Width / 2, -MDX_Position.Y - MDX_FusionTextureInformation.Height / 2, 0f) *
Matrix.Scaling(MDX_Scale.X, MDX_Scale.Y, 1.0f) *
Matrix.RotationZ(MDX_Rotation) *
Matrix.Translation(MDX_Position.X + MDX_Scale.X * MDX_FusionTextureInformation.Width / 2, MDX_Position.Y + MDX_Scale.Y * MDX_FusionTextureInformation.Height / 2, 0f) *
Matrix.Scaling(_AppScaling.X, _AppScaling.Y, 1.0f);
MDX_InternalSprite.Begin(SpriteFlags.AlphaBlend);
Vector3 _tempDrawPoint = new Vector3((float)(MDX_Position.X), (float)(MDX_Position.Y), 0.0f);
MDX_InternalSprite.Draw(MDX_Image.MDX_FusionTexture, Rectangle.Empty, new Vector3((float)MDX_Origin.X, (float)MDX_Origin.Y, 0.0f), _tempDrawPoint, Color.White);
MDX_InternalSprite.End();
return;
}
}
}
public void DrawGraph(bool GDI_not_DX, Vector2 _AppScaling, Vector2 ShowSize, CustomVertex.PositionColored[] DataPoints, Color LineColour, int LineWidth, Graphics GraphicsLayer)
{
if (!doesNotRequireTexture)
{
return;
}
if (GDI_not_DX)
{
List _tempListPoints = new List();
for (int i = 0; i < DataPoints.Length; i++)
{
_tempListPoints.Add(new PointF(DataPoints[i].X, DataPoints[i].Y));
}
GraphicsLayer.DrawLines(new Pen(LineColour, (float)LineWidth), _tempListPoints.ToArray());
}
else
{
Matrix _MatrixScaleSprite = new Matrix();
MDX_InternalSprite.Transform =
Matrix.Translation(-MDX_Position.X - ShowSize.X / 2, -MDX_Position.Y - ShowSize.Y / 2, 0f) *
Matrix.Scaling(MDX_Scale.X, MDX_Scale.Y, 1.0f) *
Matrix.RotationZ(MDX_Rotation) *
Matrix.Translation(MDX_Position.X + MDX_Scale.X * ShowSize.X / 2, MDX_Position.Y + MDX_Scale.Y * ShowSize.Y / 2, 0f) *
Matrix.Scaling(_AppScaling.X, _AppScaling.Y, 1.0f);
MDX_InternalSprite.Begin(SpriteFlags.AlphaBlend);
Vector3 _tempDrawPoint = new Vector3((float)(MDX_Position.X), (float)(MDX_Position.Y), 0.0f);
MDX_InternalSprite.Device.VertexFormat = CustomVertex.PositionColored.Format;
MDX_InternalSprite.Device.DrawUserPrimitives(PrimitiveType.LineStrip, DataPoints.Length - 1, DataPoints);
MDX_InternalSprite.End();
}
}
public void DrawPortionAndOrAsFont(bool GDI_not_DX, Vector2 Font_Scaling, Point input_position, Rectangle input_Rectangle, Color input_Colour, Vector2 _AppScaling, Graphics GraphicsLayer)
{
if (!GDI_not_DX)
{
if (MDX_Image.MDX_FusionTexture == null)
{
return;
}
if (input_Rectangle == Rectangle.Empty)
{
}
Matrix _MatrixScaleSprite = new Matrix();
MDX_InternalSprite.Transform =
Matrix.Translation(-input_position.X - input_Rectangle.Width / 2, -input_position.Y - input_Rectangle.Height / 2, 0f) *
Matrix.RotationZ(MDX_Rotation) *
Matrix.Scaling(Font_Scaling.X, Font_Scaling.Y, 1.0f) *
Matrix.Translation(input_position.X + Font_Scaling.X * input_Rectangle.Width / 2, input_position.Y + Font_Scaling.Y * input_Rectangle.Height / 2, 0f) *
Matrix.Scaling(_AppScaling.X, _AppScaling.Y, 1.0f);
MDX_InternalSprite.Begin(SpriteFlags.AlphaBlend);
Vector3 _tempDrawPoint = new Vector3((float)(input_position.X), (float)(input_position.Y), 0.0f);
MDX_InternalSprite.Draw(MDX_Image.MDX_FusionTexture, input_Rectangle, new Vector3((float)MDX_Origin.X, (float)MDX_Origin.Y, 0.0f), _tempDrawPoint, input_Colour);
MDX_InternalSprite.End();
}
else
{
Rectangle _size = new Rectangle((int)((float)input_position.X * _AppScaling.X),
(int)((float)input_position.Y * _AppScaling.Y),
(int)((float)input_Rectangle.Width * _AppScaling.X * Font_Scaling.X),
(int)((float)input_Rectangle.Height * _AppScaling.Y * Font_Scaling.Y));
GraphicsLayer.DrawImage(MDX_Image.MDX_FusionBitmap, _size, input_Rectangle, GraphicsUnit.Pixel);
}
}
#endregion
#region Constructor & Overloads
public FusionImage(Device input_Device, bool noTextureNeeded)
{
MDX_InternalSprite = new Sprite(input_Device);
doesNotRequireTexture = noTextureNeeded;
}
public FusionImage(MDX_TextureLoadingReturnClass input_MDXRC, Device input_Device)
{
MDX_Image.MDX_FusionTexture = input_MDXRC._Texture;
MDX_Image.MDX_FusionBitmap = input_MDXRC._Bitmap;
MDX_FusionTextureInformation = input_MDXRC._Info;
MDX_InternalSprite = new Sprite(input_Device);
}
public FusionImage(MDX_TextureLoadingReturnClass input_MDXRC, float input_Rotation, Device input_Device)
{
MDX_Image.MDX_FusionTexture = input_MDXRC._Texture;
MDX_Image.MDX_FusionBitmap = input_MDXRC._Bitmap;
MDX_FusionTextureInformation = input_MDXRC._Info;
MDX_Rotation = input_Rotation;
MDX_InternalSprite = new Sprite(input_Device);
}
#endregion
#region Reset Sprites with New Device
public void SetNewSpriteDevice(Device newDevice)
{
MDX_InternalSprite = new Sprite(newDevice);
}
#endregion
#region RotateGDI [DIRECT IMPORT FROM FCC VERSION 2]
public static Bitmap RotateImage(Image image, float angle)
{
if (image == null)
throw new ArgumentNullException("image");
const double pi2 = Math.PI / 2.0;
double oldWidth = (double)image.Width;
double oldHeight = (double)image.Height;
double theta = ((double)angle) * Math.PI / 180.0;
double locked_theta = theta;
while (locked_theta < 0.0)
locked_theta += 2 * Math.PI;
double newWidth, newHeight;
int nWidth, nHeight;
double adjacentTop, oppositeTop;
double adjacentBottom, oppositeBottom;
if ((locked_theta >= 0.0 && locked_theta < pi2) ||
(locked_theta >= Math.PI && locked_theta < (Math.PI + pi2)))
{
adjacentTop = Math.Abs(Math.Cos(locked_theta)) * oldWidth;
oppositeTop = Math.Abs(Math.Sin(locked_theta)) * oldWidth;
adjacentBottom = Math.Abs(Math.Cos(locked_theta)) * oldHeight;
oppositeBottom = Math.Abs(Math.Sin(locked_theta)) * oldHeight;
}
else
{
adjacentTop = Math.Abs(Math.Sin(locked_theta)) * oldHeight;
oppositeTop = Math.Abs(Math.Cos(locked_theta)) * oldHeight;
adjacentBottom = Math.Abs(Math.Sin(locked_theta)) * oldWidth;
oppositeBottom = Math.Abs(Math.Cos(locked_theta)) * oldWidth;
}
newWidth = adjacentTop + oppositeBottom;
newHeight = adjacentBottom + oppositeTop;
nWidth = (int)Math.Ceiling(newWidth);
nHeight = (int)Math.Ceiling(newHeight);
Bitmap rotatedBmp = new Bitmap(nWidth, nHeight);
using (Graphics g = Graphics.FromImage(rotatedBmp))
{
Point[] points;
if (locked_theta >= 0.0 && locked_theta < pi2)
{
points = new Point[] {
new Point( (int) oppositeBottom, 0 ),
new Point( nWidth, (int) oppositeTop ),
new Point( 0, (int) adjacentBottom )
};
}
else if (locked_theta >= pi2 && locked_theta < Math.PI)
{
points = new Point[] {
new Point( nWidth, (int) oppositeTop ),
new Point( (int) adjacentTop, nHeight ),
new Point( (int) oppositeBottom, 0 )
};
}
else if (locked_theta >= Math.PI && locked_theta < (Math.PI + pi2))
{
points = new Point[] {
new Point( (int) adjacentTop, nHeight ),
new Point( 0, (int) adjacentBottom ),
new Point( nWidth, (int) oppositeTop )
};
}
else
{
points = new Point[] {
new Point( 0, (int) adjacentBottom ),
new Point( (int) oppositeBottom, 0 ),
new Point( (int) adjacentTop, nHeight )
};
}
g.DrawImage(image, points);
}
return rotatedBmp;
}
#endregion
}
#endregion
#region MDX Texture Loading Return Class
public struct MDX_TextureLoadingReturnClass
{
public Texture _Texture;
public ImageInformation _Info;
public Image _Bitmap;
public MDX_TextureLoadingReturnClass(Texture input_Texture, ImageInformation input_Info, Image input_Bitmap)
{
_Texture = input_Texture;
_Info = input_Info;
_Bitmap = input_Bitmap;
}
}
#endregion
#region MDX Texture Loading Time Saver Lookup Table
public struct MDX_TextureLoadLookupStruct
{
public string _path;
public Texture loadedTexture;
public Image loadedBitmap;
public ImageInformation loadedInfo;
public MDX_TextureLoadLookupStruct(string input_path, Texture input_Texture, ImageInformation input_Info, Image input_Bitmap)
{
_path = input_path;
loadedTexture = input_Texture;
loadedInfo = input_Info;
loadedBitmap = input_Bitmap;
}
}
#endregion
#region Background Images
///
/// Each background image has a set page to display on, an image to display,
/// and a style as to how to display the image (tile/strech/centre)
///
public struct BackgroundImageForDisplay
{
public FusionImage theImage;
public int thePage;
public ImageLayout theImageLayout;
}
#endregion
#region Display Button Generic
public class DisplayButton
{
public List DisplayPage = new List();
public bool isPressed = false;
public bool isBeingClicked = false;
public bool isEnabled = true;
public FusionImage MDX_Primary = null;
public FusionImage MDX_Secondary = null;
public FusionImage MDX_Disabled = null;
public FusionImage MDX_Pushed = null;
public int MDX_x_left = -1; public int MDX_x_right = -1;
public int MDX_y_top = -1; public int MDX_y_bottom = -1;
public Vector2 toScale_ApplicationBy = new Vector2(1.0f, 1.0f);
public float MDX_DisplayDepth = 0.0f;
public Size DisplaySize = new Size(50, 50);
public Point DeButtonLocation = new Point(0, 0);
//public ImageLayout DeButtonsImageLayout = ImageLayout.None;
public string id;
public DateTime Time_lastDownVote = DateTime.MinValue;
public DateTime Time_lastUpVote = DateTime.MinValue;
public int Time_MinDeltaDownVote = 20;
public int Time_MinDeltaUpVote = 20;
public string functionString;
public string functionTarget;
public string toMonitor = "";
public string toMonitorType = "";
public string voteOpinion;
public string voteType;
public bool upClick_Enable = false;
public string upClick_Function;
public string upClick_FunctionTargetID;
public string upClick_VoteOpinion;
public string upClick_VoteType;
public Vote_Priority upClick_VotePriority = Vote_Priority.MEDIUM_PRIORITY;
public DisplayTextLabel TextPrimary = new DisplayTextLabel();
public DisplayTextLabel TextSecondary = new DisplayTextLabel();
public DisplayTextLabel TextDisabled = new DisplayTextLabel();
public double threshold_Low = -1;
public double threshold_High = -1;
public Vote_Priority votePriority = Vote_Priority.MEDIUM_PRIORITY;
public List ShouldIBeEnabled = new List();
public DisplayButton()
{
}
public void UpdateBounds(FusionImage CurrentImage, bool GDI_not_DX)
{
int _w = 0, _h = 0;
if (GDI_not_DX)
{
if (CurrentImage.MDX_Image.MDX_FusionBitmap != null)
{
_w = CurrentImage.MDX_Image.MDX_FusionBitmap.Width;
_h = CurrentImage.MDX_Image.MDX_FusionBitmap.Height;
}
}
else
{
if (CurrentImage.MDX_Image.MDX_FusionTexture != null)
{
_w = CurrentImage.MDX_FusionTextureInformation.Width;
_h = CurrentImage.MDX_FusionTextureInformation.Height;
}
}
int c_width = (int)(_w * CurrentImage.MDX_Scale.X * toScale_ApplicationBy.X);
int c_height = (int)(_h * CurrentImage.MDX_Scale.Y * toScale_ApplicationBy.Y);
MDX_x_left = (int)(DeButtonLocation.X * toScale_ApplicationBy.X);
MDX_x_right = (int)(DeButtonLocation.X * toScale_ApplicationBy.X) + c_width;
MDX_y_top = (int)(DeButtonLocation.Y * toScale_ApplicationBy.Y);
MDX_y_bottom = (int)(DeButtonLocation.Y * toScale_ApplicationBy.Y) + c_height;
}
}
#endregion
#region Multi Image (DisplayButton)
public class DisplayMultiImage : DisplayButton
{
public List MultipleImageList = new List();
public DisplayMultiImage(string input_id, string input_monitor, string input_toMonitor)
{
id = input_id;
toMonitor = input_monitor;
toMonitorType = input_toMonitor;
}
}
#endregion
#region Rotating Image (Display Button)
public class DisplayRotateImageCentre : DisplayButton
{
public struct DisplayRotateImageValues
{
public double value_minimum;
public double value_maximum;
public double angle_minimum;
public double angle_maximum;
}
public bool streakImage = false;
public double maximumAngleStride = 0.5f;
public bool smoothRotating = false;
public double currentAngle = -1f;
public List MultipleAngleList = new List();
public DisplayRotateImageCentre(string input_id, string input_monitor, string input_toMonitor)
{
id = input_id;
toMonitor = input_monitor;
toMonitorType = input_toMonitor;
//DeButton.AutoSize = false;
}
}
#endregion
#region Static Image
public class DisplayStaticImage
{
public FusionImage MDX_StaticImage = null;
public List DisplayPages = new List();
public Point DisplayLocation = new Point(0, 0);
public Vector2 DisplayScaling = new Vector2(1.0f, 1.0f);
public Size DisplaySize = new Size(0, 0);
public float MDX_DisplayDepth = 0.0f;
}
#endregion
#region Display Text Label
public class DisplayTextLabel
{
public Color FontColour = Color.White;
public string FontText = "";
public float FontSize = 12.0f;
public string FontName = "";
public Point LabelLocation = new Point(0, 0);
public Vector4 LabelBounds;
public bool isCompletelySetup()
{
if (FontName == "")
{
return false;
}
return true;
}
}
#endregion
#region Auto Display Text Label
public class DisplayTextLabelAuto : DisplayTextLabel
{
public string id = "";
public string monitor_type = "";
public string monitor_id = "";
public List pageList = new List();
public int LabelDecimalPrecision = 1;
public Point LabelMaxSize = new Point(1, 1);
public string FontText_Original = "";
public DisplayTextLabelAuto(string input_id, string input_type, string input_monitorid, string input_text)
{
id = input_id;
monitor_type = input_type;
monitor_id = input_monitorid;
FontText = input_text;
FontText_Original = input_text;
}
}
#endregion
#region DisplayFusionFont
public class FusionFont
{
public class FusionFont_Character
{
public Rectangle CroppingLocation = new Rectangle();
public int CharacterIntCode = -1;
public Vector4 CharacterOffsetVector = new Vector4(0.0f, 0.0f, 0.0f, 0.0f);
public FusionFont_Character(Rectangle input_rectangle, int input_IntCode, Vector4 input_Offset)
{
CroppingLocation = input_rectangle;
CharacterIntCode = input_IntCode;
CharacterOffsetVector = input_Offset;
}
}
public string FusionFontName = "";
public FusionImage FusionFontMainImage = null;
public float FusionFontOriginalSize = 100.0f;
public List FusionFont_CharDefinitions = new List();
}
public struct FontDisplayReturnValue
{
public Vector4 _Offset;
public Rectangle _Rectangle;
public FontDisplayReturnValue(Rectangle _iRect, Vector4 _iVect4)
{
_Offset = _iVect4;
_Rectangle = _iRect;
}
}
#endregion
#region Fusion Graph
public class DisplayFusionGraph : DisplayStaticImage
{
//public enum DATA_POINT {X,Y};
public string id = "";
public string timer = "logic timer";
public float value_minimum;
public float value_maximum;
//public int time_minimum;
public float time_maximum;
public Axis graphingAxis = Axis.HORIZONTAL;
public string target = "";
public string targetID = "";
public int lineThickness = 2;
public Color lineColour = Color.Black;
//public List DataPoints = new List();
public List DataPoints = new List();
public bool smooth = false;
public bool forwardBiasNotReverseBias = false;
public int smoothNumbers = 10;
}
#endregion
#region Axis Enumeration
public enum Axis { HORIZONTAL, VERTICAL }
#endregion
#region Variable Location Image (Static Image)
public class DisplayVariableLocationImage : DisplayStaticImage
{
public float value_minimum;
public float value_maximum;
public int location_minimum;
public int location_maximum;
public Axis translateAround = Axis.HORIZONTAL;
public string target = "";
public string targetID = "";
}
#endregion
#region All GUI Z-Ordering
public struct ZOrder_QuelleListeLookupItem
{
public ZOrderListIndexMatrix _ListReferenceType;
public int _IndexInList;
public float _ZOrder;
public ZOrder_QuelleListeLookupItem(ZOrderListIndexMatrix input_ListENUM, int input_Index, float input_Order)
{
_ListReferenceType = input_ListENUM;
_IndexInList = input_Index;
_ZOrder = input_Order;
}
public ZOrder_QuelleListeLookupItem(ZOrder_QuelleListeLookupItem toCloneItem)
{
_ListReferenceType = toCloneItem._ListReferenceType;
_IndexInList = toCloneItem._IndexInList;
_ZOrder = toCloneItem._ZOrder;
}
public void Replace(ZOrder_QuelleListeLookupItem toReplaceItem)
{
_ListReferenceType = toReplaceItem._ListReferenceType;
_IndexInList = toReplaceItem._IndexInList;
_ZOrder = toReplaceItem._ZOrder;
}
}
public enum ZOrderListIndexMatrix
{
ENUM_DISPLAYBUTTONS, ENUM_MULTIIMAGES, ENUM_ROTATEIMAGES, ENUM_STATICIMAGES, ENUM_VARAIBLELOCATION, ENUM_GRAPH
}
#endregion
#region Input/Output Channel Generic
public class Channel
{
public string BrainID;
public int Port;
public string id;
}
#endregion
#region Digital Output Channel (Channel)
public class DigitalOutputChannel : Channel
{
public enum DigitalOutputChannel_Mode
{
STANDARD = 0,
PULSE_WIDTH_MODULATION,
OPTION_1, // Not decided yet
OPTION_2 // Not decided yet
}
public bool CurrentState = false;
public bool PreviousState = false;
public List ShouldIChangeState = new List();
public int TimerValue = 0;
public int PWM_Value = 127;
public DigitalOutputChannel_Mode Mode = DigitalOutputChannel_Mode.STANDARD;
public DigitalOutputChannel(string input_BrainID, string input_ID, int input_Port)
{
BrainID = input_BrainID;
id = input_ID;
Port = input_Port;
}
}
#endregion
#region Analogue Input Channel (Channel)
public class AnalogueInputChannel : Channel
{
public double CurrentValue = 0.0f;
public int maximumHistory = 200;
public List HistoryValues = new List();
public bool autoAverage = false;
public AnalogueInputChannel(string input_BrainID, string input_ID, int input_Port)
{
BrainID = input_BrainID;
id = input_ID;
Port = input_Port;
}
}
#endregion
#region Digital Input Channel (Channel)
public class DigitalInputChannel : Channel
{
public bool CurrentState;
public bool PreviousState;
public DigitalInputChannel(string input_BrainID, string input_ID, int input_Port)
{
BrainID = input_BrainID;
id = input_ID;
Port = input_Port;
}
}
#endregion
#region GUI Lists
public static List AllZOrder_QuelleListe = new List();
public static List AllMDXTexturePathOptimization = new List();
public static List AllDisplayButtons = new List();
public static List AllDisplayMultiImages = new List();
public static List AllDisplayRotateImage = new List();
public static List AllBackgroundImages = new List();
public static List AllStaticImages = new List();
public static List AllStaticVariableLocationImages = new List();
public static List AllTextLabels = new List();
public static List AllGraphs = new List();
public static List AllFusionFonts = new List();
#endregion
#region Logic Lists
public static List AllLogicXMlNodes = new List();
public static List AllFunctions = new List();
public static List AllVariables = new List();
public static List AllLogClasses = new List();
public static List AllLogFileStreams = new List();
public static List wndArrayComplete = new List();
public static List AllCOMCommands = new List();
#endregion
#region Input/Output Lists
public static List AllBrains = new List();
public static List AllDigitalOutputs = new List();
public static List AllAnalogueInputs = new List();
public static List AllDigitalInputs = new List();
#endregion
#region Virtual Brain
public class VirtualBrainClass
{
public string _human;
public DEBUG_VirtualBrain _Form_03 = null;
public DEBUG_VirtualBrain_Version04 _Form_04 = null;
public BrainVersion _version;
public VirtualBrainClass(string id)
{
_human = id;
}
public static bool isAVirtualBrain(string _id)
{
foreach (VirtualBrainClass _vb in DEBUG_VirtualBrainList)
{
if(_vb._human.ToLower() == _id.ToLower())
{
return true;
}
}
return false;
}
public bool Initialize(BrainVersion myVersion, MainMDX mYmomma)
{
_version = myVersion;
switch(_version)
{
case BrainVersion.Version_03:
{
DEBUG_VirtualBrain _tempDVB = new DEBUG_VirtualBrain(mYmomma, _human);
DEBUG_FormsToShow.Add((Form)_tempDVB);
return true;
}
case BrainVersion.Version_04:
{
DEBUG_VirtualBrain_Version04 _tempDVB = new DEBUG_VirtualBrain_Version04(_human, mYmomma);
DEBUG_FormsToShow.Add((Form)_tempDVB);
return true;
}
}
return false;
}
}
public static List DEBUG_VirtualBrainList = new List();
#endregion
#region Timers
private static System.Windows.Forms.Timer LogicTimer = new System.Windows.Forms.Timer();
private static System.Windows.Forms.Timer IO_Timer = new System.Windows.Forms.Timer();
private static System.Windows.Forms.Timer GUI_Timer = new System.Windows.Forms.Timer();
//System.Windows.Forms.Timer OutputTimer = new System.Windows.Forms.Timer();
//System.Windows.Forms.Timer InputTimer = new System.Windows.Forms.Timer();
#endregion
#region Threads
Thread THREAD_Logic;
Thread THREAD_IO;
//Thread THREAD_GUI;
//Thread THREAD_INPUT;
//Thread THREAD_OUTPUT;
#endregion
#region Misc. Globals
public static List