1 package org.coolreader.crengine;
2 
3 import android.content.Context;
4 import android.util.Log;
5 import android.view.View;
6 
7 import java.util.List;
8 
9 public class EinkScreenNook implements EinkScreen {
10 
11 	public static final Logger log = L.create("nook", Log.VERBOSE);
12 
13 	/// variables
14 	protected EinkUpdateMode mUpdateMode = EinkUpdateMode.Unspecified;
15 	// 0 - Clear, set only for old_mode == 2
16 	// 1 - Fast, always set in prepare
17 	// 2 - Active, set in prepare
18 	protected int mUpdateInterval;
19 	protected int mRefreshNumber = -1;
20 	protected boolean mIsSleep = false;
21 
22 	@Override
setupController(EinkUpdateMode mode, int updateInterval, View view)23 	public void setupController(EinkUpdateMode mode, int updateInterval, View view) {
24 		mUpdateInterval = updateInterval;
25 		if (mUpdateMode.equals(mode))
26 			return;
27 		log.d("EinkScreenNookTolino.setupController(): mode=" + mode);
28 		switch (mode) {
29 			case Clear:
30 				if (mUpdateMode == EinkUpdateMode.Active) {
31 					mRefreshNumber = -1;
32 				} else {
33 					mRefreshNumber = 0;
34 				}
35 				break;
36 			case Fast:
37 				mRefreshNumber = 0;
38 				break;
39 			default:
40 				mRefreshNumber = -1;
41 		}
42 		mUpdateMode = mode;
43 	}
44 
45 	@Override
prepareController(View view, boolean isPartially)46 	public void prepareController(View view, boolean isPartially) {
47 		//System.err.println("Sleep = " + isPartially);
48 		if (isPartially || mIsSleep != isPartially) {
49 			nookSleepController(isPartially, view);
50 //				if (isPartially)
51 			return;
52 		}
53 		if (mRefreshNumber == -1) {
54 			switch (mUpdateMode) {
55 				case Clear:
56 					nookSetMode(view, mUpdateMode);
57 					break;
58 				case Active:
59 					if (mUpdateInterval == 0) {
60 						nookSetMode(view, mUpdateMode);
61 					}
62 					break;
63 			}
64 			mRefreshNumber = 0;
65 			return;
66 		}
67 		if (mUpdateMode == EinkUpdateMode.Clear) {
68 			nookSetMode(view, mUpdateMode);
69 			return;
70 		}
71 		if (mUpdateInterval > 0 || mUpdateMode == EinkUpdateMode.Fast) {
72 			if (mRefreshNumber == 0 || (mUpdateMode == EinkUpdateMode.Fast && mRefreshNumber < mUpdateInterval)) {
73 				switch (mUpdateMode) {
74 					case Active:
75 						nookSetMode(view, mUpdateMode);
76 						break;
77 					case Fast:
78 						nookSetMode(view, mUpdateMode);
79 						break;
80 				}
81 			} else if (mUpdateInterval <= mRefreshNumber) {
82 				nookSetMode(view, EinkUpdateMode.Clear);
83 				mRefreshNumber = -1;
84 			}
85 			if (mUpdateInterval > 0) {
86 				mRefreshNumber++;
87 			}
88 		}
89 	}
90 
91 	@Override
updateController(View view, boolean isPartially)92 	public void updateController(View view, boolean isPartially) {
93 		// do nothing...
94 	}
95 
96 	@Override
refreshScreen(View view)97 	public void refreshScreen(View view) {
98 		mRefreshNumber = -1;
99 	}
100 
101 	@Override
getUpdateMode()102 	public EinkUpdateMode getUpdateMode() {
103 		return mUpdateMode;
104 	}
105 
106 	@Override
getUpdateInterval()107 	public int getUpdateInterval() {
108 		return mUpdateInterval;
109 	}
110 
111 	@Override
getFrontLightValue(Context context)112 	public int getFrontLightValue(Context context) {
113 		return 0;
114 	}
115 
116 	@Override
setFrontLightValue(Context context, int value)117 	public boolean setFrontLightValue(Context context, int value) {
118 		return false;
119 	}
120 
121 	@Override
getWarmLightValue(Context context)122 	public int getWarmLightValue(Context context) {
123 		return 0;
124 	}
125 
126 	@Override
setWarmLightValue(Context context, int value)127 	public boolean setWarmLightValue(Context context, int value) {
128 		return false;
129 	}
130 
131 	@Override
getFrontLightLevels(Context context)132 	public List<Integer> getFrontLightLevels(Context context) {
133 		return null;
134 	}
135 
136 	@Override
getWarmLightLevels(Context context)137 	public List<Integer> getWarmLightLevels(Context context) {
138 		return null;
139 	}
140 
141 
142 	// private methods
nookSleepController(boolean toSleep, View view)143 	private void nookSleepController(boolean toSleep, View view) {
144 		if (toSleep != mIsSleep) {
145 			log.d("+++SleepController " + toSleep);
146 			mIsSleep = toSleep;
147 			if (mIsSleep) {
148 				switch (mUpdateMode) {
149 					case Clear:
150 						break;
151 					case Fast:
152 						break;
153 					case Active:
154 						nookSetMode(view, EinkUpdateMode.Clear);
155 						mRefreshNumber = -1;
156 				}
157 			} else {
158 				setupController(mUpdateMode, mUpdateInterval, view);
159 			}
160 		}
161 	}
162 
nookSetMode(View view, EinkUpdateMode mode)163 	private void nookSetMode(View view, EinkUpdateMode mode) {
164 		switch (mode) {
165 			case Clear:
166 				N2EpdController.setMode(N2EpdController.REGION_APP_3,
167 						N2EpdController.WAVE_GC,
168 						N2EpdController.MODE_ONESHOT_ALL);
169 //				N2EpdController.MODE_CLEAR, view);
170 				break;
171 			case Fast:
172 				N2EpdController.setMode(N2EpdController.REGION_APP_3,
173 						N2EpdController.WAVE_GU,
174 						N2EpdController.MODE_ONESHOT_ALL);
175 //				N2EpdController.MODE_ONESHOT_ALL, view);
176 				break;
177 			case Active:
178 				N2EpdController.setMode(N2EpdController.REGION_APP_3,
179 						N2EpdController.WAVE_GL16,
180 						N2EpdController.MODE_ACTIVE_ALL);
181 //				N2EpdController.MODE_ACTIVE_ALL, view);
182 				break;
183 		}
184 	}
185 }
186