Code Monkey home page Code Monkey logo

vz200's People

Contributors

cwahlmann avatar dependabot[bot] avatar kashban avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

vz200's Issues

Emulator: Basic Source Import verschluckt Leerzeichen

Der REST-Service erhält von mir:

10 PRINT "HALLO WELT!"

Der Import macht daraus

10 PRINT"HALLO WELT!"

Das ist hier nicht tragisch, in vielen anderen Fällen jedoch schon:

Aus 10 REM TESTPROGRAMM wird 10 REMTESTPROGRAMM

Leerzeichen in Zeichenketten bleiben davon verschont.

Erstelle Web App

Der Emulator kann per REST - Schnittstellen angesteuert werden. Dafür soll eine Webanwendung in Angular geschrieben werden.

Falls auch als mobile App, mit Ionic. Test Driven Development.

  • App erstellen
  • Retro-Design á la VZ200
  • Reset per REST implementieren
  • Lautstärkeregler mit 8 Stufen, der bei jeder Stufe den REST-Aufruf durchführt, VZ200-Design
  • VZ-Programme in den Emulator hochladen und ausführen (.vz)
  • VZ-Programme vom Emulator herunterladen (.vz)
  • Basic-Quellcode in den Emulator hochladen
  • Assembler-Programm in den Emulator laden und optional ausführen (asm, zipasm)
  • Assembler-Programm aus dem Emulator herunterladen (asm)
  • Kassettenschnittstelle implementieren (Optisch wie ein Kassettenrekorder, VZ-Design)
  • Programmcode im Hexadezimalformat in den Emulator laden
  • "" aus dem Emulator herunterladen

Druck - Obere Gehäusehälfte an Knick teilen

Damit kein Minimalsupport entsteht, den man kaum ablösen kann, und für eine glattere Oberfläche soll die Oberschale am Knick zweigeteilt werden. Sie wird dann vor dem Zusammenbau wieder zusammengeklebt.

Idealerweise haben die beiden Hälften mehrere Löcher vom Durchmesser 1,80mm (bei 70% Größe), so dass man Filamentstücke als Verbinder verwenden kann. Das erleichtert das Zusammenkleben.

Fix vz loader

When loading vzfiles with autorun the emulation crashes with system reset.

Absicherung des Rest-Service

  • Der Rest-Service soll per Token abgesichert werden.

Dabei soll folgendes Protokoll verwendet werden:

  1. Companion-App fordert ein Token an; eine Authentifizierung ist nicht nötig
  2. Emulator erzeugt ein Token; Identifier ist eine zufällige UUID; Signiert wird das Token über ein einmalig auf dem Raspberri erzeugtes Secret
  3. Emulator gibt das Token in der Response zurück.
  4. Emulator gibt eine Nachricht auf dem VZ200-Bildschirm aus, dass ein User mit der IP xy Zugriff wünscht
  5. über Emulator muss der Zugriff mit einem Out-Befehl bestätigt werden; eine eine Liste gültiger UUIDs wird in Form von leeren Dateien in einem Verzeichnis auf dem Raspberry geführt
  6. Companion-App greift mit dem Token auf Emulator zu
  7. Das Token wird geprüft: a) noch gültig; b) UUID ist gültig
  8. je nachdem wird der Zugriff gestattet

Schrauben Halterungen für Tastaturcontroller und Tastaturplatine

  • Es muss Schraubenhalterungen für den Tastaturcontroller
  • und die Tastaturplatine (Abstand Platine zu Matte: 4,5mm, Dicke Platine: 1,6mm) geben.
  • Außerdem braucht das Gehäuse ein Loch auf der Rückseite für das USB-Kabel.
  • Die Tastaturmaske muss Leisten haben, so dass sie mit dem Oberteil fest verbunden werden kann (u.U. mit einer zusätzlichen Schraube). Kleben ist keine Option.

VZ 200 Modell V3 drucken

Die im Vergleich zu V2 geänderten Teile noch einmal in 70% drucken, damit Christian die Elektronik einbauen und testen kann.

REST set sound throws an error on successful call

When sending an integer volume to the service it answers with

{"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0,"statusText":"Unknown Error","url":"http://localhost:8080/vz200/sound/112","ok":false,"name":"HttpErrorResponse","message":"Http failure response for http://localhost:8080/vz200/sound/112: 0 Unknown Error","error":{"isTrusted":true}}

Boden lässt sich nicht gut drucken, da minimal-Support kaum ablösbar ist

Hi Christian,

um den Boden zu drucken müssen wir noch Anpassungen machen, damit wir den Support unten drunter abbekommen:

  1. Entweder dafür sorgen, dass das Modell höher gedruckt wird
  2. oder die überstehenden Teile separiert drucken und ankleben.

So einfach bekomme ich das Modell im Slicer nicht angehoben, der setzt das immer wieder zurück auf 0.

Option 1

Man könnte nun im Quell-Modell einen kleinen Pin druntersetzen, der dafür sorgt, dass das Modell angehoben wird. Vielleicht so 2mm Durchmesser und 3mm Höhe. Dann bekommen wir entsprechend hohe Unterstützungsstrukturen, die sich dann auch noch ablösen lassen.

Option 2

Wir separieren die Füße und Bodenleisten derart, dass man sie separat drucken und nachher drunterkleben kann. Das ist natürlich deutlich aufwändiger und beim Drucken so kleiner Strukturen ergeben sich neue Probleme. Der Vorteil wäre, dass wir die in Gummi drucken können.

Ich bin erst mal für Option 1.

add australian graphics mod

emulate extended gfx modes of the vz200 gfx chip

  • out 32, n (n = ???mmmpp, mmm = mode, pp = gfx ram page)
  • mode 0: 64x64, 4 colors
  • mode 1: 128x64, monochrome
  • mode 2: 128x64, 4 colors (default)
  • mode 3: 128x96, monochrome
  • mode 4: 128x96, 4 colors
  • mode 5: 128x192, monochrome
  • mode 6: 128x192, 4 colors
  • mode 7: 256x192, monochrome

Nacharbeiten Gehäuse

Tastatur

  • Kerben und Haken mit mehr Toleranz, damit sie nach dem Druck ineinandergreifen
  • Schraubensockel entfernen und ebenfalls Haken
  • Langsamer drucken, damit die Tasten ohne Verrisse und Löcher gedruckt werden.

Gehäuse unten

  • Loch für Kabel zu klein und muss versetzt werden
  • Druckeinstellungen überprüfen, so dass auf der Schalterseite keine Lücken entstehen (möglicherweise zuviel Rückzug bei Lücken).
  • Schraubensockel für Platine oben recht sitzt falsch, neu vermessen
  • Schraubensockel für Gehäuse oben hinten nach oben verlängern (bis Oberkante Gehäuse)
  • Ein-/Aus-Schalter als Reset-Button entwerfen und ins Gehäuse integrieren (wird verlötet mit X5/Y7)
  • einsteckbare Lüfterleisten unten entfernen
  • Hintere Versenkungen für Schrauben prüfen, da ist die Decke zu den Sockeln zu dünn

Gehäuse oben hinten

  • Schraubensockel auf Kante Gehäuserand verkürzen

Monitor

  • Rückseite anpassen, so dass Lautsprecher passt
  • Rückseite mit Lautsprecher-Gitter
  • Lüftungsgitter seitlich
  • USB-Streben ausbuchten
  • Vorderseite ausschmücken (Ein-Aus-Schalter, farblich abgesetzter Rahmen u.a.)
  • Monitorhälften mit ineinandergreifenden Leisten versehen.
  • Schraubenstutzen für Gehäuseverbindung im Vorderteil abflachen für besseren Sitz.
  • Lautsprecherhalterung und Sockel enger gezogen
  • Lautsprecherhalterung-Ring um 1,22mm dicker gemacht, damit Lautsprecher fest sitzt

Monitor entwerfen

Es muss ein Monitormodell für das HDMI-Display mit angeflanschtem Raspberry entworfen werden.

  • Überbreite des Displays (16:9) könnte links und rechts abgedeckt werden
  • Lüftung für Raspberry
  • Lautsprecher für Ton (Leistung wie Kopfhörer)
  • ggf. Platz für Akku (Powerbank)?

Emulator - REST-Schnittstelle für die Dateiverwaltung

Der Emulator verwendet das Verzeichnis "vz", um dort Programme abzulegen. Ziel ist es, dieses Verzeichnis per Companion App anzusprechen, um

Programme hochzuladen:

  • VZ Dateien ablegen
  • Assembler Source kompilieren und als VZ Datei ablegen
  • Basic Source in Bytecode kodieren und als VZ Datei ablegen
  • Dabei soll es möglich sein, den Dateien sprechende Namen zu geben (zumindest aus Sicht des REST Service).

Programmer herunterzuladen:

  • VZ Dateien herunterladen
  • VZ Dateien disassemblieren und als Assembler-Source herunterladen
  • VZ Dateien dekodieren und als Basic-Source herunterladen

und:

  • Den Inhalt des Verzeichnisses aufzulisten (es werden die im Header der Vz-Dateien gespeicherten Namen gelesen)
  • Dateien zu löschen
  • Optional könnte man dort auch Basic-Listings ablegen (Endung .bas), so dass man diese gleich mitverwalten kann.

Die Services sollen JSON - Daten zurückliefern, sofern es um Text geht (z. B. Verzeichnislistings, Basic-Quellcode).

Resetschalter nachbessern

Die Halterung für die Platine mit dem Taster für den Resetknopf passt noch nicht.

  • insgesamt muss die gesamte Halterung einen größeren Abstand zum gedruckten Reset-Knopf haben, damit dieser mit der Klammer gegen Rausfallen gesichert werden kann. Ich musste mit dem Messer ca. 2,5 mm von der Fassung wegschneiden, damit das passt.
  • die Platine, die ich verwendet habe, ist 1,5mm dick, 0,5 mm mehr, als Platz war
  • die Aussparung für die Lötkontakte des Tasters in der Halterung sollte nach unten 2 mm größer sein, das war bei mir ziemlich knapp
    (alle Werte beziehen sich auf 70%, d.h. im 3d-Modell müssen die Werte *100/70 gerechnet werden)
    img_chassis_34_platine_reset
    img_chassis_35_platine_reset

Backlog - App - Basic Editor implementieren

Wunsch: Die App soll einen kleinen BASIC-Editor mitbringen, über den man deutlich bequemer Basic-Programme schreiben kann als auf dem VZ selbst.

Dabei sollte er idealerweise auch den grafischen Zeichensatz des VZ beherrschen und optional den jeweils aktuellen Speicherverbrauch ausgeben.

Eventuell ließe sich sogar ein Javascript-BASIC-Interpreter einbinden, der das Programm im Browser ausführt.

Mögliche Ansätze:

Tastaturplatine

Es muss ein Layout für die Tastaturplatine entworfen werden.

  • Entweder für externe Produktion (dann in KICad)
  • Oder zum selbst Drucken (dann mit Fusion)

Als Schalter sind Microschalter geeignet (4 Füße, Abstand ca. 5mm).

Emulator zeigt nur einen schwarzen Bildschirm auf Raspi 3b+

Während der Emulator unter Windows einwandfrei läuft, zeigt er bei mir auf dem Raspi nur einen schwarzen Bildschirm.

Ich habe ihn sowohl unter Windows als auch später unter dem Rasperian kompiliert, mit demselben Ergebnis.

Das Log zeigt eine Fehlermeldung bezüglich der Sound-Bibliothek, zu dem ich aber nichts im Internet finde.

javax.sound.sampled.LineUnavailableException
	at org.classpath.icedtea.pulseaudio.PulseAudioMixer.openImpl(PulseAudioMixer.java:714)
	at org.classpath.icedtea.pulseaudio.PulseAudioMixer.openLocal(PulseAudioMixer.java:588)
	at org.classpath.icedtea.pulseaudio.PulseAudioMixer.openLocal(PulseAudioMixer.java:584)
	at org.classpath.icedtea.pulseaudio.PulseAudioMixer.open(PulseAudioMixer.java:579)
	at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:94)
	at org.classpath.icedtea.pulseaudio.PulseAudioSourceDataLine.open(PulseAudioSourceDataLine.java:75)
	at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:290)
	at org.classpath.icedtea.pulseaudio.PulseAudioSourceDataLine.open(PulseAudioSourceDataLine.java:51)
	at jemu.core.device.sound.JavaSound.init(JavaSound.java:59)
	at jemu.core.device.sound.SunAudio.<init>(SunAudio.java:28)
	at jemu.core.device.sound.JavaSound.<init>(JavaSound.java:44)
	at jemu.core.device.sound.SoundUtil.getSoundPlayer(SoundUtil.java:29)
	at jemu.system.vz.VZ.<init>(VZ.java:69)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at jemu.core.device.Computer.createComputer(Computer.java:90)
	at jemu.ui.JemuUi.setComputer(JemuUi.java:469)
	at jemu.ui.JemuUi.start(JemuUi.java:116)
	at jemu.Emulator.start(Emulator.java:66)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:309)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1691)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:333)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:137)
	at jemu.Jemu.main(Jemu.java:11)
java.lang.IllegalStateException: Line must be open()ed before it can be start()ed
	at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.start(PulseAudioDataLine.java:345)
	at org.classpath.icedtea.pulseaudio.PulseAudioSourceDataLine.start(PulseAudioSourceDataLine.java:51)
	at jemu.core.device.sound.JavaSound.play(JavaSound.java:69)
	at jemu.system.vz.VZ.emulate(VZ.java:423)
	at jemu.core.device.Computer.run(Computer.java:396)
	at java.lang.Thread.run(Thread.java:748)
Aug 23, 2019 8:00:24 PM org.apache.coyote.AbstractProtocol start
INFORMATION: Starting ProtocolHandler ["http-nio-8080"]
Aug 23, 2019 8:00:24 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFORMATION: Using a shared selector for servlet write/read

vz200.log

REST /sound - Lautstärke nicht proportional zum Wert

Mit der Implementierung des Lautstärkereglers in der App habe ich bemerkt, dass ein höherer Wert die Lautstärke auch wieder absenken kann. 255 ist beispielsweise viel leiser als 240.

Dazwischen scheint es mehrere lokale Maxima zu geben, was völlig der Intention widerspricht, dass höhere Werte = höhere Lautstärke bedeuten.

0 ist immerhin stumm.

Gibt es dafür eine Erklärung und wie muss ich den Regler programmieren, damit ich das gewünschte Ergebnis erhalte?

Dokumentation

Die Dokumentation soll überarbeitet und ergänzt werden:

  • Strukturierung
    VZ200:
  • Teileliste
  • Hardware Zusammenbau
    Monitor:
  • Teileliste
  • Hardware Zusammenbau
    Raspberry Pi
  • Software Installation

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.