00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "stdafx.h"
00014 #include "ControlPanel.h"
00015 #include "SpiConfigDlg.h"
00016 #include ".\spiconfigdlg.h"
00017 #include "../common/I2cBridge.h"
00018 #include "../common/u2c_common_func.h"
00019
00020 bool ConfigureSpi(HANDLE hDevice, BOOL* pUseSS, ULONG* pSSPin, BOOL* pActiveHigh)
00021 {
00022 U2C_RESULT res = U2C_SUCCESS;
00023 BYTE Cpol, Cpha;
00024 BYTE Freq;
00025 try
00026 {
00027 if (U2C_SUCCESS != (res = U2C_SpiGetConfig(hDevice, &Cpol, &Cpha)))
00028 throw res;
00029 if (U2C_SUCCESS != (res = U2C_SpiGetFreq(hDevice, &Freq)))
00030 throw res;
00031 CSpiConfigDlg dlg(hDevice, Cpol, Cpha, Freq, *pUseSS, *pSSPin, *pActiveHigh);
00032 dlg.DoModal();
00033 *pUseSS = dlg.m_UseSS;
00034 *pSSPin = dlg.m_SSPin;
00035 *pActiveHigh = dlg.m_ActiveHigh;
00036 return true;
00037 }
00038 catch (U2C_RESULT res)
00039 {
00040 switch (res)
00041 {
00042 case U2C_NOT_IMPLEMENTED:
00043 {
00044 ShowNotImplementedMessage();
00045 return false;
00046 }
00047 case U2C_HARDWARE_NOT_FOUND:
00048 {
00049 MessageBox(NULL, "U2C device not connected", NULL, MB_OK|MB_ICONEXCLAMATION);
00050 return false;
00051 }
00052 default:
00053 {
00054 CString str;
00055 str.Format("SPI configuration failed, error - %d", res);
00056 MessageBox(NULL, str, NULL, MB_OK|MB_ICONEXCLAMATION);
00057 return false;
00058 }
00059 }
00060 }
00061 }
00062
00063
00064 IMPLEMENT_DYNAMIC(CSpiConfigDlg, CDialog)
00065 CSpiConfigDlg::CSpiConfigDlg(CWnd* pParent )
00066 : CDialog(CSpiConfigDlg::IDD, pParent)
00067 , m_hDevice(INVALID_HANDLE_VALUE)
00068 , m_Cpol(0), m_Cpha(0)
00069 , m_Freq(0)
00070 {
00071 }
00072
00073 CSpiConfigDlg::CSpiConfigDlg(HANDLE hDevice, BYTE Cpol, BYTE Cpha, BYTE Freq, BOOL UseSS, ULONG SSPin, BOOL ActiveHigh)
00074 : CDialog(CSpiConfigDlg::IDD, NULL)
00075 , m_hDevice(hDevice)
00076 , m_Cpol(Cpol), m_Cpha(Cpha)
00077 , m_Freq(Freq)
00078 , m_UseSS(UseSS)
00079 , m_SSPin(SSPin)
00080 , m_ActiveHigh(ActiveHigh)
00081 {
00082 }
00083
00084
00085 CSpiConfigDlg::~CSpiConfigDlg()
00086 {
00087 }
00088
00089 CSpiConfigDlg::SSpiFreq CSpiConfigDlg::sm_Freq[] =
00090 {
00091 {"200 kHz", U2C_SPI_FREQ_200KHZ},
00092 {"100 kHz", U2C_SPI_FREQ_100KHZ},
00093 {"83 kHz", U2C_SPI_FREQ_83KHZ},
00094 {"71 kHz", U2C_SPI_FREQ_71KHZ},
00095 {"62 kHz", U2C_SPI_FREQ_62KHZ},
00096 {"50 kHz", U2C_SPI_FREQ_50KHZ},
00097 {"25 kHz", U2C_SPI_FREQ_25KHZ},
00098 {"10 kHz", U2C_SPI_FREQ_10KHZ},
00099 {"5 kHz", U2C_SPI_FREQ_5KHZ},
00100 {"2 kHz", U2C_SPI_FREQ_2KHZ},
00101 };
00102
00103
00104
00105 void CSpiConfigDlg::DoDataExchange(CDataExchange* pDX)
00106 {
00107 CDialog::DoDataExchange(pDX);
00108 DDX_Control(pDX, IDC_SPI_FREQ, m_SpiFreq);
00109 }
00110
00111
00112 BEGIN_MESSAGE_MAP(CSpiConfigDlg, CDialog)
00113 ON_BN_CLICKED(IDC_APPLY, OnBnClickedApply)
00114 ON_COMMAND(IDC_CPOL_0, OnChangeSetting)
00115 ON_COMMAND(IDC_CPOL_1, OnChangeSetting)
00116 ON_COMMAND(IDC_CPHA_0, OnChangeSetting)
00117 ON_COMMAND(IDC_CPHA_1, OnChangeSetting)
00118 ON_CBN_SELCHANGE(IDC_SPI_FREQ, OnChangeSetting)
00119 ON_CBN_SELCHANGE(IDC_SS_PIN, OnChangeSetting)
00120 ON_COMMAND(IDC_SS_ACTIVE_HIGH, OnChangeSetting)
00121 ON_BN_CLICKED(IDOK, OnBnClickedOk)
00122 ON_BN_CLICKED(IDC_SS, OnBnClickedSs)
00123 END_MESSAGE_MAP()
00124
00125
00126
00127
00128
00129 BOOL CSpiConfigDlg::OnInitDialog()
00130 {
00131 CDialog::OnInitDialog();
00132 ((CButton*)GetDlgItem(IDC_CPOL_0))->SetCheck(m_Cpol?BST_UNCHECKED:BST_CHECKED);
00133 ((CButton*)GetDlgItem(IDC_CPOL_1))->SetCheck(m_Cpol?BST_CHECKED:BST_UNCHECKED);
00134 ((CButton*)GetDlgItem(IDC_CPHA_0))->SetCheck(m_Cpha?BST_UNCHECKED:BST_CHECKED);
00135 ((CButton*)GetDlgItem(IDC_CPHA_1))->SetCheck(m_Cpha?BST_CHECKED:BST_UNCHECKED);
00136 ((CButton*)GetDlgItem(IDC_SS))->SetCheck(m_UseSS?BST_CHECKED:BST_UNCHECKED);
00137 ((CButton*)GetDlgItem(IDC_SS_ACTIVE_HIGH))->SetCheck(m_ActiveHigh?BST_CHECKED:BST_UNCHECKED);
00138
00139
00140 int i;
00141 int FreqNum = sizeof(sm_Freq) / sizeof(SSpiFreq);
00142 for(i = 0; i < FreqNum; i++)
00143 {
00144 m_SpiFreq.AddString(sm_Freq[i].m_Text);
00145 }
00146 for(i = 0; i < FreqNum; i++)
00147 {
00148 if (m_Freq <= sm_Freq[i].m_Value)
00149 {
00150 m_SpiFreq.SetCurSel(i);
00151 break;
00152 }
00153 }
00154
00155
00156 CComboBox* pSSPin = (CComboBox*)GetDlgItem(IDC_SS_PIN);
00157 pSSPin->ResetContent();
00158 for(char port = 'A'; port <= 'C'; port++)
00159 {
00160 for(char pin = '0'; pin <= '7'; pin++)
00161 {
00162 char name[4];
00163 name[0]='P'; name[1]=port; name[2]=pin; name[3]=0;
00164 pSSPin->AddString(name);
00165 }
00166 }
00167 pSSPin->SetCurSel(m_SSPin);
00168
00169 if(m_UseSS)
00170 {
00171 GetDlgItem(IDC_SS_PIN)->EnableWindow(TRUE);
00172 GetDlgItem(IDC_SS_ACTIVE_HIGH)->EnableWindow(TRUE);
00173 }
00174 else
00175 {
00176 GetDlgItem(IDC_SS_PIN)->EnableWindow(FALSE);
00177 GetDlgItem(IDC_SS_ACTIVE_HIGH)->EnableWindow(FALSE);
00178 }
00179
00180
00181 return TRUE;
00182 }
00183 bool CSpiConfigDlg::Apply()
00184 {
00185 if (((CButton*)GetDlgItem(IDC_CPOL_0))->GetCheck() == BST_CHECKED)
00186 m_Cpol = 0;
00187 else
00188 m_Cpol = 1;
00189
00190 if (((CButton*)GetDlgItem(IDC_CPHA_0))->GetCheck() == BST_CHECKED)
00191 m_Cpha = 0;
00192 else
00193 m_Cpha = 1;
00194 m_Freq = sm_Freq[m_SpiFreq.GetCurSel()].m_Value;
00195
00196
00197 if(((CButton*)GetDlgItem(IDC_SS))->GetCheck() == BST_CHECKED)
00198 m_UseSS = TRUE;
00199 else
00200 m_UseSS = FALSE;
00201
00202 if(((CButton*)GetDlgItem(IDC_SS_ACTIVE_HIGH))->GetCheck() == BST_CHECKED)
00203 m_ActiveHigh = TRUE;
00204 else
00205 m_ActiveHigh = FALSE;
00206
00207 CComboBox* pSSPin = (CComboBox*)GetDlgItem(IDC_SS_PIN);
00208 if (CB_ERR != pSSPin->GetCurSel())
00209 {
00210 m_SSPin = (ULONG)pSSPin->GetCurSel();
00211 }
00212
00213 U2C_RESULT res = U2C_SUCCESS;
00214 try
00215 {
00216 if (U2C_SUCCESS != (res = U2C_SpiSetConfig(m_hDevice, m_Cpol, m_Cpha)))
00217 throw res;
00218 if (U2C_SUCCESS != (res = U2C_SpiSetFreq(m_hDevice, m_Freq)))
00219 throw res;
00220 if(m_UseSS)
00221 {
00222 if (U2C_SUCCESS != (res = U2C_SpiConfigSS(m_hDevice, m_SSPin, m_ActiveHigh)))
00223 throw res;
00224 }
00225 }
00226 catch (U2C_RESULT res)
00227 {
00228 switch (res)
00229 {
00230 case U2C_NOT_IMPLEMENTED:
00231 {
00232 ShowNotImplementedMessage();
00233 return false;
00234 }
00235 case U2C_HARDWARE_NOT_FOUND:
00236 {
00237 MessageBox("U2C device not connected", NULL, MB_OK|MB_ICONEXCLAMATION);
00238 return false;
00239 }
00240 default:
00241 {
00242 CString str;
00243 str.Format("SPI configuration failed, error - %d", res);
00244 MessageBox(str, NULL, MB_OK|MB_ICONEXCLAMATION);
00245 return false;
00246 }
00247 }
00248 }
00249 return true;
00250 }
00251
00252 void CSpiConfigDlg::OnBnClickedApply()
00253 {
00254 if(Apply())
00255 GetDlgItem(IDC_APPLY)->EnableWindow(FALSE);
00256 }
00257
00258 void CSpiConfigDlg::OnChangeSetting()
00259 {
00260 GetDlgItem(IDC_APPLY)->EnableWindow(TRUE);
00261 }
00262 void CSpiConfigDlg::OnBnClickedOk()
00263 {
00264 if(Apply())
00265 OnOK();
00266 }
00267
00268 void CSpiConfigDlg::OnBnClickedSs()
00269 {
00270 if(((CButton*)GetDlgItem(IDC_SS))->GetCheck() == BST_CHECKED)
00271 {
00272 GetDlgItem(IDC_SS_PIN)->EnableWindow(TRUE);
00273 GetDlgItem(IDC_SS_ACTIVE_HIGH)->EnableWindow(TRUE);
00274 }
00275 else
00276 {
00277 GetDlgItem(IDC_SS_PIN)->EnableWindow(FALSE);
00278 GetDlgItem(IDC_SS_ACTIVE_HIGH)->EnableWindow(FALSE);
00279 }
00280 OnChangeSetting();
00281 }