mv AccelerometerService to org.webosinternals.accelerometerservice
[webos-internals:applications.git] / org.webosinternals.accelerometerservice / AccelService.java
1 /* AccelService.java - Service to change frequency of accelerometer events */
2 /* ------------------------------------------------------------------------- */
3 /*   Copyright (C) 2009 Eric J. Gaudet
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                */
18 /* ------------------------------------------------------------------------- */
19
20 package org.webosinternals.accelservice;
21
22 import com.palm.luna.LSException;
23 import com.palm.luna.service.LunaServiceThread;
24 import com.palm.luna.service.ServiceMessage;
25 import com.palm.luna.message.ErrorMessage;
26 import java.io.BufferedReader;
27 import java.io.BufferedWriter;
28 import java.io.FileReader;
29 import java.io.FileWriter;
30 import java.io.IOException;
31 import java.io.InputStreamReader;
32 import org.json.JSONException;
33 import org.json.JSONObject;
34
35 public class AccelService extends LunaServiceThread {
36   private String hwVersion = "1.0.0";
37
38   private final String POLL_PATH = 
39     "/sys/class/input/input5/poll_interval";
40
41
42   private boolean setPollInterval(int period) {
43     BufferedWriter output;
44
45     // Only going to allow between 4 and 50 HZ for now
46     if (period > 250 || period < 20) {
47       return false;
48     }
49
50     try { 
51       output = new BufferedWriter(new FileWriter(POLL_PATH,false));
52       output.write(Integer.toString(period));
53       output.newLine();
54       output.close();
55     } catch (IOException e) {
56       return false;
57     }
58
59     return true;
60   }
61
62   private int getPollInterval() {
63     BufferedReader input;
64     FileReader fr;
65     int value;
66
67     try {
68       fr = new FileReader(POLL_PATH);
69       input = new BufferedReader(fr);
70       value = Integer.valueOf(input.readLine()).intValue();
71       input.close();
72       fr.close();
73     } catch (IOException e) {
74       value = 0;
75     }
76
77     return value;
78   }
79
80   @LunaServiceThread.PublicMethod
81     public void version(ServiceMessage message) {
82         try {
83             StringBuilder sb = new StringBuilder(8192);
84             sb.append("{version:");
85             sb.append(JSONObject.quote(this.hwVersion));
86             sb.append("}");
87             message.respond(sb.toString());
88         } catch (LSException e) {
89             this.logger.severe("", e);
90         }
91     }
92
93   @LunaServiceThread.PublicMethod
94     public void getPollFreq(ServiceMessage msg)
95     throws JSONException, LSException {
96       try {
97         StringBuilder sb = new StringBuilder(256);
98         sb.append("{freq:");
99         sb.append(Integer.toString(1000/this.getPollInterval()));
100         sb.append("}");
101         msg.respond(sb.toString());
102       } catch (LSException e) {
103         this.logger.severe("", e);
104       }
105     }
106
107   @LunaServiceThread.PublicMethod
108     public void getPollPeriod(ServiceMessage msg)
109     throws JSONException, LSException {
110       try {
111         StringBuilder sb = new StringBuilder(256);
112         sb.append("{period:");
113         sb.append(Integer.toString(this.getPollInterval()));
114         sb.append("}");
115         msg.respond(sb.toString());
116       } catch (LSException e) {
117         this.logger.severe("", e);
118       }
119     }
120
121   @LunaServiceThread.PublicMethod
122     public void setPollFreq(ServiceMessage msg)
123     throws JSONException, LSException {
124       if (msg.getJSONPayload().has("freq")) {
125         int freq = msg.getJSONPayload().getInt("freq");
126         if(setPollInterval(1000/freq)) {
127           JSONObject reply = new JSONObject();
128           reply.put("success", true);
129           msg.respond(reply.toString());
130         }
131       }
132       msg.respondError(ErrorMessage.ERROR_CODE_INVALID_PARAMETER, 
133           "Need freq in HZ");
134     }
135
136   @LunaServiceThread.PublicMethod
137     public void setPollPeriod(ServiceMessage msg)
138     throws JSONException, LSException {
139       if (msg.getJSONPayload().has("period")) {
140         int period = msg.getJSONPayload().getInt("period");
141         if(setPollInterval(period)) {
142           JSONObject reply = new JSONObject();
143           reply.put("success", true);
144           msg.respond(reply.toString());
145         }
146       }
147       msg.respondError(ErrorMessage.ERROR_CODE_INVALID_PARAMETER, 
148           "Need period in ms");
149     }
150 }