Weerstation.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. package weerstation;
  2. import java.util.ArrayList;
  3. import java.util.Calendar;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Timer;
  7. import java.util.TimerTask;
  8. /**
  9. * De main klasse die het hele programma aanstuurt
  10. *
  11. * @author Projectgroep B5
  12. */
  13. public class Weerstation{
  14. WeerstationConnector weerstation1;
  15. Calendar now, calPeriod;
  16. Measurement meting1;
  17. ArrayList<Measurement> meting2;
  18. ArrayList<Periode> periods;
  19. ArrayList<Grootheid> day, week, month, month3, month6, year, year2;
  20. ArrayList<ArrayList<Grootheid>> periodsScreens;
  21. Timer starter;
  22. Timer animator;
  23. int currentScreen;
  24. int periodeNr;
  25. boolean startup, startupState, load;
  26. boolean button1, button2, button3, graphIsDisplayed;
  27. /**
  28. * Constructor voor weerstation
  29. */
  30. public Weerstation(){
  31. GUIboard.init();
  32. startupState = true;
  33. starter = new Timer();
  34. startStartupAnimatie();
  35. Timer timer = new Timer();
  36. createPeriods();
  37. backgroundLoader();
  38. currentScreen = 0;
  39. periodeNr = 0;
  40. graphIsDisplayed = false;
  41. //De thread die op de achtergrond alles laad
  42. while(periodsScreens.size()<=0)
  43. {
  44. try
  45. {
  46. Thread.sleep(1);
  47. }
  48. catch(InterruptedException e)
  49. {
  50. e.printStackTrace();
  51. }
  52. }
  53. stopStartupAnimatie();
  54. while(startup)
  55. {
  56. try
  57. {
  58. Thread.sleep(1);
  59. }
  60. catch(InterruptedException e)
  61. {
  62. e.printStackTrace();
  63. }
  64. }
  65. GUIboard.clearTop();
  66. GUIboard.clearLeft();
  67. GUIboard.clearRight();
  68. //Screen switcher
  69. timer.scheduleAtFixedRate(new TimerTask()
  70. {
  71. public void run()
  72. {
  73. if(button2)
  74. {
  75. nextScreen();
  76. }
  77. else if(button1)
  78. {
  79. nextPeriod();
  80. }
  81. if(button3)
  82. {
  83. displayGraph();
  84. }
  85. else
  86. {
  87. displayMain();
  88. }
  89. }
  90. }, 0, 5*1000);
  91. //Update recent measurement every 60 seconds
  92. timer.scheduleAtFixedRate( new TimerTask()
  93. {
  94. public void run()
  95. {
  96. meting1 = weerstation1.getMostRecentMeasurement();
  97. for (ArrayList<Grootheid> l: periodsScreens)
  98. {
  99. for (Grootheid obj : l)
  100. {
  101. obj.updateRecent(meting1);
  102. }
  103. }
  104. }
  105. }, 60*1000, 60*1000);
  106. //Button checker
  107. timer.scheduleAtFixedRate( new TimerTask()
  108. {
  109. boolean oldButton1, oldButton2;
  110. public void run() {
  111. if(IO.readShort(0x0090) == 1){ //Blauw 1 aan
  112. button1 = true;
  113. }else{
  114. button1 = false;
  115. }
  116. if(IO.readShort(0x00100) == 1){ //Blauw 2 aan
  117. button2 = true;
  118. }else{
  119. button2 = false;
  120. }
  121. if(IO.readShort(0x0080) == 1){ //Rood aan
  122. button3 = true;
  123. displayGraph();
  124. }else{
  125. button3 = false;
  126. if(graphIsDisplayed){
  127. displayMain();
  128. }
  129. }
  130. if(button2 == !oldButton2){ // If the button is changed, the play/pauze icon wil be updated
  131. displayMain();
  132. oldButton2 = button2;
  133. }
  134. if(button1 == !oldButton1){ // If the button is changed, the play/pauze icon wil be updated
  135. displayMain();
  136. oldButton1 = button1;
  137. }
  138. }
  139. }, 0, 200);
  140. }
  141. public void createPeriods()
  142. {
  143. now = Calendar.getInstance();
  144. calPeriod = Calendar.getInstance();
  145. periods = new ArrayList<Periode>();
  146. calPeriod.add(Calendar.DATE, -1);
  147. periods.add(new Periode(now, calPeriod, "Dag"));
  148. calPeriod = Calendar.getInstance();
  149. calPeriod.add(Calendar.DATE, -7);
  150. periods.add(new Periode(now, calPeriod, "Week"));
  151. calPeriod = Calendar.getInstance();
  152. calPeriod.add(Calendar.MONTH, -1);
  153. periods.add(new Periode(now, calPeriod, "Maand"));
  154. calPeriod = Calendar.getInstance();
  155. calPeriod.add(Calendar.MONTH, -3);
  156. periods.add(new Periode(now, calPeriod, "Maand 3"));
  157. calPeriod = Calendar.getInstance();
  158. calPeriod.add(Calendar.MONTH, -6);
  159. periods.add(new Periode(now, calPeriod, "Maand 6"));
  160. calPeriod = Calendar.getInstance();
  161. calPeriod.add(Calendar.YEAR, -1);
  162. periods.add(new Periode(now, calPeriod, "Jaar"));
  163. calPeriod = Calendar.getInstance();
  164. calPeriod.add(Calendar.YEAR, -2);
  165. periods.add(new Periode(now, calPeriod, "Jaar 2"));
  166. calPeriod = Calendar.getInstance();
  167. weerstation1 = new WeerstationConnector();
  168. day = new ArrayList<Grootheid>();
  169. week = new ArrayList<Grootheid>();
  170. month = new ArrayList<Grootheid>();
  171. month3 = new ArrayList<Grootheid>();
  172. month6 = new ArrayList<Grootheid>();
  173. year = new ArrayList<Grootheid>();
  174. year2 = new ArrayList<Grootheid>();
  175. periodsScreens = new ArrayList<ArrayList<Grootheid>>();
  176. }
  177. public void backgroundLoader()
  178. {
  179. new Thread("Backgroundloader")
  180. {
  181. public void run()
  182. {
  183. Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
  184. meting1 = weerstation1.getMostRecentMeasurement();
  185. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(0).getBeginPeriode(), periods.get(0).getEindePeriode());
  186. startupState = false;
  187. //Day
  188. day.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  189. day.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  190. day.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  191. day.add(new WindDirection(meting1, meting2)); //Windrichting
  192. day.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  193. day.add(new RainRate(meting1, meting2)); //Regenval
  194. day.add(new Barometer(meting1, meting2)); //Luchtdruk
  195. day.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  196. day.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  197. day.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  198. day.add(new Sun(meting1)); //Sunrise en Sunset
  199. day.add(new UVLevel(meting1, meting2)); //UV Level
  200. day.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  201. day.add(new DewPoint(meting1, meting2)); //Dauwpunt
  202. day.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  203. day.add(new Voorspellingen(meting1)); //Voorspellingen
  204. periodsScreens.add(day);
  205. animator = new Timer();
  206. startLoadAnimatie();
  207. meting1 = weerstation1.getMostRecentMeasurement();
  208. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(1).getBeginPeriode(), periods.get(1).getEindePeriode());
  209. //Week
  210. week.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  211. week.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  212. week.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  213. week.add(new WindDirection(meting1, meting2)); //Windrichting
  214. week.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  215. week.add(new RainRate(meting1, meting2)); //Regenval
  216. week.add(new Barometer(meting1, meting2)); //Luchtdruk
  217. week.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  218. week.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  219. week.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  220. week.add(new Sun(meting1)); //Sunrise en Sunset
  221. week.add(new UVLevel(meting1, meting2)); //UV Level
  222. week.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  223. week.add(new DewPoint(meting1, meting2)); //Dauwpunt
  224. week.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  225. periodsScreens.add(week);
  226. meting1 = weerstation1.getMostRecentMeasurement();
  227. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(2).getBeginPeriode(), periods.get(2).getEindePeriode());
  228. //Month
  229. month.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  230. month.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  231. month.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  232. month.add(new WindDirection(meting1, meting2)); //Windrichting
  233. month.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  234. month.add(new RainRate(meting1, meting2)); //Regenval
  235. month.add(new Barometer(meting1, meting2)); //Luchtdruk
  236. month.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  237. month.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  238. month.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  239. month.add(new Sun(meting1)); //Sunrise en Sunset
  240. month.add(new UVLevel(meting1, meting2)); //UV Level
  241. month.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  242. month.add(new DewPoint(meting1, meting2)); //Dauwpunt
  243. month.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  244. month.add(new MaximaleRegenPeriode(meting1, meting2)); //Totale regenval in een periode
  245. month.add(new GraadDagen(meting1, meting2)); //Aantal graaddagen in een periode
  246. periodsScreens.add(month);
  247. meting1 = weerstation1.getMostRecentMeasurement();
  248. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(3).getBeginPeriode(), periods.get(3).getEindePeriode());
  249. //3 Months
  250. month3.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  251. month3.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  252. month3.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  253. month3.add(new WindDirection(meting1, meting2)); //Windrichting
  254. month3.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  255. month3.add(new RainRate(meting1, meting2)); //Regenval
  256. month3.add(new Barometer(meting1, meting2)); //Luchtdruk
  257. month3.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  258. month3.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  259. month3.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  260. month3.add(new Sun(meting1)); //Sunrise en Sunset
  261. month3.add(new UVLevel(meting1, meting2)); //UV Level
  262. month3.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  263. month3.add(new DewPoint(meting1, meting2)); //Dauwpunt
  264. month3.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  265. month3.add(new MaximaleRegenPeriode(meting1, meting2)); //Totale regenval in een periode
  266. month3.add(new GraadDagen(meting1, meting2)); //Aantal graaddagen in een periode
  267. periodsScreens.add(month3);
  268. meting1 = weerstation1.getMostRecentMeasurement();
  269. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(4).getBeginPeriode(), periods.get(4).getEindePeriode());
  270. //6 Months
  271. month6.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  272. month6.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  273. month6.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  274. month6.add(new WindDirection(meting1, meting2)); //Windrichting
  275. month6.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  276. month6.add(new RainRate(meting1, meting2)); //Regenval
  277. month6.add(new Barometer(meting1, meting2)); //Luchtdruk
  278. month6.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  279. month6.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  280. month6.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  281. month6.add(new Sun(meting1)); //Sunrise en Sunset
  282. month6.add(new UVLevel(meting1, meting2)); //UV Level
  283. month6.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  284. month6.add(new DewPoint(meting1, meting2)); //Dauwpunt
  285. month6.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  286. month6.add(new MaximaleRegenPeriode(meting1, meting2)); //Totale regenval in een periode
  287. month6.add(new GraadDagen(meting1, meting2)); //Aantal graaddagen in een periode
  288. month6.add(new LangsteHittegolfPeriode(meting1, meting2)); //Langste Hittegolf Periode
  289. month6.add(new LangsteZomerPeriode(meting1, meting2)); //Langste Zomerse Periode
  290. month6.add(new LangsteRegenPeriode(meting1, meting2)); //Langste Regen Periode
  291. //month6.add(new LangsteTempStijgingPeriode(meting1, meting2)); //Langste temperatuurstijging
  292. periodsScreens.add(month6);
  293. meting1 = weerstation1.getMostRecentMeasurement();
  294. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(5).getBeginPeriode(), periods.get(5).getEindePeriode());
  295. //Year
  296. year.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  297. year.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  298. year.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  299. year.add(new WindDirection(meting1, meting2)); //Windrichting
  300. year.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  301. year.add(new RainRate(meting1, meting2)); //Regenval
  302. year.add(new Barometer(meting1, meting2)); //Luchtdruk
  303. year.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  304. year.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  305. year.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  306. year.add(new Sun(meting1)); //Sunrise en Sunset
  307. year.add(new UVLevel(meting1, meting2)); //UV Level
  308. year.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  309. year.add(new DewPoint(meting1, meting2)); //Dauwpunt
  310. year.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  311. year.add(new MaximaleRegenPeriode(meting1, meting2)); //Totale regenval in een periode
  312. year.add(new GraadDagen(meting1, meting2)); //Aantal graaddagen in een periode
  313. year.add(new LangsteHittegolfPeriode(meting1, meting2)); //Langste Hittegolf Periode
  314. year.add(new LangsteZomerPeriode(meting1, meting2)); //Langste Zomerse Periode
  315. year.add(new LangsteRegenPeriode(meting1, meting2)); //Langste Regen Periode
  316. //year.add(new LangsteTempStijgingPeriode(meting1, meting2)); //Langste temperatuurstijging
  317. periodsScreens.add(year);
  318. meting1 = weerstation1.getMostRecentMeasurement();
  319. meting2 = weerstation1.getAllMeasurementsBetween(periods.get(6).getBeginPeriode(), periods.get(6).getEindePeriode());
  320. //2 Years
  321. year2.add(new OutsideTemp(meting1, meting2)); //Buitentemperatuur
  322. year2.add(new OutsideHum(meting1, meting2)); //Luchtv. Buiten
  323. year2.add(new AvgWindSpeed(meting1, meting2)); //Gem. Windsnelheid
  324. year2.add(new WindDirection(meting1, meting2)); //Windrichting
  325. year2.add(new WindChill(meting1, meting2)); //Gevoelstemperatuur
  326. year2.add(new RainRate(meting1, meting2)); //Regenval
  327. year2.add(new Barometer(meting1, meting2)); //Luchtdruk
  328. year2.add(new InsideTemp(meting1, meting2)); //Binnentemperatuur
  329. year2.add(new InsideHum(meting1, meting2)); //Luchtv. Binnen
  330. year2.add(new Zonsterkte(meting1, meting2)); //Zonkracht
  331. year2.add(new Sun(meting1)); //Sunrise en Sunset
  332. year2.add(new UVLevel(meting1, meting2)); //UV Level
  333. year2.add(new HeatIndex(meting1, meting2)); //Dauwpunt
  334. year2.add(new DewPoint(meting1, meting2)); //Dauwpunt
  335. year2.add(new CloudHeight(meting1, meting2)); //Wolkhoogte
  336. year2.add(new MaximaleRegenPeriode(meting1, meting2)); //Totale regenval in een periode
  337. year2.add(new GraadDagen(meting1, meting2)); //Aantal graaddagen in een periode
  338. year2.add(new LangsteHittegolfPeriode(meting1, meting2)); //Langste Hittegolf Periode
  339. year2.add(new LangsteZomerPeriode(meting1, meting2)); //Langste Zomerse Periode
  340. year2.add(new LangsteRegenPeriode(meting1, meting2)); //Langste Regen Periode
  341. //year2.add(new LangsteTempStijgingPeriode(meting1, meting2)); //Langste temperatuurstijging
  342. periodsScreens.add(year2);
  343. stopLoadAnimatie();
  344. }
  345. }.start();
  346. }
  347. /**
  348. * Start de animatie die speelt tijdens het opstarten en laden van het weerstation
  349. *
  350. * @param starter De timer die de animatie laat lopen
  351. */
  352. public void startStartupAnimatie()
  353. {
  354. starter.scheduleAtFixedRate(new TimerTask()
  355. {
  356. public void run()
  357. {
  358. startup = true;
  359. GUIboard.clearBottom();
  360. GUIboard.clearTop();
  361. GUIboard.clearLeft();
  362. GUIboard.clearRight();
  363. char[] charray;
  364. if(startupState)
  365. {
  366. charray = " Weerstation Breda\n Connecting".toCharArray();
  367. }
  368. else
  369. {
  370. charray = " Weerstation Breda\n Calculating".toCharArray();
  371. }
  372. for(char ch : charray)
  373. {
  374. IO.writeShort(0x40, ch);
  375. }
  376. int p = 1;
  377. for(int i=0; i<256;i++)
  378. {
  379. if(i<128)
  380. {
  381. IO.writeShort(0x42, 1 << 12 | i << 5 | 26);
  382. }
  383. else
  384. {
  385. IO.writeShort(0x42, 0 << 12 | i-128 << 5 | 26);
  386. }
  387. if(i%42==0)
  388. {
  389. p = p << 1;
  390. if(p>32)
  391. {
  392. p=1;
  393. }
  394. for(int q=0x10; q<0x40; q+=0x02)
  395. {
  396. IO.writeShort(q, 0x100 | p);
  397. }
  398. }
  399. IO.delay(4);
  400. }
  401. startup = false;
  402. }
  403. }, 0, (128 + 1)*8);
  404. }
  405. /**
  406. * Stopt de animatie die speelt tijdens het opstarten en laden van het weerstation
  407. */
  408. public void stopStartupAnimatie()
  409. {
  410. starter.cancel();
  411. }
  412. /**
  413. * Start de animatie die speelt tijdens het laden op de achtergrond van het weerstation
  414. */
  415. public void startLoadAnimatie()
  416. {
  417. animator.scheduleAtFixedRate(new TimerTask()
  418. {
  419. public void run()
  420. {
  421. load = true;
  422. for(int i=0; i<128;i++)
  423. {
  424. if(!graphIsDisplayed)
  425. {
  426. IO.writeShort(0x42, 1 << 12 | i << 5 | 31);
  427. }
  428. IO.delay(4);
  429. }
  430. for(int i=0; i<128;i++)
  431. {
  432. if(!graphIsDisplayed)
  433. {
  434. IO.writeShort(0x42, 0 << 12 | i << 5 | 31);
  435. }
  436. IO.delay(4);
  437. }
  438. load = false;
  439. }
  440. }, 0, (128 + 1)*8);
  441. }
  442. /**
  443. * Stopt de animatie die speelt tijdens het laden op de achtergrond van het weerstation
  444. */
  445. public void stopLoadAnimatie()
  446. {
  447. animator.cancel();
  448. }
  449. public void nextScreen(){ //Set the next screen one screen higher
  450. currentScreen++;
  451. if (currentScreen >= periodsScreens.get(periodeNr).size()){
  452. currentScreen = 0;
  453. if(button1){
  454. nextPeriod();
  455. }
  456. }
  457. }
  458. public void nextPeriod(){ //Set the next period one period higher
  459. periodeNr++;
  460. if(periodeNr >= periodsScreens.size()){
  461. periodeNr = 0;
  462. if (currentScreen+1 > periodsScreens.get(periodeNr).size())
  463. {
  464. currentScreen = 0;
  465. }
  466. }
  467. }
  468. public void displayGraph(){
  469. if(!graphIsDisplayed){
  470. Grootheid obj = periodsScreens.get(periodeNr).get(currentScreen);
  471. obj.displayGraph();
  472. graphIsDisplayed = true;
  473. }
  474. }
  475. public void displayMain(){
  476. Grootheid obj = periodsScreens.get(periodeNr).get(currentScreen);
  477. obj.display(periods.get(periodeNr).getName(), button1, button2);
  478. graphIsDisplayed = false;
  479. }
  480. }