Advertisement
Guest User

enum mit Attributen

a guest
Jul 18th, 2013
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.35 KB | None | 0 0
  1.     public enum Category
  2.      {
  3.          [Description("Allgemein")]
  4.          General,
  5.          [Description("Sensor auslesen")]
  6.          GetSensor,
  7.          [Description("Variable auslesen")]
  8.          GetVariable,
  9.          [Description("Konstante auslesen")]
  10.          GetConstant,
  11.          [Description("Variable setzen")]
  12.          SetVariable,
  13.          [Description("Konstante setzen")]
  14.          SetConstant,
  15.          Response,
  16.          [Description("Befehl")]
  17.          Command
  18.      }
  19.  
  20.         private void category_cb_SelectedIndexChanged(object sender, EventArgs e)
  21.          {
  22.              var selected = type_cb.SelectedItem; // Ausgewählten Wert merken
  23.  
  24.              Category cat = (Category)category_cb.SelectedValue; // Ausgewählte Kategorie
  25.              
  26.  // Meine Erweiterungsmethode. Hier steht "Liefere mir bitte anhand des enums 'COMM_Command' eine Liste mit Tupeln {enumwert, Displayname}, bei denen die Kategorie gleich cat ist"
  27.               List<KeyValuePair<Enum, string>> list = typeof(COMM_Command).ToList<CommandInfoAttribute>(x => x.Category == cat, x => x.DisplayName);
  28.  // Die Liste dann natürlich gleich in die zweite Combobox schieben
  29.              type_cb.DataSource = list;
  30.  
  31.  // Und falls vorher ein bestimmter Wert ausgewählt war, diesen nach Möglichkeit wieder auswählen.
  32.              if (selected != null)
  33.              {
  34.                  string text = ((KeyValuePair<Enum, string>)selected).Value;
  35.                  var item = list.FirstOrDefault(x => x.Value == text);
  36.                  if (item.Value != null)
  37.                      type_cb.SelectedValue = item.Key;
  38.              }
  39.          }
  40.  
  41.         private void type_cb_SelectedIndexChanged(object sender, EventArgs e)
  42.          {
  43.              // Einheiten herausfinden
  44.              string name = type_cb.Text;
  45.               List<KeyValuePair<Enum, string>> list = typeof(COMM_Command).ToList<CommandInfoAttribute>(x => x.DisplayName == name, x => x.Unit);
  46.  
  47.              unit_lbl.Visible = list.Count == 1;
  48.              unit_cb.Visible = list.Count != 1;
  49.  
  50.  // Falls ein Wert geschickt werden soll, bitte die Einheit neben dem Editfeld anzeigen
  51.              // Bei einer Einheit Label benutzen, sonst Combobox
  52.              unit_lbl.Text = list[0].Value;
  53.              if (list.Count > 1)
  54.              {
  55.                  unit_cb.DisplayMember = "Value";
  56.                  unit_cb.ValueMember = "Key";
  57.                  unit_cb.DataSource = list;
  58.              }
  59.  // Mit getEnumValue() bekomme ich den enumwert, der durch die aktuelle Auswahl genriert wird.
  60.              CommandInfoAttribute attrib = getEnumValue().GetInfo();
  61.  
  62.              unit_lbl.Visible = list.Count == 1 && attrib.NeedsPrimaryValue();
  63.              unit_cb.Visible = list.Count != 1 && attrib.NeedsPrimaryValue();
  64.  
  65.              // Sekundärwert Beschreibung zuweisen und ggf. sichtbar machen
  66.              value2_lbl.Text = attrib.SecondaryName + ":";
  67.              value2_lbl.Visible = attrib.NeedsSecondaryValue();
  68.              value2_txt.Visible = attrib.NeedsSecondaryValue();
  69.  
  70.              // Bei Auslesen-Befehlen die Werteeingabe verstecken
  71.              value_lbl.Text = attrib.PrimaryName + ":";
  72.              value_lbl.Visible = attrib.NeedsPrimaryValue();
  73.              value_txt.Visible = attrib.NeedsPrimaryValue();
  74.              value_txt.Clear();
  75.          }
  76.  
  77.          // Welcher Befehl entspricht den aktuellen GUI Einstellungen?
  78.          private COMM_Command getEnumValue()
  79.          {
  80.              var unit = unit_lbl.Visible ? unit_lbl.Text : unit_cb.Text; // Einheit bestimmen
  81.              var enumvalue = typeof(COMM_Command).ToList<CommandInfoAttribute>(x =>
  82.                  x.Category == (Category)category_cb.SelectedValue
  83.                  && x.DisplayName == type_cb.Text
  84.                  && (!x.NeedsPrimaryValue() || x.Unit == unit), x => "").First();
  85.              return (COMM_Command)enumvalue.Key;
  86.          }
  87.  
  88.     /// <summary>
  89.     /// Bei der Vergabe der Attribute ist folgendes zu beachten:
  90.     /// Jede Kombination aus Kategorie, Anzeigename und Einheit darf maximal einmal vorkommen.
  91.     /// Der Anzeigename wird zur Gruppierung benutzt. Werden zu einem Anzeigenamen verschiedene
  92.     /// Einheiten zugeordnet, kann die Einheit entsprechend variiert werden. Tritt daher ein Anzeigename mehrfach auf,
  93.     /// ist darauf zu achten dass beide Male die gleiche Einheit spezifiziert wird.
  94.     /// Felder ohne ein Attribut tauchen in der Eingabemaske nicht auf.
  95.     /// Die Attribute für "Konstante lesen", "Konstante setzen" und "Antwort"
  96.     /// sollten sich also - bis auf die Kategorie - nicht unterscheiden.
  97.     /// </summary>
  98.     public enum COMM_Command : byte
  99.     {
  100.         #region Paste Bereich
  101.  
  102.         [CommandInfo(Category.General, "Ping ausführen", PrimaryName = "")]
  103.         PING = 0,
  104.         [CommandInfo(Category.Response, "ACK", PrimaryName = "")]
  105.         ACK = 1,
  106.         [CommandInfo(Category.Response, "NOT!", PrimaryName = "")]
  107.         NACK = 2,
  108.         [CommandInfo(Category.GetVariable, "Status", Conversion = CommType.Status)]
  109.         REQ_STATE = 6,
  110.         [CommandInfo(Category.GetVariable, "Zyklen")]
  111.         REQ_CYCLES = 7,
  112.         [CommandInfo(Category.GetVariable, "Motor (Promille)", Unit = "‰")]
  113.         REQ_MOTOR_PROMILLE = 8,
  114.         [CommandInfo(Category.GetVariable, "Bremse (Promille)", Unit = "‰")]
  115.         REQ_BRAKE_PROMILLE = 9,
  116.         [CommandInfo(Category.GetVariable, "Bremse (binär)", Unit = "bool")]
  117.         REQ_BRAKE_STATE = 10,
  118.         [CommandInfo(Category.GetSensor, "Encoder (Gegenrad)", Unit = "U/min")]
  119.         REQ_ENCODER_GEGENRAD = 11,
  120.         [CommandInfo(Category.GetSensor, "Encoder (Motorwelle)", Unit = "U/min")]
  121.         REQ_ENCODER_MOTORWELLE = 12,
  122.         [CommandInfo(Category.GetSensor, "Alle Sensoren")]
  123.         REQ_CLIMBER_DATA = 13,
  124.         [CommandInfo(Category.GetSensor, "Gefahrene Strecke", Unit = "m", Conversion = CommType.thousands)]
  125.         REQ_DRIVEN_DISTANCE = 14,
  126.         [CommandInfo(Category.GetSensor, "Bandsensor (RAW)")]
  127.         REQ_ROPE_SENSOR_VAL = 15,
  128.         [CommandInfo(Category.GetSensor, "Bandsensor (binär)", Unit = "bool")]
  129.         REQ_ROPE_SENSOR_STATE = 16,
  130.         [CommandInfo(Category.GetSensor, "Temperatur", SecondaryName = "Sensor", Unit = "°C")]
  131.         REQ_TEMPERATURE = 17,
  132.         [CommandInfo(Category.GetSensor, "Laser(binär)", Unit = "bool")]
  133.         REQ_LASER_VAL = 18,
  134.         [CommandInfo(Category.GetSensor, "Laser(RAW)")]
  135.         REQ_LASER_STATE = 19,
  136.         [CommandInfo(Category.GetVariable, "Portdaten")]
  137.         REQ_PORT = 20,
  138.         [CommandInfo(Category.GetConstant, "Sollgeschwindigkeit (Aufstieg)", Unit = "m/s", Conversion = CommType.fixedpt)]
  139.         REQ_REGLER_SPEED_ASCENT = 30,
  140.         [CommandInfo(Category.GetConstant, "Sollgeschwindigkeit (Abstieg)", Unit = "m/s", Conversion = CommType.fixedpt)]
  141.         REQ_REGLER_SPEED_DESCENT = 31,
  142.         [CommandInfo(Category.GetConstant, "Pause (vor Aufstieg)", Unit = "ms")]
  143.         REQ_DELAY_ASCENT = 32,
  144.         [CommandInfo(Category.GetConstant, "Pause (vor Abstieg)", Unit = "ms")]
  145.         REQ_DELAY_DESCENT = 33,
  146.         [CommandInfo(Category.GetConstant, "Annäherungsgeschw. (oben)", Unit = "m/s", Conversion = CommType.fixedpt)]
  147.         REQ_APPROACH_TOP_SPEED = 34,
  148.         [CommandInfo(Category.GetConstant, "Annäherungsdistanz (oben)", Unit = "m", Conversion = CommType.thousands)]
  149.         REQ_APPROACH_TOP_DIST = 35,
  150.         [CommandInfo(Category.GetConstant, "Annäherungsgeschw. (unten)", Unit = "m/s", Conversion = CommType.fixedpt)]
  151.         REQ_APPROACH_BOTTOM_SPEED = 36,
  152.         [CommandInfo(Category.GetConstant, "Annäherungsdistanz (unten)", Unit = "m", Conversion = CommType.thousands)]
  153.         REQ_APPROACH_BOTTOM_DIST = 37,
  154.         [CommandInfo(Category.GetConstant, "Maximale Höhe", Unit = "m", Conversion = CommType.thousands)]
  155.         REQ_MAX_HEIGHT = 38,
  156.         [CommandInfo(Category.GetConstant, "Maximale Distanz", Unit = "m", Conversion = CommType.thousands)]
  157.         REQ_MAX_DISTANCE = 39,
  158.         [CommandInfo(Category.GetConstant, "Temperatur Offset", SecondaryName = "Sensor", Unit = "°C")]
  159.         REQ_TEMPERATURE_OFFSET = 40,
  160.         [CommandInfo(Category.GetConstant, "Temperatur Faktor", SecondaryName = "Sensor")]
  161.         REQ_TEMPERATURE_SCALE = 41,
  162.         [CommandInfo(Category.GetConstant, "Temperatur Threshold", SecondaryName = "Sensor", Unit = "°C")]
  163.         REQ_TEMPERATURE_THRESHOLD = 42,
  164.         [CommandInfo(Category.GetConstant, "Bandsensor Threshold")]
  165.         REQ_ROPE_SENSOR_THRESHOLD = 43,
  166.         [CommandInfo(Category.GetVariable, "PWM Sequenz Daten", SecondaryName = "Index Ende", Unit = "U/min")]
  167.         REQ_PWM_SEQ_DATA = 45,
  168.         [CommandInfo(Category.Response, "Status", Conversion = CommType.Status)]
  169.         RES_STATE = 70,
  170.         [CommandInfo(Category.Response, "Zyklen")]
  171.         RES_CYCLES = 71,
  172.         [CommandInfo(Category.Response, "Motor (Promille)", Unit = "‰")]
  173.         RES_MOTOR_PROMILLE = 72,
  174.         [CommandInfo(Category.Response, "Bremse (Promille)", PrimaryName = "", Unit = "‰")]
  175.         RES_BRAKE_PROMILLE = 73,
  176.         [CommandInfo(Category.Response, "Bremse (binär)", PrimaryName = "", Unit = "bool")]
  177.         RES_BRAKE_STATE = 74,
  178.         [CommandInfo(Category.Response, "Encoder (Gegenrad)", Unit = "U/min")]
  179.         RES_ENCODER_GEGENRAD = 75,
  180.         [CommandInfo(Category.Response, "Encoder (Motorwelle)", Unit = "U/min")]
  181.         RES_ENCODER_MOTORWELLE = 76,
  182.         [CommandInfo(Category.Response, "Alle Sensoren")]
  183.         RES_CLIMBER_DATA = 77,
  184.         [CommandInfo(Category.Response, "Gefahrene Strecke", Unit = "m", Conversion = CommType.thousands)]
  185.         RES_DRIVEN_DISTANCE = 78,
  186.         [CommandInfo(Category.Response, "Bandsensor (RAW)")]
  187.         RES_ROPE_SENSOR_VAL = 79,
  188.         [CommandInfo(Category.Response, "Bandsensor (binär)")]
  189.         RES_ROPE_SENSOR_STATE = 80,
  190.         [CommandInfo(Category.Response, "Temperatur", SecondaryName = "Sensor", Unit = "°C")]
  191.         RES_TEMPERATURE = 81,
  192.         [CommandInfo(Category.Response, "Laser(binär)", PrimaryName = "")]
  193.         RES_LASER_VAL = 82,
  194.         [CommandInfo(Category.Response, "Laser(RAW)", PrimaryName = "")]
  195.         RES_LASER_STATE = 83,
  196.         [CommandInfo(Category.Response, "Portdaten", PrimaryName = "")]
  197.         RES_PORT = 84,
  198.         [CommandInfo(Category.Response, "Sollgeschwindigkeit (Aufstieg)", Unit = "m/s", Conversion = CommType.fixedpt)]
  199.         RES_REGLER_SPEED_ASCENT = 94,
  200.         [CommandInfo(Category.Response, "Sollgeschwindigkeit (Abstieg)", Unit = "m/s", Conversion = CommType.fixedpt)]
  201.         RES_REGLER_SPEED_DESCENT = 95,
  202.         [CommandInfo(Category.Response, "Pause (vor Aufstieg)", Unit = "ms")]
  203.         RES_DELAY_ASCENT = 96,
  204.         [CommandInfo(Category.Response, "Pause (vor Abstieg)", Unit = "ms")]
  205.         RES_DELAY_DESCENT = 97,
  206.         [CommandInfo(Category.Response, "Annäherungsgeschw. (oben)", Unit = "m/s", Conversion = CommType.fixedpt)]
  207.         RES_APPROACH_TOP_SPEED = 98,
  208.         [CommandInfo(Category.Response, "Annäherungsdistanz (oben)", Unit = "m", Conversion = CommType.thousands)]
  209.         RES_APPROACH_TOP_DIST = 99,
  210.         [CommandInfo(Category.Response, "Annäherungsgeschw. (unten)", Unit = "m/s", Conversion = CommType.fixedpt)]
  211.         RES_APPROACH_BOTTOM_SPEED = 100,
  212.         [CommandInfo(Category.Response, "Annäherungsdistanz (unten)", Unit = "m", Conversion = CommType.thousands)]
  213.         RES_APPROACH_BOTTOM_DIST = 101,
  214.         [CommandInfo(Category.Response, "Maximale Höhe", Unit = "m", Conversion = CommType.thousands)]
  215.         RES_MAX_HEIGHT = 102,
  216.         [CommandInfo(Category.Response, "Maximale Distanz", Unit = "m", Conversion = CommType.thousands)]
  217.         RES_MAX_DISTANCE = 103,
  218.         [CommandInfo(Category.Response, "Temperatur Offset", SecondaryName = "Sensor", Unit = "°C")]
  219.         RES_TEMPERATURE_OFFSET = 104,
  220.         [CommandInfo(Category.Response, "Temperatur Faktor", SecondaryName = "Sensor")]
  221.         RES_TEMPERATURE_SCALE = 105,
  222.         [CommandInfo(Category.Response, "Temperatur Threshold", SecondaryName = "Sensor", Unit = "°C")]
  223.         RES_TEMPERATURE_THRESHOLD = 106,
  224.         [CommandInfo(Category.Response, "Bandsensor Threshold")]
  225.         RES_ROPE_SENSOR_THRESHOLD = 107,
  226.         [CommandInfo(Category.Response, "Reglerstatus", PrimaryName = "")]
  227.         RES_REGLER_STATE_BROADCAST = 108,
  228.         [CommandInfo(Category.Response, "PWM Sequenz Daten")]
  229.         RES_PWM_SEQ_DATA = 109,
  230.         [CommandInfo(Category.SetVariable, "Zyklen")]
  231.         SET_CYCLES = 134,
  232.         [CommandInfo(Category.SetVariable, "Status", Conversion = CommType.Status)]
  233.         SET_STATE = 135,
  234.         [CommandInfo(Category.SetVariable, "Motor (Promille)", Unit = "‰")]
  235.         SET_MOTOR_PROMILLE = 136,
  236.         [CommandInfo(Category.SetVariable, "Bremse (Promille)", Unit = "‰")]
  237.         SET_BRAKE_PROMILLE = 137,
  238.         [CommandInfo(Category.SetVariable, "Bremse (binär)", Unit = "bool")]
  239.         SET_BRAKE_STATE = 138,
  240.         [CommandInfo(Category.SetVariable, "Portdaten", PrimaryName = "")]
  241.         SET_PORT = 148,
  242.         [CommandInfo(Category.SetConstant, "Sollgeschwindigkeit (Aufstieg)", Unit = "m/s", Conversion = CommType.fixedpt)]
  243.         SET_REGLER_SPEED_ASCENT = 158,
  244.         [CommandInfo(Category.SetConstant, "Sollgeschwindigkeit (Abstieg)", Unit = "m/s", Conversion = CommType.fixedpt)]
  245.         SET_REGLER_SPEED_DESCENT = 159,
  246.         [CommandInfo(Category.SetConstant, "Pause (vor Aufstieg)", Unit = "ms")]
  247.         SET_DELAY_ASCENT = 160,
  248.         [CommandInfo(Category.SetConstant, "Pause (vor Abstieg)", Unit = "ms")]
  249.         SET_DELAY_DESCENT = 161,
  250.         [CommandInfo(Category.SetConstant, "Annäherungsgeschw. (oben)", Unit = "m/s", Conversion = CommType.fixedpt)]
  251.         SET_APPROACH_TOP_SPEED = 162,
  252.         [CommandInfo(Category.SetConstant, "Annäherungsdistanz (oben)", Unit = "m", Conversion = CommType.thousands)]
  253.         SET_APPROACH_TOP_DIST = 163,
  254.         [CommandInfo(Category.SetConstant, "Annäherungsgeschw. (unten)", Unit = "m/s", Conversion = CommType.fixedpt)]
  255.         SET_APPROACH_BOTTOM_SPEED = 164,
  256.         [CommandInfo(Category.SetConstant, "Annäherungsdistanz (unten)", Unit = "m", Conversion = CommType.thousands)]
  257.         SET_APPROACH_BOTTOM_DIST = 165,
  258.         [CommandInfo(Category.SetConstant, "Maximale Höhe", Unit = "m", Conversion = CommType.thousands)]
  259.         SET_MAX_HEIGHT = 166,
  260.         [CommandInfo(Category.SetConstant, "Maximale Distanz", Unit = "m", Conversion = CommType.thousands)]
  261.         SET_MAX_DISTANCE = 167,
  262.         [CommandInfo(Category.SetConstant, "Temperatur Offset", SecondaryName = "Sensor", Unit = "°C")]
  263.         SET_TEMPERATURE_OFFSET = 168,
  264.         [CommandInfo(Category.SetConstant, "Temperatur Faktor", SecondaryName = "Sensor")]
  265.         SET_TEMPERATURE_SCALE = 169,
  266.         [CommandInfo(Category.SetConstant, "Temperatur Threshold", SecondaryName = "Sensor", Unit = "°C")]
  267.         SET_TEMPERATURE_THRESHOLD = 170,
  268.         [CommandInfo(Category.SetConstant, "Bandsensor Threshold")]
  269.         SET_ROPE_SENSOR_THRESHOLD = 171,
  270.         [CommandInfo(Category.SetConstant, "Reglerstatus broadcasten")]
  271.         SET_REGLER_STATE_BROADCAST = 172,
  272.         [CommandInfo(Category.Command, "Start", PrimaryName = "")]
  273.         CMD_START = 200,
  274.         [CommandInfo(Category.Command, "Stopp", PrimaryName = "")]
  275.         CMD_STOP = 201,
  276.         [CommandInfo(Category.Command, "Fahren (manuell, geregelt)", Unit = "m/s")]
  277.         CMD_SETSPEED = 202,
  278.         [CommandInfo(Category.Command, "Fahren (manuell, geregelt)", Unit = "U/min")]
  279.         CMD_SETSPEED_RPM = 203,
  280.         [CommandInfo(Category.Command, "Fahren (manuell)", Unit = "‰")]
  281.         CMD_SETSPEED_PROMILLE = 204,
  282.         [CommandInfo(Category.Command, "Notaus", PrimaryName = "")]
  283.         CMD_NOTAUS = 205,
  284.         [CommandInfo(Category.Command, "Profil laden")]
  285.         CMD_LOAD_PROFILE = 206,
  286.         [CommandInfo(Category.Command, "Profil speichern", SecondaryName = "Set as Default")]
  287.         CMD_SAVE_PROFILE = 207,
  288.         [CommandInfo(Category.Command, "Kalibrierdaten speichern")]
  289.         CMD_SAVE_CALIBRATION = 208,
  290.         [CommandInfo(Category.Command, "Abstieg", PrimaryName = "")]
  291.         CMD_DESCENT = 209,
  292.         [CommandInfo(Category.Command, "PWM Sequenz Messung", PrimaryName = "Start-PWM ‰", SecondaryName = "End-PWM ‰")]
  293.         CMD_START_PWM_SEQ = 210,
  294.         [CommandInfo(Category.General, "Debugstring")]
  295.         RAW_PAYLOAD = 255,
  296.  
  297.  
  298.         #endregion
  299.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement