Commit 7b83bbb2 authored by Arnim Läuger's avatar Arnim Läuger Committed by GitHub
Browse files

Merge pull request #1519 from nodemcu/dev

Next 1.5.4.1 master drop
parents 8e48483c d96d7f23
#include "platform.h"
#include "driver/spi.h"
#include "c_types.h"
#include "sdcard.h"
#define CHECK_SSPIN(pin) \
if (pin < 1 || pin > NUM_GPIO) return FALSE; \
m_ss_pin = pin;
//==============================================================================
// SD card commands
/** GO_IDLE_STATE - init card in spi mode if CS low */
uint8_t const CMD0 = 0X00;
/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/
uint8_t const CMD8 = 0X08;
/** SEND_CSD - read the Card Specific Data (CSD register) */
uint8_t const CMD9 = 0X09;
/** SEND_CID - read the card identification information (CID register) */
uint8_t const CMD10 = 0X0A;
/** STOP_TRANSMISSION - end multiple block read sequence */
uint8_t const CMD12 = 0X0C;
/** SEND_STATUS - read the card status register */
uint8_t const CMD13 = 0X0D;
/** READ_SINGLE_BLOCK - read a single data block from the card */
uint8_t const CMD17 = 0X11;
/** READ_MULTIPLE_BLOCK - read a multiple data blocks from the card */
uint8_t const CMD18 = 0X12;
/** WRITE_BLOCK - write a single data block to the card */
uint8_t const CMD24 = 0X18;
/** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */
uint8_t const CMD25 = 0X19;
/** ERASE_WR_BLK_START - sets the address of the first block to be erased */
uint8_t const CMD32 = 0X20;
/** ERASE_WR_BLK_END - sets the address of the last block of the continuous
range to be erased*/
uint8_t const CMD33 = 0X21;
/** ERASE - erase all previously selected blocks */
uint8_t const CMD38 = 0X26;
/** APP_CMD - escape for application specific command */
uint8_t const CMD55 = 0X37;
/** READ_OCR - read the OCR register of a card */
uint8_t const CMD58 = 0X3A;
/** CRC_ON_OFF - enable or disable CRC checking */
uint8_t const CMD59 = 0X3B;
/** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be
pre-erased before writing */
uint8_t const ACMD23 = 0X17;
/** SD_SEND_OP_COMD - Sends host capacity support information and
activates the card's initialization process */
uint8_t const ACMD41 = 0X29;
//==============================================================================
/** status for card in the ready state */
uint8_t const R1_READY_STATE = 0X00;
/** status for card in the idle state */
uint8_t const R1_IDLE_STATE = 0X01;
/** status bit for illegal command */
uint8_t const R1_ILLEGAL_COMMAND = 0X04;
/** start data token for read or write single block*/
uint8_t const DATA_START_BLOCK = 0XFE;
/** stop token for write multiple blocks*/
uint8_t const STOP_TRAN_TOKEN = 0XFD;
/** start data token for write multiple blocks*/
uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC;
/** mask for data response tokens after a write block operation */
uint8_t const DATA_RES_MASK = 0X1F;
/** write data accepted token */
uint8_t const DATA_RES_ACCEPTED = 0X05;
//------------------------------------------------------------------------------
// SD card errors
/** timeout error for command CMD0 (initialize card in SPI mode) */
uint8_t const SD_CARD_ERROR_CMD0 = 0X1;
/** CMD8 was not accepted - not a valid SD card*/
uint8_t const SD_CARD_ERROR_CMD8 = 0X2;
/** card returned an error response for CMD12 (stop multiblock read) */
uint8_t const SD_CARD_ERROR_CMD12 = 0X3;
/** card returned an error response for CMD17 (read block) */
uint8_t const SD_CARD_ERROR_CMD17 = 0X4;
/** card returned an error response for CMD18 (read multiple block) */
uint8_t const SD_CARD_ERROR_CMD18 = 0X5;
/** card returned an error response for CMD24 (write block) */
uint8_t const SD_CARD_ERROR_CMD24 = 0X6;
/** WRITE_MULTIPLE_BLOCKS command failed */
uint8_t const SD_CARD_ERROR_CMD25 = 0X7;
/** card returned an error response for CMD58 (read OCR) */
uint8_t const SD_CARD_ERROR_CMD58 = 0X8;
/** SET_WR_BLK_ERASE_COUNT failed */
uint8_t const SD_CARD_ERROR_ACMD23 = 0X9;
/** ACMD41 initialization process timeout */
uint8_t const SD_CARD_ERROR_ACMD41 = 0XA;
/** card returned a bad CSR version field */
uint8_t const SD_CARD_ERROR_BAD_CSD = 0XB;
/** erase block group command failed */
uint8_t const SD_CARD_ERROR_ERASE = 0XC;
/** card not capable of single block erase */
uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0XD;
/** Erase sequence timed out */
uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0XE;
/** card returned an error token instead of read data */
uint8_t const SD_CARD_ERROR_READ = 0XF;
/** read CID or CSD failed */
uint8_t const SD_CARD_ERROR_READ_REG = 0X10;
/** timeout while waiting for start of read data */
uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X11;
/** card did not accept STOP_TRAN_TOKEN */
uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X12;
/** card returned an error token as a response to a write operation */
uint8_t const SD_CARD_ERROR_WRITE = 0X13;
/** attempt to write protected block zero */
uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X14; // REMOVE - not used
/** card did not go ready for a multiple block write */
uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15;
/** card returned an error to a CMD13 status check after a write */
uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X16;
/** timeout occurred during write programming */
uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X17;
/** incorrect rate selected */
uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18;
/** init() not called */
uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19;
/** card returned an error for CMD59 (CRC_ON_OFF) */
uint8_t const SD_CARD_ERROR_CMD59 = 0X1A;
/** invalid read CRC */
uint8_t const SD_CARD_ERROR_READ_CRC = 0X1B;
/** SPI DMA error */
uint8_t const SD_CARD_ERROR_SPI_DMA = 0X1C;
//------------------------------------------------------------------------------
// card types
uint8_t const SD_CARD_TYPE_INVALID = 0;
/** Standard capacity V1 SD card */
uint8_t const SD_CARD_TYPE_SD1 = 1;
/** Standard capacity V2 SD card */
uint8_t const SD_CARD_TYPE_SD2 = 2;
/** High Capacity SD card */
uint8_t const SD_CARD_TYPE_SDHC = 3;
typedef struct {
uint32_t start, target;
} to_t;
static uint8_t m_spi_no, m_ss_pin, m_status, m_type, m_error;
static void sdcard_chipselect_low( void ) {
platform_gpio_write( m_ss_pin, PLATFORM_GPIO_LOW );
}
static void sdcard_chipselect_high( void ) {
platform_gpio_write( m_ss_pin, PLATFORM_GPIO_HIGH );
// send some cc to ensure that MISO returns to high
platform_spi_send_recv( m_spi_no, 8, 0xff );
}
static void set_timeout( to_t *to, uint32_t us )
{
uint32_t offset;
to->start = system_get_time();
offset = 0xffffffff - to->start;
if (offset > us) {
to->target = us - offset;
} else {
to->target = to->start + us;
}
}
static uint8_t timed_out( to_t *to )
{
uint32_t now = system_get_time();
if (to->start < to->target) {
if ((now >= to->start) && (now <= to->target)) {
return FALSE;
} else {
return TRUE;
}
} else {
if ((now >= to->start) || (now <= to->target)) {
return FALSE;
} else {
return TRUE;
}
}
}
static int sdcard_wait_not_busy( uint32_t us )
{
to_t to;
set_timeout( &to, us );
while (platform_spi_send_recv( m_spi_no, 8, 0xff ) != 0xff) {
if (timed_out( &to )) {
goto fail;
}
}
return TRUE;
fail:
return FALSE;
}
static uint8_t sdcard_command( uint8_t cmd, uint32_t arg )
{
sdcard_chipselect_low();
// wait until card is busy
sdcard_wait_not_busy( 100 * 1000 );
// send command
// with precalculated CRC - correct for CMD0 with arg zero or CMD8 with arg 0x1AA
const uint8_t crc = cmd == CMD0 ? 0x95 : 0x87;
platform_spi_transaction( m_spi_no, 16, (cmd | 0x40) << 8 | arg >> 24, 32, arg << 8 | crc, 0, 0, 0 );
// skip dangling byte of data transfer
if (cmd == CMD12) {
platform_spi_transaction( m_spi_no, 8, 0xff, 0, 0, 0, 0, 0 );
}
// wait for response
for (uint8_t i = 0; ((m_status = platform_spi_send_recv( m_spi_no, 8, 0xff )) & 0x80) && i != 0xFF; i++) ;
return m_status;
}
static uint8_t sdcard_acmd( uint8_t cmd, uint32_t arg ) {
sdcard_command( CMD55, 0 );
return sdcard_command( cmd, arg );
}
static int sdcard_write_data( uint8_t token, const uint8_t *src)
{
uint16_t crc = 0xffff;
platform_spi_transaction( m_spi_no, 8, token, 0, 0, 0, 0, 0 );
platform_spi_blkwrite( m_spi_no, 512, src );
platform_spi_transaction( m_spi_no, 16, crc, 0, 0, 0, 0, 0 );
m_status = platform_spi_send_recv( m_spi_no, 8, 0xff );
if ((m_status & DATA_RES_MASK) != DATA_RES_ACCEPTED) {
m_error = SD_CARD_ERROR_WRITE;
goto fail;
}
return TRUE;
fail:
sdcard_chipselect_high();
return FALSE;
}
static int sdcard_read_data( uint8_t *dst, size_t count )
{
to_t to;
// wait for start block token
set_timeout( &to, 100 * 1000 );
while ((m_status = platform_spi_send_recv( m_spi_no, 8, 0xff)) == 0xff) {
if (timed_out( &to )) {
goto fail;
}
}
if (m_status != DATA_START_BLOCK) {
m_error = SD_CARD_ERROR_READ;
goto fail;
}
// transfer data
platform_spi_blkread( m_spi_no, count, (void *)dst );
// discard crc
platform_spi_transaction( m_spi_no, 16, 0xffff, 0, 0, 0, 0, 0 );
sdcard_chipselect_high();
return TRUE;
fail:
sdcard_chipselect_high();
return FALSE;
}
static int sdcard_read_register( uint8_t cmd, uint8_t *buf )
{
if (sdcard_command( cmd, 0 )) {
m_error = SD_CARD_ERROR_READ_REG;
goto fail;
}
return sdcard_read_data( buf, 16 );
fail:
sdcard_chipselect_high();
return FALSE;
}
int platform_sdcard_init( uint8_t spi_no, uint8_t ss_pin )
{
uint32_t arg, user_spi_clkdiv;
to_t to;
m_type = SD_CARD_TYPE_INVALID;
m_error = 0;
if (spi_no > 1) {
return FALSE;
}
m_spi_no = spi_no;
CHECK_SSPIN(ss_pin);
platform_gpio_write( m_ss_pin, PLATFORM_GPIO_HIGH );
platform_gpio_mode( m_ss_pin, PLATFORM_GPIO_OUTPUT, PLATFORM_GPIO_FLOAT );
// set SPI clock to 400 kHz for init phase
user_spi_clkdiv = spi_set_clkdiv( m_spi_no, 200 );
// apply initialization sequence:
// keep ss and io high, apply clock for max(1ms; 74cc)
// 1ms requires 400cc @ 400kHz
for (int i = 0; i < 2; i++) {
platform_spi_transaction( m_spi_no, 0, 0, 0, 0, 0, 200, 0 );
}
// command to go idle in SPI mode
set_timeout( &to, 500 * 1000 );
while (sdcard_command( CMD0, 0 ) != R1_IDLE_STATE) {
if (timed_out( &to )) {
goto fail;
}
}
set_timeout( &to, 500 * 1000 );
while (1) {
if (sdcard_command( CMD8, 0x1aa) == (R1_ILLEGAL_COMMAND | R1_IDLE_STATE)) {
m_type = SD_CARD_TYPE_SD1;
break;
}
for (uint8_t i = 0; i < 4; i++) {
m_status = platform_spi_send_recv( m_spi_no, 8, 0xff );
}
if (m_status == 0xaa) {
m_type = SD_CARD_TYPE_SD2;
break;
}
if (timed_out( &to )) {
goto fail;
}
}
// initialize card and send host supports SDHC if SD2
arg = m_type == SD_CARD_TYPE_SD2 ? 0x40000000 : 0;
set_timeout( &to, 500 * 1000 );
while (sdcard_acmd( ACMD41, arg ) != R1_READY_STATE) {
if (timed_out( &to )) {
goto fail;
}
}
// if SD2 read OCR register to check for SDHC card
if (m_type == SD_CARD_TYPE_SD2) {
if (sdcard_command( CMD58, 0 )) {
m_error = SD_CARD_ERROR_CMD58;
goto fail;
}
if ((platform_spi_send_recv( m_spi_no, 8, 0xff ) & 0xC0) == 0xC0) {
m_type = SD_CARD_TYPE_SDHC;
}
// Discard rest of ocr - contains allowed voltage range.
for (uint8_t i = 0; i < 3; i++) {
platform_spi_send_recv( m_spi_no, 8, 0xff);
}
}
sdcard_chipselect_high();
// re-apply user's spi clock divider
spi_set_clkdiv( m_spi_no, user_spi_clkdiv );
return TRUE;
fail:
sdcard_chipselect_high();
return FALSE;
}
int platform_sdcard_status( void )
{
return m_status;
}
int platform_sdcard_error( void )
{
return m_error;
}
int platform_sdcard_type( void )
{
return m_type;
}
int platform_sdcard_read_block( uint8_t ss_pin, uint32_t block, uint8_t *dst )
{
CHECK_SSPIN(ss_pin);
// generate byte address for pre-SDHC types
if (m_type != SD_CARD_TYPE_SDHC) {
block <<= 9;
}
if (sdcard_command( CMD17, block )) {
m_error = SD_CARD_ERROR_CMD17;
goto fail;
}
return sdcard_read_data( dst, 512 );
fail:
sdcard_chipselect_high();
return FALSE;
}
int platform_sdcard_read_blocks( uint8_t ss_pin, uint32_t block, size_t num, uint8_t *dst )
{
CHECK_SSPIN(ss_pin);
if (num == 0) {
return TRUE;
}
if (num == 1) {
return platform_sdcard_read_block( ss_pin, block, dst );
}
// generate byte address for pre-SDHC types
if (m_type != SD_CARD_TYPE_SDHC) {
block <<= 9;
}
// command READ_MULTIPLE_BLOCKS
if (sdcard_command( CMD18, block )) {
m_error = SD_CARD_ERROR_CMD18;
goto fail;
}
// read required blocks
while (num > 0) {
sdcard_chipselect_low();
if (sdcard_read_data( dst, 512 )) {
num--;
dst = &(dst[512]);
} else {
break;
}
}
// issue command STOP_TRANSMISSION
if (sdcard_command( CMD12, 0 )) {
m_error = SD_CARD_ERROR_CMD12;
goto fail;
}
sdcard_chipselect_high();
return TRUE;
fail:
sdcard_chipselect_high();
return FALSE;
}
int platform_sdcard_read_csd( uint8_t ss_pin, uint8_t *csd )
{
CHECK_SSPIN(ss_pin);
return sdcard_read_register( CMD9, csd );
}
int platform_sdcard_read_cid( uint8_t ss_pin, uint8_t *cid )
{
CHECK_SSPIN(ss_pin);
return sdcard_read_register( CMD10, cid );
}
int platform_sdcard_write_block( uint8_t ss_pin, uint32_t block, const uint8_t *src )
{
CHECK_SSPIN(ss_pin);
// generate byte address for pre-SDHC types
if (m_type != SD_CARD_TYPE_SDHC) {
block <<= 9;
}
if (sdcard_command( CMD24, block )) {
m_error = SD_CARD_ERROR_CMD24;
goto fail;
}
if (! sdcard_write_data( DATA_START_BLOCK, src )) {
goto fail;
}
sdcard_chipselect_high();
return TRUE;
fail:
sdcard_chipselect_high();
return FALSE;
}
static int sdcard_write_stop( void )
{
sdcard_chipselect_low();
if (! sdcard_wait_not_busy( 100 * 1000 )) {
goto fail;
}
platform_spi_transaction( m_spi_no, 8, STOP_TRAN_TOKEN, 0, 0, 0, 0, 0 );
if (! sdcard_wait_not_busy( 100 * 1000 )) {
goto fail;
}
sdcard_chipselect_high();
return TRUE;
fail:
m_error = SD_CARD_ERROR_STOP_TRAN;
sdcard_chipselect_high();
return FALSE;
}
int platform_sdcard_write_blocks( uint8_t ss_pin, uint32_t block, size_t num, const uint8_t *src )
{
CHECK_SSPIN(ss_pin);
if (sdcard_acmd( ACMD23, num )) {
m_error = SD_CARD_ERROR_ACMD23;
goto fail;
}
// generate byte address for pre-SDHC types
if (m_type != SD_CARD_TYPE_SDHC) {
block <<= 9;
}
if (sdcard_command( CMD25, block )) {
m_error = SD_CARD_ERROR_CMD25;
goto fail;
}
sdcard_chipselect_high();
for (size_t b = 0; b < num; b++, src += 512) {
sdcard_chipselect_low();
// wait for previous write to finish
if (! sdcard_wait_not_busy( 100 * 1000 )) {
goto fail_write;
}
if (! sdcard_write_data( WRITE_MULTIPLE_TOKEN, src )) {
goto fail_write;
}
sdcard_chipselect_high();
}
return sdcard_write_stop();
fail_write:
m_error = SD_CARD_ERROR_WRITE_MULTIPLE;
fail:
sdcard_chipselect_high();
return FALSE;
}
#ifndef _SDCARD_H
#define _SDCARD_H
#include "c_types.h"
int platform_sdcard_init( uint8_t spi_no, uint8_t ss_pin );
int platform_sdcard_status( void );
int platform_sdcard_error( void );
int platform_sdcard_type( void );
int platform_sdcard_read_block( uint8_t ss_pin, uint32_t block, uint8_t *dst );
int platform_sdcard_read_blocks( uint8_t ss_pin, uint32_t block, size_t num, uint8_t *dst );
int platform_sdcard_read_csd( uint8_t ss_pin, uint8_t *csd );
int platform_sdcard_read_cid( uint8_t ss_pin, uint8_t *cid );
int platform_sdcard_write_block( uint8_t ss_pin, uint32_t block, const uint8_t *src );
int platform_sdcard_write_blocks( uint8_t ss_pin, uint32_t block, size_t num, const uint8_t *src );
#endif
#include "c_stdlib.h"
#include "c_stdio.h"
#include "vfs.h"
#define LDRV_TRAVERSAL 0
// ---------------------------------------------------------------------------
// RTC system interface
//
static sint32_t (*rtc_cb)( vfs_time *tm ) = NULL;
// called by operating system
void vfs_register_rtc_cb( sint32_t (*cb)( vfs_time *tm ) )
{
// allow NULL pointer to unregister callback function
rtc_cb = cb;
}
// called by file system drivers
sint32_t vfs_get_rtc( vfs_time *tm )
{
if (rtc_cb) {
return rtc_cb( tm );
}
return VFS_RES_ERR;
}
static int dir_level = 1;
static const char *normalize_path( const char *path )
{
#if ! LDRV_TRAVERSAL
return path;
#else
const char *temp = path;
size_t len;
while ((len = c_strlen( temp )) >= 2) {
if (temp[0] == '.' && temp[1] == '.') {
--dir_level;
if (len >= 4 && dir_level > 0) {
// prepare next step
temp = &(temp[4]);
} else {
// we're at top, the remainder is expected be an absolute path
temp = &(temp[3]);
}
} else {
break;
}
}
if (dir_level > 0) {
// no traversal on root level
return path;
} else {
// path traverses via root
return temp;
}
#endif
}
// ---------------------------------------------------------------------------
// file system functions
//
vfs_vol *vfs_mount( const char *name, int num )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return fs_fns->mount( outname, num );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
vfs_vol *r = fs_fns->mount( outname, num );
c_free( outname );
return r;
}
#endif
return NULL;
}
int vfs_open( const char *name, const char *mode )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return (int)fs_fns->open( outname, mode );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
int r = (int)fs_fns->open( outname, mode );
c_free( outname );
return r;
}
#endif
return 0;
}
vfs_dir *vfs_opendir( const char *name )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return fs_fns->opendir( outname );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
vfs_dir *r = fs_fns->opendir( outname );
c_free( outname );
return r;
}
#endif
return NULL;
}
vfs_item *vfs_stat( const char *name )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return fs_fns->stat( outname );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
vfs_item *r = fs_fns->stat( outname );
c_free( outname );
return r;
}
#endif
return NULL;
}
sint32_t vfs_remove( const char *name )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return fs_fns->remove( outname );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
sint32_t r = fs_fns->remove( outname );
c_free( outname );
return r;
}
#endif
return VFS_RES_ERR;
}
sint32_t vfs_rename( const char *oldname, const char *newname )
{
vfs_fs_fns *fs_fns;
const char *normoldname = normalize_path( oldname );
const char *normnewname = normalize_path( newname );
char *oldoutname, *newoutname;
#ifdef BUILD_SPIFFS
if (myspiffs_realm( normoldname, &oldoutname, FALSE )) {
if (fs_fns = myspiffs_realm( normnewname, &newoutname, FALSE )) {
return fs_fns->rename( oldoutname, newoutname );
}
}
#endif
#ifdef BUILD_FATFS
if (myfatfs_realm( normoldname, &oldoutname, FALSE )) {
if (fs_fns = myfatfs_realm( normnewname, &newoutname, FALSE )) {
sint32_t r = fs_fns->rename( oldoutname, newoutname );
c_free( oldoutname );
c_free( newoutname );
return r;
}
c_free( oldoutname );
}
#endif
return -1;
}
sint32_t vfs_mkdir( const char *name )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
#ifdef BUILD_SPIFFS
// not supported
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
sint32_t r = fs_fns->mkdir( outname );
c_free( outname );
return r;
}
#endif
return VFS_RES_ERR;
}
sint32_t vfs_fsinfo( const char *name, uint32_t *total, uint32_t *used )
{
vfs_fs_fns *fs_fns;
char *outname;
if (!name) name = ""; // current drive
const char *normname = normalize_path( name );
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return fs_fns->fsinfo( total, used );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
c_free( outname );
return fs_fns->fsinfo( total, used );
}
#endif
return VFS_RES_ERR;
}
sint32_t vfs_fscfg( const char *name, uint32_t *phys_addr, uint32_t *phys_size)
{
vfs_fs_fns *fs_fns;
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( "/FLASH", &outname, FALSE )) {
return fs_fns->fscfg( phys_addr, phys_size );
}
#endif
#ifdef BUILD_FATFS
// not supported
#endif
// Error
return VFS_RES_ERR;
}
sint32_t vfs_format( void )
{
vfs_fs_fns *fs_fns;
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( "/FLASH", &outname, FALSE )) {
return fs_fns->format();
}
#endif
#ifdef BUILD_FATFS
// not supported
#endif
// Error
return 0;
}
sint32_t vfs_chdir( const char *path )
{
vfs_fs_fns *fs_fns;
const char *normpath = normalize_path( path );
const char *level;
char *outname;
int ok = VFS_RES_ERR;
#if LDRV_TRAVERSAL
// track dir level
if (normpath[0] == '/') {
dir_level = 0;
level = &(normpath[1]);
} else {
level = normpath;
}
while (c_strlen( level ) > 0) {
dir_level++;
if (level = c_strchr( level, '/' )) {
level++;
} else {
break;
}
}
#endif
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normpath, &outname, TRUE )) {
// our SPIFFS integration doesn't support directories
if (c_strlen( outname ) == 0) {
ok = VFS_RES_OK;
}
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normpath, &outname, TRUE )) {
if (c_strchr( outname, ':' )) {
// need to set FatFS' default drive
fs_fns->chdrive( outname );
// and force chdir to root in case path points only to root
fs_fns->chdir( "/" );
}
if (fs_fns->chdir( outname ) == VFS_RES_OK) {
ok = VFS_RES_OK;
}
c_free( outname );
}
#endif
return ok == VFS_RES_OK ? VFS_RES_OK : VFS_RES_ERR;
}
sint32_t vfs_errno( const char *name )
{
vfs_fs_fns *fs_fns;
const char *normname = normalize_path( name );
char *outname;
if (!name) name = ""; // current drive
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
return fs_fns->ferrno( );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
sint32_t r = fs_fns->ferrno( );
c_free( outname );
return r;
}
#endif
return VFS_RES_ERR;
}
sint32_t vfs_ferrno( int fd )
{
vfs_file *f = (vfs_file *)fd;
if (f) {
return f->fns->ferrno ? f->fns->ferrno( f ) : 0;
} else {
vfs_fs_fns *fs_fns;
const char *name = ""; // current drive
char *outname;
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( name, &outname, FALSE )) {
return fs_fns->ferrno( );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( name, &outname, FALSE )) {
sint32_t r = fs_fns->ferrno( );
c_free( outname );
return r;
}
#endif
}
}
void vfs_clearerr( const char *name )
{
vfs_fs_fns *fs_fns;
char *outname;
if (!name) name = ""; // current drive
const char *normname = normalize_path( name );
#ifdef BUILD_SPIFFS
if (fs_fns = myspiffs_realm( normname, &outname, FALSE )) {
fs_fns->clearerr( );
}
#endif
#ifdef BUILD_FATFS
if (fs_fns = myfatfs_realm( normname, &outname, FALSE )) {
fs_fns->clearerr( );
c_free( outname );
}
#endif
}
const char *vfs_basename( const char *path )
{
const char *basename;
// deduce basename (incl. extension) for length check
if (basename = c_strrchr( path, '/' )) {
basename++;
} else if (basename = c_strrchr( path, ':' )) {
basename++;
} else {
basename = path;
}
return basename;
}
// ---------------------------------------------------------------------------
// supplementary functions
//
int vfs_getc( int fd )
{
unsigned char c = 0xFF;
sint32_t res;
if(!vfs_eof( fd )) {
if (1 != vfs_read( fd, &c, 1 )) {
NODE_DBG("getc errno %i\n", vfs_ferrno( fd ));
return VFS_EOF;
} else {
return (int)c;
}
}
return VFS_EOF;
}
int vfs_ungetc( int c, int fd )
{
return vfs_lseek( fd, -1, VFS_SEEK_CUR );
}
#ifndef __VFS_H__
#define __VFS_H__
#include "vfs_int.h"
// DEPRECATED, DON'T USE
// Check for fd != 0 instead
#define FS_OPEN_OK 1
// ---------------------------------------------------------------------------
// file functions
//
// vfs_close - close file descriptor and free memory
// fd: file descriptor
// Returns: VFS_RES_OK or negative value in case of error
inline sint32_t vfs_close( int fd ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->close( f ) : VFS_RES_ERR;
}
// vfs_read - read data from file
// fd: file descriptor
// ptr: destination data buffer
// len: requested length
// Returns: Number of bytes read, or VFS_RES_ERR in case of error
inline sint32_t vfs_read( int fd, void *ptr, size_t len ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->read( f, ptr, len ) : VFS_RES_ERR;
}
// vfs_write - write data to file
// fd: file descriptor
// ptr: source data buffer
// len: requested length
// Returns: Number of bytes written, or VFS_RES_ERR in case of error
inline sint32_t vfs_write( int fd, const void *ptr, size_t len ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->write( f, ptr, len ) : VFS_RES_ERR;
}
int vfs_getc( int fd );
int vfs_ungetc( int c, int fd );
// vfs_lseek - move read/write pointer
// fd: file descriptor
// off: offset
// whence: VFS_SEEK_SET - set pointer to off
// VFS_SEEK_CUR - set pointer to current position + off
// VFS_SEEK_END - set pointer to end of file + off
// Returns: New position, or VFS_RES_ERR in case of error
inline sint32_t vfs_lseek( int fd, sint32_t off, int whence ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->lseek( f, off, whence ) : VFS_RES_ERR;
}
// vfs_eof - test for end-of-file
// fd: file descriptor
// Returns: 0 if not at end, != 0 if end of file
inline sint32_t vfs_eof( int fd ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->eof( f ) : VFS_RES_ERR;
}
// vfs_tell - get read/write position
// fd: file descriptor
// Returns: Current position
inline sint32_t vfs_tell( int fd ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->tell( f ) : VFS_RES_ERR;
}
// vfs_flush - flush write cache to file
// fd: file descriptor
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
inline sint32_t vfs_flush( int fd ) {
vfs_file *f = (vfs_file *)fd;
return f ? f->fns->flush( f ) : VFS_RES_ERR;
}
// vfs_size - get current file size
// fd: file descriptor
// Returns: File size
inline uint32_t vfs_size( int fd ) {
vfs_file *f = (vfs_file *)fd;
return f && f->fns->size ? f->fns->size( f ) : 0;
}
// vfs_ferrno - get file system specific errno
// fd: file descriptor
// Returns: errno
sint32_t vfs_ferrno( int fd );
// ---------------------------------------------------------------------------
// dir functions
//
// vfs_closedir - close directory descriptor and free memory
// dd: dir descriptor
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
inline sint32_t vfs_closedir( vfs_dir *dd ) { return dd->fns->close( dd ); }
// vfs_readdir - read next directory item
// dd: dir descriptor
// Returns: item object, or NULL in case of error
inline vfs_item *vfs_readdir( vfs_dir *dd ) { return dd->fns->readdir( dd ); }
// ---------------------------------------------------------------------------
// dir item functions
//
// vfs_closeitem - close directory item and free memory
// di: item descriptor
// Returns: nothing
inline void vfs_closeitem( vfs_item *di ) { return di->fns->close( di ); }
// vfs_item_size - get item's size
// di: item descriptor
// Returns: Item size
inline uint32_t vfs_item_size( vfs_item *di ) { return di->fns->size( di ); }
// vfs_item_time - get item's modification time
// di: item descriptor
// Returns: Item modification time
inline sint32_t vfs_item_time( vfs_item *di, struct vfs_time *tm ) { return di->fns->time ? di->fns->time( di, tm ) : VFS_RES_ERR; }
// vfs_item_name - get item's name
// di: item descriptor
// Returns: Item name
inline const char *vfs_item_name( vfs_item *di ) { return di->fns->name( di ); }
// vfs_item_is_dir - check for directory
// di: item descriptor
// Returns: >0 if item is a directory, 0 if not
inline sint32_t vfs_item_is_dir( vfs_item *di ) { return di->fns->is_dir ? di->fns->is_dir( di ) : 0; }
// vfs_item_is_rdonly - check for read-only
// di: item descriptor
// Returns: >0 if item is read only, 0 if not
inline sint32_t vfs_item_is_rdonly( vfs_item *di ) { return di->fns->is_rdonly ? di->fns->is_rdonly( di ) : 0; }
// vfs_item_is_hidden - check for hidden attribute
// di: item descriptor
// Returns: >0 if item is hidden, 0 if not
inline sint32_t vfs_item_is_hidden( vfs_item *di ) { return di->fns->is_hidden ? di->fns->is_hidden( di ) : 0; }
// vfs_item_is_sys - check for sys attribute
// di: item descriptor
// Returns: >0 if item is sys, 0 if not
inline sint32_t vfs_item_is_sys( vfs_item *di ) { return di->fns->is_sys ? di->fns->is_sys( di ) : 0; }
// vfs_item_is_arch - check for archive attribute
// di: item descriptor
// Returns: >0 if item is archive, 0 if not
inline sint32_t vfs_item_is_arch( vfs_item *di ) { return di->fns->is_arch ? di->fns->is_arch( di ) : 0; }
// ---------------------------------------------------------------------------
// volume functions
//
// vfs_umount - unmount logical drive and free memory
// vol: volume object
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
inline sint32_t vfs_umount( vfs_vol *vol ) { return vol->fns->umount( vol ); }
// ---------------------------------------------------------------------------
// file system functions
//
// vfs_mount - unmount logical drive
// name: name of logical drive
// num: drive's physical number (eg. SS/CS pin), negative values are ignored
// Returns: Volume object, or NULL in case of error
vfs_vol *vfs_mount( const char *name, int num );
// vfs_open - open file
// name: file name
// mode: open mode
// Returns: File descriptor, or NULL in case of error
int vfs_open( const char *name, const char *mode );
// vfs_opendir - open directory
// name: dir name
// Returns: Directory descriptor, or NULL in case of error
vfs_dir *vfs_opendir( const char *name );
// vfs_stat - stat file or directory
// name: file or directory name
// Returns: Item object, or NULL in case of error
vfs_item *vfs_stat( const char *name );
// vfs_remove - remove file or directory
// name: file or directory name
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
sint32_t vfs_remove( const char *name );
// vfs_rename - rename file or directory
// name: file or directory name
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
sint32_t vfs_rename( const char *oldname, const char *newname );
// vfs_mkdir - create directory
// name: directory name
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
sint32_t vfs_mkdir( const char *name );
// vfs_fsinfo - get file system info
// name: logical drive identifier
// total: receives total amount
// used: received used amount
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
sint32_t vfs_fsinfo( const char *name, uint32_t *total, uint32_t *used );
// vfs_format - format file system
// Returns: 1, or 0 in case of error
sint32_t vfs_format( void );
// vfs_chdir - change default directory
// path: new default directory
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
sint32_t vfs_chdir( const char *path );
// vfs_fscfg - query configuration settings of file system
// phys_addr: pointer to store physical address information
// phys_size: pointer to store physical size information
// Returns: VFS_RES_OK, or VFS_RES_ERR in case of error
sint32_t vfs_fscfg( const char *name, uint32_t *phys_addr, uint32_t *phys_size);
// vfs_errno - get file system specific errno
// name: logical drive identifier
// Returns: errno
sint32_t vfs_errno( const char *name );
// vfs_clearerr - cleaer file system specific errno
void vfs_clearerr( const char *name );
// vfs_register_rtc_cb - register callback function for RTC query
// cb: pointer to callback function
void vfs_register_rtc_cb( sint32_t (*cb)( vfs_time *tm ) );
// vfs_basename - identify basename (incl. extension)
// path: full file system path
// Returns: pointer to basename within path string
const char *vfs_basename( const char *path );
#endif
// internal definitions for vfs
#ifndef __VFS_INT_H__
#define __VFS_INT_H__
#include <c_string.h>
#include <c_stdint.h>
#if 0
#include "spiffs.h"
#include "fatfs_prefix_lib.h"
#include "ff.h"
#endif
#define VFS_EOF -1
enum vfs_filesystems {
VFS_FS_NONE = 0,
VFS_FS_SPIFFS,
VFS_FS_FATFS
};
enum vfs_seek {
VFS_SEEK_SET = 0,
VFS_SEEK_CUR,
VFS_SEEK_END
};
enum vfs_result {
VFS_RES_OK = 0,
VFS_RES_ERR = -1
};
struct vfs_time {
int year, mon, day;
int hour, min, sec;
};
typedef struct vfs_time vfs_time;
// generic file descriptor
struct vfs_file {
int fs_type;
const struct vfs_file_fns *fns;
};
typedef const struct vfs_file vfs_file;
// file descriptor functions
struct vfs_file_fns {
sint32_t (*close)( const struct vfs_file *fd );
sint32_t (*read)( const struct vfs_file *fd, void *ptr, size_t len );
sint32_t (*write)( const struct vfs_file *fd, const void *ptr, size_t len );
sint32_t (*lseek)( const struct vfs_file *fd, sint32_t off, int whence );
sint32_t (*eof)( const struct vfs_file *fd );
sint32_t (*tell)( const struct vfs_file *fd );
sint32_t (*flush)( const struct vfs_file *fd );
uint32_t (*size)( const struct vfs_file *fd );
sint32_t (*ferrno)( const struct vfs_file *fd );
};
typedef const struct vfs_file_fns vfs_file_fns;
// generic dir item descriptor
struct vfs_item {
int fs_type;
const struct vfs_item_fns *fns;
};
typedef const struct vfs_item vfs_item;
// directory item functions
struct vfs_item_fns {
void (*close)( const struct vfs_item *di );
uint32_t (*size)( const struct vfs_item *di );
sint32_t (*time)( const struct vfs_item *di, struct vfs_time *tm );
const char *(*name)( const struct vfs_item *di );
sint32_t (*is_dir)( const struct vfs_item *di );
sint32_t (*is_rdonly)( const struct vfs_item *di );
sint32_t (*is_hidden)( const struct vfs_item *di );
sint32_t (*is_sys)( const struct vfs_item *di );
sint32_t (*is_arch)( const struct vfs_item *di );
};
typedef const struct vfs_item_fns vfs_item_fns;
// generic dir descriptor
struct vfs_dir {
int fs_type;
const struct vfs_dir_fns *fns;
};
typedef const struct vfs_dir vfs_dir;
// dir descriptor functions
struct vfs_dir_fns {
sint32_t (*close)( const struct vfs_dir *dd );
vfs_item *(*readdir)( const struct vfs_dir *dd );
};
typedef const struct vfs_dir_fns vfs_dir_fns;
// generic volume descriptor
struct vfs_vol {
int fs_type;
const struct vfs_vol_fns *fns;
};
typedef const struct vfs_vol vfs_vol;
// volume functions
struct vfs_vol_fns {
sint32_t (*umount)( const struct vfs_vol *vol );
};
typedef const struct vfs_vol_fns vfs_vol_fns;
struct vfs_fs_fns {
vfs_vol *(*mount)( const char *name, int num );
vfs_file *(*open)( const char *name, const char *mode );
vfs_dir *(*opendir)( const char *name );
vfs_item *(*stat)( const char *name );
sint32_t (*remove)( const char *name );
sint32_t (*rename)( const char *oldname, const char *newname );
sint32_t (*mkdir)( const char *name );
sint32_t (*fsinfo)( uint32_t *total, uint32_t *used );
sint32_t (*fscfg)( uint32_t *phys_addr, uint32_t *phys_size );
sint32_t (*format)( void );
sint32_t (*chdrive)( const char * );
sint32_t (*chdir)( const char * );
sint32_t (*ferrno)( void );
void (*clearerr)( void );
};
typedef const struct vfs_fs_fns vfs_fs_fns;
vfs_fs_fns *myspiffs_realm( const char *inname, char **outname, int set_current_drive );
vfs_fs_fns *myfatfs_realm( const char *inname, char **outname, int set_current_drive );
sint32_t vfs_get_rtc( vfs_time *tm );
#endif
...@@ -204,101 +204,421 @@ int myspiffs_format( void ) ...@@ -204,101 +204,421 @@ int myspiffs_format( void )
return myspiffs_mount(); return myspiffs_mount();
} }
int myspiffs_check( void ) #if 0
{ void test_spiffs() {
// ets_wdt_disable(); char buf[12];
// int res = (int)SPIFFS_check(&fs);
// ets_wdt_enable(); // Surely, I've mounted spiffs before entering here
// return res;
spiffs_file fd = SPIFFS_open(&fs, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
if (SPIFFS_write(&fs, fd, (u8_t *)"Hello world", 12) < 0) NODE_DBG("errno %i\n", SPIFFS_errno(&fs));
SPIFFS_close(&fs, fd);
fd = SPIFFS_open(&fs, "my_file", SPIFFS_RDWR, 0);
if (SPIFFS_read(&fs, fd, (u8_t *)buf, 12) < 0) NODE_DBG("errno %i\n", SPIFFS_errno(&fs));
SPIFFS_close(&fs, fd);
NODE_DBG("--> %s <--\n", buf);
} }
#endif
int myspiffs_open(const char *name, int flags){
return (int)SPIFFS_open(&fs, (char *)name, (spiffs_flags)flags, 0); // ***************************************************************************
// vfs API
// ***************************************************************************
#include <c_stdlib.h>
#include "vfs_int.h"
#define MY_LDRV_ID "FLASH"
// default current drive
static int is_current_drive = TRUE;
// forward declarations
static sint32_t myspiffs_vfs_close( const struct vfs_file *fd );
static sint32_t myspiffs_vfs_read( const struct vfs_file *fd, void *ptr, size_t len );
static sint32_t myspiffs_vfs_write( const struct vfs_file *fd, const void *ptr, size_t len );
static sint32_t myspiffs_vfs_lseek( const struct vfs_file *fd, sint32_t off, int whence );
static sint32_t myspiffs_vfs_eof( const struct vfs_file *fd );
static sint32_t myspiffs_vfs_tell( const struct vfs_file *fd );
static sint32_t myspiffs_vfs_flush( const struct vfs_file *fd );
static sint32_t myspiffs_vfs_ferrno( const struct vfs_file *fd );
static sint32_t myspiffs_vfs_closedir( const struct vfs_dir *dd );
static vfs_item *myspiffs_vfs_readdir( const struct vfs_dir *dd );
static void myspiffs_vfs_iclose( const struct vfs_item *di );
static uint32_t myspiffs_vfs_isize( const struct vfs_item *di );
//static const struct tm *myspiffs_vfs_time( const struct vfs_item *di );
static const char *myspiffs_vfs_name( const struct vfs_item *di );
static vfs_vol *myspiffs_vfs_mount( const char *name, int num );
static vfs_file *myspiffs_vfs_open( const char *name, const char *mode );
static vfs_dir *myspiffs_vfs_opendir( const char *name );
static vfs_item *myspiffs_vfs_stat( const char *name );
static sint32_t myspiffs_vfs_remove( const char *name );
static sint32_t myspiffs_vfs_rename( const char *oldname, const char *newname );
static sint32_t myspiffs_vfs_fsinfo( uint32_t *total, uint32_t *used );
static sint32_t myspiffs_vfs_fscfg( uint32_t *phys_addr, uint32_t *phys_size );
static sint32_t myspiffs_vfs_format( void );
static sint32_t myspiffs_vfs_errno( void );
static void myspiffs_vfs_clearerr( void );
static sint32_t myspiffs_vfs_umount( const struct vfs_vol *vol );
// ---------------------------------------------------------------------------
// function tables
//
static vfs_fs_fns myspiffs_fs_fns = {
.mount = myspiffs_vfs_mount,
.open = myspiffs_vfs_open,
.opendir = myspiffs_vfs_opendir,
.stat = myspiffs_vfs_stat,
.remove = myspiffs_vfs_remove,
.rename = myspiffs_vfs_rename,
.mkdir = NULL,
.fsinfo = myspiffs_vfs_fsinfo,
.fscfg = myspiffs_vfs_fscfg,
.format = myspiffs_vfs_format,
.chdrive = NULL,
.chdir = NULL,
.ferrno = myspiffs_vfs_errno,
.clearerr = myspiffs_vfs_clearerr
};
static vfs_file_fns myspiffs_file_fns = {
.close = myspiffs_vfs_close,
.read = myspiffs_vfs_read,
.write = myspiffs_vfs_write,
.lseek = myspiffs_vfs_lseek,
.eof = myspiffs_vfs_eof,
.tell = myspiffs_vfs_tell,
.flush = myspiffs_vfs_flush,
.size = NULL,
.ferrno = myspiffs_vfs_ferrno
};
static vfs_item_fns myspiffs_item_fns = {
.close = myspiffs_vfs_iclose,
.size = myspiffs_vfs_isize,
.time = NULL,
.name = myspiffs_vfs_name,
.is_dir = NULL,
.is_rdonly = NULL,
.is_hidden = NULL,
.is_sys = NULL,
.is_arch = NULL
};
static vfs_dir_fns myspiffs_dd_fns = {
.close = myspiffs_vfs_closedir,
.readdir = myspiffs_vfs_readdir
};
// ---------------------------------------------------------------------------
// specific struct extensions
//
struct myvfs_file {
struct vfs_file vfs_file;
spiffs_file fh;
};
struct myvfs_dir {
struct vfs_dir vfs_dir;
spiffs_DIR d;
};
struct myvfs_stat {
struct vfs_item vfs_item;
spiffs_stat s;
};
// ---------------------------------------------------------------------------
// stat functions
//
#define GET_STAT_S(descr) \
const struct myvfs_stat *mystat = (const struct myvfs_stat *)descr; \
spiffs_stat *s = (spiffs_stat *)&(mystat->s);
static void myspiffs_vfs_iclose( const struct vfs_item *di ) {
// free descriptor memory
c_free( (void *)di );
} }
int myspiffs_close( int fd ){ static uint32_t myspiffs_vfs_isize( const struct vfs_item *di ) {
return SPIFFS_close(&fs, (spiffs_file)fd); GET_STAT_S(di);
return s->size;
} }
size_t myspiffs_write( int fd, const void* ptr, size_t len ){
#if 0 static const char *myspiffs_vfs_name( const struct vfs_item *di ) {
if(fd==c_stdout || fd==c_stderr){ GET_STAT_S(di);
uart0_tx_buffer((u8_t*)ptr, len);
return len; return s->name;
} }
#endif
int res = SPIFFS_write(&fs, (spiffs_file)fd, (void *)ptr, len);
if (res < 0) { // ---------------------------------------------------------------------------
NODE_DBG("write errno %i\n", SPIFFS_errno(&fs)); // volume functions
return 0; //
static sint32_t myspiffs_vfs_umount( const struct vfs_vol *vol ) {
// not implemented
return VFS_RES_ERR;
}
// ---------------------------------------------------------------------------
// dir functions
//
#define GET_DIR_D(descr) \
const struct myvfs_dir *mydd = (const struct myvfs_dir *)descr; \
spiffs_DIR *d = (spiffs_DIR *)&(mydd->d);
static sint32_t myspiffs_vfs_closedir( const struct vfs_dir *dd ) {
GET_DIR_D(dd);
sint32_t res = SPIFFS_closedir( d );
// free descriptor memory
c_free( (void *)dd );
}
static vfs_item *myspiffs_vfs_readdir( const struct vfs_dir *dd ) {
GET_DIR_D(dd);
struct myvfs_stat *stat;
struct spiffs_dirent dirent;
if (stat = c_malloc( sizeof( struct myvfs_stat ) )) {
if (SPIFFS_readdir( d, &dirent )) {
stat->vfs_item.fs_type = VFS_FS_FATFS;
stat->vfs_item.fns = &myspiffs_item_fns;
// copy entries to vfs' directory item
stat->s.size = dirent.size;
c_strncpy( stat->s.name, dirent.name, SPIFFS_OBJ_NAME_LEN );
return (vfs_item *)stat;
} else {
c_free( stat );
}
} }
return NULL;
}
// ---------------------------------------------------------------------------
// file functions
//
#define GET_FILE_FH(descr) \
const struct myvfs_file *myfd = (const struct myvfs_file *)descr; \
spiffs_file fh = myfd->fh;
static sint32_t myspiffs_vfs_close( const struct vfs_file *fd ) {
GET_FILE_FH(fd);
sint32_t res = SPIFFS_close( &fs, fh );
// free descriptor memory
c_free( (void *)fd );
return res; return res;
} }
size_t myspiffs_read( int fd, void* ptr, size_t len){
int res = SPIFFS_read(&fs, (spiffs_file)fd, ptr, len); static sint32_t myspiffs_vfs_read( const struct vfs_file *fd, void *ptr, size_t len ) {
if (res < 0) { GET_FILE_FH(fd);
NODE_DBG("read errno %i\n", SPIFFS_errno(&fs));
return 0; return SPIFFS_read( &fs, fh, ptr, len );
}
static sint32_t myspiffs_vfs_write( const struct vfs_file *fd, const void *ptr, size_t len ) {
GET_FILE_FH(fd);
return SPIFFS_write( &fs, fh, (void *)ptr, len );
}
static sint32_t myspiffs_vfs_lseek( const struct vfs_file *fd, sint32_t off, int whence ) {
GET_FILE_FH(fd);
int spiffs_whence;
switch (whence) {
default:
case VFS_SEEK_SET:
spiffs_whence = SPIFFS_SEEK_SET;
break;
case VFS_SEEK_CUR:
spiffs_whence = SPIFFS_SEEK_CUR;
break;
case VFS_SEEK_END:
spiffs_whence = SPIFFS_SEEK_END;
break;
} }
return res;
return SPIFFS_lseek( &fs, fh, off, spiffs_whence );
} }
int myspiffs_lseek( int fd, int off, int whence ){
return SPIFFS_lseek(&fs, (spiffs_file)fd, off, whence); static sint32_t myspiffs_vfs_eof( const struct vfs_file *fd ) {
GET_FILE_FH(fd);
return SPIFFS_eof( &fs, fh );
}
static sint32_t myspiffs_vfs_tell( const struct vfs_file *fd ) {
GET_FILE_FH(fd);
return SPIFFS_tell( &fs, fh );
} }
int myspiffs_eof( int fd ){
return SPIFFS_eof(&fs, (spiffs_file)fd); static sint32_t myspiffs_vfs_flush( const struct vfs_file *fd ) {
GET_FILE_FH(fd);
return SPIFFS_fflush( &fs, fh ) >= 0 ? VFS_RES_OK : VFS_RES_ERR;
} }
int myspiffs_tell( int fd ){
return SPIFFS_tell(&fs, (spiffs_file)fd); static sint32_t myspiffs_vfs_ferrno( const struct vfs_file *fd ) {
return SPIFFS_errno( &fs );
} }
int myspiffs_getc( int fd ){
unsigned char c = 0xFF;
int res; static int fs_mode2flag(const char *mode){
if(!myspiffs_eof(fd)){ if(c_strlen(mode)==1){
res = SPIFFS_read(&fs, (spiffs_file)fd, &c, 1); if(c_strcmp(mode,"w")==0)
if (res != 1) { return SPIFFS_WRONLY|SPIFFS_CREAT|SPIFFS_TRUNC;
NODE_DBG("getc errno %i\n", SPIFFS_errno(&fs)); else if(c_strcmp(mode, "r")==0)
return (int)EOF; return SPIFFS_RDONLY;
else if(c_strcmp(mode, "a")==0)
return SPIFFS_WRONLY|SPIFFS_CREAT|SPIFFS_APPEND;
else
return SPIFFS_RDONLY;
} else if (c_strlen(mode)==2){
if(c_strcmp(mode,"r+")==0)
return SPIFFS_RDWR;
else if(c_strcmp(mode, "w+")==0)
return SPIFFS_RDWR|SPIFFS_CREAT|SPIFFS_TRUNC;
else if(c_strcmp(mode, "a+")==0)
return SPIFFS_RDWR|SPIFFS_CREAT|SPIFFS_APPEND;
else
return SPIFFS_RDONLY;
} else {
return SPIFFS_RDONLY;
}
}
// ---------------------------------------------------------------------------
// filesystem functions
//
static vfs_file *myspiffs_vfs_open( const char *name, const char *mode ) {
struct myvfs_file *fd;
int flags = fs_mode2flag( mode );
if (fd = (struct myvfs_file *)c_malloc( sizeof( struct myvfs_file ) )) {
if (0 < (fd->fh = SPIFFS_open( &fs, name, flags, 0 ))) {
fd->vfs_file.fs_type = VFS_FS_SPIFFS;
fd->vfs_file.fns = &myspiffs_file_fns;
return (vfs_file *)fd;
} else { } else {
return (int)c; c_free( fd );
} }
} }
return (int)EOF;
return NULL;
} }
int myspiffs_ungetc( int c, int fd ){
return SPIFFS_lseek(&fs, (spiffs_file)fd, -1, SEEK_CUR); static vfs_dir *myspiffs_vfs_opendir( const char *name ){
struct myvfs_dir *dd;
if (dd = (struct myvfs_dir *)c_malloc( sizeof( struct myvfs_dir ) )) {
if (SPIFFS_opendir( &fs, name, &(dd->d) )) {
dd->vfs_dir.fs_type = VFS_FS_SPIFFS;
dd->vfs_dir.fns = &myspiffs_dd_fns;
return (vfs_dir *)dd;
} else {
c_free( dd );
}
}
return NULL;
} }
int myspiffs_flush( int fd ){
return SPIFFS_fflush(&fs, (spiffs_file)fd); static vfs_item *myspiffs_vfs_stat( const char *name ) {
struct myvfs_stat *s;
if (s = (struct myvfs_stat *)c_malloc( sizeof( struct myvfs_stat ) )) {
if (0 <= SPIFFS_stat( &fs, name, &(s->s) )) {
s->vfs_item.fs_type = VFS_FS_SPIFFS;
s->vfs_item.fns = &myspiffs_item_fns;
return (vfs_item *)s;
} else {
c_free( s );
}
}
return NULL;
} }
int myspiffs_error( int fd ){
return SPIFFS_errno(&fs); static sint32_t myspiffs_vfs_remove( const char *name ) {
return SPIFFS_remove( &fs, name );
} }
void myspiffs_clearerr( int fd ){
SPIFFS_clearerr(&fs); static sint32_t myspiffs_vfs_rename( const char *oldname, const char *newname ) {
return SPIFFS_rename( &fs, oldname, newname );
} }
int myspiffs_rename( const char *old, const char *newname ){
return SPIFFS_rename(&fs, (char *)old, (char *)newname); static sint32_t myspiffs_vfs_fsinfo( uint32_t *total, uint32_t *used ) {
return SPIFFS_info( &fs, total, used );
} }
size_t myspiffs_size( int fd ){
int32_t curpos = SPIFFS_tell(&fs, (spiffs_file) fd); static sint32_t myspiffs_vfs_fscfg( uint32_t *phys_addr, uint32_t *phys_size ) {
int32_t size = SPIFFS_lseek(&fs, (spiffs_file) fd, SPIFFS_SEEK_END, 0); *phys_addr = fs.cfg.phys_addr;
(void) SPIFFS_lseek(&fs, (spiffs_file) fd, SPIFFS_SEEK_SET, curpos); *phys_size = fs.cfg.phys_size;
return size; return VFS_RES_OK;
} }
#if 0
void test_spiffs() {
char buf[12];
// Surely, I've mounted spiffs before entering here static vfs_vol *myspiffs_vfs_mount( const char *name, int num ) {
// volume descriptor not supported, just return TRUE / FALSE
spiffs_file fd = SPIFFS_open(&fs, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0); return myspiffs_mount() ? (vfs_vol *)1 : NULL;
if (SPIFFS_write(&fs, fd, (u8_t *)"Hello world", 12) < 0) NODE_DBG("errno %i\n", SPIFFS_errno(&fs)); }
SPIFFS_close(&fs, fd);
fd = SPIFFS_open(&fs, "my_file", SPIFFS_RDWR, 0); static sint32_t myspiffs_vfs_format( void ) {
if (SPIFFS_read(&fs, fd, (u8_t *)buf, 12) < 0) NODE_DBG("errno %i\n", SPIFFS_errno(&fs)); return myspiffs_format();
SPIFFS_close(&fs, fd); }
NODE_DBG("--> %s <--\n", buf); static sint32_t myspiffs_vfs_errno( void ) {
return SPIFFS_errno( &fs );
}
static void myspiffs_vfs_clearerr( void ) {
SPIFFS_clearerr( &fs );
}
// ---------------------------------------------------------------------------
// VFS interface functions
//
vfs_fs_fns *myspiffs_realm( const char *inname, char **outname, int set_current_drive ) {
if (inname[0] == '/') {
size_t idstr_len = c_strlen( MY_LDRV_ID );
// logical drive is specified, check if it's our id
if (0 == c_strncmp( &(inname[1]), MY_LDRV_ID, idstr_len )) {
*outname = (char *)&(inname[1 + idstr_len]);
if (*outname[0] == '/') {
// skip leading /
(*outname)++;
}
if (set_current_drive) is_current_drive = TRUE;
return &myspiffs_fs_fns;
}
} else {
// no logical drive in patchspec, are we current drive?
if (is_current_drive) {
*outname = (char *)inname;
return &myspiffs_fs_fns;
}
}
if (set_current_drive) is_current_drive = FALSE;
return NULL;
} }
#endif
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include "nodemcu_spiffs.h" #include "nodemcu_spiffs.h"
// ----------- >8 ------------ // ----------- >8 ------------
#include "user_config.h"
// compile time switches // compile time switches
// Set generic spiffs debug output call. // Set generic spiffs debug output call.
...@@ -99,7 +101,7 @@ ...@@ -99,7 +101,7 @@
// zero-termination character, meaning maximum string of characters // zero-termination character, meaning maximum string of characters
// can at most be SPIFFS_OBJ_NAME_LEN - 1. // can at most be SPIFFS_OBJ_NAME_LEN - 1.
#ifndef SPIFFS_OBJ_NAME_LEN #ifndef SPIFFS_OBJ_NAME_LEN
#define SPIFFS_OBJ_NAME_LEN (32) #define SPIFFS_OBJ_NAME_LEN (FS_OBJ_NAME_LEN+1)
#endif #endif
// Size of buffer allocated on stack used when copying data. // Size of buffer allocated on stack used when copying data.
......
...@@ -134,15 +134,15 @@ typedef uint8_t u8g_fntpgm_uint8_t; ...@@ -134,15 +134,15 @@ typedef uint8_t u8g_fntpgm_uint8_t;
typedef uint8_t u8g_fntpgm_uint8_t; typedef uint8_t u8g_fntpgm_uint8_t;
# define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr)) # define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr))
# define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s)) # define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s))
#endif
#else #ifndef U8G_PROGMEM
# define U8G_PROGMEM # define U8G_PROGMEM
# define PROGMEM # define PROGMEM
typedef uint8_t u8g_pgm_uint8_t; typedef uint8_t u8g_pgm_uint8_t;
typedef uint8_t u8g_fntpgm_uint8_t; typedef uint8_t u8g_fntpgm_uint8_t;
# define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr)) # define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr))
# define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s)) # define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s))
#endif #endif
/*===============================================================*/ /*===============================================================*/
...@@ -414,6 +414,7 @@ extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_bw_hw_spi; ...@@ -414,6 +414,7 @@ extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_bw_hw_spi;
extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_bw_parallel; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_bw_parallel;
extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_sw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_sw_spi;
extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_hw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_hw_spi;
extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_parallel;
extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_sw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_sw_spi;
extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi;
...@@ -699,11 +700,18 @@ uint8_t u8g_com_atmega_st7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val ...@@ -699,11 +700,18 @@ uint8_t u8g_com_atmega_st7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val
uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
uint8_t u8g_com_atmega_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atmega_parallel.c */ uint8_t u8g_com_atmega_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atmega_parallel.c */
uint8_t u8g_com_atxmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atxmega_hw_spi.c */
uint8_t u8g_com_atxmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atxmega_st7920_spi.c */
uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_msp430_hw_spi.c */ uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_msp430_hw_spi.c */
uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */ uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */
uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */ uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */
uint8_t u8g_com_linux_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_linux_ssd_i2c.c */
uint8_t u8g_com_psoc5_ssd_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_psoc5_ssd_hw_spi.c */
uint8_t u8g_com_psoc5_ssd_hw_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_psoc5_ssd_hw_parallel.c */
/* /*
Translation of system specific com drives to generic com names Translation of system specific com drives to generic com names
...@@ -762,7 +770,10 @@ defined(__18CXX) || defined(__PIC32MX) ...@@ -762,7 +770,10 @@ defined(__18CXX) || defined(__PIC32MX)
#endif #endif
/* ==== HW SPI, not Arduino ====*/ /* ==== HW SPI, not Arduino ====*/
#ifndef U8G_COM_HW_SPI #ifndef U8G_COM_HW_SPI
#if defined(__AVR__) #if defined(__AVR_XMEGA__)
#define U8G_COM_HW_SPI u8g_com_atxmega_hw_spi_fn
#define U8G_COM_ST7920_HW_SPI u8g_com_atxmega_st7920_hw_spi_fn
#elif defined(__AVR__)
#define U8G_COM_HW_SPI u8g_com_atmega_hw_spi_fn #define U8G_COM_HW_SPI u8g_com_atmega_hw_spi_fn
#define U8G_COM_ST7920_HW_SPI u8g_com_atmega_st7920_hw_spi_fn #define U8G_COM_ST7920_HW_SPI u8g_com_atmega_st7920_hw_spi_fn
#endif #endif
...@@ -861,13 +872,19 @@ defined(__18CXX) || defined(__PIC32MX) ...@@ -861,13 +872,19 @@ defined(__18CXX) || defined(__PIC32MX)
#define U8G_COM_SSD_I2C u8g_com_raspberrypi_ssd_i2c_fn #define U8G_COM_SSD_I2C u8g_com_raspberrypi_ssd_i2c_fn
#endif #endif
#endif #endif
#ifndef U8G_COM_SSD_I2C #ifndef U8G_COM_SSD_I2C
#if defined(U8G_LINUX)
#define U8G_COM_SSD_I2C u8g_com_linux_ssd_i2c_fn
#endif
#if defined(__XTENSA__) #if defined(__XTENSA__)
// ESP8266 // ESP8266
#define U8G_COM_SSD_I2C u8g_com_esp8266_ssd_i2c_fn #define U8G_COM_SSD_I2C u8g_com_esp8266_ssd_i2c_fn
#endif #endif
#endif #endif
#if defined(U8G_CYPRESS_PSOC5)
#define U8G_COM_HW_SPI u8g_com_psoc5_ssd_hw_spi_fn
#define U8G_COM_FAST_PARALLEL u8g_com_psoc5_ssd_hw_parallel_fn
#endif
#ifndef U8G_COM_SSD_I2C #ifndef U8G_COM_SSD_I2C
#define U8G_COM_SSD_I2C u8g_com_null_fn #define U8G_COM_SSD_I2C u8g_com_null_fn
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
#define U8G_ALWAYS_INLINE __inline__ __attribute__((always_inline)) #define U8G_ALWAYS_INLINE __inline__ __attribute__((always_inline))
#else #else
#define U8G_ALWAYS_INLINE #define U8G_ALWAYS_INLINE
#endif #endif
/* /*
intersection assumptions: intersection assumptions:
......
...@@ -67,8 +67,8 @@ uint8_t u8g_i2c_get_err_pos(void) ...@@ -67,8 +67,8 @@ uint8_t u8g_i2c_get_err_pos(void)
} }
#if defined(__AVR_XMEGA__)
#if defined(__AVR__) #elif defined(__AVR__)
static void u8g_i2c_set_error(uint8_t code, uint8_t pos) static void u8g_i2c_set_error(uint8_t code, uint8_t pos)
{ {
......
...@@ -65,6 +65,83 @@ uint8_t u8g_Pin(uint8_t port, uint8_t bitpos) ...@@ -65,6 +65,83 @@ uint8_t u8g_Pin(uint8_t port, uint8_t bitpos)
return port; return port;
} }
#if defined(__AVR_XMEGA__)
const IO_PTR u8g_avr_ddr_P[] PROGMEM = {
#ifdef PORTA
&PORTA.DIR,
#else
0,
#endif
&PORTB.DIR,
#ifdef PORTC
&PORTC.DIR,
#ifdef PORTD
&PORTD.DIR,
#ifdef PORTE
&PORTE.DIR,
#ifdef PORTF
&PORTF.DIR,
#ifdef PORTR
&PORTR.DIR,
#endif
#endif
#endif
#endif
#endif
};
const IO_PTR u8g_avr_port_P[] PROGMEM = {
#ifdef PORTA
&PORTA.OUT,
#else
0,
#endif
&PORTB.OUT,
#ifdef PORTC
&PORTC.OUT,
#ifdef PORTD
&PORTD.OUT,
#ifdef PORTE
&PORTE.OUT,
#ifdef PORTF
&PORTF.OUT,
#ifdef PORTR
&PORTR.OUT,
#endif
#endif
#endif
#endif
#endif
};
const IO_PTR u8g_avr_pin_P[] PROGMEM = {
#ifdef PORTA
&PORTA.IN,
#else
0,
#endif
&PORTB.IN,
#ifdef PORTC
&PORTC.IN,
#ifdef PORTD
&PORTD.IN,
#ifdef PORTE
&PORTE.IN,
#ifdef PORTF
&PORTF.IN,
#ifdef PORTR
&PORTR.IN,
#endif
#endif
#endif
#endif
#endif
};
#else
const IO_PTR u8g_avr_ddr_P[] PROGMEM = { const IO_PTR u8g_avr_ddr_P[] PROGMEM = {
#ifdef DDRA #ifdef DDRA
&DDRA, &DDRA,
...@@ -146,6 +223,7 @@ const IO_PTR u8g_avr_pin_P[] PROGMEM = { ...@@ -146,6 +223,7 @@ const IO_PTR u8g_avr_pin_P[] PROGMEM = {
#endif #endif
#endif #endif
}; };
#endif
static volatile uint8_t *u8g_get_avr_io_ptr(const IO_PTR *base, uint8_t offset) static volatile uint8_t *u8g_get_avr_io_ptr(const IO_PTR *base, uint8_t offset)
{ {
......
...@@ -52,6 +52,11 @@ ...@@ -52,6 +52,11 @@
# include <Arduino.h> # include <Arduino.h>
# endif # endif
/* issue 353 */
#if defined(ARDUINO_ARCH_SAMD)
# include <delay.h>
#endif
# if defined(__AVR__) # if defined(__AVR__)
# define USE_AVR_DELAY # define USE_AVR_DELAY
# elif defined(__PIC32MX) # elif defined(__PIC32MX)
...@@ -71,6 +76,8 @@ ...@@ -71,6 +76,8 @@
# define USE_AVR_DELAY # define USE_AVR_DELAY
#elif defined(__18CXX) #elif defined(__18CXX)
# define USE_PIC18_DELAY # define USE_PIC18_DELAY
#elif defined(U8G_CYPRESS_PSOC5)
#define USE_PSOC5_DELAY
#elif defined(__arm__) || defined(__XTENSA__) #elif defined(__arm__) || defined(__XTENSA__)
/* do not define anything, all procedures are expected to be defined outside u8glib */ /* do not define anything, all procedures are expected to be defined outside u8glib */
...@@ -293,6 +300,12 @@ void u8g_10MicroDelay(void) ...@@ -293,6 +300,12 @@ void u8g_10MicroDelay(void)
__delay_cycles(F_CPU/100000UL); __delay_cycles(F_CPU/100000UL);
} }
#endif #endif
#if defined USE_PSOC5_DELAY
#include <project.h>
void u8g_Delay(uint16_t val) {CyDelay(val);};
void u8g_MicroDelay(void) {CyDelay(1);};
void u8g_10MicroDelay(void) {CyDelay(10);};
#endif
/*== Any other systems: Dummy Delay ==*/ /*== Any other systems: Dummy Delay ==*/
......
...@@ -75,7 +75,7 @@ static const uint8_t u8g_dev_lc7981_160x80_init_seq[] PROGMEM = { ...@@ -75,7 +75,7 @@ static const uint8_t u8g_dev_lc7981_160x80_init_seq[] PROGMEM = {
U8G_ESC_ADR(1), /* instruction mode */ U8G_ESC_ADR(1), /* instruction mode */
0x003, /* time division */ 0x003, /* time division */
U8G_ESC_ADR(0), /* data mode */ U8G_ESC_ADR(0), /* data mode */
0x07f, /* */ 0x050, /* Oct 2015: Changed from 7f to 50 (1/80 duty cycle) */
U8G_ESC_ADR(1), /* instruction mode */ U8G_ESC_ADR(1), /* instruction mode */
0x008, /* display start low */ 0x008, /* display start low */
......
...@@ -230,6 +230,13 @@ uint8_t u8g_dev_ssd1306_128x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void ...@@ -230,6 +230,13 @@ uint8_t u8g_dev_ssd1306_128x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void
u8g_SetChipSelect(u8g, dev, 0); u8g_SetChipSelect(u8g, dev, 0);
} }
break; break;
case U8G_DEV_MSG_CONTRAST:
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x081);
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */
u8g_SetChipSelect(u8g, dev, 0);
return 1;
case U8G_DEV_MSG_SLEEP_ON: case U8G_DEV_MSG_SLEEP_ON:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
return 1; return 1;
...@@ -268,6 +275,13 @@ uint8_t u8g_dev_ssd1306_128x32_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo ...@@ -268,6 +275,13 @@ uint8_t u8g_dev_ssd1306_128x32_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
u8g_SetChipSelect(u8g, dev, 0); u8g_SetChipSelect(u8g, dev, 0);
} }
break; break;
case U8G_DEV_MSG_CONTRAST:
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x081);
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */
u8g_SetChipSelect(u8g, dev, 0);
return 1;
case U8G_DEV_MSG_SLEEP_ON: case U8G_DEV_MSG_SLEEP_ON:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
return 1; return 1;
......
...@@ -240,6 +240,15 @@ uint8_t u8g_dev_ssd1306_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void ...@@ -240,6 +240,15 @@ uint8_t u8g_dev_ssd1306_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void
case U8G_DEV_MSG_SLEEP_OFF: case U8G_DEV_MSG_SLEEP_OFF:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
return 1; return 1;
case U8G_DEV_MSG_CONTRAST:
{
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81);
u8g_WriteByte(u8g, dev, *(uint8_t *) arg);
u8g_SetChipSelect(u8g, dev, 0);
return 1;
}
} }
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
} }
...@@ -271,6 +280,15 @@ uint8_t u8g_dev_ssd1306_adafruit_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m ...@@ -271,6 +280,15 @@ uint8_t u8g_dev_ssd1306_adafruit_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m
case U8G_DEV_MSG_SLEEP_OFF: case U8G_DEV_MSG_SLEEP_OFF:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
return 1; return 1;
case U8G_DEV_MSG_CONTRAST:
{
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81);
u8g_WriteByte(u8g, dev, *(uint8_t *) arg);
u8g_SetChipSelect(u8g, dev, 0);
return 1;
}
} }
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
} }
...@@ -302,6 +320,15 @@ uint8_t u8g_dev_sh1106_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * ...@@ -302,6 +320,15 @@ uint8_t u8g_dev_sh1106_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *
case U8G_DEV_MSG_SLEEP_OFF: case U8G_DEV_MSG_SLEEP_OFF:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
return 1; return 1;
case U8G_DEV_MSG_CONTRAST:
{
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81);
u8g_WriteByte(u8g, dev, *(uint8_t *) arg);
u8g_SetChipSelect(u8g, dev, 0);
return 1;
}
} }
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
} }
...@@ -340,6 +367,15 @@ uint8_t u8g_dev_ssd1306_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo ...@@ -340,6 +367,15 @@ uint8_t u8g_dev_ssd1306_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
case U8G_DEV_MSG_SLEEP_OFF: case U8G_DEV_MSG_SLEEP_OFF:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
return 1; return 1;
case U8G_DEV_MSG_CONTRAST:
{
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81);
u8g_WriteByte(u8g, dev, *(uint8_t *) arg);
u8g_SetChipSelect(u8g, dev, 0);
return 1;
}
} }
return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
} }
...@@ -377,6 +413,15 @@ uint8_t u8g_dev_sh1106_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi ...@@ -377,6 +413,15 @@ uint8_t u8g_dev_sh1106_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi
case U8G_DEV_MSG_SLEEP_OFF: case U8G_DEV_MSG_SLEEP_OFF:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
return 1; return 1;
case U8G_DEV_MSG_CONTRAST:
{
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81);
u8g_WriteByte(u8g, dev, *(uint8_t *) arg);
u8g_SetChipSelect(u8g, dev, 0);
return 1;
}
} }
return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
} }
......
...@@ -128,6 +128,13 @@ uint8_t u8g_dev_ssd1306_64x48_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * ...@@ -128,6 +128,13 @@ uint8_t u8g_dev_ssd1306_64x48_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *
u8g_SetChipSelect(u8g, dev, 0); u8g_SetChipSelect(u8g, dev, 0);
} }
break; break;
case U8G_DEV_MSG_CONTRAST:
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x081);
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */
u8g_SetChipSelect(u8g, dev, 0);
return 1;
case U8G_DEV_MSG_SLEEP_ON: case U8G_DEV_MSG_SLEEP_ON:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
return 1; return 1;
...@@ -166,6 +173,13 @@ uint8_t u8g_dev_ssd1306_64x48_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi ...@@ -166,6 +173,13 @@ uint8_t u8g_dev_ssd1306_64x48_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi
u8g_SetChipSelect(u8g, dev, 0); u8g_SetChipSelect(u8g, dev, 0);
} }
break; break;
case U8G_DEV_MSG_CONTRAST:
u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x081);
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */
u8g_SetChipSelect(u8g, dev, 0);
return 1;
case U8G_DEV_MSG_SLEEP_ON: case U8G_DEV_MSG_SLEEP_ON:
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
return 1; return 1;
......
...@@ -220,6 +220,7 @@ static uint8_t u8g_dev_ssd1325_nhd27oled_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, ui ...@@ -220,6 +220,7 @@ static uint8_t u8g_dev_ssd1325_nhd27oled_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, ui
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_sw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_SW_SPI); U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_sw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_SW_SPI);
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_hw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_HW_SPI); U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_hw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_HW_SPI);
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_parallel , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_FAST_PARALLEL);
uint8_t u8g_dev_ssd1325_nhd27oled_2x_buf[WIDTH*2] U8G_NOCOMMON ; uint8_t u8g_dev_ssd1325_nhd27oled_2x_buf[WIDTH*2] U8G_NOCOMMON ;
u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_buf}; u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_buf};
......
...@@ -43,8 +43,16 @@ ...@@ -43,8 +43,16 @@
static const uint8_t u8g_dev_uc1611_dogm240_init_seq[] PROGMEM = { static const uint8_t u8g_dev_uc1611_dogm240_init_seq[] PROGMEM = {
U8G_ESC_CS(1), // enable chip U8G_ESC_CS(0), /* disable chip */
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
U8G_ESC_DLY(200),
U8G_ESC_CS(1), // enable chip
U8G_ESC_ADR(0), // instruction mode U8G_ESC_ADR(0), // instruction mode
0xe2, // system reset
U8G_ESC_DLY(1),
0x2f, // enable internal charge pump
0xF1, // set last COM electrode 0xF1, // set last COM electrode
0x3F, // 64-1=63 0x3F, // 64-1=63
0xF2, // set display start line 0xF2, // set display start line
...@@ -96,16 +104,16 @@ uint8_t u8g_dev_uc1611_dogm240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void ...@@ -96,16 +104,16 @@ uint8_t u8g_dev_uc1611_dogm240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void
u8g_SetAddress(u8g, dev, 1); /* data mode */ u8g_SetAddress(u8g, dev, 1); /* data mode */
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
return 0; return 0;
u8g_SetChipSelect(u8g, dev, 1); u8g_SetChipSelect(u8g, dev, 0);
} }
break; break;
case U8G_DEV_MSG_CONTRAST: case U8G_DEV_MSG_CONTRAST:
u8g_SetChipSelect(u8g, dev, 0); u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, 0x81);
/* 11 Jul 2015: bugfix, github issue 339 */ /* 11 Jul 2015: bugfix, github issue 339 */
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */ u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */
u8g_SetChipSelect(u8g, dev, 1); u8g_SetChipSelect(u8g, dev, 0);
return 1; return 1;
} }
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
......
...@@ -43,8 +43,17 @@ ...@@ -43,8 +43,17 @@
static const uint8_t u8g_dev_uc1611_dogxl240_init_seq[] PROGMEM = { static const uint8_t u8g_dev_uc1611_dogxl240_init_seq[] PROGMEM = {
U8G_ESC_CS(0), /* disable chip */
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
U8G_ESC_DLY(200),
U8G_ESC_CS(1), // enable chip U8G_ESC_CS(1), // enable chip
U8G_ESC_ADR(0), // instruction mode U8G_ESC_ADR(0), // instruction mode
0xe2, // system reset
U8G_ESC_DLY(1),
0x2f, // enable internal charge pump
0xF1, // set last COM electrode 0xF1, // set last COM electrode
0x7F, // DOGXL240 0x7F, // DOGXL240
0xF2, // set display start line 0xF2, // set display start line
...@@ -96,16 +105,16 @@ static uint8_t u8g_dev_uc1611_dogxl240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t ms ...@@ -96,16 +105,16 @@ static uint8_t u8g_dev_uc1611_dogxl240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t ms
u8g_SetAddress(u8g, dev, 1); /* data mode */ u8g_SetAddress(u8g, dev, 1); /* data mode */
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
return 0; return 0;
u8g_SetChipSelect(u8g, dev, 1); u8g_SetChipSelect(u8g, dev, 0);
} }
break; break;
case U8G_DEV_MSG_CONTRAST: case U8G_DEV_MSG_CONTRAST:
u8g_SetChipSelect(u8g, dev, 0); u8g_SetChipSelect(u8g, dev, 1);
u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_SetAddress(u8g, dev, 0); /* instruction mode */
u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, 0x81);
/* 11 Jul 2015: bugfix, github issue 339 */ /* 11 Jul 2015: bugfix, github issue 339 */
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */ u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */
u8g_SetChipSelect(u8g, dev, 1); u8g_SetChipSelect(u8g, dev, 0);
return 1; return 1;
} }
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
......
/* /*
Fontname: -FreeType-04b03b-Medium-R-Normal--8-80-72-72-P-39-ISO10646-1 Fontname: -FreeType-04b03b-Medium-R-Normal--8-80-72-72-P-39-ISO10646-1
Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 5 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 5 h= 5 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 5
Font Bounding box w= 5 h= 6 x= 0 y=-1 Font Bounding box w= 5 h= 6 x= 0 y=-1
...@@ -65,7 +65,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03b[826] U8G_FONT_SECTION("u8g_font_04b_03 ...@@ -65,7 +65,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03b[826] U8G_FONT_SECTION("u8g_font_04b_03
255,255,255,255,255,255,255,255,255,255}; 255,255,255,255,255,255,255,255,255,255};
/* /*
Fontname: -FreeType-04b03b-Medium-R-Normal--8-80-72-72-P-39-ISO10646-1 Fontname: -FreeType-04b03b-Medium-R-Normal--8-80-72-72-P-39-ISO10646-1
Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 0, '1' Height: 5 Capital A Height: 0, '1' Height: 5
Calculated Max Values w= 5 h= 5 x= 0 y= 2 dx= 6 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 5 h= 5 x= 0 y= 2 dx= 6 dy= 0 ascent= 5 len= 5
Font Bounding box w= 5 h= 6 x= 0 y=-1 Font Bounding box w= 5 h= 6 x= 0 y=-1
...@@ -87,7 +87,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03bn[136] U8G_FONT_SECTION("u8g_font_04b_0 ...@@ -87,7 +87,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03bn[136] U8G_FONT_SECTION("u8g_font_04b_0
16,112,3,19,35,128,0,128}; 16,112,3,19,35,128,0,128};
/* /*
Fontname: -FreeType-04b03b-Medium-R-Normal--8-80-72-72-P-39-ISO10646-1 Fontname: -FreeType-04b03b-Medium-R-Normal--8-80-72-72-P-39-ISO10646-1
Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 5 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 5 h= 5 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 5
Font Bounding box w= 5 h= 6 x= 0 y=-1 Font Bounding box w= 5 h= 6 x= 0 y=-1
...@@ -144,7 +144,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03br[696] U8G_FONT_SECTION("u8g_font_04b_0 ...@@ -144,7 +144,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03br[696] U8G_FONT_SECTION("u8g_font_04b_0
64,192,5,66,82,80,160,255}; 64,192,5,66,82,80,160,255};
/* /*
Fontname: -FreeType-04b03-Medium-R-Normal--8-80-72-72-P-38-ISO10646-1 Fontname: -FreeType-04b03-Medium-R-Normal--8-80-72-72-P-38-ISO10646-1
Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 7 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 7 Calculated Max Values w= 5 h= 7 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 7
Font Bounding box w= 5 h= 7 x= 0 y=-2 Font Bounding box w= 5 h= 7 x= 0 y=-2
...@@ -211,7 +211,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03[859] U8G_FONT_SECTION("u8g_font_04b_03" ...@@ -211,7 +211,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03[859] U8G_FONT_SECTION("u8g_font_04b_03"
255,255,255,255,255,255,255,255,255,255,255}; 255,255,255,255,255,255,255,255,255,255,255};
/* /*
Fontname: -FreeType-04b03-Medium-R-Normal--8-80-72-72-P-38-ISO10646-1 Fontname: -FreeType-04b03-Medium-R-Normal--8-80-72-72-P-38-ISO10646-1
Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 0, '1' Height: 5 Capital A Height: 0, '1' Height: 5
Calculated Max Values w= 5 h= 5 x= 0 y= 2 dx= 6 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 5 h= 5 x= 0 y= 2 dx= 6 dy= 0 ascent= 5 len= 5
Font Bounding box w= 5 h= 7 x= 0 y=-2 Font Bounding box w= 5 h= 7 x= 0 y=-2
...@@ -233,7 +233,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03n[136] U8G_FONT_SECTION("u8g_font_04b_03 ...@@ -233,7 +233,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03n[136] U8G_FONT_SECTION("u8g_font_04b_03
16,96,3,19,35,128,0,128}; 16,96,3,19,35,128,0,128};
/* /*
Fontname: -FreeType-04b03-Medium-R-Normal--8-80-72-72-P-38-ISO10646-1 Fontname: -FreeType-04b03-Medium-R-Normal--8-80-72-72-P-38-ISO10646-1
Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 19992003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 7 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 7 Calculated Max Values w= 5 h= 7 x= 0 y= 3 dx= 6 dy= 0 ascent= 5 len= 7
Font Bounding box w= 5 h= 7 x= 0 y=-2 Font Bounding box w= 5 h= 7 x= 0 y=-2
...@@ -292,7 +292,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03r[729] U8G_FONT_SECTION("u8g_font_04b_03 ...@@ -292,7 +292,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_03r[729] U8G_FONT_SECTION("u8g_font_04b_03
32,64,192,5,66,82,80,160,255}; 32,64,192,5,66,82,80,160,255};
/* /*
Fontname: -FreeType-04b24-Medium-R-Normal--8-80-72-72-P-32-ISO10646-1 Fontname: -FreeType-04b24-Medium-R-Normal--8-80-72-72-P-32-ISO10646-1
Copyright: 20002003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 20002003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 6 x= 0 y= 4 dx= 6 dy= 0 ascent= 5 len= 6 Calculated Max Values w= 5 h= 6 x= 0 y= 4 dx= 6 dy= 0 ascent= 5 len= 6
Font Bounding box w= 5 h= 6 x= 0 y=-1 Font Bounding box w= 5 h= 6 x= 0 y=-1
...@@ -363,7 +363,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_24[912] U8G_FONT_SECTION("u8g_font_04b_24" ...@@ -363,7 +363,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_24[912] U8G_FONT_SECTION("u8g_font_04b_24"
}; };
/* /*
Fontname: -FreeType-04b24-Medium-R-Normal--8-80-72-72-P-32-ISO10646-1 Fontname: -FreeType-04b24-Medium-R-Normal--8-80-72-72-P-32-ISO10646-1
Copyright: 20002003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 20002003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 0, '1' Height: 5 Capital A Height: 0, '1' Height: 5
Calculated Max Values w= 3 h= 5 x= 0 y= 2 dx= 4 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 3 h= 5 x= 0 y= 2 dx= 4 dy= 0 ascent= 5 len= 5
Font Bounding box w= 5 h= 6 x= 0 y=-1 Font Bounding box w= 5 h= 6 x= 0 y=-1
...@@ -385,7 +385,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_24n[136] U8G_FONT_SECTION("u8g_font_04b_24 ...@@ -385,7 +385,7 @@ const u8g_fntpgm_uint8_t u8g_font_04b_24n[136] U8G_FONT_SECTION("u8g_font_04b_24
224,32,3,19,35,128,0,128}; 224,32,3,19,35,128,0,128};
/* /*
Fontname: -FreeType-04b24-Medium-R-Normal--8-80-72-72-P-32-ISO10646-1 Fontname: -FreeType-04b24-Medium-R-Normal--8-80-72-72-P-32-ISO10646-1
Copyright: 20002003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org Copyright: 20002003 / yuji oshimoo / 04@dsg4.com / www.04.jp.org
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 6 x= 0 y= 4 dx= 6 dy= 0 ascent= 5 len= 6 Calculated Max Values w= 5 h= 6 x= 0 y= 4 dx= 6 dy= 0 ascent= 5 len= 6
Font Bounding box w= 5 h= 6 x= 0 y=-1 Font Bounding box w= 5 h= 6 x= 0 y=-1
...@@ -15757,7 +15757,7 @@ const u8g_fntpgm_uint8_t u8g_font_cursorr[492] U8G_FONT_SECTION("u8g_font_cursor ...@@ -15757,7 +15757,7 @@ const u8g_fntpgm_uint8_t u8g_font_cursorr[492] U8G_FONT_SECTION("u8g_font_cursor
64,28,0,56,0,112,0,224,0,192,0,255}; 64,28,0,56,0,112,0,224,0,192,0,255};
/* /*
Fontname: -FreeType-fixed_v01-Medium-R-Normal--8-80-72-72-P-51-ISO10646-1 Fontname: -FreeType-fixed_v01-Medium-R-Normal--8-80-72-72-P-51-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 7, '1' Height: 7 Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 7 h= 9 x= 2 y= 6 dx= 6 dy= 0 ascent= 7 len= 9 Calculated Max Values w= 7 h= 9 x= 2 y= 6 dx= 6 dy= 0 ascent= 7 len= 9
Font Bounding box w= 7 h= 9 x= 0 y=-2 Font Bounding box w= 7 h= 9 x= 0 y=-2
...@@ -15877,7 +15877,7 @@ const u8g_fntpgm_uint8_t u8g_font_fixed_v0[1702] U8G_FONT_SECTION("u8g_font_fixe ...@@ -15877,7 +15877,7 @@ const u8g_fntpgm_uint8_t u8g_font_fixed_v0[1702] U8G_FONT_SECTION("u8g_font_fixe
136,136,136,120,8,112}; 136,136,136,120,8,112};
/* /*
Fontname: -FreeType-fixed_v01-Medium-R-Normal--8-80-72-72-P-51-ISO10646-1 Fontname: -FreeType-fixed_v01-Medium-R-Normal--8-80-72-72-P-51-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 0, '1' Height: 7 Capital A Height: 0, '1' Height: 7
Calculated Max Values w= 5 h= 7 x= 1 y= 3 dx= 6 dy= 0 ascent= 7 len= 7 Calculated Max Values w= 5 h= 7 x= 1 y= 3 dx= 6 dy= 0 ascent= 7 len= 7
Font Bounding box w= 7 h= 9 x= 0 y=-2 Font Bounding box w= 7 h= 9 x= 0 y=-2
...@@ -15901,7 +15901,7 @@ const u8g_fntpgm_uint8_t u8g_font_fixed_v0n[167] U8G_FONT_SECTION("u8g_font_fixe ...@@ -15901,7 +15901,7 @@ const u8g_fntpgm_uint8_t u8g_font_fixed_v0n[167] U8G_FONT_SECTION("u8g_font_fixe
21,101,128,128,0,128,128}; 21,101,128,128,0,128,128};
/* /*
Fontname: -FreeType-fixed_v01-Medium-R-Normal--8-80-72-72-P-51-ISO10646-1 Fontname: -FreeType-fixed_v01-Medium-R-Normal--8-80-72-72-P-51-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 7, '1' Height: 7 Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 7 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 7 len= 9 Calculated Max Values w= 7 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 7 len= 9
Font Bounding box w= 7 h= 9 x= 0 y=-2 Font Bounding box w= 7 h= 9 x= 0 y=-2
...@@ -18731,49 +18731,6 @@ const u8g_fntpgm_uint8_t u8g_font_fub20r[4022] U8G_FONT_SECTION("u8g_font_fub20r ...@@ -18731,49 +18731,6 @@ const u8g_fntpgm_uint8_t u8g_font_fub20r[4022] U8G_FONT_SECTION("u8g_font_fub20r
192,15,0,30,0,30,0,30,0,30,0,30,0,30,0,30, 192,15,0,30,0,30,0,30,0,30,0,30,0,30,0,30,
0,30,0,124,0,252,0,240,0,14,3,6,14,0,5,63, 0,30,0,124,0,252,0,240,0,14,3,6,14,0,5,63,
156,127,248,225,240,255}; 156,127,248,225,240,255};
/*
Fontname: -FreeType-FreeUniversal-Bold-R-Normal--27-270-72-72-P-136-ISO10646-1
Copyright: FreeUniveral (c) Stephen Wilson 2009 Original Font Sil-Sophia Copyright (c) SIL International, 1994-2008.
Capital A Height: 0, '1' Height: 20
Calculated Max Values w=14 h=20 x= 4 y= 0 dx=15 dy= 0 ascent=20 len=40
Font Bounding box w=40 h=36 x=-2 y=-7
Calculated Min Values x= 0 y= 0 dx= 0 dy= 0
Pure Font ascent =20 descent= 0
X Font ascent =20 descent= 0
Max Font ascent =20 descent= 0
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_fub20t[477] U8G_SECTION(".progmem.u8g_font_fub20t") = {
0,40,36,254,249,20,0,0,0,0,48,58,0,20,0,20,
0,14,20,40,15,1,0,15,128,31,224,60,240,120,112,112,
56,240,56,240,56,240,60,240,60,240,60,240,60,240,60,240,
60,240,56,240,56,112,56,120,120,60,240,31,224,15,128,8,
20,20,15,3,0,15,63,127,255,239,207,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,14,20,40,15,1,0,7,
192,31,240,63,248,124,120,120,60,120,60,0,60,0,120,0,
120,0,240,1,240,3,224,7,192,15,128,31,0,124,0,248,
0,255,252,255,252,255,252,13,20,40,15,1,0,15,128,63,
224,127,240,248,240,240,120,0,120,0,120,0,240,15,224,15,
128,15,224,0,240,0,120,0,120,240,120,240,120,248,240,127,
240,63,224,31,128,14,20,40,15,1,0,1,240,3,240,3,
240,7,240,7,240,14,240,30,240,28,240,60,240,56,240,120,
240,112,240,240,240,255,252,255,252,255,252,0,240,0,240,0,
240,0,240,13,20,40,15,1,0,255,240,255,240,255,240,240,
0,240,0,240,0,240,0,247,192,255,224,253,240,240,120,240,
120,0,120,0,120,0,120,240,120,240,240,127,240,63,224,31,
128,13,20,40,15,1,0,15,192,31,224,63,240,120,120,120,
120,112,0,240,0,247,192,239,224,253,240,248,120,240,120,240,
120,240,120,240,120,112,120,120,240,63,240,63,224,15,128,13,
20,40,15,1,0,255,248,255,248,255,248,0,120,0,120,0,
240,0,240,1,224,1,224,1,224,3,192,3,192,7,128,7,
128,15,128,15,0,31,0,30,0,30,0,62,0,14,20,40,
15,1,0,31,192,63,240,127,240,120,248,240,120,240,120,240,
120,120,240,63,224,31,192,63,240,120,120,240,56,240,60,240,
60,240,60,248,120,127,248,63,240,31,192,13,20,40,15,1,
0,15,128,63,192,127,224,120,240,240,112,240,120,240,120,240,
120,240,120,120,248,127,184,63,56,0,120,0,120,0,112,240,
240,120,240,127,224,63,192,15,128,4,14,14,9,4,0,240,
240,240,240,0,0,0,0,0,0,240,240,240,240};
/* /*
Fontname: -FreeType-FreeUniversal-Bold-R-Normal--34-340-72-72-P-170-ISO10646-1 Fontname: -FreeType-FreeUniversal-Bold-R-Normal--34-340-72-72-P-170-ISO10646-1
Copyright: FreeUniveral (c) Stephen Wilson 2009 Original Font Sil-Sophia Copyright (c) SIL International, 1994-2008. Copyright: FreeUniveral (c) Stephen Wilson 2009 Original Font Sil-Sophia Copyright (c) SIL International, 1994-2008.
...@@ -45380,34 +45337,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR08[2687] U8G_FONT_SECTION("u8g_font_helvR ...@@ -45380,34 +45337,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR08[2687] U8G_FONT_SECTION("u8g_font_helvR
11,5,255,254,8,16,0,72,72,80,80,48,32,32,192,5, 11,5,255,254,8,16,0,72,72,80,80,48,32,32,192,5,
10,10,6,0,254,128,128,176,200,136,136,200,176,128,128,5, 10,10,6,0,254,128,128,176,200,136,136,200,176,128,128,5,
10,10,5,255,254,80,0,72,72,80,80,48,32,32,192}; 10,10,5,255,254,80,0,72,72,80,80,48,32,32,192};
/*
Fontname: -Adobe-Helvetica-Medium-R-Normal--11-80-100-100-P-56-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
Capital A Height: 0, '1' Height: 8
Calculated Max Values w= 5 h= 8 x= 1 y= 5 dx= 6 dy= 0 ascent= 8 len= 8
Font Bounding box w=13 h=18 x=-2 y=-4
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 8 descent= 0
X Font ascent = 8 descent= 0
Max Font ascent = 8 descent=-2
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_helvR08n[226] U8G_FONT_SECTION("u8g_font_helvR08n") = {
0,13,18,254,252,8,0,0,0,0,42,58,0,8,254,8,
0,3,3,3,4,0,5,160,64,160,5,5,5,6,0,1,
32,32,248,32,32,2,3,3,3,0,254,64,64,128,3,1,
1,4,0,3,224,1,1,1,3,1,0,128,3,8,8,3,
0,0,32,32,64,64,64,64,128,128,5,8,8,6,0,0,
112,136,136,136,136,136,136,112,2,8,8,6,1,0,64,192,
64,64,64,64,64,64,5,8,8,6,0,0,112,136,8,8,
48,64,128,248,5,8,8,6,0,0,112,136,8,48,8,8,
136,112,5,8,8,6,0,0,16,48,80,80,144,248,16,16,
5,8,8,6,0,0,120,64,64,112,8,8,136,112,5,8,
8,6,0,0,112,136,128,240,136,136,136,112,5,8,8,6,
0,0,248,8,16,32,32,64,64,64,5,8,8,6,0,0,
112,136,136,112,136,136,136,112,5,8,8,6,0,0,112,136,
136,136,120,8,136,112,1,6,6,3,1,0,128,0,0,0,
0,128};
/* /*
Fontname: -Adobe-Helvetica-Medium-R-Normal--11-80-100-100-P-56-ISO10646-1 Fontname: -Adobe-Helvetica-Medium-R-Normal--11-80-100-100-P-56-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
...@@ -45735,36 +45664,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR10[3527] U8G_FONT_SECTION("u8g_font_helvR ...@@ -45735,36 +45664,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR10[3527] U8G_FONT_SECTION("u8g_font_helvR
14,14,8,1,253,128,128,128,184,204,132,132,132,132,204,184, 14,14,8,1,253,128,128,128,184,204,132,132,132,132,204,184,
128,128,128,7,14,14,7,0,253,36,36,0,130,194,68,68, 128,128,128,7,14,14,7,0,253,36,36,0,130,194,68,68,
36,40,24,16,16,48,96}; 36,40,24,16,16,48,96};
/*
Fontname: -Adobe-Helvetica-Medium-R-Normal--14-100-100-100-P-76-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
Capital A Height: 0, '1' Height: 11
Calculated Max Values w= 7 h=11 x= 2 y= 6 dx= 9 dy= 0 ascent=11 len=11
Font Bounding box w=17 h=22 x=-2 y=-5
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent =11 descent= 0
X Font ascent =11 descent= 0
Max Font ascent =11 descent=-2
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_helvR10n[267] U8G_FONT_SECTION("u8g_font_helvR10n") = {
0,17,22,254,251,11,0,0,0,0,42,58,0,11,254,11,
0,5,5,5,7,1,6,32,168,112,168,32,7,7,7,9,
1,1,16,16,16,254,16,16,16,2,4,4,3,0,254,64,
64,64,128,3,1,1,4,0,4,224,1,2,2,3,1,0,
128,128,4,11,11,4,0,0,16,16,32,32,32,64,64,64,
128,128,128,6,11,11,8,1,0,120,132,132,132,132,132,132,
132,132,132,120,3,11,11,8,2,0,32,224,32,32,32,32,
32,32,32,32,32,6,11,11,8,1,0,120,132,132,4,8,
16,32,64,128,128,252,6,11,11,8,1,0,120,132,132,4,
4,56,4,4,132,132,120,7,11,11,8,1,0,4,12,20,
36,68,132,132,254,4,4,4,6,11,11,8,1,0,252,128,
128,128,248,4,4,4,132,132,120,6,11,11,8,1,0,120,
132,128,128,184,196,132,132,132,132,120,6,11,11,8,1,0,
252,4,8,8,16,16,32,32,64,64,64,6,11,11,8,1,
0,120,132,132,132,132,120,132,132,132,132,120,6,11,11,8,
1,0,120,132,132,132,132,124,4,4,132,132,120,1,8,8,
3,1,0,128,128,0,0,0,0,128,128};
/* /*
Fontname: -Adobe-Helvetica-Medium-R-Normal--14-100-100-100-P-76-ISO10646-1 Fontname: -Adobe-Helvetica-Medium-R-Normal--14-100-100-100-P-76-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
...@@ -46150,38 +46049,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR12[4077] U8G_FONT_SECTION("u8g_font_helvR ...@@ -46150,38 +46049,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR12[4077] U8G_FONT_SECTION("u8g_font_helvR
32,192,7,16,16,9,1,252,128,128,128,184,196,130,130,130, 32,192,7,16,16,9,1,252,128,128,128,184,196,130,130,130,
130,130,196,184,128,128,128,128,7,15,15,8,0,253,40,40, 130,130,196,184,128,128,128,128,7,15,15,8,0,253,40,40,
0,130,130,68,68,40,40,56,16,16,32,32,192}; 0,130,130,68,68,40,40,56,16,16,32,32,192};
/*
Fontname: -Adobe-Helvetica-Medium-R-Normal--17-120-100-100-P-88-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
Capital A Height: 0, '1' Height: 12
Calculated Max Values w= 9 h=12 x= 3 y= 7 dx=10 dy= 0 ascent=12 len=18
Font Bounding box w=20 h=26 x=-2 y=-6
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent =12 descent= 0
X Font ascent =12 descent= 0
Max Font ascent =12 descent=-2
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_helvR12n[290] U8G_FONT_SECTION("u8g_font_helvR12n") = {
0,20,26,254,250,12,0,0,0,0,42,58,0,12,254,12,
0,5,5,5,6,0,7,32,168,112,80,136,9,9,18,10,
0,0,8,0,8,0,8,0,8,0,255,128,8,0,8,0,
8,0,8,0,2,4,4,4,1,254,64,64,64,128,4,1,
1,5,0,4,240,1,2,2,4,2,0,128,128,4,12,12,
5,0,0,16,16,32,32,32,32,64,64,64,128,128,128,7,
12,12,9,1,0,56,68,68,130,130,130,130,130,130,68,68,
56,3,12,12,9,3,0,32,32,96,160,32,32,32,32,32,
32,32,32,7,12,12,9,1,0,56,68,130,130,2,4,8,
48,64,128,128,254,7,12,12,9,1,0,56,68,130,130,4,
56,4,2,130,130,68,56,8,12,12,9,0,0,12,20,20,
36,36,68,68,132,255,4,4,4,7,12,12,9,1,0,62,
32,32,64,120,68,2,2,2,130,68,56,7,12,12,9,1,
0,60,66,130,128,184,196,130,130,130,130,68,56,8,12,12,
9,0,0,255,1,2,4,4,8,8,16,16,16,32,32,7,
12,12,9,1,0,56,68,130,130,68,56,68,130,130,130,68,
56,7,12,12,9,1,0,56,68,130,130,130,130,70,58,2,
130,132,120,1,9,9,4,2,0,128,128,0,0,0,0,0,
128,128};
/* /*
Fontname: -Adobe-Helvetica-Medium-R-Normal--17-120-100-100-P-88-ISO10646-1 Fontname: -Adobe-Helvetica-Medium-R-Normal--17-120-100-100-P-88-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
...@@ -46636,39 +46503,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR14[4920] U8G_FONT_SECTION("u8g_font_helvR ...@@ -46636,39 +46503,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR14[4920] U8G_FONT_SECTION("u8g_font_helvR
193,128,227,0,255,0,222,0,192,0,192,0,192,0,192,0, 193,128,227,0,255,0,222,0,192,0,192,0,192,0,192,0,
8,18,18,10,1,252,102,102,0,0,195,195,195,102,102,102, 8,18,18,10,1,252,102,102,0,0,195,195,195,102,102,102,
36,60,24,24,24,24,112,112}; 36,60,24,24,24,24,112,112};
/*
Fontname: -Adobe-Helvetica-Medium-R-Normal--20-140-100-100-P-100-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
Capital A Height: 0, '1' Height: 13
Calculated Max Values w= 9 h=14 x= 2 y= 7 dx=10 dy= 0 ascent=14 len=26
Font Bounding box w=22 h=29 x=-2 y=-7
Calculated Min Values x= 0 y=-3 dx= 0 dy= 0
Pure Font ascent =13 descent= 0
X Font ascent =13 descent= 0
Max Font ascent =14 descent=-3
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_helvR14n[311] U8G_FONT_SECTION("u8g_font_helvR14n") = {
0,22,29,254,249,13,0,0,0,0,42,58,0,14,253,13,
0,5,7,7,7,1,7,32,168,248,32,248,168,32,8,10,
10,10,1,0,24,24,24,24,255,255,24,24,24,24,2,5,
5,5,1,253,192,192,64,64,128,5,1,1,6,0,5,248,
2,2,2,5,1,0,192,192,5,14,14,5,0,0,24,24,
24,24,48,48,48,96,96,96,192,192,192,192,8,13,13,10,
1,0,60,126,102,195,195,195,195,195,195,195,102,126,60,5,
13,13,10,2,0,24,248,248,24,24,24,24,24,24,24,24,
24,24,8,13,13,10,1,0,60,254,195,3,7,14,28,56,
112,224,192,255,255,8,13,13,10,1,0,62,127,195,195,6,
28,30,7,3,195,199,126,60,9,13,26,10,0,0,3,0,
7,0,15,0,27,0,51,0,51,0,99,0,195,0,255,128,
255,128,3,0,3,0,3,0,8,13,13,10,1,0,254,254,
192,192,252,254,199,3,3,195,199,254,124,8,13,13,10,1,
0,60,127,99,192,192,220,254,195,195,195,227,126,60,8,13,
13,10,1,0,255,255,3,6,12,12,24,24,48,48,96,96,
96,8,13,13,10,1,0,60,126,231,195,195,102,126,231,195,
195,231,126,60,8,13,13,10,1,0,60,126,199,195,195,195,
127,59,3,3,198,254,124,2,10,10,5,1,0,192,192,0,
0,0,0,0,0,192,192};
/* /*
Fontname: -Adobe-Helvetica-Medium-R-Normal--20-140-100-100-P-100-ISO10646-1 Fontname: -Adobe-Helvetica-Medium-R-Normal--20-140-100-100-P-100-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
...@@ -47295,53 +47129,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR18[7307] U8G_FONT_SECTION("u8g_font_helvR ...@@ -47295,53 +47129,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR18[7307] U8G_FONT_SECTION("u8g_font_helvR
128,0,0,0,0,192,48,192,48,96,48,112,96,48,96,56, 128,0,0,0,0,192,48,192,48,96,48,112,96,48,96,56,
224,24,192,24,192,13,128,13,128,7,128,7,0,3,0,3, 224,24,192,24,192,13,128,13,128,7,128,7,0,3,0,3,
0,6,0,6,0,12,0,60,0,56,0}; 0,6,0,6,0,12,0,60,0,56,0};
/*
Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
Capital A Height: 0, '1' Height: 18
Calculated Max Values w=12 h=19 x= 2 y=12 dx=14 dy= 0 ascent=19 len=36
Font Bounding box w=28 h=37 x=-3 y=-8
Calculated Min Values x= 0 y=-3 dx= 0 dy= 0
Pure Font ascent =18 descent= 0
X Font ascent =18 descent= 0
Max Font ascent =19 descent=-3
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_helvR18n[536] U8G_FONT_SECTION("u8g_font_helvR18n") = {
0,28,37,253,248,18,0,0,0,0,42,58,0,19,253,18,
0,7,7,7,10,1,12,16,16,214,124,56,108,68,12,12,
24,14,1,1,6,0,6,0,6,0,6,0,6,0,255,240,
255,240,6,0,6,0,6,0,6,0,6,0,2,6,6,6,
2,253,192,192,192,64,64,128,6,2,2,8,1,6,252,252,
2,3,3,6,2,0,192,192,192,7,19,19,7,0,0,6,
4,12,12,8,24,24,16,16,48,48,32,96,96,64,192,192,
128,128,11,18,36,13,1,0,31,0,63,128,113,192,96,192,
96,192,224,224,192,96,192,96,192,96,192,96,192,96,192,96,
224,224,96,192,96,192,113,192,63,128,31,0,6,18,18,13,
2,0,12,12,28,252,252,12,12,12,12,12,12,12,12,12,
12,12,12,12,11,18,36,13,1,0,30,0,127,128,97,192,
192,192,192,96,192,96,0,224,0,192,1,192,3,128,15,0,
28,0,56,0,112,0,224,0,192,0,255,224,255,224,11,18,
36,13,1,0,31,0,127,128,97,128,192,192,192,192,192,192,
0,192,1,128,15,0,15,192,0,192,0,96,0,96,192,96,
192,192,97,192,127,128,31,0,11,18,36,13,1,0,1,128,
3,128,3,128,7,128,15,128,13,128,25,128,57,128,49,128,
97,128,225,128,193,128,255,224,255,224,1,128,1,128,1,128,
1,128,11,18,36,13,1,0,127,192,127,192,96,0,96,0,
96,0,96,0,126,0,127,128,113,192,0,192,0,224,0,96,
0,96,192,224,192,192,225,192,127,128,30,0,11,18,36,13,
1,0,15,0,63,192,112,192,96,96,224,96,192,0,192,0,
207,0,223,128,241,192,224,192,192,96,192,96,192,96,224,224,
113,192,127,192,31,0,11,18,36,13,1,0,255,224,255,224,
0,224,0,192,1,128,1,128,3,0,3,0,6,0,6,0,
12,0,12,0,28,0,24,0,24,0,56,0,48,0,48,0,
11,18,36,13,1,0,14,0,63,128,49,128,96,192,96,192,
96,192,49,128,31,0,63,128,113,192,96,192,192,96,192,96,
192,96,192,96,96,192,127,192,31,0,11,18,36,13,1,0,
31,0,127,192,113,192,224,192,192,96,192,96,192,96,192,96,
224,224,113,224,127,96,30,96,0,96,0,224,192,192,225,192,
127,128,30,0,2,14,14,6,2,0,192,192,192,0,0,0,
0,0,0,0,0,192,192,192};
/* /*
Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1 Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1
Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved.
...@@ -56251,7 +56038,7 @@ const u8g_fntpgm_uint8_t u8g_font_ncenR24r[5367] U8G_FONT_SECTION("u8g_font_ncen ...@@ -56251,7 +56038,7 @@ const u8g_fntpgm_uint8_t u8g_font_ncenR24r[5367] U8G_FONT_SECTION("u8g_font_ncen
127,135,225,254,192,120,255}; 127,135,225,254,192,120,255};
/* /*
Fontname: -FreeType-Org_v01-Medium-R-Normal--8-80-72-72-P-43-ISO10646-1 Fontname: -FreeType-Org_v01-Medium-R-Normal--8-80-72-72-P-43-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w=11 h= 9 x= 1 y= 4 dx=12 dy= 0 ascent= 9 len=10 Calculated Max Values w=11 h= 9 x= 1 y= 4 dx=12 dy= 0 ascent= 9 len=10
Font Bounding box w=11 h=11 x= 0 y=-2 Font Bounding box w=11 h=11 x= 0 y=-2
...@@ -56360,7 +56147,7 @@ const u8g_fntpgm_uint8_t u8g_font_orgv01[1535] U8G_FONT_SECTION("u8g_font_orgv01 ...@@ -56360,7 +56147,7 @@ const u8g_fntpgm_uint8_t u8g_font_orgv01[1535] U8G_FONT_SECTION("u8g_font_orgv01
128,240,136,240,128,1,71,87,144,0,144,144,144,240,16}; 128,240,136,240,128,1,71,87,144,0,144,144,144,240,16};
/* /*
Fontname: -FreeType-Org_v01-Medium-R-Normal--8-80-72-72-P-43-ISO10646-1 Fontname: -FreeType-Org_v01-Medium-R-Normal--8-80-72-72-P-43-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 0, '1' Height: 5 Capital A Height: 0, '1' Height: 5
Calculated Max Values w= 5 h= 5 x= 0 y= 2 dx= 6 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 5 h= 5 x= 0 y= 2 dx= 6 dy= 0 ascent= 5 len= 5
Font Bounding box w=11 h=11 x= 0 y=-2 Font Bounding box w=11 h=11 x= 0 y=-2
...@@ -56382,7 +56169,7 @@ const u8g_fntpgm_uint8_t u8g_font_orgv01n[137] U8G_FONT_SECTION("u8g_font_orgv01 ...@@ -56382,7 +56169,7 @@ const u8g_fntpgm_uint8_t u8g_font_orgv01n[137] U8G_FONT_SECTION("u8g_font_orgv01
8,248,2,20,36,128,0,0,128}; 8,248,2,20,36,128,0,0,128};
/* /*
Fontname: -FreeType-Org_v01-Medium-R-Normal--8-80-72-72-P-43-ISO10646-1 Fontname: -FreeType-Org_v01-Medium-R-Normal--8-80-72-72-P-43-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 5, '1' Height: 5 Capital A Height: 5, '1' Height: 5
Calculated Max Values w= 5 h= 5 x= 0 y= 4 dx= 6 dy= 0 ascent= 5 len= 5 Calculated Max Values w= 5 h= 5 x= 0 y= 4 dx= 6 dy= 0 ascent= 5 len= 5
Font Bounding box w=11 h=11 x= 0 y=-2 Font Bounding box w=11 h=11 x= 0 y=-2
...@@ -70404,7 +70191,7 @@ const u8g_fntpgm_uint8_t u8g_font_pixelle_micror[1012] U8G_FONT_SECTION("u8g_fon ...@@ -70404,7 +70191,7 @@ const u8g_fntpgm_uint8_t u8g_font_pixelle_micror[1012] U8G_FONT_SECTION("u8g_fon
1,80,160,255}; 1,80,160,255};
/* /*
Fontname: ProFont10 Fontname: ProFont10
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 6, '1' Height: 6 Capital A Height: 6, '1' Height: 6
Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 5 dy= 0 ascent= 8 len= 9 Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 5 dy= 0 ascent= 8 len= 9
Font Bounding box w= 5 h= 9 x= 0 y=-2 Font Bounding box w= 5 h= 9 x= 0 y=-2
...@@ -70578,7 +70365,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont10[2560] U8G_FONT_SECTION("u8g_font_pro ...@@ -70578,7 +70365,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont10[2560] U8G_FONT_SECTION("u8g_font_pro
}; };
/* /*
Fontname: ProFont10 Fontname: ProFont10
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 6, '1' Height: 6 Capital A Height: 6, '1' Height: 6
Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 5 dy= 0 ascent= 7 len= 9 Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 5 dy= 0 ascent= 7 len= 9
Font Bounding box w= 5 h= 9 x= 0 y=-2 Font Bounding box w= 5 h= 9 x= 0 y=-2
...@@ -70661,7 +70448,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont10r[1106] U8G_FONT_SECTION("u8g_font_pr ...@@ -70661,7 +70448,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont10r[1106] U8G_FONT_SECTION("u8g_font_pr
0,0}; 0,0};
/* /*
Fontname: ProFont11 Fontname: ProFont11
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 7, '1' Height: 7 Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 6 h=11 x= 3 y= 6 dx= 6 dy= 0 ascent= 9 len=11 Calculated Max Values w= 6 h=11 x= 3 y= 6 dx= 6 dy= 0 ascent= 9 len=11
Font Bounding box w= 6 h=10 x= 0 y=-2 Font Bounding box w= 6 h=10 x= 0 y=-2
...@@ -70848,7 +70635,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont11[2768] U8G_FONT_SECTION("u8g_font_pro ...@@ -70848,7 +70635,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont11[2768] U8G_FONT_SECTION("u8g_font_pro
}; };
/* /*
Fontname: ProFont11 Fontname: ProFont11
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 7, '1' Height: 7 Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 6 h=11 x= 2 y= 6 dx= 6 dy= 0 ascent= 9 len=11 Calculated Max Values w= 6 h=11 x= 2 y= 6 dx= 6 dy= 0 ascent= 9 len=11
Font Bounding box w= 6 h=10 x= 0 y=-2 Font Bounding box w= 6 h=10 x= 0 y=-2
...@@ -70937,7 +70724,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont11r[1200] U8G_FONT_SECTION("u8g_font_pr ...@@ -70937,7 +70724,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont11r[1200] U8G_FONT_SECTION("u8g_font_pr
}; };
/* /*
Fontname: ProFont12 Fontname: ProFont12
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 8, '1' Height: 8 Capital A Height: 8, '1' Height: 8
Calculated Max Values w= 6 h=12 x= 3 y= 7 dx= 6 dy= 0 ascent=10 len=12 Calculated Max Values w= 6 h=12 x= 3 y= 7 dx= 6 dy= 0 ascent=10 len=12
Font Bounding box w= 6 h=11 x= 0 y=-2 Font Bounding box w= 6 h=11 x= 0 y=-2
...@@ -71132,7 +70919,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont12[2907] U8G_FONT_SECTION("u8g_font_pro ...@@ -71132,7 +70919,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont12[2907] U8G_FONT_SECTION("u8g_font_pro
254,80,0,0,136,136,136,136,120,8,112}; 254,80,0,0,136,136,136,136,120,8,112};
/* /*
Fontname: ProFont12 Fontname: ProFont12
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 8, '1' Height: 8 Capital A Height: 8, '1' Height: 8
Calculated Max Values w= 6 h=11 x= 2 y= 7 dx= 6 dy= 0 ascent= 9 len=11 Calculated Max Values w= 6 h=11 x= 2 y= 7 dx= 6 dy= 0 ascent= 9 len=11
Font Bounding box w= 6 h=11 x= 0 y=-2 Font Bounding box w= 6 h=11 x= 0 y=-2
...@@ -71224,7 +71011,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont12r[1258] U8G_FONT_SECTION("u8g_font_pr ...@@ -71224,7 +71011,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont12r[1258] U8G_FONT_SECTION("u8g_font_pr
0,4,104,176,0,0,0,6,0,0}; 0,4,104,176,0,0,0,6,0,0};
/* /*
Fontname: ProFont15 Fontname: ProFont15
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 9, '1' Height: 9 Capital A Height: 9, '1' Height: 9
Calculated Max Values w= 7 h=15 x= 4 y= 8 dx= 7 dy= 0 ascent=12 len=15 Calculated Max Values w= 7 h=15 x= 4 y= 8 dx= 7 dy= 0 ascent=12 len=15
Font Bounding box w= 7 h=14 x= 0 y=-3 Font Bounding box w= 7 h=14 x= 0 y=-3
...@@ -71437,7 +71224,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont15[3186] U8G_FONT_SECTION("u8g_font_pro ...@@ -71437,7 +71224,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont15[3186] U8G_FONT_SECTION("u8g_font_pro
4,120}; 4,120};
/* /*
Fontname: ProFont15 Fontname: ProFont15
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 9, '1' Height: 9 Capital A Height: 9, '1' Height: 9
Calculated Max Values w= 7 h=15 x= 3 y= 8 dx= 7 dy= 0 ascent=12 len=15 Calculated Max Values w= 7 h=15 x= 3 y= 8 dx= 7 dy= 0 ascent=12 len=15
Font Bounding box w= 7 h=14 x= 0 y=-3 Font Bounding box w= 7 h=14 x= 0 y=-3
...@@ -71536,7 +71323,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont15r[1372] U8G_FONT_SECTION("u8g_font_pr ...@@ -71536,7 +71323,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont15r[1372] U8G_FONT_SECTION("u8g_font_pr
2,7,0,4,100,152,0,0,0,7,0,0}; 2,7,0,4,100,152,0,0,0,7,0,0};
/* /*
Fontname: ProFont17 Fontname: ProFont17
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 11, '1' Height: 11 Capital A Height: 11, '1' Height: 11
Calculated Max Values w= 9 h=17 x= 5 y=10 dx=14 dy= 0 ascent=14 len=32 Calculated Max Values w= 9 h=17 x= 5 y=10 dx=14 dy= 0 ascent=14 len=32
Font Bounding box w=14 h=16 x= 0 y=-3 Font Bounding box w=14 h=16 x= 0 y=-3
...@@ -71780,7 +71567,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont17[3681] U8G_FONT_SECTION("u8g_font_pro ...@@ -71780,7 +71567,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont17[3681] U8G_FONT_SECTION("u8g_font_pro
60}; 60};
/* /*
Fontname: ProFont17 Fontname: ProFont17
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 11, '1' Height: 11 Capital A Height: 11, '1' Height: 11
Calculated Max Values w= 9 h=17 x= 3 y= 9 dx=14 dy= 0 ascent=14 len=32 Calculated Max Values w= 9 h=17 x= 3 y= 9 dx=14 dy= 0 ascent=14 len=32
Font Bounding box w=14 h=16 x= 0 y=-3 Font Bounding box w=14 h=16 x= 0 y=-3
...@@ -71893,7 +71680,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont17r[1590] U8G_FONT_SECTION("u8g_font_pr ...@@ -71893,7 +71680,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont17r[1590] U8G_FONT_SECTION("u8g_font_pr
0,0,0,14,0,0}; 0,0,0,14,0,0};
/* /*
Fontname: ProFont22 Fontname: ProFont22
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 14, '1' Height: 14 Capital A Height: 14, '1' Height: 14
Calculated Max Values w=12 h=22 x= 6 y=12 dx=12 dy= 0 ascent=18 len=44 Calculated Max Values w=12 h=22 x= 6 y=12 dx=12 dy= 0 ascent=18 len=44
Font Bounding box w=12 h=21 x= 0 y=-4 Font Bounding box w=12 h=21 x= 0 y=-4
...@@ -72310,7 +72097,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont22[6454] U8G_FONT_SECTION("u8g_font_pro ...@@ -72310,7 +72097,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont22[6454] U8G_FONT_SECTION("u8g_font_pro
1,192,63,128,63,0}; 1,192,63,128,63,0};
/* /*
Fontname: ProFont22 Fontname: ProFont22
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 14, '1' Height: 14 Capital A Height: 14, '1' Height: 14
Calculated Max Values w=12 h=22 x= 4 y=12 dx=12 dy= 0 ascent=18 len=40 Calculated Max Values w=12 h=22 x= 4 y=12 dx=12 dy= 0 ascent=18 len=40
Font Bounding box w=12 h=21 x= 0 y=-4 Font Bounding box w=12 h=21 x= 0 y=-4
...@@ -72493,7 +72280,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont22r[2719] U8G_FONT_SECTION("u8g_font_pr ...@@ -72493,7 +72280,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont22r[2719] U8G_FONT_SECTION("u8g_font_pr
6,48,192,124,192,207,128,195,0,0,0,0,12,0,0}; 6,48,192,124,192,207,128,195,0,0,0,0,12,0,0};
/* /*
Fontname: ProFont29 Fontname: ProFont29
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 19, '1' Height: 19 Capital A Height: 19, '1' Height: 19
Calculated Max Values w=16 h=29 x= 8 y=16 dx=16 dy= 0 ascent=24 len=58 Calculated Max Values w=16 h=29 x= 8 y=16 dx=16 dy= 0 ascent=24 len=58
Font Bounding box w=16 h=28 x= 0 y=-5 Font Bounding box w=16 h=28 x= 0 y=-5
...@@ -73048,7 +72835,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont29[8666] U8G_FONT_SECTION("u8g_font_pro ...@@ -73048,7 +72835,7 @@ const u8g_fntpgm_uint8_t u8g_font_profont29[8666] U8G_FONT_SECTION("u8g_font_pro
0,28,0,56,31,248,31,240,31,224}; 0,28,0,56,31,248,31,240,31,224};
/* /*
Fontname: ProFont29 Fontname: ProFont29
Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5
Capital A Height: 19, '1' Height: 19 Capital A Height: 19, '1' Height: 19
Calculated Max Values w=16 h=29 x= 5 y=15 dx=16 dy= 0 ascent=24 len=58 Calculated Max Values w=16 h=29 x= 5 y=15 dx=16 dy= 0 ascent=24 len=58
Font Bounding box w=16 h=28 x= 0 y=-5 Font Bounding box w=16 h=28 x= 0 y=-5
...@@ -83005,7 +82792,7 @@ const u8g_fntpgm_uint8_t u8g_font_timR24r[4764] U8G_FONT_SECTION("u8g_font_timR2 ...@@ -83005,7 +82792,7 @@ const u8g_fntpgm_uint8_t u8g_font_timR24r[4764] U8G_FONT_SECTION("u8g_font_timR2
18,1,7,62,3,127,135,225,254,192,124,255}; 18,1,7,62,3,127,135,225,254,192,124,255};
/* /*
Fontname: -FreeType-Teachers Pet Sans Serif Bold-Medium-R-Normal--8-80-72-72-P-61-ISO10646-1 Fontname: -FreeType-Teachers Pet Sans Serif Bold-Medium-R-Normal--8-80-72-72-P-61-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 9, '1' Height: 9 Capital A Height: 9, '1' Height: 9
Calculated Max Values w=11 h=13 x= 1 y=10 dx=12 dy= 0 ascent=13 len=18 Calculated Max Values w=11 h=13 x= 1 y=10 dx=12 dy= 0 ascent=13 len=18
Font Bounding box w=11 h=17 x= 0 y=-4 Font Bounding box w=11 h=17 x= 0 y=-4
...@@ -83185,7 +82972,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssb[2656] U8G_FONT_SECTION("u8g_font_tpssb") ...@@ -83185,7 +82972,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssb[2656] U8G_FONT_SECTION("u8g_font_tpssb")
}; };
/* /*
Fontname: -FreeType-Teachers Pet Sans Serif Bold-Medium-R-Normal--8-80-72-72-P-61-ISO10646-1 Fontname: -FreeType-Teachers Pet Sans Serif Bold-Medium-R-Normal--8-80-72-72-P-61-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 0, '1' Height: 9 Capital A Height: 0, '1' Height: 9
Calculated Max Values w= 6 h= 9 x= 1 y= 3 dx= 8 dy= 0 ascent= 9 len= 9 Calculated Max Values w= 6 h= 9 x= 1 y= 3 dx= 8 dy= 0 ascent= 9 len= 9
Font Bounding box w=11 h=17 x= 0 y=-4 Font Bounding box w=11 h=17 x= 0 y=-4
...@@ -83214,7 +83001,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssbn[240] U8G_FONT_SECTION("u8g_font_tpssbn" ...@@ -83214,7 +83001,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssbn[240] U8G_FONT_SECTION("u8g_font_tpssbn"
}; };
/* /*
Fontname: -FreeType-Teachers Pet Sans Serif Bold-Medium-R-Normal--8-80-72-72-P-61-ISO10646-1 Fontname: -FreeType-Teachers Pet Sans Serif Bold-Medium-R-Normal--8-80-72-72-P-61-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 9, '1' Height: 9 Capital A Height: 9, '1' Height: 9
Calculated Max Values w=10 h=13 x= 1 y=10 dx=12 dy= 0 ascent=12 len=18 Calculated Max Values w=10 h=13 x= 1 y=10 dx=12 dy= 0 ascent=12 len=18
Font Bounding box w=11 h=17 x= 0 y=-4 Font Bounding box w=11 h=17 x= 0 y=-4
...@@ -83312,7 +83099,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssbr[1346] U8G_FONT_SECTION("u8g_font_tpssbr ...@@ -83312,7 +83099,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssbr[1346] U8G_FONT_SECTION("u8g_font_tpssbr
184,255}; 184,255};
/* /*
Fontname: -FreeType-Teachers Pet Sans Serif-Medium-R-Normal--8-80-72-72-P-18-ISO10646-1 Fontname: -FreeType-Teachers Pet Sans Serif-Medium-R-Normal--8-80-72-72-P-18-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 9, '1' Height: 9 Capital A Height: 9, '1' Height: 9
Calculated Max Values w= 9 h=13 x= 1 y=10 dx=11 dy= 0 ascent=13 len=18 Calculated Max Values w= 9 h=13 x= 1 y=10 dx=11 dy= 0 ascent=13 len=18
Font Bounding box w=11 h=17 x=-1 y=-4 Font Bounding box w=11 h=17 x=-1 y=-4
...@@ -83488,7 +83275,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpss[2605] U8G_FONT_SECTION("u8g_font_tpss") = ...@@ -83488,7 +83275,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpss[2605] U8G_FONT_SECTION("u8g_font_tpss") =
252,80,0,136,136,136,136,136,120,8,8,136,112}; 252,80,0,136,136,136,136,136,120,8,8,136,112};
/* /*
Fontname: -FreeType-Teachers Pet Sans Serif-Medium-R-Normal--8-80-72-72-P-18-ISO10646-1 Fontname: -FreeType-Teachers Pet Sans Serif-Medium-R-Normal--8-80-72-72-P-18-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 0, '1' Height: 9 Capital A Height: 0, '1' Height: 9
Calculated Max Values w= 5 h= 9 x= 1 y= 3 dx= 7 dy= 0 ascent= 9 len= 9 Calculated Max Values w= 5 h= 9 x= 1 y= 3 dx= 7 dy= 0 ascent= 9 len= 9
Font Bounding box w=11 h=17 x=-1 y=-4 Font Bounding box w=11 h=17 x=-1 y=-4
...@@ -83516,7 +83303,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssn[238] U8G_FONT_SECTION("u8g_font_tpssn") ...@@ -83516,7 +83303,7 @@ const u8g_fntpgm_uint8_t u8g_font_tpssn[238] U8G_FONT_SECTION("u8g_font_tpssn")
8,8,136,112,1,4,4,3,1,0,128,0,0,128}; 8,8,136,112,1,4,4,3,1,0,128,0,0,128};
/* /*
Fontname: -FreeType-Teachers Pet Sans Serif-Medium-R-Normal--8-80-72-72-P-18-ISO10646-1 Fontname: -FreeType-Teachers Pet Sans Serif-Medium-R-Normal--8-80-72-72-P-18-ISO10646-1
Copyright: www.orgdot.com Copyright: www.orgdot.com
Capital A Height: 9, '1' Height: 9 Capital A Height: 9, '1' Height: 9
Calculated Max Values w= 9 h=13 x= 1 y=10 dx=11 dy= 0 ascent=12 len=16 Calculated Max Values w= 9 h=13 x= 1 y=10 dx=11 dy= 0 ascent=12 len=16
Font Bounding box w=11 h=17 x=-1 y=-4 Font Bounding box w=11 h=17 x=-1 y=-4
...@@ -83974,557 +83761,6 @@ const u8g_fntpgm_uint8_t u8g_font_u8glib_4r[664] U8G_FONT_SECTION("u8g_font_u8gl ...@@ -83974,557 +83761,6 @@ const u8g_fntpgm_uint8_t u8g_font_u8glib_4r[664] U8G_FONT_SECTION("u8g_font_u8gl
1,54,70,96,64,128,128,64,96,1,22,38,128,128,128,128, 1,54,70,96,64,128,128,64,96,1,22,38,128,128,128,128,
128,128,1,54,70,192,64,32,32,64,192,5,66,82,80,160, 128,128,1,54,70,192,64,32,32,64,192,5,66,82,80,160,
2,69,85,240,144,144,144,240}; 2,69,85,240,144,144,144,240};
/*
Fontname: -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1
Copyright:
Capital A Height: 10, '1' Height: 10
Calculated Max Values w=16 h=16 x= 4 y=14 dx=16 dy= 0 ascent=14 len=32
Font Bounding box w=16 h=16 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent =10 descent=-2
X Font ascent =11 descent=-2
Max Font ascent =14 descent=-2
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_unifont_0_10[5136] U8G_FONT_SECTION("u8g_font_unifont_0_10") = {
0,16,16,0,254,10,5,43,7,25,10,255,254,14,254,11,
254,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,65,241,193,0,65,241,193,0,125,1,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,69,241,196,64,68,65,168,64,16,
65,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,125,241,193,
0,125,241,193,0,65,1,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,61,225,193,16,65,225,193,32,61,17,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,60,225,193,16,57,17,133,
16,120,225,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,61,
241,192,64,56,65,132,64,121,241,128,0,0,1,128,0,0,
1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,114,57,202,32,74,57,202,32,115,185,128,
0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0,
254,170,170,0,1,128,0,0,1,128,0,113,137,202,24,74,
9,202,8,113,157,128,0,0,1,128,0,0,1,128,0,85,
85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,113,153,202,4,74,9,202,16,113,157,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,113,153,202,4,74,25,202,4,113,
153,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,113,133,202,
12,74,21,202,28,113,133,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,73,147,234,84,106,89,219,212,74,83,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,52,83,194,154,49,23,137,
18,113,19,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,123,
185,193,36,121,57,193,36,121,57,128,0,0,1,128,0,0,
1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,51,37,196,180,71,173,196,164,52,165,128,
0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0,
254,170,170,0,1,128,0,0,1,128,0,125,17,193,176,125,
81,193,16,125,17,128,0,0,1,128,0,0,1,128,0,85,
85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,58,93,194,82,50,93,138,82,113,157,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,121,207,194,16,121,145,192,80,123,
143,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,121,193,194,
0,121,129,192,64,67,129,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,57,193,194,0,89,129,200,64,59,129,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,113,193,202,0,113,129,208,
64,75,129,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,73,
193,202,0,73,129,200,64,51,129,128,0,0,1,128,0,0,
1,128,0,85,85,0,0,0,8,0,14,1,10,10,8,4,
0,128,128,128,128,128,128,128,0,128,128,5,4,4,8,2,
8,136,136,136,136,6,10,10,8,1,0,36,36,36,252,72,
72,252,144,144,144,7,10,10,8,1,0,16,124,146,144,112,
28,18,146,124,16,7,10,10,8,1,0,98,148,148,104,16,
16,44,82,82,140,7,10,10,8,1,0,56,68,68,68,56,
114,138,132,140,114,1,4,4,8,4,8,128,128,128,128,3,
12,12,8,3,255,32,64,64,128,128,128,128,128,128,64,64,
32,3,12,12,8,2,255,128,64,64,32,32,32,32,32,32,
64,64,128,7,7,7,8,1,1,16,146,84,56,84,146,16,
7,7,7,8,1,1,16,16,16,254,16,16,16,2,4,4,
8,3,254,192,64,64,128,6,1,1,8,1,4,252,2,2,
2,8,3,0,192,192,6,10,10,8,1,0,4,4,8,16,
16,32,32,64,128,128,6,10,10,8,1,0,48,72,132,132,
132,132,132,132,72,48,5,10,10,8,2,0,32,96,160,32,
32,32,32,32,32,248,6,10,10,8,1,0,120,132,132,4,
24,32,64,128,128,252,6,10,10,8,1,0,120,132,132,4,
56,4,4,132,132,120,6,10,10,8,1,0,8,24,40,72,
136,136,252,8,8,8,6,10,10,8,1,0,252,128,128,128,
248,4,4,4,132,120,6,10,10,8,1,0,56,64,128,128,
248,132,132,132,132,120,6,10,10,8,1,0,252,4,4,8,
8,8,16,16,16,16,6,10,10,8,1,0,120,132,132,132,
120,132,132,132,132,120,6,10,10,8,1,0,120,132,132,132,
124,4,4,4,8,112,2,7,7,8,3,1,192,192,0,0,
0,192,192,2,9,9,8,3,255,192,192,0,0,0,192,64,
64,128,5,9,9,8,2,0,8,16,32,64,128,64,32,16,
8,6,5,5,8,1,2,252,0,0,0,252,5,9,9,8,
1,0,128,64,32,16,8,16,32,64,128,6,10,10,8,1,
0,120,132,132,4,8,16,16,0,16,16,6,10,10,8,1,
0,56,68,148,172,164,164,164,156,64,60,6,10,10,8,1,
0,48,72,72,132,132,252,132,132,132,132,6,10,10,8,1,
0,248,132,132,132,248,132,132,132,132,248,6,10,10,8,1,
0,120,132,132,128,128,128,128,132,132,120,6,10,10,8,1,
0,240,136,132,132,132,132,132,132,136,240,6,10,10,8,1,
0,252,128,128,128,248,128,128,128,128,252,6,10,10,8,1,
0,252,128,128,128,248,128,128,128,128,128,6,10,10,8,1,
0,120,132,132,128,128,156,132,132,140,116,6,10,10,8,1,
0,132,132,132,132,252,132,132,132,132,132,5,10,10,8,2,
0,248,32,32,32,32,32,32,32,32,248,7,10,10,8,1,
0,62,8,8,8,8,8,8,136,136,112,6,10,10,8,1,
0,132,136,144,160,192,192,160,144,136,132,6,10,10,8,1,
0,128,128,128,128,128,128,128,128,128,252,6,10,10,8,1,
0,132,132,204,204,180,180,132,132,132,132,6,10,10,8,1,
0,132,196,196,164,164,148,148,140,140,132,6,10,10,8,1,
0,120,132,132,132,132,132,132,132,132,120,6,10,10,8,1,
0,248,132,132,132,248,128,128,128,128,128,7,11,11,8,1,
255,120,132,132,132,132,132,132,180,204,120,6,6,10,10,8,
1,0,248,132,132,132,248,144,136,136,132,132,6,10,10,8,
1,0,120,132,132,128,96,24,4,132,132,120,7,10,10,8,
1,0,254,16,16,16,16,16,16,16,16,16,6,10,10,8,
1,0,132,132,132,132,132,132,132,132,132,120,7,10,10,8,
1,0,130,130,130,68,68,68,40,40,16,16,6,10,10,8,
1,0,132,132,132,132,180,180,204,204,132,132,6,10,10,8,
1,0,132,132,72,72,48,48,72,72,132,132,7,10,10,8,
1,0,130,130,68,68,40,16,16,16,16,16,6,10,10,8,
1,0,252,4,4,8,16,32,64,128,128,252,3,12,12,8,
4,255,224,128,128,128,128,128,128,128,128,128,128,224,6,10,
10,8,1,0,128,128,64,32,32,16,16,8,4,4,3,12,
12,8,1,255,224,32,32,32,32,32,32,32,32,32,32,224,
6,3,3,8,1,9,48,72,132,7,1,1,8,1,255,254,
3,3,3,8,2,10,128,64,32,6,8,8,8,1,0,120,
132,4,124,132,132,140,116,6,11,11,8,1,0,128,128,128,
184,196,132,132,132,132,196,184,6,8,8,8,1,0,120,132,
128,128,128,128,132,120,6,11,11,8,1,0,4,4,4,116,
140,132,132,132,132,140,116,6,8,8,8,1,0,120,132,132,
252,128,128,132,120,5,11,11,8,1,0,24,32,32,32,248,
32,32,32,32,32,32,6,11,11,8,1,254,4,116,136,136,
136,112,64,120,132,132,120,6,11,11,8,1,0,128,128,128,
184,196,132,132,132,132,132,132,5,11,11,8,2,0,32,32,
0,96,32,32,32,32,32,32,248,5,13,13,8,1,254,8,
8,0,24,8,8,8,8,8,8,8,144,96,6,10,10,8,
1,0,128,128,136,144,160,192,160,144,136,132,5,10,10,8,
2,0,96,32,32,32,32,32,32,32,32,248,7,8,8,8,
1,0,236,146,146,146,146,146,146,146,6,8,8,8,1,0,
184,196,132,132,132,132,132,132,6,8,8,8,1,0,120,132,
132,132,132,132,132,120,6,10,10,8,1,254,184,196,132,132,
132,132,196,184,128,128,6,10,10,8,1,254,116,140,132,132,
132,132,140,116,4,4,6,8,8,8,1,0,184,196,132,128,
128,128,128,128,6,8,8,8,1,0,120,132,128,96,24,4,
132,120,5,10,10,8,1,0,32,32,248,32,32,32,32,32,
32,24,6,8,8,8,1,0,132,132,132,132,132,132,140,116,
6,8,8,8,1,0,132,132,132,72,72,72,48,48,7,8,
8,8,1,0,130,146,146,146,146,146,146,108,6,8,8,8,
1,0,132,132,72,48,48,72,132,132,6,10,10,8,1,254,
132,132,132,132,132,76,52,4,4,120,6,8,8,8,1,0,
252,4,8,16,32,64,128,252,3,12,12,8,3,255,96,128,
128,64,64,128,128,64,64,128,128,96,1,14,14,8,4,254,
128,128,128,128,128,128,128,128,128,128,128,128,128,128,3,12,
12,8,2,255,192,32,32,64,64,32,32,64,64,32,32,192,
7,3,3,8,1,8,98,146,140,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,115,209,202,16,75,209,202,
16,115,223,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,113,
157,202,82,115,211,194,82,66,93,128,0,0,1,128,0,0,
1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,73,157,202,82,122,93,202,80,73,145,128,
0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0,
254,170,170,0,1,128,0,0,1,128,0,115,147,202,82,115,
159,202,18,114,19,128,0,0,1,128,0,0,1,128,0,85,
85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,75,147,234,82,91,159,202,82,75,147,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,116,185,166,164,37,165,164,164,116,
185,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,75,209,234,
16,91,209,202,16,75,223,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,57,205,194,18,49,159,136,82,115,147,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,121,205,194,18,121,159,192,
82,123,147,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,75,
157,201,32,121,25,201,4,73,57,128,0,0,1,128,0,0,
1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,75,185,201,8,121,9,201,8,73,49,128,
0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0,
254,170,170,0,1,128,0,0,1,128,0,69,205,196,144,68,
137,168,132,16,153,128,0,0,1,128,0,0,1,128,0,85,
85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,114,29,202,18,114,19,194,18,67,221,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,114,19,202,18,114,19,194,18,67,
205,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,14,33,137,
32,14,33,138,32,9,33,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,57,221,194,2,49,141,136,80,115,159,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,57,221,194,2,49,141,136,
66,115,157,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,113,
207,202,16,74,13,202,2,113,221,128,0,0,1,128,0,0,
1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,114,69,202,76,114,69,194,68,65,143,128,
0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0,
254,170,170,0,1,128,0,0,1,128,0,114,93,202,66,114,
77,194,80,65,159,128,0,0,1,128,0,0,1,128,0,85,
85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,59,157,193,32,49,25,137,4,113,57,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,57,211,194,18,66,31,194,18,57,
211,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,69,17,237,
16,85,81,197,176,69,17,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,59,141,194,82,51,159,138,18,114,19,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,123,141,194,82,123,159,194,
18,122,19,128,0,0,1,128,0,0,1,128,0,85,85,16,
16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,57,
143,194,80,50,77,138,66,113,157,128,0,0,1,128,0,0,
1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,51,155,196,34,37,163,148,162,99,155,128,
0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0,
254,170,170,0,1,128,0,0,1,128,0,57,221,194,8,50,
9,138,8,113,221,128,0,0,1,128,0,0,1,128,0,85,
85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128,
0,57,221,194,8,65,137,192,72,59,157,128,0,0,1,128,
0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0,
1,128,0,0,1,128,0,14,249,144,32,12,33,130,32,28,
33,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32,
16,0,254,170,170,0,1,128,0,0,1,128,0,49,207,202,
16,73,145,200,80,51,143,128,0,0,1,128,0,0,1,128,
0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0,
1,128,0,114,33,203,96,114,161,194,32,66,33,128,0,0,
1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170,
170,0,1,128,0,0,1,128,0,51,143,202,80,123,145,202,
16,74,15,128,0,0,1,128,0,0,1,128,0,85,85,0,
0,0,8,0,14,1,10,10,8,4,0,128,128,0,128,128,
128,128,128,128,128,7,10,10,8,1,0,16,16,124,146,144,
144,146,124,16,16,7,10,10,8,1,0,28,32,32,32,248,
32,32,32,124,194,6,8,8,8,1,1,132,72,120,72,72,
120,72,132,7,10,10,8,1,0,130,68,40,16,254,16,254,
16,16,16,1,10,10,8,4,0,128,128,128,128,0,0,128,
128,128,128,6,10,10,8,1,0,120,132,128,120,132,132,120,
4,132,120,4,2,2,8,2,12,144,144,8,10,10,8,0,
0,60,66,153,165,161,161,165,153,66,60,5,7,7,8,2,
5,112,8,120,136,120,0,248,6,9,9,8,1,0,36,36,
72,72,144,72,72,36,36,6,4,4,8,1,0,252,4,4,
4,6,1,1,8,1,4,252,8,10,10,8,0,0,60,66,
185,165,165,185,169,165,66,60,6,1,1,8,1,11,252,3,
4,4,8,2,10,64,160,160,64,7,9,9,8,1,1,16,
16,16,254,16,16,16,0,254,5,7,7,8,2,5,112,136,
8,112,128,128,248,5,7,7,8,2,5,112,136,8,112,8,
136,112,3,3,3,8,3,10,32,64,128,5,8,8,8,2,
254,136,136,136,136,216,168,128,128,6,12,12,8,1,255,124,
244,244,244,244,116,20,20,20,20,20,28,2,2,2,8,3,
4,192,192,3,2,2,8,2,254,32,192,3,7,7,8,2,
5,32,96,160,32,32,32,32,5,7,7,8,2,5,112,136,
136,136,112,0,248,6,9,9,8,1,0,144,144,72,72,36,
72,72,144,144,6,10,10,8,1,0,68,196,72,80,80,36,
44,84,156,132,6,10,10,8,1,0,68,196,72,80,80,40,
52,68,136,156,6,10,10,8,1,0,196,36,72,48,208,36,
44,84,156,132,6,10,10,8,1,0,16,16,0,16,16,96,
132,132,132,120,6,14,14,8,1,0,96,24,0,0,48,72,
72,132,132,252,132,132,132,132,6,14,14,8,1,0,24,96,
0,0,48,72,72,132,132,252,132,132,132,132,6,14,14,8,
1,0,48,72,0,0,48,72,72,132,132,252,132,132,132,132,
6,14,14,8,1,0,100,152,0,0,48,72,72,132,132,252,
132,132,132,132,6,14,14,8,1,0,72,72,0,0,48,72,
72,132,132,252,132,132,132,132,6,14,14,8,1,0,48,72,
48,0,48,72,72,132,132,252,132,132,132,132,7,10,10,8,
1,0,62,80,144,144,254,144,144,144,144,158,6,12,12,8,
1,254,120,132,132,128,128,128,128,132,132,120,16,96,6,14,
14,8,1,0,96,24,0,0,252,128,128,128,248,128,128,128,
128,252,6,14,14,8,1,0,24,96,0,0,252,128,128,128,
248,128,128,128,128,252,6,14,14,8,1,0,48,72,0,0,
252,128,128,128,248,128,128,128,128,252,6,14,14,8,1,0,
72,72,0,0,252,128,128,128,248,128,128,128,128,252,5,14,
14,8,2,0,96,24,0,0,248,32,32,32,32,32,32,32,
32,248,5,14,14,8,2,0,48,192,0,0,248,32,32,32,
32,32,32,32,32,248,5,14,14,8,2,0,96,144,0,0,
248,32,32,32,32,32,32,32,32,248,5,14,14,8,2,0,
144,144,0,0,248,32,32,32,32,32,32,32,32,248,7,10,
10,8,0,0,120,68,66,66,242,66,66,66,68,120,6,14,
14,8,1,0,100,152,0,0,132,196,196,164,164,148,148,140,
140,132,6,14,14,8,1,0,96,24,0,0,120,132,132,132,
132,132,132,132,132,120,6,14,14,8,1,0,24,96,0,0,
120,132,132,132,132,132,132,132,132,120,6,14,14,8,1,0,
48,72,0,0,120,132,132,132,132,132,132,132,132,120,6,14,
14,8,1,0,100,152,0,0,120,132,132,132,132,132,132,132,
132,120,6,14,14,8,1,0,72,72,0,0,120,132,132,132,
132,132,132,132,132,120,6,5,5,8,1,2,132,72,48,72,
132,6,12,12,8,1,255,4,116,136,140,148,148,164,164,196,
68,184,128,6,14,14,8,1,0,96,24,0,0,132,132,132,
132,132,132,132,132,132,120,6,14,14,8,1,0,24,96,0,
0,132,132,132,132,132,132,132,132,132,120,6,14,14,8,1,
0,48,72,0,0,132,132,132,132,132,132,132,132,132,120,6,
14,14,8,1,0,72,72,0,0,132,132,132,132,132,132,132,
132,132,120,7,14,14,8,1,0,24,96,0,0,130,130,68,
68,40,16,16,16,16,16,6,11,11,8,1,0,128,128,240,
136,132,132,136,240,128,128,128,6,10,10,8,1,0,112,136,
136,136,248,132,132,132,196,184,6,12,12,8,1,0,96,24,
0,0,120,132,4,124,132,132,140,116,6,12,12,8,1,0,
24,96,0,0,120,132,4,124,132,132,140,116,6,12,12,8,
1,0,48,72,0,0,120,132,4,124,132,132,140,116,6,12,
12,8,1,0,100,152,0,0,120,132,4,124,132,132,140,116,
6,12,12,8,1,0,72,72,0,0,120,132,4,124,132,132,
140,116,6,13,13,8,1,0,48,72,48,0,0,120,132,4,
124,132,132,140,116,7,8,8,8,1,0,124,146,18,126,144,
144,146,124,6,10,10,8,1,254,120,132,128,128,128,128,132,
120,16,96,6,12,12,8,1,0,96,24,0,0,120,132,132,
252,128,128,132,120,6,12,12,8,1,0,24,96,0,0,120,
132,132,252,128,128,132,120,6,12,12,8,1,0,48,72,0,
0,120,132,132,252,128,128,132,120,6,12,12,8,1,0,72,
72,0,0,120,132,132,252,128,128,132,120,5,12,12,8,2,
0,192,48,0,0,96,32,32,32,32,32,32,248,5,12,12,
8,2,0,48,192,0,0,96,32,32,32,32,32,32,248,5,
12,12,8,2,0,96,144,0,0,96,32,32,32,32,32,32,
248,5,12,12,8,2,0,144,144,0,0,96,32,32,32,32,
32,32,248,6,12,12,8,1,0,100,24,40,68,4,124,132,
132,132,132,132,120,6,12,12,8,1,0,100,152,0,0,184,
196,132,132,132,132,132,132,6,12,12,8,1,0,96,24,0,
0,120,132,132,132,132,132,132,120,6,12,12,8,1,0,24,
96,0,0,120,132,132,132,132,132,132,120,6,12,12,8,1,
0,48,72,0,0,120,132,132,132,132,132,132,120,6,12,12,
8,1,0,100,152,0,0,120,132,132,132,132,132,132,120,6,
12,12,8,1,0,72,72,0,0,120,132,132,132,132,132,132,
120,6,7,7,8,1,1,48,0,0,252,0,0,48,6,10,
10,8,1,255,4,120,140,148,148,164,164,196,120,128,6,12,
12,8,1,0,96,24,0,0,132,132,132,132,132,132,140,116,
6,12,12,8,1,0,24,96,0,0,132,132,132,132,132,132,
140,116,6,12,12,8,1,0,48,72,0,0,132,132,132,132,
132,132,140,116,6,12,12,8,1,0,72,72,0,0,132,132,
132,132,132,132,140,116,6,14,14,8,1,254,24,96,0,0,
132,132,132,132,132,76,52,4,4,120,5,12,12,8,2,254,
128,128,240,136,136,136,144,160,192,128,128,128,6,14,14,8,
1,254,72,72,0,0,132,132,132,132,132,76,52,4,4,120
};
/*
Fontname: -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1
Copyright:
Capital A Height: 10, '1' Height: 10
Calculated Max Values w=16 h=16 x= 5 y=14 dx=16 dy= 0 ascent=14 len=32
Font Bounding box w=16 h=16 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent =10 descent=-2
X Font ascent =11 descent=-2
Max Font ascent =14 descent=-2
*/
#include "u8g.h"
const u8g_fntpgm_uint8_t u8g_font_unifont_0_11[3240] U8G_FONT_SECTION("u8g_font_unifont_0_11") = {
0,16,16,0,254,10,1,231,3,213,32,255,254,14,254,11,
254,0,0,0,8,0,14,1,10,10,8,4,0,128,128,128,
128,128,128,128,0,128,128,5,4,4,8,2,8,136,136,136,
136,6,10,10,8,1,0,36,36,36,252,72,72,252,144,144,
144,7,10,10,8,1,0,16,124,146,144,112,28,18,146,124,
16,7,10,10,8,1,0,98,148,148,104,16,16,44,82,82,
140,7,10,10,8,1,0,56,68,68,68,56,114,138,132,140,
114,1,4,4,8,4,8,128,128,128,128,3,12,12,8,3,
255,32,64,64,128,128,128,128,128,128,64,64,32,3,12,12,
8,2,255,128,64,64,32,32,32,32,32,32,64,64,128,7,
7,7,8,1,1,16,146,84,56,84,146,16,7,7,7,8,
1,1,16,16,16,254,16,16,16,2,4,4,8,3,254,192,
64,64,128,6,1,1,8,1,4,252,2,2,2,8,3,0,
192,192,6,10,10,8,1,0,4,4,8,16,16,32,32,64,
128,128,6,10,10,8,1,0,48,72,132,132,132,132,132,132,
72,48,5,10,10,8,2,0,32,96,160,32,32,32,32,32,
32,248,6,10,10,8,1,0,120,132,132,4,24,32,64,128,
128,252,6,10,10,8,1,0,120,132,132,4,56,4,4,132,
132,120,6,10,10,8,1,0,8,24,40,72,136,136,252,8,
8,8,6,10,10,8,1,0,252,128,128,128,248,4,4,4,
132,120,6,10,10,8,1,0,56,64,128,128,248,132,132,132,
132,120,6,10,10,8,1,0,252,4,4,8,8,8,16,16,
16,16,6,10,10,8,1,0,120,132,132,132,120,132,132,132,
132,120,6,10,10,8,1,0,120,132,132,132,124,4,4,4,
8,112,2,7,7,8,3,1,192,192,0,0,0,192,192,2,
9,9,8,3,255,192,192,0,0,0,192,64,64,128,5,9,
9,8,2,0,8,16,32,64,128,64,32,16,8,6,5,5,
8,1,2,252,0,0,0,252,5,9,9,8,1,0,128,64,
32,16,8,16,32,64,128,6,10,10,8,1,0,120,132,132,
4,8,16,16,0,16,16,6,10,10,8,1,0,56,68,148,
172,164,164,164,156,64,60,6,10,10,8,1,0,48,72,72,
132,132,252,132,132,132,132,6,10,10,8,1,0,248,132,132,
132,248,132,132,132,132,248,6,10,10,8,1,0,120,132,132,
128,128,128,128,132,132,120,6,10,10,8,1,0,240,136,132,
132,132,132,132,132,136,240,6,10,10,8,1,0,252,128,128,
128,248,128,128,128,128,252,6,10,10,8,1,0,252,128,128,
128,248,128,128,128,128,128,6,10,10,8,1,0,120,132,132,
128,128,156,132,132,140,116,6,10,10,8,1,0,132,132,132,
132,252,132,132,132,132,132,5,10,10,8,2,0,248,32,32,
32,32,32,32,32,32,248,7,10,10,8,1,0,62,8,8,
8,8,8,8,136,136,112,6,10,10,8,1,0,132,136,144,
160,192,192,160,144,136,132,6,10,10,8,1,0,128,128,128,
128,128,128,128,128,128,252,6,10,10,8,1,0,132,132,204,
204,180,180,132,132,132,132,6,10,10,8,1,0,132,196,196,
164,164,148,148,140,140,132,6,10,10,8,1,0,120,132,132,
132,132,132,132,132,132,120,6,10,10,8,1,0,248,132,132,
132,248,128,128,128,128,128,7,11,11,8,1,255,120,132,132,
132,132,132,132,180,204,120,6,6,10,10,8,1,0,248,132,
132,132,248,144,136,136,132,132,6,10,10,8,1,0,120,132,
132,128,96,24,4,132,132,120,7,10,10,8,1,0,254,16,
16,16,16,16,16,16,16,16,6,10,10,8,1,0,132,132,
132,132,132,132,132,132,132,120,7,10,10,8,1,0,130,130,
130,68,68,68,40,40,16,16,6,10,10,8,1,0,132,132,
132,132,180,180,204,204,132,132,6,10,10,8,1,0,132,132,
72,72,48,48,72,72,132,132,7,10,10,8,1,0,130,130,
68,68,40,16,16,16,16,16,6,10,10,8,1,0,252,4,
4,8,16,32,64,128,128,252,3,12,12,8,4,255,224,128,
128,128,128,128,128,128,128,128,128,224,6,10,10,8,1,0,
128,128,64,32,32,16,16,8,4,4,3,12,12,8,1,255,
224,32,32,32,32,32,32,32,32,32,32,224,6,3,3,8,
1,9,48,72,132,7,1,1,8,1,255,254,3,3,3,8,
2,10,128,64,32,6,8,8,8,1,0,120,132,4,124,132,
132,140,116,6,11,11,8,1,0,128,128,128,184,196,132,132,
132,132,196,184,6,8,8,8,1,0,120,132,128,128,128,128,
132,120,6,11,11,8,1,0,4,4,4,116,140,132,132,132,
132,140,116,6,8,8,8,1,0,120,132,132,252,128,128,132,
120,5,11,11,8,1,0,24,32,32,32,248,32,32,32,32,
32,32,6,11,11,8,1,254,4,116,136,136,136,112,64,120,
132,132,120,6,11,11,8,1,0,128,128,128,184,196,132,132,
132,132,132,132,5,11,11,8,2,0,32,32,0,96,32,32,
32,32,32,32,248,5,13,13,8,1,254,8,8,0,24,8,
8,8,8,8,8,8,144,96,6,10,10,8,1,0,128,128,
136,144,160,192,160,144,136,132,5,10,10,8,2,0,96,32,
32,32,32,32,32,32,32,248,7,8,8,8,1,0,236,146,
146,146,146,146,146,146,6,8,8,8,1,0,184,196,132,132,
132,132,132,132,6,8,8,8,1,0,120,132,132,132,132,132,
132,120,6,10,10,8,1,254,184,196,132,132,132,132,196,184,
128,128,6,10,10,8,1,254,116,140,132,132,132,132,140,116,
4,4,6,8,8,8,1,0,184,196,132,128,128,128,128,128,
6,8,8,8,1,0,120,132,128,96,24,4,132,120,5,10,
10,8,1,0,32,32,248,32,32,32,32,32,32,24,6,8,
8,8,1,0,132,132,132,132,132,132,140,116,6,8,8,8,
1,0,132,132,132,72,72,72,48,48,7,8,8,8,1,0,
130,146,146,146,146,146,146,108,6,8,8,8,1,0,132,132,
72,48,48,72,132,132,6,10,10,8,1,254,132,132,132,132,
132,76,52,4,4,120,6,8,8,8,1,0,252,4,8,16,
32,64,128,252,3,12,12,8,3,255,96,128,128,64,64,128,
128,64,64,128,128,96,1,14,14,8,4,254,128,128,128,128,
128,128,128,128,128,128,128,128,128,128,3,12,12,8,2,255,
192,32,32,64,64,32,32,64,64,32,32,192,7,3,3,8,
1,8,98,146,140,16,16,32,16,0,254,170,170,0,1,128,
0,0,1,128,0,115,209,202,16,75,209,202,16,115,223,128,
0,0,1,128,0,0,1,128,0,85,85,6,10,10,8,1,
254,184,196,132,132,132,132,132,132,128,128,6,10,10,8,1,
254,116,140,132,132,132,140,116,4,132,120,4,8,8,8,3,
0,192,64,64,64,64,64,64,112,7,12,12,8,1,254,16,
16,148,154,146,146,146,146,178,82,16,16,7,11,11,8,1,
0,28,34,32,32,248,32,32,32,32,32,32,6,8,8,8,
1,0,120,132,132,132,132,132,132,120,7,12,12,8,1,254,
112,144,144,112,28,18,18,18,146,124,16,16,7,10,10,8,
1,0,128,128,128,136,136,136,136,136,136,118,6,14,14,8,
1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84,
2,7,7,8,3,1,192,192,0,0,0,192,192,6,2,2,
8,1,1,196,120,6,14,14,8,1,255,168,84,168,84,168,
84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,168,
84,168,84,168,84,168,84,168,84,168,84,168,84,6,14,14,
8,1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,
84,6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,
84,168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,
84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,168,
84,168,84,168,84,168,84,168,84,168,84,168,84,5,4,4,
8,2,255,32,32,112,136,6,3,3,8,1,9,48,0,204,
4,6,6,8,2,8,48,192,48,192,48,192,2,3,3,8,
3,10,192,0,192,4,3,3,8,2,10,176,128,176,3,3,
3,8,3,255,128,128,96,5,5,5,8,2,9,32,112,248,
112,32,6,4,4,8,1,9,72,164,148,72,3,3,3,8,
0,9,192,32,32,2,3,3,8,5,255,64,128,64,4,4,
4,8,1,254,208,208,16,224,3,3,3,8,3,10,96,128,
128,3,3,3,8,5,9,96,128,128,5,5,5,8,3,9,
48,64,152,160,32,8,4,4,8,0,9,66,165,66,36,3,
4,4,8,5,9,64,160,64,128,4,3,3,8,0,8,80,
96,128,5,3,3,8,1,254,136,112,32,3,3,3,8,2,
255,32,32,224,2,3,3,8,3,255,64,128,64,3,3,3,
8,2,255,32,32,192,5,4,4,8,1,254,40,200,16,96,
4,5,5,8,2,254,96,128,96,16,96,3,3,3,8,2,
9,192,32,32,3,4,4,8,1,9,64,160,64,32,5,4,
4,8,2,254,136,112,32,32,2,3,3,8,2,10,64,128,
64,3,3,3,8,3,10,32,32,224,3,3,3,8,5,255,
128,128,96,5,4,4,8,0,9,72,168,168,144,4,4,4,
8,2,9,96,144,144,96,2,3,3,8,3,255,192,0,192,
5,3,3,8,2,255,168,0,72,5,3,3,8,2,255,232,
0,8,5,3,3,8,2,255,232,64,72,2,2,2,8,3,
0,192,192,6,2,2,8,1,0,204,204,6,3,3,8,1,
254,204,0,48,4,1,1,8,2,0,240,5,3,3,8,2,
254,248,32,32,2,2,2,8,2,10,192,192,2,2,2,8,
1,10,192,192,5,3,3,8,2,255,128,32,8,2,1,1,
8,3,5,192,1,3,3,8,4,255,128,128,128,6,2,2,
8,1,10,124,248,4,1,1,8,2,10,240,1,9,9,8,
4,0,128,128,128,128,128,128,128,128,128,2,2,2,8,5,
10,192,192,2,2,2,8,1,10,192,192,3,8,8,8,3,
0,64,224,64,0,0,64,224,64,2,2,2,8,3,10,192,
192,2,2,2,8,3,10,192,192,4,9,9,8,2,0,224,
128,128,128,128,128,128,128,240,5,4,4,8,2,254,248,32,
32,32,6,14,14,8,1,255,168,84,168,84,168,84,168,84,
168,84,168,84,168,84,6,14,14,8,1,255,168,84,168,84,
168,84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,
168,84,168,84,168,84,168,84,168,84,168,84,168,84,6,14,
14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84,
168,84,6,14,14,8,1,255,168,84,168,84,168,84,168,84,
168,84,168,84,168,84,6,14,14,8,1,255,168,84,168,84,
168,84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,
168,84,168,84,168,84,168,84,168,84,168,84,168,84,6,14,
14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84,
168,84,6,9,9,8,1,0,132,132,68,36,88,144,136,132,
132,7,9,9,8,1,0,248,8,8,8,8,8,8,8,254,
6,9,9,8,1,0,96,16,16,16,8,24,40,68,132,6,
9,9,8,1,0,252,8,8,8,8,8,8,8,8,6,9,
9,8,1,0,252,4,4,68,68,68,68,68,68,3,9,9,
8,2,0,224,32,32,32,32,32,32,32,32,5,9,9,8,
2,0,192,48,40,32,32,32,32,32,32,6,9,9,8,1,
0,252,68,68,68,68,68,68,68,68,6,9,9,8,1,0,
140,148,132,132,132,132,132,132,252,3,4,4,8,2,5,224,
32,32,32,6,11,11,8,1,254,252,4,4,4,4,4,4,
4,4,4,4,6,9,9,8,1,0,252,4,4,4,4,4,
4,4,248,5,11,11,8,2,0,128,128,248,8,8,8,8,
16,16,32,192,7,9,9,8,0,0,254,34,34,34,34,34,
34,34,62,7,9,9,8,1,0,156,98,66,130,130,130,130,
130,142,3,11,11,8,2,254,224,32,32,32,32,32,32,32,
32,32,32,4,9,9,8,2,0,112,16,16,16,16,16,16,
16,240,6,9,9,8,1,0,252,132,132,132,132,132,132,136,
240,7,9,9,8,0,0,18,18,18,18,18,18,18,18,254,
6,11,11,8,1,254,252,132,132,132,228,4,4,4,4,4,
4,6,9,9,8,1,0,252,132,132,132,228,4,4,4,252,
5,11,11,8,2,254,136,136,144,160,192,128,128,128,128,128,
128,6,9,9,8,1,0,132,132,72,48,16,8,4,4,252,
6,11,11,8,1,254,252,68,68,72,72,80,64,64,64,64,
64,6,9,9,8,1,0,252,4,4,4,4,4,4,4,4,
7,9,9,8,1,0,146,146,146,146,146,146,146,146,254,6,
9,9,8,1,0,124,68,68,68,68,68,68,68,196,6,14,
14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84,
168,84,6,14,14,8,1,255,168,84,168,84,168,84,168,84,
168,84,168,84,168,84,6,14,14,8,1,255,168,84,168,84,
168,84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,
168,84,168,84,168,84,168,84,168,84,168,84,168,84,6,14,
14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84,
168,84,7,9,9,8,1,0,238,34,34,34,34,34,34,34,
34,7,9,9,8,1,0,238,34,34,34,2,2,2,2,2,
7,4,4,8,1,5,238,34,34,34,3,3,3,8,4,9,
32,64,128,6,3,3,8,1,9,36,72,144,6,14,14,8,
1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84,
6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,84,
168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,84,
168,84,168,84,168,84,168,84,6,14,14,8,1,255,168,84,
168,84,168,84,168,84,168,84,168,84,168,84,6,14,14,8,
1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84,
6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,84,
168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,84,
168,84,168,84,168,84,168,84,6,14,14,8,1,255,168,84,
168,84,168,84,168,84,168,84,168,84,168,84,6,14,14,8,
1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84,
6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,84,
168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,84,
168,84,168,84,168,84,168,84};
/* /*
Fontname: -gnu-Unifont-Medium-R-Normal-Sans-16-160-75-75-c-80-iso10646-1 Fontname: -gnu-Unifont-Medium-R-Normal-Sans-16-160-75-75-c-80-iso10646-1
Copyright: Copyright (C) 2014 Roman Czyborra, Paul Hardy, Qianqian Fang, Andrew Miller, et al. Licensed under the GNU General Public License; either version 2, or (at your option) a later version, with the GNU Font Embedding Exception. Copyright: Copyright (C) 2014 Roman Czyborra, Paul Hardy, Qianqian Fang, Andrew Miller, et al. Licensed under the GNU General Public License; either version 2, or (at your option) a later version, with the GNU Font Embedding Exception.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment