From a1ee40016db58a5ad2707725d4a1e225b7919a3f Mon Sep 17 00:00:00 2001 From: Johannes Wache Date: Sat, 26 Dec 2020 20:28:16 +0100 Subject: [PATCH] apps: calc: Created memory-saving calculator app Signed-off-by: Johannes Wache --- README.rst | 4 ++ res/CalcApp.png | Bin 0 -> 6066 bytes res/calc.png | Bin 0 -> 750 bytes wasp/apps/calc.py | 121 ++++++++++++++++++++++++++++++++ wasp/boards/manifest_240x240.py | 1 + wasp/boards/simulator/main.py | 3 + 6 files changed, 129 insertions(+) create mode 100644 res/CalcApp.png create mode 100644 res/calc.png create mode 100644 wasp/apps/calc.py diff --git a/README.rst b/README.rst index 8578c3c..8985e40 100644 --- a/README.rst +++ b/README.rst @@ -185,6 +185,10 @@ using one of the techniques is the Application Writer's guide. :alt: Music Player running in the wasp-os simulator :width: 179 +.. image:: res/CalcApp.png + :alt: Calculator running in the wasp-os simulator + :width: 179 + .. image:: res/SnakeApp.png :alt: Snake Game running in the wasp-os simulator :width: 179 diff --git a/res/CalcApp.png b/res/CalcApp.png new file mode 100644 index 0000000000000000000000000000000000000000..8af84a6ba7e560112926975e752ec09355090a50 GIT binary patch literal 6066 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 literal 0 HcmV?d00001 diff --git a/res/calc.png b/res/calc.png new file mode 100644 index 0000000000000000000000000000000000000000..14a3199976787106ebe9bb6f613add744ad89bec GIT binary patch literal 750 zcmVIDCcU*1|P#JV=A^-?b=j9JgfCBm9Pz0dn{rW_3fbTmu4)A^F$N|3ZTsgq^ zoihjczH{dQ-**ih;QOv+r#|5EkZN#8qW#CL(I;@TKB>0gdl|PBu02W-2l(AZfQ7th zQdnJ4R07ltd}dC}3{1j6Nf?s^?T>&gJ2a^U^Y@-3;eg-~S$1yg@+%o4^6&b2O;0;V zmYVbhP4xlRk$@0cMxC&3T=+5=M6_CZvXhtKIF&u3SKxDx02?pz(t9E*xThizU<-!V zeZA!9kid+Hl86jLK4cR10wV|*kOWR);}Kxt+|x0v$7`$)7<~(x+KYfNfHJhS?4C=8 zh!*)G@jzv$Mb9%GqZIsve@cC3M zZ^lipw~(Tf-!7SmK#*WSfc?{r&%iTn$%{%d>L&v7HuN0)t=@le36XXC3&kWrxNrH9 z4#b2H|KDC6VlY?a0# z%TN(B%cN6BS`W-Y9c6?h(Z)e5(L^iiJ;hw;+AVC!1`{w`( z@col81^E6|5C!=DWhe#s{(S%i_;vb#mU@NZUR#Mmgnu+Ljt5pK`HrV^&HFVJ0kt9` gUf%6M26pB316twcw{86?>i_@%07*qoM6N<$f~mw#!vFvP literal 0 HcmV?d00001 diff --git a/wasp/apps/calc.py b/wasp/apps/calc.py new file mode 100644 index 0000000..8dddf57 --- /dev/null +++ b/wasp/apps/calc.py @@ -0,0 +1,121 @@ +# 2-bit RLE, generated from res/calc.png, 413 bytes +calc = ( + b'\x02' + b'`@' + b'(@\x03P?\x0eV?\x08[?\x04_?\x01b' + b' 200): # undo button pressed + if (self.output != ""): + self.output = self.output[:-1] + else: + indices = [(event[2]// 48)-1,event[1]//47] + # Error handling for touching at the border + if (indices[0]>3): + indices[0] = 3 + if (indices[1]>4): + indices[1] = 4 + button_pressed = self.fields[indices[0]][indices[1]] + if (button_pressed == "C"): + self.output = "" + elif (button_pressed == "="): + self.output = self.calculate(self.output) + else: + self.output += button_pressed + self.display_output() + + def _draw(self): + draw = wasp.watch.drawable + draw.fill() + # Make grid: + for i in range(4): + # horizontal lines + draw.line(x0=0,y0=(i+1)*47,x1=240,y1=(i+1)*47) + # vertical lines + draw.line(x0=(i+1)*47,y0=47,x1=(i+1)*47,y1=240) + # Draw button label: + for y in range(4): + for x in range(5): + label = self.fields[y][x] + if (x == 0): + draw.string(label, x*47+14, y*47+60) + else: + draw.string(label, x*47+16, y*47+60) + draw.string("<", 215, 10) + + + + def display_output(self): + wasp.watch.drawable.fill(x=2,y=2,w=170,h=40) + if (self.output != ""): + if len(self.output) >= 10: + wasp.watch.drawable.string(self.output[len(self.output)-9:], 6, 14, width=170) + else: + wasp.watch.drawable.string(self.output, 6, 14, width=170) + + def calculate(self,s): + equation = s + + # Normal calculator stuff + for i in range(len(s)): + if (s[i] =="^"): + equation = s[:i] + "**"+s[i+1:] + elif (s[i] == ":"): + equation = s[:i] + "/"+s[i+1:] + try: + result = eval(equation) + except: # Error + result = "" + return str(result) \ No newline at end of file diff --git a/wasp/boards/manifest_240x240.py b/wasp/boards/manifest_240x240.py index 4341fc9..6021df5 100644 --- a/wasp/boards/manifest_240x240.py +++ b/wasp/boards/manifest_240x240.py @@ -10,6 +10,7 @@ manifest = ( 'apps/haiku.py', 'apps/heart.py', 'apps/musicplayer.py', + 'apps/calc.py', 'apps/launcher.py', 'apps/pager.py', 'apps/settings.py', diff --git a/wasp/boards/simulator/main.py b/wasp/boards/simulator/main.py index d170247..ea943f3 100644 --- a/wasp/boards/simulator/main.py +++ b/wasp/boards/simulator/main.py @@ -15,6 +15,9 @@ wasp.system.register(GameOfLifeApp()) from apps.snake import SnakeGameApp wasp.system.register(SnakeGameApp()) +from apps.calc import CalculatorApp +wasp.system.register(CalculatorApp()) + from apps.musicplayer import MusicPlayerApp wasp.system.register(MusicPlayerApp()) wasp.system.set_music_info({