1 package org.coolreader.crengine;
2 
3 import java.lang.reflect.Constructor;
4 import java.lang.reflect.Method;
5 import android.app.Activity;
6 
7 /**
8  * Nook Touch EPD controller interface wrapper.
9  * This class is created by DairyKnight for Nook Touch screen support in FBReaderJ.
10  * @author DairyKnight <dairyknight@gmail.com>
11  * http://forum.xda-developers.com/showthread.php?t=1183173
12  */
13 
14 public class N2EpdController {
15 	public static final int REGION_APP_1 = 0;
16 	public static final int REGION_APP_2 = 1;
17 	public static final int REGION_APP_3 = 2;
18 	public static final int REGION_APP_4 = 3;
19 
20 	public static final int WAVE_GC = 0;
21 	public static final int WAVE_GU = 1;
22 	public static final int WAVE_DU = 2;
23 	public static final int WAVE_A2 = 3;
24 	public static final int WAVE_GL16 = 4;
25 	public static final int WAVE_AUTO = 5;
26 
27 	public static final int MODE_BLINK = 0;
28 	public static final int MODE_ACTIVE = 1;
29 	public static final int MODE_ONESHOT = 2;
30 	public static final int MODE_CLEAR = 3;
31 	public static final int MODE_ACTIVE_ALL = 4;
32 	public static final int MODE_ONESHOT_ALL = 5;
33 	public static final int MODE_CLEAR_ALL = 6;
34 
35 	public static String strN2EpdInit = " N2EpdInit: ";
36 
37 	private static Method mtSetRegion = null;
38 	private static Constructor<?> RegionParamsConstructor= null;
39 	private static Constructor<?> EpdControllerConstructors[] = null;
40 	public static Activity n2MainActivity =  null;
41 	private static Object mEpdController = null;
42 
43 	private static Object[] enumsWave 	= null;
44 	private static Object[] enumsRegion	= null;
45 	private static Object[] enumsMode	= null;
46 
47 	static {
48 		if (DeviceInfo.EINK_NOOK) {
49 			try {
50 				Class<?> clEpdController     	= Class.forName("android.hardware.EpdController");
51 				Class<?> clEpdControllerWave;
52 				if (DeviceInfo.EINK_NOOK_120)
53 					clEpdControllerWave = Class.forName("android.hardware.EpdRegionParams$Wave");
54 				else
55 					clEpdControllerWave = Class.forName("android.hardware.EpdController$Wave");
56 				Class<?> clEpdControllerMode 	= Class.forName("android.hardware.EpdController$Mode");
57 				Class<?> clEpdControllerRegion = Class.forName("android.hardware.EpdController$Region");
58 
59 				Class<?> clEpdControllerRegionParams;
60 				if (DeviceInfo.EINK_NOOK_120)
61 					clEpdControllerRegionParams = Class.forName("android.hardware.EpdRegionParams");
62 				else
63 					clEpdControllerRegionParams = Class.forName("android.hardware.EpdController$RegionParams");
64 
65 				enumsWave = clEpdControllerWave.getEnumConstants();
66 
67 				enumsMode = clEpdControllerMode.getEnumConstants();
68 
69 				enumsRegion = clEpdControllerRegion.getEnumConstants();
70 
71 				RegionParamsConstructor = clEpdControllerRegionParams.getConstructor(
72 						new Class[] { Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, clEpdControllerWave});
73 				mtSetRegion = clEpdController.getMethod("setRegion", String.class, clEpdControllerRegion,
74 						clEpdControllerRegionParams, clEpdControllerMode);
75 
76 				if (DeviceInfo.EINK_NOOK_120)
77 					EpdControllerConstructors = clEpdController.getConstructors();
78 
79 				strN2EpdInit += "Ok!";
80 			} catch (Exception e) {
81 				System.err.println("Failed to init refresh EPD");
82 				System.err.println(e.toString());
83 				strN2EpdInit += "Failed: " + e.toString();
84 				e.printStackTrace();
85 			}
86 		}
87 	}
88 
setMode(int region, int wave, int mode)89 	public static void setMode(int region, int wave, int mode) {
90 		if (mtSetRegion != null) {
91 			try {
92 				if (DeviceInfo.EINK_NOOK_120 && mEpdController == null)
93 					mEpdController = EpdControllerConstructors[0].newInstance(new Object[] { n2MainActivity });
94 				Object regionParams =  RegionParamsConstructor.newInstance(new Object[] { 0, 0, 600, 800, enumsWave[wave]});
95 				mtSetRegion.invoke(mEpdController, "CoolReader", enumsRegion[region], regionParams, enumsMode[mode]);
96 			} catch (Exception e) {
97 				System.err.println("Failed: SetMode");
98 				System.err.println(e.toString());
99 				strN2EpdInit += "Failed: setMode: " + e.toString();
100 				e.printStackTrace();
101 			}
102 		}
103 	}
104 }
105