Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • authierj/dfall-system
1 result
Show changes
Showing
with 311 additions and 115 deletions
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "crazyFlyZone.h" #include "crazyFlyZone.h"
#include "ui_mainguiwindow.h" #include "ui_mainguiwindow.h"
#include "rosNodeThread.h" #include "rosNodeThread_for_systemConfigGUI.h"
#include <QObject> #include <QObject>
......
// Copyright (C) 2017, ETH Zurich, D-ITET, Paul Beuchat
//
// This file is part of D-FaLL-System.
//
// D-FaLL-System is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// D-FaLL-System is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with D-FaLL-System. If not, see <http://www.gnu.org/licenses/>.
//
//
// ----------------------------------------------------------------------------------
// DDDD FFFFF L L SSSS Y Y SSSS TTTTT EEEEE M M
// D D F aaa L L S Y Y S T E MM MM
// D D --- FFFF a a L L --- SSS Y SSS T EEE M M M
// D D F a aa L L S Y S T E M M
// DDDD F aa a LLLL LLLL SSSS Y SSSS T EEEEE M M
//
//
// DESCRIPTION:
// Constants that are used across multiple files
//
// ----------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------
// U U
// U U
// U U
// U U
// UUU
// ----------------------------------------------------------------------------------
// Conversions between degrees and radians
#define RAD2DEG 180.0/PI
#define DEG2RAD PI/180.0
// PI
#define PI 3.141592653589
// ----------------------------------------------------------------------------------
//
//
//
//
//
// ----------------------------------------------------------------------------------
// The types, i.e., agent or coordinator
#define TYPE_INVALID -1
#define TYPE_COORDINATOR 1
#define TYPE_AGENT 2
// ----------------------------------------------------------------------------------
//
//
//
//
//
// ----------------------------------------------------------------------------------
// These constants define the modes that can be used for controller this is
// running on-board the Crazyflie 2.0.
// Therefore, the constants defined here need to be in agreement with those
// defined in the firmware running on-board the Crazyflie 2.0.
// The following is a short description about each mode:
//
// CF_COMMAND_TYPE_MOTORS
// In this mode the Crazyflie will apply the requested 16-bit per motor
// command directly to each of the motors
//
// CF_COMMAND_TYPE_RATE
// In this mode the Crazyflie will apply the requested 16-bit per motor
// command directly to each of the motors, and additionally request the
// body frame roll, pitch, and yaw angular rates from the PID rate
// controllers implemented in the Crazyflie 2.0 firmware.
//
// CF_COMMAND_TYPE_ANGLE
// In this mode the Crazyflie will apply the requested 16-bit per motor
// command directly to each of the motors, and additionally request the
// body frame roll, pitch, and yaw angles from the PID attitude
// controllers implemented in the Crazyflie 2.0 firmware.
#define CF_COMMAND_TYPE_MOTORS 6
#define CF_COMMAND_TYPE_RATE 7
#define CF_COMMAND_TYPE_ANGLE 8
// Types of controllers being used:
#define DEFAULT_CONTROLLER 1
#define DEMO_CONTROLLER 2
#define STUDENT_CONTROLLER 3
#define MPC_CONTROLLER 4
#define REMOTE_CONTROLLER 5
#define TUNING_CONTROLLER 6
#define PICKER_CONTROLLER 7
// The constants that "command" changes in the
// operation state of this agent
#define CMD_USE_DEFAULT_CONTROLLER 1
#define CMD_USE_DEMO_CONTROLLER 2
#define CMD_USE_STUDENT_CONTROLLER 3
#define CMD_USE_MPC_CONTROLLER 4
#define CMD_USE_REMOTE_CONTROLLER 5
#define CMD_USE_TUNING_CONTROLLER 6
#define CMD_USE_PICKER_CONTROLLER 7
#define CMD_CRAZYFLY_TAKE_OFF 11
#define CMD_CRAZYFLY_LAND 12
#define CMD_CRAZYFLY_MOTORS_OFF 13
// Flying states
#define STATE_MOTORS_OFF 1
#define STATE_TAKE_OFF 2
#define STATE_FLYING 3
#define STATE_LAND 4
#define STATE_UNAVAILABLE 5
// Commands for CrazyRadio
#define CMD_RECONNECT 0
#define CMD_DISCONNECT 1
// CrazyRadio states:
#define CRAZY_RADIO_STATE_CONNECTED 0
#define CRAZY_RADIO_STATE_CONNECTING 1
#define CRAZY_RADIO_STATE_DISCONNECTED 2
// ----------------------------------------------------------------------------------
// BBBB A TTTTT TTTTT EEEEE RRRR Y Y
// B B A A T T E R R Y Y
// BBBB A A T T EEE RRRR Y
// B B AAAAA T T E R R Y
// BBBB A A T T EEEEE R R Y
// ----------------------------------------------------------------------------------
// Battery levels
#define BATTERY_LEVEL_000 0
#define BATTERY_LEVEL_010 1
#define BATTERY_LEVEL_020 2
#define BATTERY_LEVEL_030 3
#define BATTERY_LEVEL_040 4
#define BATTERY_LEVEL_050 5
#define BATTERY_LEVEL_060 6
#define BATTERY_LEVEL_070 7
#define BATTERY_LEVEL_080 8
#define BATTERY_LEVEL_090 9
#define BATTERY_LEVEL_100 10
#define BATTERY_LEVEL_UNAVAILABLE -1
// Battery states
#define BATTERY_STATE_NORMAL 0
#define BATTERY_STATE_LOW 1
// ----------------------------------------------------------------------------------
// Y Y A M M L
// Y Y A A MM MM L
// Y A A M M M L
// Y AAAAA M M L
// Y A A M M LLLLL
// ----------------------------------------------------------------------------------
// For where to load the yaml file from
#define LOAD_YAML_FROM_AGENT 1
#define LOAD_YAML_FROM_COORDINATOR 2
// ----------------------------------------------------------------------------------
//
//
//
//
//
// ----------------------------------------------------------------------------------
// For standard buttons in the GUI
#define REQUEST_DEFAULT_SETPOINT_BUTTON_ID 100
\ No newline at end of file
...@@ -38,21 +38,32 @@ ...@@ -38,21 +38,32 @@
#include <QGraphicsSvgItem> #include <QGraphicsSvgItem>
#include <QSvgRenderer> #include <QSvgRenderer>
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
#include "d_fall_pps/CrazyflieData.h" // Include the Crazyflie Data Struct
#include "dfall_pkg/FlyingVehicleState.h"
// Include other classes
#include "classes/GetParamtersAndNamespaces.h"
#else
// Include the shared definitions
#include "include/constants_for_qt_compile.h"
#endif #endif
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
using namespace d_fall_pps; using namespace dfall_pkg;
#endif #endif
#define DRONE_HEIGHT 100 * FROM_MILIMETERS_TO_UNITS * 1.2 #define DRONE_HEIGHT 100 * FROM_MILIMETERS_TO_UNITS * 1.2
#define DRONE_WIDTH 100 * FROM_MILIMETERS_TO_UNITS * 1.2 #define DRONE_WIDTH 100 * FROM_MILIMETERS_TO_UNITS * 1.2
class crazyFly : public QGraphicsSvgItem class crazyFly : public QGraphicsSvgItem
{ {
public: public:
explicit crazyFly(const CrazyflieData* p_crazyfly_msg, QString filename, QGraphicsItem * parent = 0); explicit crazyFly(const FlyingVehicleState* p_crazyfly_msg, QString filename, QGraphicsItem * parent = 0);
~crazyFly(); ~crazyFly();
QRectF boundingRect() const; QRectF boundingRect() const;
...@@ -60,7 +71,7 @@ public: ...@@ -60,7 +71,7 @@ public:
const QStyleOptionGraphicsItem * option, const QStyleOptionGraphicsItem * option,
QWidget * widget); QWidget * widget);
void updateCF(const CrazyflieData* p_crazyfly_msg); void updateCF(const FlyingVehicleState* p_crazyfly_msg);
std::string getName(); std::string getName();
...@@ -83,7 +94,7 @@ private: ...@@ -83,7 +94,7 @@ private:
std::string m_name; std::string m_name;
qreal m_x; qreal m_x;
qreal m_y; qreal m_y;
qreal m_z; qreal m_z = 0.0;
qreal m_roll; qreal m_roll;
qreal m_pitch; qreal m_pitch;
...@@ -91,6 +102,8 @@ private: ...@@ -91,6 +102,8 @@ private:
bool m_occluded; bool m_occluded;
qreal m_baseline_scale = 1.0;
// info for plotting CF // info for plotting CF
qreal m_width; qreal m_width;
qreal m_height; qreal m_height;
......
...@@ -41,9 +41,4 @@ ...@@ -41,9 +41,4 @@
#define FROM_CENTIMETERS_TO_UNITS 1 #define FROM_CENTIMETERS_TO_UNITS 1
#define FROM_MILIMETERS_TO_UNITS 0.1 #define FROM_MILIMETERS_TO_UNITS 0.1
#define PI 3.1415926
#define FROM_RADIANS_TO_DEGREES 180.0/PI
#define FROM_DEGREES_TO_RADIANS PI/180.0
#endif #endif
// Copyright (C) 2017, ETH Zurich, D-ITET, Angel Romero // Copyright (C) 2017, ETH Zurich, D-ITET, Paul Beuchat, Angel Romero
// //
// This file is part of D-FaLL-System. // This file is part of D-FaLL-System.
// //
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
// //
// //
// DESCRIPTION: // DESCRIPTION:
// Teacher's GUI main window header. // System Config GUI main window header.
// //
// ---------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------
...@@ -38,42 +38,40 @@ ...@@ -38,42 +38,40 @@
#include <QTimer> #include <QTimer>
#include <QGridLayout> #include <QGridLayout>
#include <QGraphicsRectItem> #include <QGraphicsRectItem>
#include <QLineEdit>
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
#include "rosNodeThread.h" #include "rosNodeThread_for_systemConfigGUI.h"
// Include the standard message types
#include "std_msgs/Int32.h"
//#include "std_msgs/Float32.h"
//#include <std_msgs/String.h>
// Include the DFALL message types
#include "dfall_pkg/IntWithHeader.h"
#include "marker.h" #include "marker.h"
#include "crazyFly.h" #include "crazyFly.h"
#include "CFLinker.h" #include "CFLinker.h"
#include "d_fall_pps/CrazyflieDB.h" // Include the DFALL service types
#include "d_fall_pps/CrazyflieEntry.h" #include "dfall_pkg/CrazyflieDB.h"
#include "d_fall_pps/CustomControllerYAML.h" #include "dfall_pkg/CrazyflieEntry.h"
#include <std_msgs/Int32.h> // Include the shared definitions
#include "nodes/Constants.h"
// Include other classes
#include "classes/GetParamtersAndNamespaces.h"
// The constants that are sent to the agents in order to
// "command" changes in their operation state
#define CMD_USE_SAFE_CONTROLLER 1
#define CMD_USE_CUSTOM_CONTROLLER 2
#define CMD_CRAZYFLY_TAKE_OFF 3
#define CMD_CRAZYFLY_LAND 4
#define CMD_CRAZYFLY_MOTORS_OFF 5
// The constants that are sent to the agents in order to using namespace dfall_pkg;
// adjust their radio connection
#define CMD_RECONNECT 0
#define CMD_DISCONNECT 1
// For which controller parameters to load
#define LOAD_YAML_SAFE_CONTROLLER_AGENT 1
#define LOAD_YAML_CUSTOM_CONTROLLER_AGENT 2
#define LOAD_YAML_SAFE_CONTROLLER_COORDINATOR 3
#define LOAD_YAML_CUSTOM_CONTROLLER_COORDINATOR 4
#else
using namespace d_fall_pps; // Include the shared definitions
#include "include/constants_for_qt_compile.h"
#endif #endif
...@@ -134,6 +132,8 @@ private slots: ...@@ -134,6 +132,8 @@ private slots:
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
#endif #endif
float validate_and_get_value_from_lineEdit(QLineEdit * lineEdit, float min, float max, int decimals, float default_value);
void doNumCrazyFlyZonesChanged(int n); void doNumCrazyFlyZonesChanged(int n);
void transitionToMode(int mode); void transitionToMode(int mode);
void on_removeTable_clicked(); void on_removeTable_clicked();
...@@ -165,12 +165,14 @@ private slots: ...@@ -165,12 +165,14 @@ private slots:
void on_load_from_DB_button_clicked(); void on_load_from_DB_button_clicked();
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
void updateNewViconData(const ptrToMessage& p_msg); void updateNewViconData(const ptrToMessage& p_msg);
#endif #endif
void on_checkBox_vicon_crazyflies_toggled(bool checked); void on_checkBox_vicon_crazyflies_toggled(bool checked);
void on_scaleSpinBox_valueChanged(double arg1); void on_scaleSpinBox_valueChanged(double arg1);
void on_refresh_cfs_button_clicked(); void on_refresh_cfs_button_clicked();
void on_refresh_student_ids_button_clicked(); void on_refresh_student_ids_button_clicked();
...@@ -182,27 +184,17 @@ private slots: ...@@ -182,27 +184,17 @@ private slots:
void updateComboBoxes(); void updateComboBoxes();
void setTabIndex(int index); void setTabIndex(int index);
void doTabClosed(int tab_index); void doTabClosed(int tab_index);
void on_comboBoxCFs_currentTextChanged(const QString &arg1); void on_comboBoxCFs_currentTextChanged(const QString &arg1);
// For the buttons that "command" all of the agent nodes // For the emergency stop button
// > For the radio connection void on_emergency_stop_button_clicked();
void on_all_connect_button_clicked();
void on_all_disconnect_button_clicked(); // For automatically validating the zmin and zmax line edits
// > For changing the operation state void on_lineEdit_zmin_editingFinished();
void on_all_take_off_button_clicked(); void on_lineEdit_zmax_editingFinished();
void on_all_land_button_clicked();
void on_all_motors_off_button_clicked();
void on_all_enable_safe_controller_button_clicked();
void on_all_enable_custom_controller_button_clicked();
// > For loading the parameter
void on_all_load_safe_controller_yaml_own_agent_button_clicked();
void on_all_load_custom_controller_yaml_own_agent_button_clicked();
// > For sending a message with updated parameters
void on_all_load_safe_controller_yaml_coordinator_button_clicked();
void on_all_load_custom_controller_yaml_coordinator_button_clicked();
private: private:
...@@ -210,25 +202,19 @@ private: ...@@ -210,25 +202,19 @@ private:
Ui::MainGUIWindow *ui; Ui::MainGUIWindow *ui;
myGraphicsScene* scene; myGraphicsScene* scene;
ros::Timer m_timer_yaml_file_for_safe_controller;
ros::Timer m_timer_yaml_file_for_custom_controller;
void _init(); void _init();
void safeYamlFileTimerCallback(const ros::TimerEvent&); #ifdef CATKIN_MAKE
void customYamlFileTimerCallback(const ros::TimerEvent&);
void customSendYamlAsMessageTimerCallback(const ros::TimerEvent&);
float getParameterFloat(ros::NodeHandle& nodeHandle, std::string name); float getParameterFloat(ros::NodeHandle& nodeHandle, std::string name);
void getParameterFloatVector(ros::NodeHandle& nodeHandle, std::string name, std::vector<float>& val, int length); void getParameterFloatVectorKnownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<float>& val, int length);
int getParameterInt(ros::NodeHandle& nodeHandle, std::string name); int getParameterInt(ros::NodeHandle& nodeHandle, std::string name);
void getParameterIntVectorWithKnownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<int>& val, int length); void getParameterIntVectorWithKnownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<int>& val, int length);
int getParameterIntVectorWithUnknownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<int>& val); int getParameterIntVectorWithUnknownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<int>& val);
bool getParameterBool(ros::NodeHandle& nodeHandle, std::string name); bool getParameterBool(ros::NodeHandle& nodeHandle, std::string name);
#endif
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
rosNodeThread* _rosNodeThread; rosNodeThread* _rosNodeThread;
std::vector<Marker*> markers_vector; std::vector<Marker*> markers_vector;
std::vector<crazyFly*> crazyflies_vector; std::vector<crazyFly*> crazyflies_vector;
...@@ -236,28 +222,9 @@ private: ...@@ -236,28 +222,9 @@ private:
std::string ros_namespace; std::string ros_namespace;
ros::Publisher DBChangedPublisher; //ros::Publisher DBChangedPublisher;
ros::Publisher emergencyStopPublisher; ros::Publisher emergencyStopPublisher;
#endif
// Publsher for sending "commands" from here (the master) to all
// of the agent nodes (where a "command" is the integer that
// gives the directive to "take-off", "land, "motors-off", etc...)
ros::Publisher commandAllAgentsPublisher;
// Publisher for sending a request from here (the master) to all "Parameter Service" nodes
// that it should re-load parameters from the YAML file for the controllers.
// > This is recieved and acted on by both Coordinate and Agent type "Parameter Services",
// > A coordinator type "Parameter Service" will subsequently request the agents to fetch
// the parameters from itself.
// > A agent type "Parameter Service" will subsequently request its own agent to fetch
// the parameters from itself.
ros::Publisher requestLoadControllerYamlPublisher;
// Publisher for sending a request from here (the master) to all
// of the agents nodes that they should (re/dis)-connect from
// the Crazy-Radio
ros::Publisher crazyRadioCommandAllAgentsPublisher;
#endif
void updateComboBoxesCFs(); void updateComboBoxesCFs();
...@@ -265,6 +232,8 @@ private: ...@@ -265,6 +232,8 @@ private:
int getTabIndexFromName(QString name); int getTabIndexFromName(QString name);
#ifdef CATKIN_MAKE
CrazyflieDB m_data_base; CrazyflieDB m_data_base;
void clear_database_file(); void clear_database_file();
...@@ -276,6 +245,7 @@ private: ...@@ -276,6 +245,7 @@ private:
void save_database_file(); void save_database_file();
void insert_or_update_entry_database(CrazyflieEntry entry); void insert_or_update_entry_database(CrazyflieEntry entry);
#endif
}; };
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
// //
// //
// DESCRIPTION: // DESCRIPTION:
// Teacher's GUI marker object, to represent unlabeled markers. // System Config GUI marker object, to represent unlabeled markers.
// //
// ---------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------
...@@ -38,12 +38,12 @@ ...@@ -38,12 +38,12 @@
#include <QGraphicsEllipseItem> #include <QGraphicsEllipseItem>
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
#include "d_fall_pps/UnlabeledMarker.h" #include "dfall_pkg/UnlabeledMarker.h"
#endif #endif
#ifdef CATKIN_MAKE #ifdef CATKIN_MAKE
using namespace d_fall_pps; using namespace dfall_pkg;
#endif #endif
#define MARKER_DIAMETER 20 * FROM_MILIMETERS_TO_UNITS #define MARKER_DIAMETER 20 * FROM_MILIMETERS_TO_UNITS
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
// ---------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------
#ifndef ___ROSNODETHREAD_H___ #ifndef ___ROSNODETHREAD_FOR_SYSTEMCONFIGGUI_H___
#define ___ROSNODETHREAD_H___ #define ___ROSNODETHREAD_FOR_SYSTEMCONFIGGUI_H___
#include <QtCore> #include <QtCore>
#include <QThread> #include <QThread>
...@@ -43,11 +43,11 @@ ...@@ -43,11 +43,11 @@
#include <ros/ros.h> #include <ros/ros.h>
#include <ros/network.h> #include <ros/network.h>
#include "d_fall_pps/UnlabeledMarker.h" #include "dfall_pkg/UnlabeledMarker.h"
#include "d_fall_pps/CrazyflieData.h" #include "dfall_pkg/FlyingVehicleState.h"
#include "d_fall_pps/ViconData.h" #include "dfall_pkg/ViconData.h"
using namespace d_fall_pps; using namespace dfall_pkg;
typedef ViconData::ConstPtr ptrToMessage; typedef ViconData::ConstPtr ptrToMessage;
......
...@@ -164,11 +164,17 @@ void CFLinker::link(int student_id, int cf_zone_index, std::string cf_name, std: ...@@ -164,11 +164,17 @@ void CFLinker::link(int student_id, int cf_zone_index, std::string cf_name, std:
links.push_back(tmp_link); links.push_back(tmp_link);
// TODO: remove options linked from available ones // TODO: remove options linked from available ones
// Get the index of the currently selected CF
int index = m_ui->comboBoxCFs->currentIndex(); int index = m_ui->comboBoxCFs->currentIndex();
// remove items // Remove item from the CF Combo Box
m_ui->comboBoxCFs->removeItem(index); m_ui->comboBoxCFs->removeItem(index);
index = m_ui->comboBoxCFZones->currentIndex();
m_ui->comboBoxCFZones->removeItem(index);
// THIS WAS COMMENTED OUT TO ALLOW ASSIGNING MULTIPLE CRAYZFLIES TO ONE ZONE
// Get the index of the currently selected CF
//index = m_ui->comboBoxCFZones->currentIndex();
// Remove item from the CF Combo Box
//m_ui->comboBoxCFZones->removeItem(index);
// disable item // disable item
// m_ui->comboBoxCFs->setItemData(index, 0, Qt::UserRole - 1); // m_ui->comboBoxCFs->setItemData(index, 0, Qt::UserRole - 1);
......
...@@ -35,21 +35,24 @@ ...@@ -35,21 +35,24 @@
std::map<std::string, std::string> channel_LUT std::map<std::string, std::string> channel_LUT
{ {
// {"CF1", "A12D2"}, {"CF01", "0/0/2M/E7E7E7E701"},
// {"CF2", "E341E"}, {"CF02", "0/8/2M/E7E7E7E702"},
// {"CF3", "4E21A"}, {"CF03", "0/16/2M/E7E7E7E703"},
{"cfOne", "0/76/2M/E7E7E7E701"}, {"CF04", "0/24/2M/E7E7E7E704"},
{"cfTwo", "0/69/2M"}, {"CF05", "0/32/2M/E7E7E7E705"},
{"cfThree", "0/72/2M"}, {"CF06", "0/40/2M/E7E7E7E706"},
{"cfFour", "0/99/2M"}, {"CF07", "0/48/2M/E7E7E7E707"},
{"PPS_CF01", "0/0/2M/E7E7E7E701"}, {"CF08", "0/56/2M/E7E7E7E708"},
{"PPS_CF02", "0/8/2M/E7E7E7E702"}, {"CF09", "0/64/2M/E7E7E7E709"},
{"PPS_CF03", "0/16/2M/E7E7E7E703"}, {"CF10", "0/72/2M/E7E7E7E70A"},
{"PPS_CF04", "0/24/2M/E7E7E7E704"}, {"CF11", "0/80/2M/E7E7E7E70B"},
{"PPS_CF05", "0/32/2M/E7E7E7E705"}, {"CF12", "0/88/2M/E7E7E7E70C"},
{"PPS_CF06", "0/40/2M/E7E7E7E706"}, {"CF13", "0/96/2M/E7E7E7E70D"},
{"PPS_CF07", "0/48/2M/E7E7E7E707"}, {"CF14", "0/104/2M/E7E7E7E70E"},
{"PPS_CF08", "0/56/2M/E7E7E7E708"}, {"CF15", "0/112/2M/E7E7E7E70F"},
{"PPS_CF09", "0/56/2M/E7E7E7E709"}, {"CF16", "0/120/2M/E7E7E7E710"},
{"PPS_CF10", "0/56/2M/E7E7E7E70A"}, {"CF17", "0/4/2M/E7E7E7E711"},
{"CF18", "0/12/2M/E7E7E7E712"},
{"CF19", "0/20/2M/E7E7E7E713"},
{"CF20", "0/28/2M/E7E7E7E714"},
}; };