Wenn es draußen heiß wird, soll man ja im kühlen Zimmer bleiben. Also habe ich mich nochmal an die CGI Geschichte gewagt.
War gar nicht so schwer.
Wie schon oben geschrieben muss man den Contiki Webserver mit
make -C contiki-2.5/examples/webserver disk TARGET=c64 HTTPD-CFS=0
übersetzen. Dann hat man zwar nicht das SD-Karten Filesysstem, sondern nur das In-Memory File-System,
aber dafür volle CGI Kontrolle.
Ich habe mal einen Webserver aufgesetzt, der Temperaturwerte über den Userport einliest und das ganze mittels AJAX dynamisch
im Browser darstellen kann.
im Detail werde ich es auf jedem Fall in meinem Blog beschreiben: https://commodore64breadbox.tumblr.com
Hier schon mal die Highlights:
Als Basis für meinen Webserver habe ich das Beispiel aus den Contiki Examples genommen. Ich bin noch bei Contiki 2.5,
da dieses Version ja noch supported wurde. Später ggf. mal auf 3.0 migrieren.
Wenn man also den Webserver ohne das CFS Filesystem übersetzt, kann man nur auf die In-Memeory Files zugreifen.
Diese zu erzeugen sind ganz einfach. Man muss sich nur aus dem Verzeichnis
....\contiki-2.5\apps\webserver
den Ordner httpd-fs und die Datei httpd-fsdata.c kopieren. In der C Datei liegen die Dateien aus dem Ordner als ASCII Arrays abgelegt.
Das muss man machen, da der Compiler normale Printausgaben in PETSCII ausliefert. Das versteht jedoch kein Browser 
Mit dem Perl-Skript makefsdata aus dem Contiki Toolverzeichnis läßt sich einfach der komplette Ordner in diese Form bringen:
perl ....\tools\makefsdata -d httpd-fs
Beim nächsten make werden dann diese neuen Files eincompiliert und stehen dann zur Verfügung. Coole Idee 
Natürlich muss man bei den File-Endungen aufpassen. Denn der Webserver muss ja in der HTTP Antwort den Content-Type richtig setzen.
Und leider kennt der Webserver noch keinen Javaskript (JS) und liefert diese dann als "Plain" aus. Das gefällt nicht jedem Browser.
War aber leicht zu patchen.
Um nun seine eigenen CGi Skripte aufrufen zu können, muss man nur einen CGI Handler schreiben.
Sieht dann in etwa so aus:
#include <stdio.h> /* For printf() */
#include <string.h>
#include <stdlib.h>
#include "contiki-net.h"
#include "httpd.h"
#include "httpd-cgi.h"
#include "lib/petsciiconv.h"
#include "webserver-nogui.h"
#include "webserver-strings.c"
#include "tempvalues.h"
int nMyTemperatur=20;
int nMyTemperaturDecimal=0;
PROCESS(get_temp_process,"get temperature process");
/*---------------------------------------------------------------------------*/
void gettemp()
{
int* DDRB=(int*) 56579;
int* CRA=(int*) 56590;
int* PRB=(int*)56577;
int* SDR=(int*)56588;
int* ICR=(int*) 56589;
int* KEY=(int*)198;
int nValue=0;// read value from SDR register
int nTemp=0;
int xPos=0;
//First init all CIA registers
*DDRB=255;//all lines are output lines
*CRA=8+64;*CRA=8;//first clear SDR and then set it to input
*PRB=0;*SDR=0;//empty buffer
*ICR=127;//Set Interrupt flag
// toggle eight times the clock line for eight bits
for (xPos=0;xPos<8;xPos++){
*PRB=0;
*PRB=1;
}
//Wait until interrupt is set
while (*ICR!=0){}
nValue=*SDR;
nTemp=arrTemp[nValue];
//Calculate temperature
*PRB=2; //reset TLC549
nMyTemperatur=nTemp/10;
nMyTemperaturDecimal=abs(nTemp%10);
}
static unsigned short
make_temp(void *p)
{
uint16_t numprinted;
numprinted=snprintf( (char *)uip_appdata, uip_mss(),"%d.%d",nMyTemperatur,nMyTemperaturDecimal);
return numprinted;
}
/*---------------------------------------------------------------------------*/
static
PT_THREAD(MyTemp_thread(struct httpd_state *s, char *ptr))
{
PSOCK_BEGIN(&s->sout);
PSOCK_GENERATOR_SEND(&s->sout, make_temp, s->u.ptr);
PSOCK_END(&s->sout);
}
HTTPD_CGI_CALL(MyTemp, MyTemp_name, MyTemp_thread);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(get_temp_process, ev, data)
{
static struct etimer timer;
static int nCount=0;
PROCESS_BEGIN();
httpd_cgi_add(&MyTemp);
etimer_set(&timer, 1*CLOCK_SECOND);
while(1) {
PROCESS_WAIT_EVENT();
if (ev == PROCESS_EVENT_TIMER)
{
gettemp();
etimer_reset(&timer);
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/
AUTOSTART_PROCESSES(&webserver_nogui_process,&get_temp_process);
/*---------------------------------------------------------------------------*/
Für die Temepraturmessung habe ich eine alte Schaltung aus einem Bastelbuch von John Iovine aus 1980 genommen. hier der Link.
Die Schaltung und meine Bastelversuche habe ich mal dran gehängt..
Das schöne ist, dass man den TLC548 einfach dranhängen kann und 8-Bit Digitalwerte bekommt, aber ohne das
ganze Timing geraffele wie beim I2C Bus oder so. Mit nem Multiplexer könnte man sogar mehrere dran hängen, aber das kommt später 
Das genaue How-To beschreibe ich im oben genannten Blog. Das wäre hier zu viel.
Wird noch ein paar Tage dauern bis ich im Blog alles drin habe. Wer vorher Infos haben will, einfach fragen.
Wenn ich meine RR-Net und Netzteile Probleme endlich im Griff habe, werde ich mit dem Server auch Online gehen. Eingerichtet ist schon alles,
aber wie in anderen Threads beschrieben, habe ich Probleme das RR-Net zum Laufen zu bekommen und Probleme mit meinem Netzteilnachbau.
Ich wollte der Rechner 24/7 laufen lassen. Aber dazu bearfs es noch ein wenig Vorbereitung, beginnend beim Netzteil.