Hi!
Ich arbeite momentan an einem Editor für meinen Yún.
Der Aufbau:
Ich habe dazu eine PS2-Tastatur mit dem Clock-pin an Pin 7 und dem Data-Pin an Pin 6 angeschlossen. Da sie 50 mA zieht, wird sie von einer externen Stromversorgung versorgt. Außerdem ist noch ein USB-Stick an den Yún angeschlossen.
Der Sketch:
#include <ps2.h>
#include <avr/pgmspace.h>
#include <FileIO.h>
#define KEY_SHIFTL 0x12
#define KEY_SHIFTR 0x59
#define KEY_CTRL 0x14
#define KEY_ALT 0x11
#define KEY_RUN 0x01
PS2 kbd(7, 6);
const char keyboard[] PROGMEM = {
0x0E, '^', '°', 0,
0x16, '1', '!', 0,
0x1E, '2', '"', '²',
0x26, '3', '§', '³',
0x25, '4', '
Der aktuelle Stand:
Ich habe vor, mit einer PS2-Tastatur, einem I2C-Display und einem Stick einen Editor für den Arduino Yún zu bauen, damit ich auch unterwegs programmieren kann. Man soll, wie es sich bei einem anständigen Editor gehört, mit der Rücktaste das letzte Zeichen löschen können. Für eine lange String ist aber der RAM zu klein. Momentan versuche ich erstmal, dass man über den seriellen Monitor den Text ausgegeben bekommt. Nachher soll man auch über die Tastenkombination STRG+ALT+R ein Python-Programm ausführen können, aber das kommt später. Und das werdet ihr dann auch mitbekommen, denn ich verspreche euch, dann wieder ein Problem zu haben. Mein Stick wird vom Yún als "sdb1" erkannt und er hat einen Ordner für diese Python-Programme, nämlich /arduino/python/editor/.
Erstmal wird die Datei, die man gerade benutzt, kopiert, allerdings ohne den letzten Buchstaben, und unter einer Datei, die fast genauso heißt, nur am Anfang "copy_" stehen hat, gespeichert und anschließend ausgegeben. Nebenbei wird noch die Zeit in Sekunden ausgegeben.
Ausgabe über den seriellen Monitor:
Dateiname: test2.txt
Dies ist ein Test.
[28.77 ]
[29.01 ]Dies ist ein Test
[31.54 ]
[32.14 ]Dies ist ein Test
[32.96 ]
[33.26 ]Dies ist ein Test
[33.84 ]
[34.14 ]Dies ist ein Test
[34.52 ]
[35.02 ]Dies ist ein Test
[35.41 ]
[35.70 ]Dies ist ein Test
[36.06 ]
[36.46 ]Dies ist ein Test
[36.79 ]
[37.19 ]Dies ist ein Test
[37.52 ]
[37.81 ]Dies ist ein Test
[38.17 ]
[38.57 ]Dies ist ein Test
[38.73 ]
[39.05 ]Dies ist ein Test
[39.21 ]
[39.74 ]Dies ist ein Test
[39.77 ]
[40.06 ]Dies ist ein Test
[40.20 ]
[40.59 ]Dies ist ein Test
[40.87 ]
[41.17 ]Dies ist ein Test
[41.55 ]
[42.08 ]Dies ist ein Test
Mein Problem:
Es dauert um die 500 ms, bis die Datei kopiert wurde, was ich aber als deutlich zu lang empfinde. Kann man den Kopier-Prozess irgendwie beschleunigen?
Gruß
HTML-Fan, 0,
0x2E, '5', '%', 0,
0x36, '6', '&', 0,
0x3D, '7', '/', '{',
0x3E, '8', '(', '[',
0x46, '9', ')', ']',
0x45, '0', '=', '}',
0x4E, 'ß', '?', '\',
0x55, '´', '`', 0,
0x66, '\b', 0, 0,
0x0D, '\t', 0, 0,
0x15, 'q', 'Q', '@',
0x1D, 'w', 'W', 0,
0x24, 'e', 'E', '€',
0x2D, 'r', 'R', KEY_RUN,
0x2C, 't', 'T', 0,
0x35, 'z', 'Z', 0,
0x3C, 'u', 'U', 0,
0x43, 'i', 'I', 0,
0x44, 'o', 'O', 0,
0x4D, 'p', 'P', 0,
0x54, 'ü', 'Ü', 0,
0x5B, '+', '*', '~',
0x5A, '\n', 0, 0,
0x1C, 'a', 'A', 0,
0x1B, 's', 'S', 0,
0x23, 'd', 'D', 0,
0x2B, 'f', 'F', 0,
0x34, 'g', 'G', 0,
0x33, 'h', 'H', 0,
0x3B, 'j', 'J', 0,
0x42, 'k', 'K', 0,
0x4B, 'l', 'L', 0,
0x4C, 'ö', 'Ö', 0,
0x52, 'ä', 'Ä', 0,
0x5D, '#', ''', 0,
0x61, '<', '>', '|',
0x1A, 'y', 'Y', 0,
0x22, 'x', 'X', 0,
0x21, 'c', 'C', 0,
0x2A, 'v', 'V', 0,
0x32, 'b', 'B', 0,
0x31, 'n', 'N', 0,
0x3A, 'm', 'M', 'µ',
0x41, ',', ';', 0,
0x49, '.', ':', 0,
0x4A, '-', '', 0,
0x29, ' ', ' ', 0,
};
void kbd_init(){
char ack;
kbd.write(0xff);
ack = kbd.read();
ack = kbd.read();
}
String fileName;
void setup(){
Bridge.begin();
FileSystem.begin();
Serial.begin(9600);
kbd_init();
while(!Serial);
Serial.print("Dateiname: ");
fileName = "";
while(true){
char ch = key(kbd.read());
if(ch == '\n'){
break;
}
if(ch != 0){
Serial.write(ch);
if(ch == '\b'){
fileName.remove(fileName.length() - 1);
Serial.print("\n" + fileName);
continue;
}
fileName += ch;
}
}
Serial.println();
}
bool shiftl_pressed = false, shiftr_pressed = false, ctrl_pressed = false, alt_pressed = false, next_release = false;
char key(byte code){
byte result = 0;
if(code == 0xF0){
next_release = true;
return 0;
}
else if(code == KEY_SHIFTL){
shiftl_pressed = !next_release;
}
else if(code == KEY_SHIFTR){
shiftr_pressed = !next_release;
}
else if(code == KEY_CTRL){
ctrl_pressed = !next_release;
}
else if(code == KEY_ALT){
alt_pressed = !next_release;
}
if(!next_release){
byte charIndex = (shiftr_pressed || shiftl_pressed) && !(ctrl_pressed || alt_pressed) ? 1 : (!(shiftr_pressed || shiftl_pressed) && (ctrl_pressed && alt_pressed) ? 2 : 0);
for(byte i = 0;i < sizeof(keyboard);i += 4){
if(pgm_read_byte_near(keyboard + i) == code){
result = pgm_read_byte_near(keyboard + i + 1 + charIndex);
break;
}
}
}
next_release = false;
return result;
}
void print(String text, int value, bool newLine = false) {
/Serial.print(text);
Serial.print(": ");
Serial.print(value);
if (newLine) {
Serial.println();
}
else {
Serial.print(", ");
}/
}
void printTime(){
Serial.write('[');
Serial.print(double(millis()) / 1000);
Serial.write('\t');
Serial.write(']');
}
void remove(){
//Serial.println("Kopieren ... ");
if (FileSystem.exists(("/mnt/sdb1/arduino/python/editor/copy" + fileName).c_str())) {
FileSystem.remove(("/mnt/sdb1/arduino/python/editor/copy_" + fileName).c_str());
}
byte buf[256];
int len;
int pos = 0;
bool available;
uint32_t time = micros();
print("Size", FileSystem.open(("/mnt/sdb1/arduino/python/editor/" + fileName).c_str(), FILE_READ).size(), true);
do {
File file = FileSystem.open(("/mnt/sdb1/arduino/python/editor/" + fileName).c_str(), FILE_READ);
file.seek(pos);
print("Noch nicht uebertragen", file.size() - file.position());
len = min(file.size() - file.position() - 1, 256);
print("Pos", pos);
print("Len", len, true);
file.read(buf, len);
pos = file.position();
available = file.size() - file.position() > 1;
file.close();
File copyFile = FileSystem.open(("/mnt/sdb1/arduino/python/editor/copy_" + fileName).c_str(), FILE_APPEND);
copyFile.write(buf, len);
copyFile.close();
} while (available);
}
void loop(){
char ch = key(kbd.read());
if(ch != 0){
if(ch == '\b'){
Serial.println();
printTime();
Serial.println();
remove();
File file = FileSystem.open(("/mnt/sdb1/arduino/python/editor/copy_" + fileName).c_str(), FILE_READ);
printTime();
while(file.available()){
Serial.write(file.read());
}
return;
}
File file = FileSystem.open(("/mnt/sdb1/arduino/python/editor/" + fileName).c_str(), FILE_APPEND);
file.write(ch);
file.close();
Serial.write(ch);
}
}
[/code]
Der aktuelle Stand:
Ich habe vor, mit einer PS2-Tastatur, einem I2C-Display und einem Stick einen Editor für den Arduino Yún zu bauen, damit ich auch unterwegs programmieren kann. Man soll, wie es sich bei einem anständigen Editor gehört, mit der Rücktaste das letzte Zeichen löschen können. Für eine lange String ist aber der RAM zu klein. Momentan versuche ich erstmal, dass man über den seriellen Monitor den Text ausgegeben bekommt. Nachher soll man auch über die Tastenkombination STRG+ALT+R ein Python-Programm ausführen können, aber das kommt später. Und das werdet ihr dann auch mitbekommen, denn ich verspreche euch, dann wieder ein Problem zu haben. Mein Stick wird vom Yún als "sdb1" erkannt und er hat einen Ordner für diese Python-Programme, nämlich /arduino/python/editor/.
Erstmal wird die Datei, die man gerade benutzt, kopiert, allerdings ohne den letzten Buchstaben, und unter einer Datei, die fast genauso heißt, nur am Anfang "copy_" stehen hat, gespeichert und anschließend ausgegeben. Nebenbei wird noch die Zeit in Sekunden ausgegeben.
Ausgabe über den seriellen Monitor:
§_DISCOURSE_HOISTED_CODE_1_§
Mein Problem:
Es dauert um die 500 ms, bis die Datei kopiert wurde, was ich aber als deutlich zu lang empfinde. Kann man den Kopier-Prozess irgendwie beschleunigen?
Gruß
HTML-Fan