main() { cmdScannerADT cs; scannerADT scanner; graphADT graph; printf("Graph test program\n"); cs = NewCommandScanner(); scanner = GetTokenScanner(cs); SetScannerStringOption(scanner, ScanQuotesAsStrings); graph = NewGraph(); SetGraphData(graph, NewSymbolTable()); SetCommandData(cs, graph); InitCommandTable(cs); CommandLoop(cs, "G> "); FreeCommandScanner(cs); }
/** * \brief Generates points based on selected signal type * \param[out] - * \param[in] Signal Type * \return void * \authors Arunkumar Karri * \date 03.02.2012 Created */ void CSignalDefinerDlg::vGenerateWave() { UpdateData(); SIGNAL_TYPE enSignalType = (SIGNAL_TYPE)(m_ctrSignalType.GetCurSel()); int nPointCount; double dblFrqStep, dblTimePeriod; /*Setting the Frequency Resolution to nResolution*/ dblFrqStep = m_dblSamplingTimePeriod; /* Calculate Time period per each cycle */ dblTimePeriod = 1 / m_fFrequency; //Calculate number of points to be plotted nPointCount = ((dblTimePeriod * 1000) + (dblFrqStep / 10)) * (m_nSelCycle+1); /*For variant packing purpose*/ CComVariant varrX, varrY; varrX.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount); if(varrX.parray == NULL) { return; } varrX.vt = VT_ARRAY|VT_R8; varrY.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount); if(varrY.parray == NULL) { return; } varrY.vt = VT_ARRAY|VT_R8; LONG lngCount = 0; if(dblFrqStep > 0) { /*Currently using the Peak to Peak Amplitude as 0 to 2*Amplitude instead of -Amplitude to +Amplitude*/ for(double dblCounter=0; dblCounter<nPointCount; dblCounter+=dblFrqStep) { double dblX, dblY; dblCounter /= 1000; switch(enSignalType) { case SINE_WAVE: dblX = dblCounter*1000; dblY = m_fAmplitude + m_fAmplitude * sin( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) ); break; case COS_WAVE: dblX = dblCounter*1000; dblY = m_fAmplitude + m_fAmplitude * cos( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) ); break; case TRIANGULAR_WAVE: double dblSamplingPoint; dblSamplingPoint = dblCounter; while ( dblSamplingPoint > dblTimePeriod ) { dblSamplingPoint -= dblTimePeriod; } dblX = dblCounter*1000; dblY = m_fAmplitude + CalculateYatXForTriangleWave(dblSamplingPoint, m_fAmplitude, dblTimePeriod); break; } HRESULT hr; hr = SafeArrayPutElement(varrX.parray, &lngCount, &dblX); hr = SafeArrayPutElement(varrY.parray, &lngCount, &dblY); lngCount++; dblCounter *= 1000; } } SetGraphData(&varrX, &varrY); }
/** * \brief Generates points based on selected signal type * \param[out] - * \param[in] Signal Type * \return void * \authors Arunkumar Karri * \date 03.02.2012 Created */ void CSignalDefinerDlg::vGenerateWave() { UpdateData(); SIGNAL_TYPE enSignalType = (SIGNAL_TYPE)(m_ctrSignalType.GetCurSel()); int nPointCount; double dblFrqStep, dblTimePeriod, dblSamplingPoint;; /*Setting the Frequency Resolution to nResolution*/ dblFrqStep = m_dblSamplingTimePeriod; /* Calculate Time period per each cycle */ dblTimePeriod = 1 / m_fFrequency; if(m_fFrequency == 0.0) { (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus(); return; } //Calculate number of points to be plotted nPointCount = ((dblTimePeriod * 1000) + (dblFrqStep / 10)) * (m_nSelCycle+1); if(m_btnAutoCorrect.GetCheck() == BST_CHECKED ) { if((nPointCount/(dblFrqStep*(m_nSelCycle+1))) < 8) //the no. of points in a cycle should be more than 8 to plot a proper graph { dblFrqStep = nPointCount/(9* (m_nSelCycle+1)); //set the number of required points to 9 if(dblFrqStep > MAX_SAMPLING_TIME_PERIOD) { (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus(); return; } if(dblFrqStep < 1) { (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus(); return; } m_dblSamplingTimePeriod = dblFrqStep; CString omSamplingPeriod; omSamplingPeriod.Format(_T("%d"),(int)m_dblSamplingTimePeriod); SetDlgItemText(IDC_EDIT_SIGNAL_SAMPLING_TIME, omSamplingPeriod); //This command will call this function continously, hence the above logic. nPointCount = ((dblTimePeriod * 1000) + (dblFrqStep / 10)) * (m_nSelCycle+1); } } else if(m_btnAutoCorrect.GetCheck() == BST_UNCHECKED ) { if(m_fFrequency > MAX_FREQUENCY) { (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus(); return; } if(dblFrqStep == 0) { (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus(); return; } if(dblFrqStep > MAX_SAMPLING_TIME_PERIOD) { (GetDlgItem(IDC_EDIT_SIGNAL_FREQUENCY))->SetFocus(); return; } } /*For variant packing purpose*/ CComVariant varrX, varrY; varrX.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount); if(varrX.parray == NULL) { return; } varrX.vt = VT_ARRAY|VT_R8; varrY.parray = SafeArrayCreateVector(VT_R8, 0, nPointCount); if(varrY.parray == NULL) { return; } varrY.vt = VT_ARRAY|VT_R8; LONG lngCount = 0; if(dblFrqStep > 0) { /*Currently using the Peak to Peak Amplitude as 0 to 2*Amplitude instead of -Amplitude to +Amplitude*/ for(double dblCounter=0; dblCounter<nPointCount; dblCounter+=dblFrqStep) { double dblX, dblY; dblCounter /= 1000; switch(enSignalType) { case SINE_WAVE: dblX = dblCounter*1000; dblY = m_fAmplitude + m_fAmplitude * sin( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) ); break; case COS_WAVE: dblX = dblCounter*1000; dblY = m_fAmplitude + m_fAmplitude * cos( DegreesToRadians(2 * 180 * m_fFrequency * dblCounter) ); break; case TRIANGULAR_WAVE: dblSamplingPoint = dblCounter; while ( dblSamplingPoint > dblTimePeriod ) { dblSamplingPoint -= dblTimePeriod; } dblX = dblCounter*1000; dblY = m_fAmplitude + CalculateYatXForTriangleWave(dblSamplingPoint, m_fAmplitude, dblTimePeriod); break; case SAWTOOTH_WAVE: dblSamplingPoint = dblCounter; while ( dblSamplingPoint > dblTimePeriod ) { dblSamplingPoint -= dblTimePeriod; } dblX = dblCounter*1000; dblY = m_fAmplitude + (((2 * m_fAmplitude * dblSamplingPoint)/dblTimePeriod )- m_fAmplitude);/* Sawtooth :((2A t /T) - A) */ break; } HRESULT hr; hr = SafeArrayPutElement(varrX.parray, &lngCount, &dblX); hr = SafeArrayPutElement(varrY.parray, &lngCount, &dblY); lngCount++; if ( (dblY >= 2* m_fAmplitude) && enSignalType == SAWTOOTH_WAVE ) { dblY = 0; hr = SafeArrayPutElement(varrX.parray, &lngCount, &dblX); hr = SafeArrayPutElement(varrY.parray, &lngCount, &dblY); lngCount++; } dblCounter *= 1000; } } SetGraphData(&varrX, &varrY); }