99import android .graphics .drawable .Drawable ;
1010import android .location .Location ;
1111import android .location .LocationManager ;
12- import android .os .Build ;
1312import android .os .Bundle ;
1413import android .os .Handler ;
1514import android .support .annotation .NonNull ;
2019import android .support .v4 .content .ContextCompat ;
2120import android .support .v7 .app .AlertDialog ;
2221import android .support .v7 .app .AppCompatActivity ;
22+ import android .support .v7 .widget .Toolbar ;
2323import android .util .DisplayMetrics ;
2424import android .util .Log ;
2525import android .view .GestureDetector ;
2929import android .view .MotionEvent ;
3030import android .view .View ;
3131import android .view .Window ;
32- import android .view .WindowManager ;
3332import android .widget .Button ;
3433import android .widget .ImageButton ;
3534import android .widget .ImageView ;
3635import android .widget .LinearLayout ;
3736import android .widget .RelativeLayout ;
3837import android .widget .TextView ;
3938import android .widget .Toast ;
40- import android .support .v7 .widget .Toolbar ;
4139
4240import com .github .mikephil .charting .charts .LineChart ;
41+ import com .github .mikephil .charting .components .Legend ;
42+ import com .github .mikephil .charting .data .Entry ;
43+ import com .github .mikephil .charting .data .LineData ;
44+ import com .github .mikephil .charting .data .LineDataSet ;
45+ import com .github .mikephil .charting .interfaces .datasets .ILineDataSet ;
4346import com .warkiz .widget .IndicatorSeekBar ;
4447
48+ import java .util .ArrayList ;
4549import java .util .Date ;
50+ import java .util .List ;
4651import java .util .Timer ;
4752import java .util .TimerTask ;
4853
4954import butterknife .BindView ;
5055import butterknife .ButterKnife ;
51- import io .pslab .DataFormatter ;
5256import io .pslab .R ;
5357import io .pslab .communication .ScienceLab ;
5458import io .pslab .models .SensorDataBlock ;
@@ -202,6 +206,8 @@ protected void onCreate(Bundle savedInstanceState) {
202206 pwmModeLayout = findViewById (R .id .pwm_mode_layout );
203207 previewChart = findViewById (R .id .chart_preview );
204208
209+ waveBtnActive = WaveConst .WAVE1 ;
210+ pwmBtnActive = WaveConst .SQR1 ;
205211 squareModeControls = findViewById (R .id .square_mode_controls );
206212 pwmModeControls = findViewById (R .id .pwm_mode_controls );
207213 csvLogger = new CSVLogger (getString (R .string .wave_generator ));
@@ -751,6 +757,7 @@ public void selectBtn(WaveConst btn_selected) {
751757 }
752758 prop_active = null ;
753759 toggleSeekBtns (false );
760+ previewWave ();
754761 }
755762
756763 private void selectWaveform (final int waveType ) {
@@ -778,6 +785,7 @@ private void selectWaveform(final int waveType) {
778785 }
779786 selectedWaveText .setText (waveFormText );
780787 selectedWaveImg .setImageDrawable (image );
788+ previewWave ();
781789 }
782790
783791 private void toggleDigitalMode (WaveConst mode ) {
@@ -800,6 +808,7 @@ private void toggleDigitalMode(WaveConst mode) {
800808 btnPwmSq4 .setEnabled (true );
801809 }
802810 WaveGeneratorCommon .mode_selected = mode ;
811+ previewWave ();
803812 }
804813
805814 private void fetchPropertyValue (WaveConst btnActive , WaveConst property , String unit , TextView propTextView ) {
@@ -897,11 +906,80 @@ private void setValue() {
897906 WaveGeneratorCommon .wave .get (waveBtnActive ).put (prop_active , value );
898907 }
899908 setWave ();
909+ previewWave ();
900910 Double dValue = (double ) value ;
901911 String valueText = String .valueOf (dValue .intValue ()) + " " + unit ;
902912 activePropTv .setText (valueText );
903913 }
904914
915+ private void previewWave () {
916+ List <ILineDataSet > dataSets = new ArrayList <>();
917+ ArrayList <Entry > entries = getSamplePoints (false );
918+ ArrayList <Entry > refEntries = getSamplePoints (true );
919+ LineDataSet dataSet ;
920+ LineDataSet refDataSet ;
921+ if (WaveGeneratorCommon .mode_selected == WaveConst .PWM ) {
922+ dataSet = new LineDataSet (entries , pwmBtnActive .toString ());
923+ refDataSet = new LineDataSet (refEntries , getResources ().getString (R .string .reference_wave_title ));
924+ } else {
925+ dataSet = new LineDataSet (entries , waveBtnActive .toString ());
926+ refDataSet = new LineDataSet (refEntries , getResources ().getString (R .string .reference_wave_title ));
927+ }
928+ dataSet .setDrawCircles (false );
929+ dataSet .setColor (Color .WHITE );
930+ refDataSet .setDrawCircles (false );
931+ refDataSet .setColor (Color .GRAY );
932+ dataSets .add (refDataSet );
933+ dataSets .add (dataSet );
934+ LineData data = new LineData (dataSets );
935+ data .setDrawValues (false );
936+ previewChart .setData (data );
937+ previewChart .notifyDataSetChanged ();
938+ previewChart .invalidate ();
939+ }
940+
941+ private ArrayList <Entry > getSamplePoints (boolean isReference ) {
942+ ArrayList <Entry > entries = new ArrayList <>();
943+ if (WaveGeneratorCommon .mode_selected == WaveConst .PWM ) {
944+ double freq = (double ) WaveGeneratorCommon .wave .get (WaveConst .SQR1 ).get (WaveConst .FREQUENCY );
945+ double duty = ((double ) WaveGeneratorCommon .wave .get (pwmBtnActive ).get (WaveConst .DUTY )) / 100 ;
946+ double phase = 0 ;
947+ if (pwmBtnActive != WaveConst .SQR1 && !isReference ) {
948+ phase = (double ) WaveGeneratorCommon .wave .get (pwmBtnActive ).get (WaveConst .PHASE );
949+ }
950+ for (int i = 0 ; i < 5000 ; i ++) {
951+ double t = 2 * Math .PI * freq * (i ) / 1e6 + phase * Math .PI / 180 ;
952+ double y ;
953+ if (t % (2 * Math .PI ) < 2 * Math .PI * duty ) {
954+ y = 5 ;
955+ } else {
956+ y = -5 ;
957+ }
958+ entries .add (new Entry ((float ) i , (float ) y ));
959+ }
960+ } else {
961+ double phase = 0 ;
962+ int shape = WaveGeneratorCommon .wave .get (waveBtnActive ).get (WaveConst .WAVETYPE );
963+ double freq = (double ) WaveGeneratorCommon .wave .get (waveBtnActive ).get (WaveConst .FREQUENCY );
964+
965+ if (waveBtnActive != WaveConst .WAVE1 && !isReference ) {
966+ phase = (double ) WaveGeneratorCommon .wave .get (WaveConst .WAVE2 ).get (WaveConst .PHASE );
967+ }
968+ if (shape == 1 ) {
969+ for (int i = 0 ; i < 5000 ; i ++) {
970+ float y = (float ) (5 * Math .sin (2 * Math .PI * (freq / 1e6 ) * i + phase * Math .PI / 180 ));
971+ entries .add (new Entry ((float ) i , y ));
972+ }
973+ } else {
974+ for (int i = 0 ; i < 5000 ; i ++) {
975+ float y = (float ) ((10 / Math .PI ) * (Math .asin (Math .sin (2 * Math .PI * (freq / 1e6 ) * i + phase * Math .PI / 180 ))));
976+ entries .add (new Entry ((float ) i , y ));
977+ }
978+ }
979+ }
980+ return entries ;
981+ }
982+
905983 private void chartInit () {
906984 previewChart .setTouchEnabled (true );
907985 previewChart .setHighlightPerDragEnabled (true );
@@ -912,13 +990,18 @@ private void chartInit() {
912990 previewChart .setScaleYEnabled (false );
913991 previewChart .setBackgroundColor (Color .BLACK );
914992 previewChart .getDescription ().setEnabled (false );
915- previewChart .getXAxis ().setAxisMaximum (1000 );
993+ previewChart .getXAxis ().setAxisMaximum (5000 );
916994 previewChart .getXAxis ().setAxisMinimum (0 );
917995 previewChart .getXAxis ().setTextColor (Color .WHITE );
918- previewChart .getAxisLeft ().setAxisMaximum (5 );
919- previewChart .getAxisLeft ().setAxisMinimum (-5 );
996+ previewChart .getAxisLeft ().setAxisMaximum (10 );
997+ previewChart .getAxisLeft ().setAxisMinimum (-10 );
998+ previewChart .getAxisRight ().setAxisMaximum (10 );
999+ previewChart .getAxisRight ().setAxisMinimum (-10 );
9201000 previewChart .fitScreen ();
9211001 previewChart .invalidate ();
1002+ Legend l = previewChart .getLegend ();
1003+ l .setForm (Legend .LegendForm .LINE );
1004+ l .setTextColor (Color .WHITE );
9221005 }
9231006
9241007 private void toggleSeekBtns (boolean state ) {
0 commit comments