more work on pages and ressources.

This commit is contained in:
Martin Preuss
2025-12-15 21:12:51 +01:00
parent 06f006ee42
commit 636fc026aa
13 changed files with 376 additions and 2 deletions

2
0BUILD
View File

@@ -2,7 +2,7 @@
<gwbuild> <gwbuild>
<project name="aqhome" version="0.0.21" so_current="0" so_age="0" so_revision="21" write_config_h="TRUE"> <project name="aqhome" version="0.0.22" so_current="0" so_age="0" so_revision="22" write_config_h="TRUE">
<setVar name="package">$(project_name)</setVar> <setVar name="package">$(project_name)</setVar>
<setVar name="version"> <setVar name="version">
$(project_vmajor).$(project_vminor).$(project_vpatchlevel) $(project_vmajor).$(project_vminor).$(project_vpatchlevel)

View File

@@ -23,6 +23,7 @@
#include <gwenhywfar/debug.h> #include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h> #include <gwenhywfar/timestamp.h>
#include <gwenhywfar/text.h> #include <gwenhywfar/text.h>
#include <gwenhywfar/directory.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <string.h> #include <string.h>
@@ -75,6 +76,8 @@ static int _getColorComponent(GWEN_DB_NODE *dbPost, const char *sValueName, cons
static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue); static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue); static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
static void _sendPageList(AQH_MODULE *m, GWEN_BUFFER *dbuf);
static GWEN_STRINGLIST *_listPageFiles(AQH_MODULE *m);
static GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName); static GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName);
static GWEN_XMLNODE *_readPageFile(const char *sFilename); static GWEN_XMLNODE *_readPageFile(const char *sFilename);
static int _layoutFromString(const char *s); static int _layoutFromString(const char *s);
@@ -93,7 +96,7 @@ void AQH_ModDevices_RunPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
DBG_INFO(NULL, "RunPageGet"); DBG_INFO(NULL, "RunPageGet");
dbQuery=AQCGI_Request_GetDbQuery(rq); dbQuery=AQCGI_Request_GetDbQuery(rq);
sPageId=GWEN_DB_GetCharValue(dbQuery, "page", 0, NULL); sPageId=dbQuery?GWEN_DB_GetCharValue(dbQuery, "page", 0, NULL):NULL;
if (sPageId && *sPageId) { if (sPageId && *sPageId) {
GWEN_XMLNODE *fileNode; GWEN_XMLNODE *fileNode;
@@ -115,6 +118,10 @@ void AQH_ModDevices_RunPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
DBG_INFO(NULL, "here"); DBG_INFO(NULL, "here");
} }
} }
else {
DBG_ERROR(NULL, "Reading page list");
_sendPageList(m, dbuf);
}
} }
@@ -812,6 +819,86 @@ void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *s
void _sendPageList(AQH_MODULE *m, GWEN_BUFFER *dbuf)
{
GWEN_STRINGLIST *sl;
GBAS(dbuf, "<h1>Page List</h1>\n");
sl=_listPageFiles(m);
if (sl) {
GWEN_STRINGLISTENTRY *se;
GBAS(dbuf,
"<table class=\"datatable\">\n"
"<thead><tr><th>Page</th><th>Title</th></tr></thead>\n"
"<tbody>\n");
se=GWEN_StringList_FirstEntry(sl);
while(se) {
const char *filename;
filename=GWEN_StringListEntry_Data(se);
if (filename && *filename) {
GWEN_XMLNODE *node;
DBG_ERROR(NULL, "Reading file \"%s\"", filename);
node=_readPageFile(filename);
if (node) {
GWEN_XMLNODE *nPage;
nPage=GWEN_XMLNode_FindFirstTag(node, "page", NULL, NULL);
if (nPage) {
const char *sId;
const char *sTitle;
sId=GWEN_XMLNode_GetProperty(nPage, "id", NULL);
sTitle=GWEN_XMLNode_GetProperty(nPage, "title", sId);
if (sId && *sId)
GBAA(dbuf, "<tr><td><a href=\"page.html?page=%s\">%s</a></td><td>%s</td></tr>\n", sId, sId, sTitle);
}
GWEN_XMLNode_free(node);
}
}
se=GWEN_StringListEntry_Next(se);
}
GBAS(dbuf, "</tbody></table>");
GWEN_StringList_free(sl);
}
else {
GBAS(dbuf, "No pages.");
}
}
GWEN_STRINGLIST *_listPageFiles(AQH_MODULE *m)
{
GWEN_BUFFER *fbuf;
AQH_SERVICE *sv;
GWEN_STRINGLIST *sl;
int rv;
sv=AQH_ModService_GetService(m);
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
GBAA(fbuf, "%s%spages", AQH_Service_GetRuntimeFolder(sv), GWEN_DIR_SEPARATOR_S);
sl=GWEN_StringList_new();
rv=GWEN_Directory_GetMatchingFilesRecursively(GWEN_Buffer_GetStart(fbuf), sl, "*.xml");
if (rv<0) {
DBG_INFO(NULL, "Error reading pages (%d)", rv);
GWEN_StringList_free(sl);
GWEN_Buffer_free(fbuf);
return NULL;
}
if (GWEN_StringList_Count(sl)<1) {
GWEN_StringList_free(sl);
GWEN_Buffer_free(fbuf);
return NULL;
}
GWEN_Buffer_free(fbuf);
return sl;
}
GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName) GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName)
{ {

View File

@@ -16,6 +16,7 @@
<ul class="mainmenu" > <ul class="mainmenu" >
<li><a href="/aqhome/devices/index.html">Devices</a></li> <li><a href="/aqhome/devices/index.html">Devices</a></li>
<li><a href="/aqhome/devices/page.html">Pages</a></li>
<li><a href="/aqhome/admin/index.html">Admin</a></li> <li><a href="/aqhome/admin/index.html">Admin</a></li>
<li><a href="#news">News</a></li> <li><a href="#news">News</a></li>
<li><a href="#contact">Contact</a></li> <li><a href="#contact">Contact</a></li>

View File

@@ -67,6 +67,7 @@ static int AQH_Tool_ReadAndDumpBmpFile(const char *fname);
static int AQH_Tool_ExportBmpFile(const char *fname); static int AQH_Tool_ExportBmpFile(const char *fname);
static int _exportBmp_1bpp(const BMP_FILE *bf); static int _exportBmp_1bpp(const BMP_FILE *bf);
static int _exportBmp_gray8bpp(const BMP_FILE *bf);
static BMP_FILEHEADER *_fileHeader_new(); static BMP_FILEHEADER *_fileHeader_new();
static void _fileHeader_free(BMP_FILEHEADER *fh); static void _fileHeader_free(BMP_FILEHEADER *fh);
@@ -166,6 +167,8 @@ int AQH_Tool_ExportBmpFile(const char *fname)
_dumpBmpImageHeader(bf->imageHeader); _dumpBmpImageHeader(bf->imageHeader);
if (bf->imageHeader->bitsPerPixel==1) if (bf->imageHeader->bitsPerPixel==1)
rv=_exportBmp_1bpp(bf); rv=_exportBmp_1bpp(bf);
else if (bf->imageHeader->bitsPerPixel==8)
rv=_exportBmp_gray8bpp(bf);
else { else {
fprintf(stderr, "Invalid bits per pixel (%d)", bf->imageHeader->bitsPerPixel); fprintf(stderr, "Invalid bits per pixel (%d)", bf->imageHeader->bitsPerPixel);
rv=2; rv=2;
@@ -220,6 +223,69 @@ int _exportBmp_1bpp(const BMP_FILE *bf)
int _exportBmp_gray8bpp(const BMP_FILE *bf)
{
const uint8_t *ptrBuffer;
uint32_t lenBuffer;
uint32_t offsPixels;
const uint8_t *ptrPixels;
int imageWidth;
int imageHeight;
int rowWidthInBytes;
int columns;
int y;
ptrBuffer=(const uint8_t *) GWEN_Buffer_GetStart(bf->buffer);
lenBuffer=GWEN_Buffer_GetUsedBytes(bf->buffer);
offsPixels=bf->fileHeader->offsPixels;
ptrPixels=ptrBuffer+offsPixels;
imageWidth=bf->imageHeader->imgWidth;
imageHeight=bf->imageHeader->imgHeight;
columns=imageWidth;
rowWidthInBytes=4*((columns+3)/4); /* BMPs have multiple of 4 bytes per row! */
fprintf(stdout, "imgData: \n");
fprintf(stdout, " .dw %d, %d\n", imageWidth, imageHeight);
for (y=imageHeight-1; y>=0; y--) {
const uint8_t *rowPtr;
int x;
uint8_t currentByte=0;
int writtenBytes=0;
int packedPixels=0;
fprintf(stdout, " .db ");
rowPtr=ptrPixels+(y*rowWidthInBytes);
for (x=0; x<columns; x++) {
uint8_t pixel;
uint8_t newPix;
pixel=rowPtr[x];
switch(pixel) {
case 0x00: newPix=0b01; break; /* outline color */
case 0x60: newPix=0b10; break; /* color 1 */
case 0xc0: newPix=0b11; break; /* color 2 */
case 0xff: newPix=0b00; break; /* background color */
default: newPix=0b00; break; /* background color */
}
currentByte<<=2;
currentByte|=newPix;
packedPixels++;
if (packedPixels==4) {
if (writtenBytes)
fprintf(stdout, ", ");
fprintf(stdout, "0x%02x", currentByte);
writtenBytes++;
packedPixels=0;
currentByte=0;
}
}
fprintf(stdout, "\n");
}
return 0;
}
BMP_FILE *BMP_File_new(const char *fname) BMP_FILE *BMP_File_new(const char *fname)

View File

@@ -32,6 +32,7 @@
tree_t.asm tree_t.asm
eeprom-r.asm eeprom-r.asm
eeprom-w.asm eeprom-w.asm
ressource.asm
</extradist> </extradist>
</gwbuild> </gwbuild>

64
avr/common/ressource.asm Normal file
View File

@@ -0,0 +1,64 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_COMMON_RESSOURCE_H
#define AQH_AVR_COMMON_RESSOURCE_H
; ***************************************************************************
; defs
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine RES_GetRessource
;
; The Ressource table has one entry for every ressource handled by this table.
; The first entry contains the number of ressource entries in the table.
; All following entries contain byte pointer addresses (for LPM) to ressources.
; Ressource ids start with zero.
;
; @param r17:r16 ressource id (starting with 0)
; @param Z pointer to start of ressources in FLASH (byte address)
; @return CF set if ressource found, cleared otherwise
; @return Z if CF set: pointer to ressource (byte address)
; @clobbers r16, r17, r18
RES_GetRessource:
lpm r18, Z+ ; first entry: number of entries in table
cp r16, r18 ; id must be < num entries
lpm r18, Z+ ; Z points to first entry now
cpc r17, r18
brcc RES_GetRessource_ret
RES_GetRessource_getRessource:
lsl r16 ; byte address, so we need to add ressource id twice (i.e. *2)
rol r17
add zl, r16
add zh, r17
lpm r16, Z+
lpm r17, Z+
mov zl, r16
mov zh, r17
sec
RES_GetRessource_ret:
ret
; @end
#endif

View File

@@ -248,6 +248,7 @@
#ifdef MODULES_ILI9341 #ifdef MODULES_ILI9341
.include "modules/lcd2/ili9341/defs.asm" .include "modules/lcd2/ili9341/defs.asm"
.include "modules/lcd2/ili9341/colors.asm" .include "modules/lcd2/ili9341/colors.asm"
.include "modules/lcd2/ili9341/images.asm"
.include "modules/lcd2/ili9341/main.asm" .include "modules/lcd2/ili9341/main.asm"
.include "modules/lcd2/ili9341/io_spi.asm" .include "modules/lcd2/ili9341/io_spi.asm"
.include "modules/lcd2/ili9341/graphops.asm" .include "modules/lcd2/ili9341/graphops.asm"

View File

@@ -40,6 +40,8 @@
.equ BOOTLOADER_ADDR = 0x7c00 .equ BOOTLOADER_ADDR = 0x7c00
.equ RESSOURCE_ADDR = 0x4000
.equ FIRMWARE_VARIANT_BOOT = 0 .equ FIRMWARE_VARIANT_BOOT = 0
.equ FIRMWARE_VARIANT_TEMP_WINDOW = 1 .equ FIRMWARE_VARIANT_TEMP_WINDOW = 1

View File

@@ -20,6 +20,24 @@
</target> </target>
<target type="AvrHexFile" name="c03_ressources" >
<includes type="avrasm" >
-I $(builddir)
-I $(srcdir)
-I $(topsrcdir)/avr
-I $(topbuilddir)/avr
</includes>
<sources type="avrasm" >
ressources.asm
</sources>
</target>
<subdirs> <subdirs>
</subdirs> </subdirs>

View File

@@ -253,9 +253,11 @@ test:
;.include "common/list_t.asm" ;.include "common/list_t.asm"
;.include "common/tree_t.asm" ;.include "common/tree_t.asm"
.include "common/divide.asm" .include "common/divide.asm"
.include "common/ressource.asm"
.include "modules/lcd2/gui/style.asm" .include "modules/lcd2/gui/style.asm"
.include "dlg_netstats.asm" .include "dlg_netstats.asm"
.include "ressources.inc"
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------

View File

@@ -0,0 +1,95 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_DEVICE_C03_RESSOURCES_ASM
#define AQH_AVR_DEVICE_C03_RESSOURCES_ASM
.nolist
.include "include/m644Pdef.inc" ; Define device ATmega644P
.list
.include "../defs.asm"
.include "modules/lcd2/ili9341/colors.asm"
.include "modules/lcd2/ili9341/images.asm"
.cseg
.org RESSOURCE_ADDR
RessourceTable:
.dw 1
.dw (resImageNetwork*2) ; RESSSOURCE_IMG_NETWORK
resImageNetwork:
.dw DISPLAY_IMAGETYPE_IDX2
.dw 48, 48
.dw (resImageNetworkColorMap*2)
.dw (resImageNetworkPixels*2)
resImageNetworkColorMap:
.dw 4
.dw 0, DISPLAY_COLOR_BLACK, DISPLAY_COLOR_LIGHTGREY, DISPLAY_COLOR_LIGHTGREY
resImageNetworkPixels:
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40
.db 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40
.db 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x05, 0x55, 0x54, 0x00, 0x00, 0x05, 0x55, 0x54, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, 0x00
.db 0x00, 0x00, 0x05, 0x55, 0x54, 0x00, 0x00, 0x05, 0x55, 0x54, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
#endif

View File

@@ -0,0 +1,18 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_DEVICE_C03_RESSOURCES_INC
#define AQH_AVR_DEVICE_C03_RESSOURCES_INC
.equ RESSSOURCE_IMG_NETWORK = 0
#endif ; AQH_AVR_DEVICE_C03_RESSOURCES_INC

View File

@@ -0,0 +1,19 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_ILI9341_IMAGES_ASM
#define AQH_AVR_ILI9341_IMAGES_ASM
.equ DISPLAY_IMAGETYPE_IDX2 = 1 ; 2 bit indexed image
#endif