11package com .example .brainflowplot .ui .bandpowerplot ;
22
3+ import android .graphics .Color ;
34import android .os .Bundle ;
5+ import android .os .Handler ;
6+ import android .util .Log ;
47import android .view .LayoutInflater ;
58import android .view .View ;
69import android .view .ViewGroup ;
7- import android .widget .TextView ;
810
911import androidx .annotation .NonNull ;
10- import androidx .annotation .Nullable ;
1112import androidx .fragment .app .Fragment ;
12- import androidx .lifecycle .Observer ;
13- import androidx .lifecycle .ViewModelProviders ;
1413
14+ import com .example .brainflowplot .DataActivity ;
1515import com .example .brainflowplot .R ;
16+ import com .jjoe64 .graphview .GraphView ;
17+ import com .jjoe64 .graphview .GridLabelRenderer ;
18+ import com .jjoe64 .graphview .ValueDependentColor ;
19+ import com .jjoe64 .graphview .series .BarGraphSeries ;
20+ import com .jjoe64 .graphview .series .DataPoint ;
21+
22+ import org .apache .commons .lang3 .tuple .ImmutablePair ;
23+ import org .apache .commons .lang3 .tuple .Pair ;
24+
25+ import java .util .ArrayList ;
26+ import java .util .List ;
27+
28+ import brainflow .BrainFlowError ;
29+ import brainflow .DataFilter ;
30+ import brainflow .WindowFunctions ;
31+
1632
1733public class BandPowerPlotFragment extends Fragment {
1834
19- private BandPowerPlotViewModel bandPowerPlotViewModel ;
35+ public int windowSize = 2 ;
36+ public int timeSleep = 100 ;
37+ private GraphView graph = null ;
38+ private BarGraphSeries <DataPoint > series = null ;
39+
40+ private Runnable worker = null ;
41+ private final Handler handler = new Handler ();
42+
43+ private List <Pair <Integer , Integer >> bands = new ArrayList <Pair <Integer , Integer >>();
44+ private final String [] names = {"Delta" , "Theta" , "Alpha" , "Beta" , "Gamma" };
2045
2146 public View onCreateView (@ NonNull LayoutInflater inflater ,
2247 ViewGroup container , Bundle savedInstanceState ) {
23- bandPowerPlotViewModel =
24- ViewModelProviders .of (this ).get (BandPowerPlotViewModel .class );
25- View root = inflater .inflate (R .layout .fragment_bandpowerplot , container , false );
26- final TextView textView = root .findViewById (R .id .text_notifications );
27- bandPowerPlotViewModel .getText ().observe (getViewLifecycleOwner (), new Observer <String >() {
48+ View rootView = inflater .inflate (R .layout .fragment_bandpowerplot , container , false );
49+
50+ graph = (GraphView ) rootView .findViewById (R .id .bandpowergraph );
51+ graph .setTitle ("BandPower" );
52+ graph .getViewport ().setXAxisBoundsManual (true );
53+ graph .getViewport ().setMinX (0 );
54+ graph .getViewport ().setMaxX (5 );
55+ graph .getViewport ().setYAxisBoundsManual (true );
56+ graph .getViewport ().setMinY (0 );
57+ graph .getViewport ().setMaxY (1 );
58+ graph .getGridLabelRenderer ().setVerticalLabelsVisible (false );
59+ graph .getGridLabelRenderer ().setHorizontalLabelsVisible (false );
60+ graph .getGridLabelRenderer ().setGridStyle (GridLabelRenderer .GridStyle .NONE );
61+ series = new BarGraphSeries <DataPoint >();
62+ series .setValueDependentColor (new ValueDependentColor <DataPoint >() {
2863 @ Override
29- public void onChanged ( @ Nullable String s ) {
30- textView . setText ( s );
64+ public int get ( DataPoint data ) {
65+ return Color . rgb (( int ) data . getX () * 255 / 6 , ( int ) Math . abs ( data . getY () * 255 / 4 ), 100 );
3166 }
3267 });
33- return root ;
68+ series .setTitle ("Delta Theta Alpha Beta Gamma" );
69+
70+ graph .addSeries (series );
71+
72+ bands .add (new ImmutablePair <Integer , Integer >(1 , 4 ));
73+ bands .add (new ImmutablePair <Integer , Integer >(4 , 8 ));
74+ bands .add (new ImmutablePair <Integer , Integer >(8 , 13 ));
75+ bands .add (new ImmutablePair <Integer , Integer >(13 , 30 ));
76+ bands .add (new ImmutablePair <Integer , Integer >(30 , 70 ));
77+
78+ return rootView ;
79+ }
80+
81+ @ Override
82+ public void onResume () {
83+ super .onResume ();
84+
85+ worker = new Runnable () {
86+ @ Override
87+ public void run () {
88+ try {
89+ int numDataPoints = DataFilter .get_nearest_power_of_two (DataActivity .samplingRate * windowSize );
90+ double [][] tmpArray = DataActivity .boardShim .get_current_board_data (numDataPoints );
91+ if (tmpArray [0 ].length != numDataPoints ) {
92+ // dont prepend, just wait for more data
93+ return ;
94+ }
95+ // average across all channels
96+ DataPoint [] values = new DataPoint [bands .size ()];
97+ for (int i = 0 ; i < values .length ; i ++) {
98+ values [i ] = new DataPoint (i , 0 );
99+ }
100+ for (int i = 0 ; i < DataActivity .channels .length ; i ++) {
101+ double [] channel = tmpArray [DataActivity .channels [i ]];
102+ Pair <double [], double []> psd = DataFilter .get_psd (channel , 0 , channel .length , DataActivity .samplingRate , WindowFunctions .HAMMING .get_code ());
103+ for (int j = 0 ; j < bands .size (); j ++) {
104+ double bandPower = DataFilter .get_band_power (psd , bands .get (j ).getLeft (), bands .get (j ).getRight ());
105+ values [j ] = new DataPoint (values [j ].getX (), values [j ].getY () + bandPower );
106+ }
107+ }
108+ // normalize for colors
109+ double max = 0 ;
110+ for (int j = 0 ; j < bands .size (); j ++) {
111+ if (values [j ].getY () > max ) {
112+ max = values [j ].getY ();
113+ }
114+ }
115+ for (int j = 0 ; j < bands .size (); j ++) {
116+ values [j ] = new DataPoint (values [j ].getX (), values [j ].getY () / max );
117+ }
118+ series .resetData (values );
119+ } catch (BrainFlowError e ) {
120+ Log .e (getString (R .string .log_tag ), e .getMessage ());
121+ }
122+
123+ handler .postDelayed (this , timeSleep );
124+ }
125+ };
126+ handler .postDelayed (worker , timeSleep );
127+ }
128+
129+ @ Override
130+ public void onPause () {
131+ handler .removeCallbacks (worker );
132+ graph .removeAllSeries ();
133+ super .onPause ();
34134 }
35135}
0 commit comments