diff --git a/.gitignore b/.gitignore
index 8d69b04..e5638cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,14 @@
.cproject
.project
.settings
+gmon.out
*/.depend
+server/gmon.out
server/modelbahn-cgi
server/modelbahn-server
server/test-json
+z21emu/gmon.out
+z21emu/config.h
z21emu/z21emu
*~
*.oo
diff --git a/server/server.cc b/server/server.cc
index 8da5d57..c8cd199 100644
--- a/server/server.cc
+++ b/server/server.cc
@@ -43,7 +43,7 @@ int Server::Start() {
Server::Server() {
thread = 0;
thread_running = 0;
- railways.SetSize(200, 200);
+ railways.SetSize(64, 32);
status_text = "init server";
mode = SMODE_STARTUP;
data_reset.mr_idx = -1;
diff --git a/webinterface/gui/guidebug.js b/webinterface/gui/guidebug.js
index b061b61..265064b 100644
--- a/webinterface/gui/guidebug.js
+++ b/webinterface/gui/guidebug.js
@@ -1,9 +1,11 @@
function debug (t) {
- var pre = document.getElementById("debug");
+
+ var pre = document.getElementById("debug");
var div = document.getElementById("debug_div");
- if (pre) pre.innerHTML = pre.innerHTML + "
" + t;
+ if (pre) pre.innerHTML = pre.innerHTML + "
" + t;
if (div) div.scrollTop = div.scrollHeight;
+
};
diff --git a/webinterface/layout.css b/webinterface/layout.css
index 2b165a5..8ba438f 100644
--- a/webinterface/layout.css
+++ b/webinterface/layout.css
@@ -1,13 +1,13 @@
body {
margin: 0px;
- font-family: system-ui;
+ font-family: system-ui;
}
:root {
--top-height: 34px;
--side-width: 37px;
- --bottom-height: 2px;
+ --bottom-height: 100px;
--menu-bg-color: #333;
--menu-fg-color: linen;
diff --git a/z21emu/atmega16_detect/gleiserkennung-v3.c b/z21emu/atmega16_detect/gleiserkennung-v3.c
index b4cb03e..3f1a482 100644
--- a/z21emu/atmega16_detect/gleiserkennung-v3.c
+++ b/z21emu/atmega16_detect/gleiserkennung-v3.c
@@ -281,4 +281,3 @@ int main( void ) {
return 0;
};
-
diff --git a/z21emu/atmega32_detect/Makefile b/z21emu/atmega32_detect/Makefile
new file mode 100644
index 0000000..bd50d5e
--- /dev/null
+++ b/z21emu/atmega32_detect/Makefile
@@ -0,0 +1,41 @@
+# .SILENT:
+
+# Atmega88
+# CFLAGS= -Os -g -Wall -mmcu=atmega16 -DF_CPU=8000000UL
+# LDFLAGS= -mmcu=atmega16
+
+CPUTYPE1= atmega32
+CPUTYPE2= m32
+
+# Atmega32
+CFLAGS= -Os -g -Wall -mmcu=$(CPUTYPE1) -DF_CPU=16000000UL
+LDFLAGS= -mmcu=$(CPUTYPE1)
+
+all: gleiserkennung-v4.bin
+
+%.o: %.c
+ avr-gcc $(CFLAGS) -c -o $@ $^
+
+rebuild: clean all
+
+gleiserkennung-v4.elf: gleiserkennung-v4.o eprom.o
+ avr-gcc $^ -o $@ $(LDFLAGS)
+
+
+%.bin: %.elf
+ avr-objcopy -j .text -j .data -O binary $^ $@
+
+clean:
+ rm *.o -rf
+ rm *.bin -rf
+ rm *.elf -rf
+ rm *~ -rf
+
+cleanall: clean
+
+source: cleanall
+
+upload-v4: gleiserkennung-v4.bin
+ avrdude -c avrispmkII -P usb -p $(CPUTYPE2) -v -V -U flash:w:gleiserkennung-v4.bin:r
+
+
diff --git a/z21emu/atmega32_detect/eprom.c b/z21emu/atmega32_detect/eprom.c
new file mode 100644
index 0000000..f1913af
--- /dev/null
+++ b/z21emu/atmega32_detect/eprom.c
@@ -0,0 +1,26 @@
+/*
+ * eprom.c
+ *
+ * Created on: 11.02.2018
+ * Author: steffen
+ */
+
+
+#include "eprom.h"
+
+void EEPROM_write(unsigned int uiAddress, unsigned char ucData) {
+ while(EECR & (1<
+#include
+
+void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
+unsigned char EEPROM_read(unsigned int uiAddress);
+
+
+#endif /* ATMEGA8_DETECT_EPROM_H_ */
diff --git a/z21emu/atmega32_detect/gleiserkennung-v4.c b/z21emu/atmega32_detect/gleiserkennung-v4.c
new file mode 100644
index 0000000..5d124f3
--- /dev/null
+++ b/z21emu/atmega32_detect/gleiserkennung-v4.c
@@ -0,0 +1,281 @@
+/******************************************************************
+
+ * reads some digital inputs and make them readable over i2c bus.
+ *
+ * Atmega 32
+ * +-------+
+ * S17 (XCK/T0) PB0 -|1 O 40|- PA0 (ADC0) S9
+ * S18 (T1) PB1 -|2 39|- PA1 (ADC1) S10
+ * S19 (INT2/AIN0) PB2 -|3 38|- PA2 (ADC2) S11
+ * S20 (OC0/AIN1) PB3 -|4 37|- PA3 (ADC3) S12
+ * S21 (SS) PB4 -|5 36|- PA4 (ADC4) S13
+ * S22 (MOSI) PB5 -|6 35|- PA5 (ADC5) S14
+ * S23 (MISO) PB6 -|7 34|- PA6 (ADC6) S15
+ * S24 (SCK) PB7 -|8 33|- PA7 (ADC7) S16
+ * RESET -|9 32|- AREF
+ * VCC -|10 31|- GND
+ * GND -|11 30|- AVCC
+ * XTAL2 -|12 29|- PC7 (TOSC2)
+ * XTAL1 -|13 28|- PC6 (TOSC1)
+ * S1 (RXD) PD0 -|14 27|- PC5 (TDI)
+ * S2 (TXD) PD1 -|15 26|- PC4 (TDO)
+ * S3 (INT0) PD2 -|16 25|- PC3 (TMS)
+ * S4 (INT1) PD3 -|17 24|- PC2 (TCK)
+ * S5 (OC1B) PD4 -|18 23|- PC1 (DSA) I2C
+ * S6 (OC1A) PD5 -|19 22|- PC0 (SCL) I2C
+ * S7 (ICP1) PD6 -|20 21|- PD7 (OC2) S8
+ * +-------+ */
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include "eprom.h"
+
+#define TWCR_ACK TWCR = (1<= I2C_SREGS_OFFSET && data < I2C_SREGS_OFFSET+I2C_SREG_MAX)) {
+ i2c_reg = data;
+ TWCR_ACK;
+ }
+ else
+ TWCR_NACK;
+ }
+ else {
+ if(i2c_reg < I2C_NUM_REGS) {
+ i2c_regs[i2c_reg] = data;
+ i2c_reg++;
+ TWCR_ACK;
+ }
+ else if (i2c_reg >= I2C_SREGS_OFFSET && i2c_reg < I2C_SREGS_OFFSET+I2C_SREG_MAX) {
+ i2c_system[i2c_reg-I2C_SREGS_OFFSET] = data;
+ i2c_reg++;
+ TWCR_ACK;
+ }
+ else TWCR_NACK;
+ }
+ break;
+
+ case TW_ST_SLA_ACK: //0xA8 Slave wurde im Lesemodus adressiert und hat ein ACK zurückgegeben.
+ case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Daten wurden angefordert
+ if (i2c_reg == 0xFF) {
+ i2c_reg = 0;
+ }
+ if (i2c_reg < I2C_NUM_REGS) {
+ TWDR = i2c_regs[i2c_reg];
+ i2c_reg++;
+ TWCR_ACK;
+ }
+ else if (i2c_reg >= I2C_SREGS_OFFSET && i2c_reg < I2C_SREGS_OFFSET+I2C_SREG_MAX) {
+ TWDR = i2c_system[i2c_reg-I2C_SREGS_OFFSET];
+ i2c_reg++;
+ TWCR_ACK;
+ }
+ else TWCR_NACK;
+ break;
+
+ case TW_SR_STOP:
+ TWCR_ACK;
+ break;
+
+ case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert
+ case TW_SR_DATA_NACK: // 0x88
+ case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
+ default:
+ TWCR_RESET;
+ break;
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////
+//
+
+int main( void ) {
+ uint32_t cnt[32] = { 0 };
+ unsigned int i;
+ uint32_t inval = 0;
+ uint32_t temp = 0;
+ int offdelay;
+
+ //
+ // disable JTAG
+ MCUCSR |= (1< 0x4f || i2c_system[I2C_SREG_ADDR] < 0x20) {
+ i2c_system[I2C_SREG_ADDR] = I2C_DEFAULT_ADDR;
+ }
+
+ i2c_system[I2C_SREG_DIOFFDELAY] = EEPROM_read(I2C_SREG_DIOFFDELAY);
+ if (i2c_system[I2C_SREG_DIOFFDELAY] == 0 || i2c_system[I2C_SREG_DIOFFDELAY] == 0xFF) {
+ i2c_system[I2C_SREG_DIOFFDELAY] = 0x20;
+ }
+
+ i2c_slave_init (i2c_system[I2C_SREG_ADDR]);
+
+ for (i = 0; i < 32; i++) cnt[i] = 0;
+
+ //
+ // system loop
+ while( 1 ) {
+ //
+ // digital in registers..
+ offdelay = i2c_system[I2C_SREG_DIOFFDELAY] << 8;
+
+ // S1 - S8
+ i = 0; if (!(PINC & (1 << 0))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 1))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 2))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 3))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 4))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 5))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 6))) cnt[i] = offdelay;
+ i++; if (!(PINC & (1 << 7))) cnt[i] = offdelay;
+
+ // S9 - S16
+ i++; if (!(PINA & (1 << 0))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 1))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 2))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 3))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 4))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 5))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 6))) cnt[i] = offdelay;
+ i++; if (!(PINA & (1 << 7))) cnt[i] = offdelay;
+
+ // S17 - S24
+ i++; if (!(PIND & (1 << 0))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 1))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 2))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 3))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 4))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 5))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 6))) cnt[i] = offdelay;
+ i++; if (!(PIND & (1 << 7))) cnt[i] = offdelay;
+
+ // all values
+ for (i = 0; i < 16; i++) {
+ if (cnt[i] == 0) inval &= ~(1 << (i));
+ else {
+ cnt[i]--;
+ inval |= (1 << (i));
+ }
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (cnt[16+i] == 0) temp &= ~(1 << (i));
+ else {
+ cnt[16+i]--;
+ temp |= (1 << (i));
+ }
+ }
+
+ i2c_regs[0] = (unsigned char) (inval & 0x000000FF);
+ i2c_regs[1] = (unsigned char) ((inval & 0x0000FF00) >> 8);
+ i2c_regs[2] = (unsigned char) (temp & 0x000000FF);
+ i2c_regs[3] = (unsigned char) ((temp & 0x0000FF00) >> 8);
+
+
+ //
+ // system registers
+ if (i2c_system[I2C_SREG_CMD] != 0) {
+ if (i2c_system[I2C_SREG_CMD] == I2C_CMD_EEPROMREAD) {
+ cli();
+ i2c_system[I2C_SREG_CMD] = 0;
+ for (i = 0; i < I2C_SREG_MAX; i++) {
+ i2c_system[i] = EEPROM_read(i);
+ }
+ sei();
+ }
+
+ if (i2c_system[I2C_SREG_CMD] == I2C_CMD_EEPROMWRITE) {
+ cli();
+ i2c_system[I2C_SREG_CMD] = 0;
+ for (i = 0; i < I2C_SREG_MAX; i++) {
+ EEPROM_write(i, i2c_system[i]);
+ }
+ sei();
+ }
+ }
+ i2c_system[I2C_SREG_CMD] = 0;
+ }
+ return 0;
+};
+
+
diff --git a/z21emu/config.h b/z21emu/config.h
deleted file mode 100644
index 31da638..0000000
--- a/z21emu/config.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _CONFIG_H_
-#define _CONFIG_H_
-
-#define VERSION "0.1"
-
-#define PREFIX "/usr/local"
-#define RUNPID "/var/run/z21Emulation.pid"
-#define DATAPREFIX "/var/lib"
-#define ETCPREFIX "/etc"
-
-#define DEFAULT_Z21PORT 21104
-
-
-#endif
diff --git a/z21emu/z21emu.cc b/z21emu/z21emu.cc
index 4917102..e9ddefd 100644
--- a/z21emu/z21emu.cc
+++ b/z21emu/z21emu.cc
@@ -141,7 +141,7 @@ void i2cscan(I2C *i2c) {
docnt++;
}
}
- else if (ver == 3) {
+ else if (ver == 3 || ver == 4) {
if (dicnt < RBUS_MAXSENSORBYTES) {
rbus[dicnt].i2c_addr = addr;
rbus[dicnt].i2c_reg = 0x0;
@@ -194,7 +194,6 @@ int i2ccfgload(const char *fname) {
FILE *f;
char buf[1024];
char *pos;
- int tmp;
int index = -1;
int type;
int addr;