CTrafficConfigDlg Class Reference

A class for the IDM Model Configuration Dialog. More...

#include <TrafficConfigDlg.h>

Collaboration diagram for CTrafficConfigDlg:

Collaboration graph
[legend]

List of all members.

Public Types

enum  { IDD = IDD_TRAFFICCONFIG }

Public Member Functions

 CTrafficConfigDlg (CWnd *pParent=NULL)

Public Attributes

CComboBox m_cmbVehicleClassCopy
CComboBox m_cmbVehicleClassDefine
int m_nFixCols
int m_nFixRows
int m_nCols
int m_nRows
CStringArray m_sDistributions
CIDMParameterSet m_IDMParams_Car
CIDMParameterSet m_IDMParams_SmallTruck
CIDMParameterSet m_IDMParams_LargeTruck
CIDMParameterSet m_IDMParams_Crane
CIDMParameterSet m_IDMParams_Lowloader
CGridCtrl m_Grid

Protected Member Functions

virtual void DoDataExchange (CDataExchange *pDX)
virtual BOOL OnInitDialog ()
afx_msg void OnBtnCopy ()
afx_msg void OnSelchangeCmbClassCopy ()
afx_msg void OnSelchangeCmbClassDefine ()
void OnGridEndEdit (NMHDR *pNotifyStruct, LRESULT *pResult)

Private Member Functions

CParameterMapRowToParameter (int row)
 MAPPING FUNCTIONS FOR TEXT/OBJECT TO ID & BACK.
void SetParamData (int row, int col, double val)
void SetParamData (int row, int col, CString str)
CIDMParameterSetMapIDMParamSet (int iSelect)
void LoadRow (int row)
WORD MapDistributionString (CString dist)
CString MapDistributionID (WORD distID)
void LoadParamsIntoGrid ()
void SetCells ()
void SetGridHeadings ()

Private Attributes

CIDMParameterSetm_pCurrentIDMParamSet
CIDMParameterSetm_pCopyIDMParamSet
CStringArray m_sCmbOptions
CStringArray m_sRowHeaders
CStringArray m_sColumnHeaders


Detailed Description

A class for the IDM Model Configuration Dialog.

Definition at line 20 of file TrafficConfigDlg.h.


Member Enumeration Documentation

anonymous enum

Enumerator:
IDD 

Definition at line 28 of file TrafficConfigDlg.h.

00028 { IDD = IDD_TRAFFICCONFIG };


Constructor & Destructor Documentation

CTrafficConfigDlg::CTrafficConfigDlg ( CWnd *  pParent = NULL  ) 

Definition at line 21 of file TrafficConfigDlg.cpp.

References FIXED_COLUMNS, FIXED_ROWS, m_nCols, m_nFixCols, m_nFixRows, m_nRows, m_sCmbOptions, m_sColumnHeaders, m_sDistributions, and m_sRowHeaders.

00022         : CDialog(CTrafficConfigDlg::IDD, pParent)
00023 {
00024     m_sDistributions.Add("Exponential");
00025     m_sDistributions.Add("Log-Normal");
00026     m_sDistributions.Add("Gamma");
00027         m_sDistributions.Add("Gumbel");
00028         m_sDistributions.Add("Poisson");
00029         m_sDistributions.Add("GEV");
00030         m_sDistributions.Add("Normal");
00031         m_sDistributions.Add("Constant");
00032 
00033         m_sColumnHeaders.Add("Distribution");
00034         m_sColumnHeaders.Add("Location");
00035         m_sColumnHeaders.Add("Scale");
00036         m_sColumnHeaders.Add("Shape");
00037 
00038         m_sRowHeaders.Add("Safe time headway, T (s)");
00039         m_sRowHeaders.Add("Maximum acceleration, a (m/s^2)");
00040         m_sRowHeaders.Add("Comfortable decceleration, b (m/s^2)");      
00041         m_sRowHeaders.Add("Minimum jam distance, s0 (m)");
00042         m_sRowHeaders.Add("Elastic jam distance, s1 (m)");
00043         m_sRowHeaders.Add("Desired velocity, v0 (km/h)");
00044         m_sRowHeaders.Add("Acceleration exponent, delta");
00045         m_sRowHeaders.Add("Lane change politeness factor, p");
00046         m_sRowHeaders.Add("Outside lane bias factor, deltaAbias");
00047         m_sRowHeaders.Add("Lane change threshold, deltaAth (m/s^2)");
00048 
00049         m_sCmbOptions.Add("Class 0 - Cars");
00050         m_sCmbOptions.Add("Class 1 - Small Truck");
00051         m_sCmbOptions.Add("Class 2 - Large Truck");
00052         m_sCmbOptions.Add("Class 3 - Crane");
00053         m_sCmbOptions.Add("Class 4 - Low-loader");
00054         
00055         m_nFixCols = FIXED_COLUMNS;     // MAGIC NUMBER for row & column heads
00056         m_nFixRows = FIXED_ROWS;
00057         m_nCols = m_sColumnHeaders.GetSize() + m_nFixCols;
00058         m_nRows = m_sRowHeaders.GetSize() + m_nFixRows;
00059 
00060         //{{AFX_DATA_INIT(CTrafficConfigDlg)
00061                 // NOTE: the ClassWizard will add member initialization here
00062         //}}AFX_DATA_INIT
00063 }


Member Function Documentation

void CTrafficConfigDlg::DoDataExchange ( CDataExchange *  pDX  )  [protected, virtual]

Definition at line 66 of file TrafficConfigDlg.cpp.

References IDC_CMB_CLASSCOPY, IDC_CMB_CLASSDEFINE, IDC_GRID, m_cmbVehicleClassCopy, m_cmbVehicleClassDefine, and m_Grid.

00067 {
00068         CDialog::DoDataExchange(pDX);
00069         //{{AFX_DATA_MAP(CTrafficConfigDlg)
00070         DDX_Control(pDX, IDC_CMB_CLASSCOPY, m_cmbVehicleClassCopy);
00071         DDX_Control(pDX, IDC_CMB_CLASSDEFINE, m_cmbVehicleClassDefine);
00072         DDX_Control(pDX, IDC_GRID, m_Grid);             // associate the grid window with a C++ object
00073         //}}AFX_DATA_MAP
00074 }

BOOL CTrafficConfigDlg::OnInitDialog (  )  [protected, virtual]

Definition at line 89 of file TrafficConfigDlg.cpp.

References LoadParamsIntoGrid(), m_cmbVehicleClassCopy, m_cmbVehicleClassDefine, m_Grid, m_IDMParams_Car, m_nCols, m_nFixCols, m_nFixRows, m_nRows, m_pCurrentIDMParamSet, m_sCmbOptions, SetCells(), and SetGridHeadings().

00090 {
00091         CDialog::OnInitDialog();
00092 
00093         TRY {
00094                 m_Grid.SetRowCount(m_nRows);
00095                 m_Grid.SetColumnCount(m_nCols);
00096                 m_Grid.SetFixedRowCount(m_nFixRows);
00097                 m_Grid.SetFixedColumnCount(m_nFixCols);
00098         }
00099         CATCH (CMemoryException, e)
00100         {
00101                 e->ReportError();
00102                 return FALSE;
00103         }
00104         END_CATCH
00105         
00106         SetGridHeadings();
00107         SetCells();
00108         m_Grid.AutoSizeColumn(0);       // headings
00109         m_Grid.ExpandToFit();
00110         
00111         m_pCurrentIDMParamSet = &m_IDMParams_Car;
00112         LoadParamsIntoGrid();
00113 
00114         // Load ComboBox text dynamically
00115         for(int i = 0; i < m_sCmbOptions.GetSize(); i++)
00116         {
00117                 m_cmbVehicleClassDefine.AddString(m_sCmbOptions.GetAt(i));
00118                 m_cmbVehicleClassCopy.AddString(m_sCmbOptions.GetAt(i));
00119         }
00120         // Select the first vehicle class
00121         m_cmbVehicleClassDefine.SelectString(0,m_sCmbOptions.GetAt(0));
00122 
00123         return TRUE;  // return TRUE  unless you set the focus to a control
00124 }

Here is the call graph for this function:

void CTrafficConfigDlg::OnBtnCopy (  )  [protected]

Definition at line 200 of file TrafficConfigDlg.cpp.

References LoadParamsIntoGrid(), m_pCopyIDMParamSet, and m_pCurrentIDMParamSet.

00201 {
00202         // Once something is chosen
00203         if( m_pCurrentIDMParamSet != NULL && m_pCopyIDMParamSet != NULL)
00204         {
00205                 // and they are not the same objects
00206                 if( m_pCurrentIDMParamSet != m_pCopyIDMParamSet )
00207                 {
00208                         // copy them
00209                         *m_pCurrentIDMParamSet = *m_pCopyIDMParamSet;
00210                         LoadParamsIntoGrid();
00211                 }
00212         }
00213 }

Here is the call graph for this function:

void CTrafficConfigDlg::OnSelchangeCmbClassCopy (  )  [protected]

Definition at line 215 of file TrafficConfigDlg.cpp.

References m_cmbVehicleClassCopy, m_pCopyIDMParamSet, and MapIDMParamSet().

00216 {
00217         int iSelect = m_cmbVehicleClassCopy.GetCurSel();
00218         m_pCopyIDMParamSet = MapIDMParamSet(iSelect);   
00219 }

Here is the call graph for this function:

void CTrafficConfigDlg::OnSelchangeCmbClassDefine (  )  [protected]

Definition at line 221 of file TrafficConfigDlg.cpp.

References LoadParamsIntoGrid(), m_cmbVehicleClassDefine, m_pCurrentIDMParamSet, and MapIDMParamSet().

00222 {
00223         // Load chosen paramset into m_pCurrentIDMParamSet
00224         int iSelect = m_cmbVehicleClassDefine.GetCurSel();
00225         m_pCurrentIDMParamSet = MapIDMParamSet(iSelect);
00226 
00227         LoadParamsIntoGrid();
00228 }

Here is the call graph for this function:

void CTrafficConfigDlg::OnGridEndEdit ( NMHDR *  pNotifyStruct,
LRESULT *  pResult 
) [protected]

Definition at line 231 of file TrafficConfigDlg.cpp.

References m_Grid, m_nFixCols, and SetParamData().

00232 {
00233         // if change is ok, then *pResult 0, else *pResult -1
00234         
00235         // pItem is the cell that has just been edited
00236     NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
00237     
00238     int row = pItem->iRow;
00239         int col = pItem->iColumn;
00240 
00241         if(col == m_nFixCols)   // is the distriubtion column
00242         {
00243                 CString strCell = m_Grid.GetCell(row,col)->GetText();
00244                 if(strCell != "")
00245                 {
00246                         // data is ok
00247                         SetParamData(row,col,strCell);
00248                         *pResult = 0;
00249                 }       
00250                 else
00251                         *pResult = -1;
00252         }
00253         else
00254         {
00255                 // no need to verify CNumericCells since will always be a number
00256                 // even deleting a cell's data results in a zero
00257                 double val = ((CGridCellNumeric *)(m_Grid.GetCell(row,col)))->GetNumber();
00258                 SetParamData(row,col,val);
00259                 *pResult = 0;
00260         }
00261 }

Here is the call graph for this function:

CParameter * CTrafficConfigDlg::MapRowToParameter ( int  row  )  [private]

MAPPING FUNCTIONS FOR TEXT/OBJECT TO ID & BACK.

Definition at line 295 of file TrafficConfigDlg.cpp.

References CIDMParameterSet::get_A(), CIDMParameterSet::get_B(), CIDMParameterSet::get_Bias(), CIDMParameterSet::get_Delta(), CIDMParameterSet::get_DeltaAth(), CIDMParameterSet::get_Polite(), CIDMParameterSet::get_S0(), CIDMParameterSet::get_S1(), CIDMParameterSet::get_T(), CIDMParameterSet::get_V0(), m_nFixRows, and m_pCurrentIDMParamSet.

Referenced by LoadRow(), and SetParamData().

00296 {
00297         // This function assumes m_pCurrentIDMParamSet != NULL
00298         // This function assumes the order of the parameters does not change
00299 
00300         // this means we're independent of m_nFixCols in the cases
00301         row = row - m_nFixRows; 
00302         switch(row)
00303         {
00304                 case 0:         return m_pCurrentIDMParamSet->get_T();
00305                 case 1:         return m_pCurrentIDMParamSet->get_A();
00306                 case 2:         return m_pCurrentIDMParamSet->get_B();
00307                 case 3:         return m_pCurrentIDMParamSet->get_S0();
00308                 case 4:         return m_pCurrentIDMParamSet->get_S1();
00309                 case 5:         return m_pCurrentIDMParamSet->get_V0();
00310                 case 6:         return m_pCurrentIDMParamSet->get_Delta();
00311                 case 7:         return m_pCurrentIDMParamSet->get_Polite();
00312                 case 8:         return m_pCurrentIDMParamSet->get_Bias();
00313                 case 9:         return m_pCurrentIDMParamSet->get_DeltaAth();
00314                 default:        return m_pCurrentIDMParamSet->get_T();  // T
00315         }
00316 }

Here is the call graph for this function:

void CTrafficConfigDlg::SetParamData ( int  row,
int  col,
double  val 
) [private]

Definition at line 270 of file TrafficConfigDlg.cpp.

References CParameter::getDistribution(), m_nFixCols, MapRowToParameter(), CDistribution::setLocation(), CDistribution::setScale(), and CDistribution::setShape().

Referenced by OnGridEndEdit().

00271 {
00272         CParameter* currentParam = MapRowToParameter(row);
00273 
00274         // this means we're independent of m_nFixCols in the cases
00275         col = col - m_nFixCols; 
00276         switch(col)
00277         {
00278                 case 1:
00279                         currentParam->getDistribution()->setLocation(val);
00280                         break;
00281                 case 2:
00282                         currentParam->getDistribution()->setScale(val);
00283                         break;
00284                 case 3:
00285                         currentParam->getDistribution()->setShape(val);
00286                         break;
00287                 default:
00288                         currentParam->getDistribution()->setLocation(val);
00289         }
00290 }

Here is the call graph for this function:

void CTrafficConfigDlg::SetParamData ( int  row,
int  col,
CString  str 
) [private]

Definition at line 263 of file TrafficConfigDlg.cpp.

References CParameter::getDistribution(), MapDistributionString(), MapRowToParameter(), and CDistribution::setDistributionID().

00264 {
00265         CParameter* currentParam = MapRowToParameter(row);
00266         WORD dist = MapDistributionString(str);
00267         currentParam->getDistribution()->setDistributionID(dist);
00268 }

Here is the call graph for this function:

CIDMParameterSet * CTrafficConfigDlg::MapIDMParamSet ( int  iSelect  )  [private]

Definition at line 318 of file TrafficConfigDlg.cpp.

References m_IDMParams_Car, m_IDMParams_Crane, m_IDMParams_LargeTruck, m_IDMParams_Lowloader, and m_IDMParams_SmallTruck.

Referenced by OnSelchangeCmbClassCopy(), and OnSelchangeCmbClassDefine().

00319 {
00320         // Note that this function requires the index of the
00321         // m_sCmbOptions text to not change. There is no way 
00322         // to avoid this since some function must map the txt
00323         // string to the m-IDMParams_ classes
00324 
00325         switch(iSelect)
00326         {
00327                 case 0:         return &m_IDMParams_Car;
00328                 case 1:         return &m_IDMParams_SmallTruck;
00329                 case 2:         return &m_IDMParams_LargeTruck;
00330                 case 3:         return &m_IDMParams_Crane;
00331                 case 4:         return &m_IDMParams_Lowloader;
00332                 default:        return &m_IDMParams_Car;
00333         }
00334 }

void CTrafficConfigDlg::LoadRow ( int  row  )  [private]

Definition at line 184 of file TrafficConfigDlg.cpp.

References CParameter::getDistribution(), CDistribution::getDistributionID(), CDistribution::getLocation(), CDistribution::getScale(), CDistribution::getShape(), m_Grid, m_nFixCols, MapDistributionID(), and MapRowToParameter().

Referenced by LoadParamsIntoGrid().

00185 {
00186         CParameter* pParam = MapRowToParameter(row);
00187         
00188         int col = m_nFixCols;
00189         CString txt = MapDistributionID( pParam->getDistribution()->getDistributionID() );
00190         m_Grid.SetItemText(row,col,txt);
00191         
00192         CGridCellNumeric* pCell1 = (CGridCellNumeric *)(m_Grid.GetCell(row,col+1));
00193         CGridCellNumeric* pCell2 = (CGridCellNumeric *)(m_Grid.GetCell(row,col+2));
00194         CGridCellNumeric* pCell3 = (CGridCellNumeric *)(m_Grid.GetCell(row,col+3));
00195         pCell1->SetNumber(pParam->getDistribution()->getLocation());
00196         pCell2->SetNumber(pParam->getDistribution()->getScale());
00197         pCell3->SetNumber(pParam->getDistribution()->getShape());
00198 }

Here is the call graph for this function:

WORD CTrafficConfigDlg::MapDistributionString ( CString  dist  )  [private]

Definition at line 354 of file TrafficConfigDlg.cpp.

References DIST_CONST, DIST_EXPONENTIAL, DIST_GAMMA, DIST_GEV, DIST_GUMBEL, DIST_LOGNORMAL, DIST_NORMAL, DIST_POISSON, and m_sDistributions.

Referenced by SetParamData().

00355 {
00356         // Note this function reqires the order of the distributions 
00357         // to not change
00358         int i = 0;
00359         while(dist != m_sDistributions.GetAt(i))
00360                 i++;
00361 
00362         switch(i)
00363         {
00364                 case 0:         return DIST_EXPONENTIAL;
00365                 case 1:         return DIST_LOGNORMAL;
00366                 case 2:         return DIST_GAMMA;               
00367                 case 3:         return DIST_GUMBEL;                      
00368                 case 4:         return DIST_POISSON;                     
00369                 case 5:         return DIST_GEV;                         
00370                 case 6:         return DIST_NORMAL;                      
00371                 case 7:         return DIST_CONST;                       
00372                 default:        return DIST_CONST;
00373         }
00374 }

CString CTrafficConfigDlg::MapDistributionID ( WORD  distID  )  [private]

Definition at line 336 of file TrafficConfigDlg.cpp.

References DIST_CONST, DIST_EXPONENTIAL, DIST_GAMMA, DIST_GEV, DIST_GUMBEL, DIST_LOGNORMAL, DIST_NORMAL, DIST_POISSON, and m_sDistributions.

Referenced by LoadRow().

00337 {
00338         // Note this function reqires the order of the distributions 
00339         // to not change
00340         switch(distID)
00341         {
00342                 case DIST_EXPONENTIAL:  return m_sDistributions.GetAt(0);
00343                 case DIST_LOGNORMAL:    return m_sDistributions.GetAt(1);
00344                 case DIST_GAMMA:                return m_sDistributions.GetAt(2);
00345                 case DIST_GUMBEL:               return m_sDistributions.GetAt(3);
00346                 case DIST_POISSON:              return m_sDistributions.GetAt(4);
00347                 case DIST_GEV:                  return m_sDistributions.GetAt(5);
00348                 case DIST_NORMAL:               return m_sDistributions.GetAt(6);
00349                 case DIST_CONST:                return m_sDistributions.GetAt(7);
00350                 default:                                return m_sDistributions.GetAt(7);       // constant
00351         }
00352 }

void CTrafficConfigDlg::LoadParamsIntoGrid (  )  [private]

Definition at line 164 of file TrafficConfigDlg.cpp.

References LoadRow(), m_Grid, and m_nFixRows.

Referenced by OnBtnCopy(), OnInitDialog(), and OnSelchangeCmbClassDefine().

00165 {
00166         // First, clear the grid
00167 //      CCellRange range(m_nFixRows,m_nFixCols,m_Grid.GetRowCount()-m_nFixRows, m_Grid.GetColumnCount()-m_nFixCols);
00168 //      m_Grid.ClearCells( range );
00169 
00170         LoadRow(m_nFixRows);
00171         LoadRow(m_nFixRows+1);
00172         LoadRow(m_nFixRows+2);
00173         LoadRow(m_nFixRows+3);
00174         LoadRow(m_nFixRows+4);
00175         LoadRow(m_nFixRows+5);
00176         LoadRow(m_nFixRows+6);
00177         LoadRow(m_nFixRows+7);
00178         LoadRow(m_nFixRows+8);
00179         LoadRow(m_nFixRows+9);
00180 
00181         m_Grid.Refresh();
00182 }

Here is the call graph for this function:

void CTrafficConfigDlg::SetCells (  )  [private]

Definition at line 141 of file TrafficConfigDlg.cpp.

References m_Grid, m_nCols, m_nRows, and m_sDistributions.

Referenced by OnInitDialog().

00142 {
00143         for (int row = 1; row < m_nRows; row++)
00144         {
00145                 int col = 1;
00146                 m_Grid.SetCellType(row,col, RUNTIME_CLASS(CGridCellCombo));     
00147             CGridCellCombo *pCell = (CGridCellCombo*) m_Grid.GetCell(row,col);
00148                 pCell->SetOptions(m_sDistributions);
00149                 pCell->SetStyle(CBS_DROPDOWNLIST); //CBS_DROPDOWN, CBS_DROPDOWNLIST, CBS_SIMPLE
00150         }
00151 
00152         for (row = 1; row < m_nRows; row++)
00153         {
00154                 for (int col = 2; col < m_nCols; col++)
00155                 {
00156                         m_Grid.SetCellType(row,col, RUNTIME_CLASS(CGridCellNumeric));
00157                         m_Grid.GetCell(row,col)->SetFormat(DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS);
00158                         CGridCellNumeric *pCell = (CGridCellNumeric*)m_Grid.GetCell(row,col);
00159                         pCell->SetFlags(CGridCellNumeric::Real | CGridCellNumeric::Negative);
00160                 }
00161         }
00162 }

void CTrafficConfigDlg::SetGridHeadings (  )  [private]

Definition at line 126 of file TrafficConfigDlg.cpp.

References m_Grid, m_nCols, m_nRows, m_sColumnHeaders, and m_sRowHeaders.

Referenced by OnInitDialog().

00127 {
00128         int row = 0;
00129         int col = 0;
00130 
00131         // Set fixed column text
00132         for (col = 1; col < m_nCols; col++)
00133                 m_Grid.SetItemText(row,col,m_sColumnHeaders.GetAt(col-1));
00134 
00135         // Set fixed row text
00136         col = 0;
00137         for (row = 1; row < m_nRows; row++)
00138                 m_Grid.SetItemText(row,col,m_sRowHeaders.GetAt(row-1));
00139 }


Member Data Documentation

Definition at line 29 of file TrafficConfigDlg.h.

Referenced by DoDataExchange(), OnInitDialog(), and OnSelchangeCmbClassCopy().

Definition at line 30 of file TrafficConfigDlg.h.

Referenced by DoDataExchange(), OnInitDialog(), and OnSelchangeCmbClassDefine().

Definition at line 33 of file TrafficConfigDlg.h.

Referenced by CTrafficConfigDlg(), OnInitDialog(), SetCells(), and SetGridHeadings().

Definition at line 34 of file TrafficConfigDlg.h.

Referenced by CTrafficConfigDlg(), OnInitDialog(), SetCells(), and SetGridHeadings().

Definition at line 37 of file TrafficConfigDlg.h.

Referenced by MapIDMParamSet(), and CEvolveTrafficView::OnConfigTraf().

Definition at line 38 of file TrafficConfigDlg.h.

Referenced by MapIDMParamSet(), and CEvolveTrafficView::OnConfigTraf().

Definition at line 39 of file TrafficConfigDlg.h.

Referenced by MapIDMParamSet(), and CEvolveTrafficView::OnConfigTraf().

Definition at line 40 of file TrafficConfigDlg.h.

Referenced by MapIDMParamSet(), and CEvolveTrafficView::OnConfigTraf().

Definition at line 76 of file TrafficConfigDlg.h.

Referenced by OnBtnCopy(), and OnSelchangeCmbClassCopy().

CStringArray CTrafficConfigDlg::m_sCmbOptions [private]

Definition at line 77 of file TrafficConfigDlg.h.

Referenced by CTrafficConfigDlg(), and OnInitDialog().

CStringArray CTrafficConfigDlg::m_sRowHeaders [private]

Definition at line 78 of file TrafficConfigDlg.h.

Referenced by CTrafficConfigDlg(), and SetGridHeadings().

CStringArray CTrafficConfigDlg::m_sColumnHeaders [private]

Definition at line 79 of file TrafficConfigDlg.h.

Referenced by CTrafficConfigDlg(), and SetGridHeadings().


The documentation for this class was generated from the following files:

Generated on Wed Aug 20 00:48:46 2008 for EvolveTraffic by  doxygen 1.5.6