mirror of
https://github.com/opentx/opentx.git
synced 2025-07-26 17:55:19 +03:00
[X9D] Full use of the 16 grayscales.
[X9D] BMP 4bits support [X9D] Debug driver
This commit is contained in:
parent
2e747a1663
commit
e41aa9fbd6
28 changed files with 325 additions and 182 deletions
11
src/Makefile
11
src/Makefile
|
@ -496,7 +496,7 @@ ifeq ($(PCB), X9D)
|
||||||
EEPROMSRC = eeprom_avr.cpp # TODO later eeprom_conversions.cpp
|
EEPROMSRC = eeprom_avr.cpp # TODO later eeprom_conversions.cpp
|
||||||
PULSESSRC = pulses_arm.cpp
|
PULSESSRC = pulses_arm.cpp
|
||||||
CPPSRC += sky9x/audio.cpp
|
CPPSRC += sky9x/audio.cpp
|
||||||
CPPSRC += x9d/pwr_driver.cpp x9d/eeprom_driver.cpp x9d/pulses_driver.cpp x9d/keys_driver.cpp x9d/adc_driver.cpp x9d/trainer_driver.cpp x9d/audio_driver.cpp x9d/delays.cpp x9d/uart.cpp
|
CPPSRC += x9d/pwr_driver.cpp x9d/eeprom_driver.cpp x9d/pulses_driver.cpp x9d/keys_driver.cpp x9d/adc_driver.cpp x9d/trainer_driver.cpp x9d/audio_driver.cpp x9d/delays.cpp
|
||||||
CPPSRC += bmp.cpp monitors_views.cpp
|
CPPSRC += bmp.cpp monitors_views.cpp
|
||||||
SRC += x9d/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c
|
SRC += x9d/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c
|
||||||
SRC += x9d/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c
|
SRC += x9d/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c
|
||||||
|
@ -517,6 +517,12 @@ ifeq ($(PCB), X9D)
|
||||||
CPPDEFS += -DRTCLOCK
|
CPPDEFS += -DRTCLOCK
|
||||||
CPPSRC += rtc.cpp x9d/rtc_driver.cpp
|
CPPSRC += rtc.cpp x9d/rtc_driver.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(DEBUG), YES)
|
||||||
|
CPPSRC += debug.cpp
|
||||||
|
CPPSRC += x9d/debug_driver.cpp
|
||||||
|
SRC += sky9x/syscalls.c
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(PCB), SKY9X)
|
ifeq ($(PCB), SKY9X)
|
||||||
|
@ -554,7 +560,8 @@ ifeq ($(PCB), SKY9X)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(DEBUG), YES)
|
ifeq ($(DEBUG), YES)
|
||||||
CPPSRC += sky9x/debug.cpp
|
CPPSRC += debug.cpp
|
||||||
|
CPPSRC += sky9x/debug_driver.cpp
|
||||||
SRC += sky9x/syscalls.c
|
SRC += sky9x/syscalls.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
120
src/bmp.cpp
120
src/bmp.cpp
|
@ -34,13 +34,16 @@
|
||||||
|
|
||||||
#include "open9x.h"
|
#include "open9x.h"
|
||||||
|
|
||||||
const pm_char * bmpLoad(uint8_t *dest, const char *filename)
|
const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t width, const uint8_t height)
|
||||||
{
|
{
|
||||||
FIL bmpFile;
|
FIL bmpFile;
|
||||||
UINT read;
|
UINT read;
|
||||||
uint8_t bmpBuf[64]; /* maximum with 64px for 1-bit bitmaps */
|
uint8_t palette[16];
|
||||||
|
uint8_t bmpBuf[64]; /* maximum with 64px */
|
||||||
uint8_t *buf = &bmpBuf[0];
|
uint8_t *buf = &bmpBuf[0];
|
||||||
|
|
||||||
|
assert(width <= 64);
|
||||||
|
|
||||||
FRESULT result = f_open(&bmpFile, filename, FA_OPEN_EXISTING | FA_READ);
|
FRESULT result = f_open(&bmpFile, filename, FA_OPEN_EXISTING | FA_READ);
|
||||||
if (result != FR_OK) {
|
if (result != FR_OK) {
|
||||||
return SDCARD_ERROR(result);
|
return SDCARD_ERROR(result);
|
||||||
|
@ -90,7 +93,7 @@ const pm_char * bmpLoad(uint8_t *dest, const char *filename)
|
||||||
return STR_INCOMPATIBLE;
|
return STR_INCOMPATIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t width, height;
|
uint32_t w, h;
|
||||||
|
|
||||||
switch (ihsize){
|
switch (ihsize){
|
||||||
case 40: // windib
|
case 40: // windib
|
||||||
|
@ -98,13 +101,13 @@ const pm_char * bmpLoad(uint8_t *dest, const char *filename)
|
||||||
case 64: // OS/2 v2
|
case 64: // OS/2 v2
|
||||||
case 108: // windib v4
|
case 108: // windib v4
|
||||||
case 124: // windib v5
|
case 124: // windib v5
|
||||||
width = *((uint32_t *)&buf[4]);
|
w = *((uint32_t *)&buf[4]);
|
||||||
height = *((uint32_t *)&buf[8]);
|
h = *((uint32_t *)&buf[8]);
|
||||||
buf += 12;
|
buf += 12;
|
||||||
break;
|
break;
|
||||||
case 12: // OS/2 v1
|
case 12: // OS/2 v1
|
||||||
width = *((uint16_t *)&buf[4]);
|
w = *((uint16_t *)&buf[4]);
|
||||||
height = *((uint16_t *)&buf[6]);
|
h = *((uint16_t *)&buf[6]);
|
||||||
buf += 8;
|
buf += 8;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -117,59 +120,86 @@ const pm_char * bmpLoad(uint8_t *dest, const char *filename)
|
||||||
return STR_INCOMPATIBLE;
|
return STR_INCOMPATIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (width > MODEL_BITMAP_WIDTH || height > MODEL_BITMAP_HEIGHT) {
|
if (w > width || h > height) {
|
||||||
f_close(&bmpFile);
|
f_close(&bmpFile);
|
||||||
return STR_INCOMPATIBLE;
|
return STR_INCOMPATIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t depth = *((uint16_t *)&buf[2]);
|
uint16_t depth = *((uint16_t *)&buf[2]);
|
||||||
|
|
||||||
if (f_lseek(&bmpFile, hsize) != FR_OK) {
|
buf = &bmpBuf[0];
|
||||||
f_close(&bmpFile);
|
|
||||||
return SDCARD_ERROR(result);
|
if (depth == 4) {
|
||||||
|
if (f_lseek(&bmpFile, hsize-64) != FR_OK || f_read(&bmpFile, buf, 64, &read) != FR_OK || read != 64) {
|
||||||
|
f_close(&bmpFile);
|
||||||
|
return SDCARD_ERROR(result);
|
||||||
|
}
|
||||||
|
for (uint8_t i=0; i<16; i++) {
|
||||||
|
palette[i] = buf[4*i] >> 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (f_lseek(&bmpFile, hsize) != FR_OK) {
|
||||||
|
f_close(&bmpFile);
|
||||||
|
return SDCARD_ERROR(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*dest++ = width;
|
*dest++ = w;
|
||||||
*dest++ = height;
|
*dest++ = h;
|
||||||
|
|
||||||
|
memset(dest, 0, w*(h/8)*4);
|
||||||
|
|
||||||
uint32_t n;
|
uint32_t n;
|
||||||
buf = &bmpBuf[0];
|
|
||||||
|
|
||||||
switch (depth) {
|
switch (depth) {
|
||||||
case 1:
|
case 1:
|
||||||
n = width/8;
|
n = w/8;
|
||||||
for (uint32_t i=0; i<height; i+=8) {
|
for (uint32_t i=0; i<h; i+=8) {
|
||||||
result = f_read(&bmpFile, buf, n*8, &read);
|
result = f_read(&bmpFile, buf, n*8, &read);
|
||||||
if (result != FR_OK || read != n*8) {
|
if (result != FR_OK || read != n*8) {
|
||||||
f_close(&bmpFile);
|
f_close(&bmpFile);
|
||||||
return SDCARD_ERROR(result);
|
return SDCARD_ERROR(result);
|
||||||
}
|
}
|
||||||
uint8_t * dst = dest + ((height-i-8)/8 * width);
|
uint8_t * dst = dest + 4*((h-i-8)/8 * w);
|
||||||
for (uint32_t j=0; j<n; j++) {
|
for (uint32_t j=0; j<n; j++) {
|
||||||
*dst++ = ~(((buf[j+0*n] >> 7) << 7) + ((buf[j+1*n] >> 7) << 6) + ((buf[j+2*n] >> 7) << 5) + ((buf[j+3*n] >> 7) << 4) + ((buf[j+4*n] >> 7) << 3) + ((buf[j+5*n] >> 7) << 2) + ((buf[j+6*n] >> 7) << 1) + ((buf[j+7*n] >> 7) << 0));
|
#define PUSH_4BYTES(x) *dst = *(dst+1) = *(dst+2) = *(dst+3) = (x); dst += 4
|
||||||
*dst++ = ~((((buf[j+0*n] >> 6) & 1) << 7) + (((buf[j+1*n] >> 6) & 1) << 6) + (((buf[j+2*n] >> 6) & 1) << 5) + (((buf[j+3*n] >> 6) & 1) << 4) + (((buf[j+4*n] >> 6) & 1) << 3) + (((buf[j+5*n] >> 6) & 1) << 2) + (((buf[j+6*n] >> 6) & 1) << 1) + (((buf[j+7*n] >> 6) & 1) << 0));
|
PUSH_4BYTES(~(((buf[j+0*n] >> 7) << 7) + ((buf[j+1*n] >> 7) << 6) + ((buf[j+2*n] >> 7) << 5) + ((buf[j+3*n] >> 7) << 4) + ((buf[j+4*n] >> 7) << 3) + ((buf[j+5*n] >> 7) << 2) + ((buf[j+6*n] >> 7) << 1) + ((buf[j+7*n] >> 7) << 0)));
|
||||||
*dst++ = ~((((buf[j+0*n] >> 5) & 1) << 7) + (((buf[j+1*n] >> 5) & 1) << 6) + (((buf[j+2*n] >> 5) & 1) << 5) + (((buf[j+3*n] >> 5) & 1) << 4) + (((buf[j+4*n] >> 5) & 1) << 3) + (((buf[j+5*n] >> 5) & 1) << 2) + (((buf[j+6*n] >> 5) & 1) << 1) + (((buf[j+7*n] >> 5) & 1) << 0));
|
PUSH_4BYTES(~((((buf[j+0*n] >> 6) & 1) << 7) + (((buf[j+1*n] >> 6) & 1) << 6) + (((buf[j+2*n] >> 6) & 1) << 5) + (((buf[j+3*n] >> 6) & 1) << 4) + (((buf[j+4*n] >> 6) & 1) << 3) + (((buf[j+5*n] >> 6) & 1) << 2) + (((buf[j+6*n] >> 6) & 1) << 1) + (((buf[j+7*n] >> 6) & 1) << 0)));
|
||||||
*dst++ = ~((((buf[j+0*n] >> 4) & 1) << 7) + (((buf[j+1*n] >> 4) & 1) << 6) + (((buf[j+2*n] >> 4) & 1) << 5) + (((buf[j+3*n] >> 4) & 1) << 4) + (((buf[j+4*n] >> 4) & 1) << 3) + (((buf[j+5*n] >> 4) & 1) << 2) + (((buf[j+6*n] >> 4) & 1) << 1) + (((buf[j+7*n] >> 4) & 1) << 0));
|
PUSH_4BYTES(~((((buf[j+0*n] >> 5) & 1) << 7) + (((buf[j+1*n] >> 5) & 1) << 6) + (((buf[j+2*n] >> 5) & 1) << 5) + (((buf[j+3*n] >> 5) & 1) << 4) + (((buf[j+4*n] >> 5) & 1) << 3) + (((buf[j+5*n] >> 5) & 1) << 2) + (((buf[j+6*n] >> 5) & 1) << 1) + (((buf[j+7*n] >> 5) & 1) << 0)));
|
||||||
*dst++ = ~((((buf[j+0*n] >> 3) & 1) << 7) + (((buf[j+1*n] >> 3) & 1) << 6) + (((buf[j+2*n] >> 3) & 1) << 5) + (((buf[j+3*n] >> 3) & 1) << 4) + (((buf[j+4*n] >> 3) & 1) << 3) + (((buf[j+5*n] >> 3) & 1) << 2) + (((buf[j+6*n] >> 3) & 1) << 1) + (((buf[j+7*n] >> 3) & 1) << 0));
|
PUSH_4BYTES(~((((buf[j+0*n] >> 4) & 1) << 7) + (((buf[j+1*n] >> 4) & 1) << 6) + (((buf[j+2*n] >> 4) & 1) << 5) + (((buf[j+3*n] >> 4) & 1) << 4) + (((buf[j+4*n] >> 4) & 1) << 3) + (((buf[j+5*n] >> 4) & 1) << 2) + (((buf[j+6*n] >> 4) & 1) << 1) + (((buf[j+7*n] >> 4) & 1) << 0)));
|
||||||
*dst++ = ~((((buf[j+0*n] >> 2) & 1) << 7) + (((buf[j+1*n] >> 2) & 1) << 6) + (((buf[j+2*n] >> 2) & 1) << 5) + (((buf[j+3*n] >> 2) & 1) << 4) + (((buf[j+4*n] >> 2) & 1) << 3) + (((buf[j+5*n] >> 2) & 1) << 2) + (((buf[j+6*n] >> 2) & 1) << 1) + (((buf[j+7*n] >> 2) & 1) << 0));
|
PUSH_4BYTES(~((((buf[j+0*n] >> 3) & 1) << 7) + (((buf[j+1*n] >> 3) & 1) << 6) + (((buf[j+2*n] >> 3) & 1) << 5) + (((buf[j+3*n] >> 3) & 1) << 4) + (((buf[j+4*n] >> 3) & 1) << 3) + (((buf[j+5*n] >> 3) & 1) << 2) + (((buf[j+6*n] >> 3) & 1) << 1) + (((buf[j+7*n] >> 3) & 1) << 0)));
|
||||||
*dst++ = ~((((buf[j+0*n] >> 1) & 1) << 7) + (((buf[j+1*n] >> 1) & 1) << 6) + (((buf[j+2*n] >> 1) & 1) << 5) + (((buf[j+3*n] >> 1) & 1) << 4) + (((buf[j+4*n] >> 1) & 1) << 3) + (((buf[j+5*n] >> 1) & 1) << 2) + (((buf[j+6*n] >> 1) & 1) << 1) + (((buf[j+7*n] >> 1) & 1) << 0));
|
PUSH_4BYTES(~((((buf[j+0*n] >> 2) & 1) << 7) + (((buf[j+1*n] >> 2) & 1) << 6) + (((buf[j+2*n] >> 2) & 1) << 5) + (((buf[j+3*n] >> 2) & 1) << 4) + (((buf[j+4*n] >> 2) & 1) << 3) + (((buf[j+5*n] >> 2) & 1) << 2) + (((buf[j+6*n] >> 2) & 1) << 1) + (((buf[j+7*n] >> 2) & 1) << 0)));
|
||||||
*dst++ = ~((((buf[j+0*n] >> 0) & 1) << 7) + (((buf[j+1*n] >> 0) & 1) << 6) + (((buf[j+2*n] >> 0) & 1) << 5) + (((buf[j+3*n] >> 0) & 1) << 4) + (((buf[j+4*n] >> 0) & 1) << 3) + (((buf[j+5*n] >> 0) & 1) << 2) + (((buf[j+6*n] >> 0) & 1) << 1) + (((buf[j+7*n] >> 0) & 1) << 0));
|
PUSH_4BYTES(~((((buf[j+0*n] >> 1) & 1) << 7) + (((buf[j+1*n] >> 1) & 1) << 6) + (((buf[j+2*n] >> 1) & 1) << 5) + (((buf[j+3*n] >> 1) & 1) << 4) + (((buf[j+4*n] >> 1) & 1) << 3) + (((buf[j+5*n] >> 1) & 1) << 2) + (((buf[j+6*n] >> 1) & 1) << 1) + (((buf[j+7*n] >> 1) & 1) << 0)));
|
||||||
|
PUSH_4BYTES(~((((buf[j+0*n] >> 0) & 1) << 7) + (((buf[j+1*n] >> 0) & 1) << 6) + (((buf[j+2*n] >> 0) & 1) << 5) + (((buf[j+3*n] >> 0) & 1) << 4) + (((buf[j+4*n] >> 0) & 1) << 3) + (((buf[j+5*n] >> 0) & 1) << 2) + (((buf[j+6*n] >> 0) & 1) << 1) + (((buf[j+7*n] >> 0) & 1) << 0)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* case 4:
|
case 4:
|
||||||
for (uint32_t i=0; i<height; i++) {
|
n = w/8;
|
||||||
int j;
|
for (int32_t i=h-1; i>=0; i--) {
|
||||||
for (j = 0; j < n; j++){
|
result = f_read(&bmpFile, buf, w/2, &read);
|
||||||
ptr[j*2+0] = (buf[j] >> 4) & 0xF;
|
if (result != FR_OK || read != w/2) {
|
||||||
ptr[j*2+1] = buf[j] & 0xF;
|
f_close(&bmpFile);
|
||||||
|
return SDCARD_ERROR(result);
|
||||||
|
}
|
||||||
|
uint8_t mask = 1 << (i%8);
|
||||||
|
for (uint32_t j=0; j<w/2; j++) {
|
||||||
|
uint8_t * dst = dest + (i/8)*w*4 + j*8;
|
||||||
|
uint8_t val = palette[(buf[j] >> 4) & 0x0F];
|
||||||
|
*(dst+0) = ((*(dst+0)) & (~mask)) + ((val & 0x1) ? 0 : mask);
|
||||||
|
*(dst+1) = ((*(dst+1)) & (~mask)) + ((val & 0x2) ? 0 : mask);
|
||||||
|
*(dst+2) = ((*(dst+2)) & (~mask)) + ((val & 0x4) ? 0 : mask);
|
||||||
|
*(dst+3) = ((*(dst+3)) & (~mask)) + ((val & 0x8) ? 0 : mask);
|
||||||
|
val = palette[buf[j] & 0x0F];
|
||||||
|
*(dst+4) = ((*(dst+4)) & (~mask)) + ((val & 0x1) ? 0 : mask);
|
||||||
|
*(dst+5) = ((*(dst+5)) & (~mask)) + ((val & 0x2) ? 0 : mask);
|
||||||
|
*(dst+6) = ((*(dst+6)) & (~mask)) + ((val & 0x4) ? 0 : mask);
|
||||||
|
*(dst+7) = ((*(dst+7)) & (~mask)) + ((val & 0x8) ? 0 : mask);
|
||||||
}
|
}
|
||||||
buf += n;
|
|
||||||
ptr += linesize;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
*/
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
f_close(&bmpFile);
|
f_close(&bmpFile);
|
||||||
|
@ -179,3 +209,25 @@ const pm_char * bmpLoad(uint8_t *dest, const char *filename)
|
||||||
f_close(&bmpFile);
|
f_close(&bmpFile);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcd_bmp(xcoord_t x, uint8_t y, const pm_uchar * img)
|
||||||
|
{
|
||||||
|
const pm_uchar *q = img;
|
||||||
|
#if LCD >= 260
|
||||||
|
xcoord_t w = pgm_read_byte(q++);
|
||||||
|
if (w == 255) w += pgm_read_byte(q++);
|
||||||
|
#else
|
||||||
|
uint8_t w = pgm_read_byte(q++);
|
||||||
|
#endif
|
||||||
|
uint8_t hb = (pgm_read_byte(q++)+7)/8;
|
||||||
|
for (uint8_t yb = 0; yb < hb; yb++) {
|
||||||
|
uint8_t *p = &displayBuf[ (y / 8 + yb) * DISPLAY_W + x ];
|
||||||
|
for (xcoord_t i=0; i<w; i++){
|
||||||
|
*(p+0*DISPLAY_PLAN_SIZE) = pgm_read_byte(q++);
|
||||||
|
*(p+1*DISPLAY_PLAN_SIZE) = pgm_read_byte(q++);
|
||||||
|
*(p+2*DISPLAY_PLAN_SIZE) = pgm_read_byte(q++);
|
||||||
|
*(p+3*DISPLAY_PLAN_SIZE) = pgm_read_byte(q++);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
85
src/debug.cpp
Normal file
85
src/debug.cpp
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Authors (alphabetical order)
|
||||||
|
* - Andre Bernet <bernet.andre@gmail.com>
|
||||||
|
* - Bertrand Songis <bsongis@gmail.com>
|
||||||
|
* - Bryan J. Rentoul (Gruvin) <gruvin@gmail.com>
|
||||||
|
* - Cameron Weeks <th9xer@gmail.com>
|
||||||
|
* - Erez Raviv
|
||||||
|
* - Jean-Pierre Parisy
|
||||||
|
* - Karl Szmutny <shadow@privy.de>
|
||||||
|
* - Michael Blandford
|
||||||
|
* - Michal Hlavinka
|
||||||
|
* - Pat Mackenzie
|
||||||
|
* - Philip Moss
|
||||||
|
* - Rob Thomson
|
||||||
|
* - Romolo Manfredini <romolo.manfredini@gmail.com>
|
||||||
|
* - Thomas Husterer
|
||||||
|
*
|
||||||
|
* open9x is based on code named
|
||||||
|
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
|
||||||
|
* er9x by Erez Raviv: http://code.google.com/p/er9x/,
|
||||||
|
* and the original (and ongoing) project by
|
||||||
|
* Thomas Husterer, th9x: http://code.google.com/p/th9x/
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../open9x.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "fifo.h"
|
||||||
|
|
||||||
|
#if !defined(SIMU)
|
||||||
|
|
||||||
|
Fifo32 debugFifo;
|
||||||
|
|
||||||
|
// Outputs a string to the UART
|
||||||
|
void debugPuts(const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list arglist;
|
||||||
|
char tmp[256];
|
||||||
|
|
||||||
|
va_start(arglist, format);
|
||||||
|
vsnprintf(tmp, 256, format, arglist);
|
||||||
|
va_end(arglist);
|
||||||
|
|
||||||
|
const char *t = tmp;
|
||||||
|
while (*t) {
|
||||||
|
debugPutc(*t++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump(unsigned char *data, unsigned int size)
|
||||||
|
{
|
||||||
|
debugPuts("DUMP %d bytes ...\n\r", size);
|
||||||
|
unsigned int i = 0, j=0;
|
||||||
|
while (i*32+j < size) {
|
||||||
|
debugPuts("%.2X ", data[i*32+j]);
|
||||||
|
j++;
|
||||||
|
if (j==32) {
|
||||||
|
i++; j=0;
|
||||||
|
debugPuts("\n\r");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debugPuts("\n\r");
|
||||||
|
}
|
||||||
|
|
||||||
|
void debugTask(void* pdata)
|
||||||
|
{
|
||||||
|
uint8_t rxchar ;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
while (!debugFifo.pop(rxchar))
|
||||||
|
CoTickDelay(5); // 10ms
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -60,9 +60,6 @@ void dump(unsigned char *data, unsigned int size);
|
||||||
#define TRACE_ERROR(...) debugPuts("-E- " __VA_ARGS__)
|
#define TRACE_ERROR(...) debugPuts("-E- " __VA_ARGS__)
|
||||||
#define DUMP(data, size) dump(data, size)
|
#define DUMP(data, size) dump(data, size)
|
||||||
|
|
||||||
void DEBUG_UART_Configure( uint32_t baudrate, uint32_t masterClock);
|
|
||||||
void DEBUG_UART_Stop();
|
|
||||||
|
|
||||||
void debugTask(void* pdata);
|
void debugTask(void* pdata);
|
||||||
|
|
||||||
#else
|
#else
|
|
@ -37,9 +37,9 @@
|
||||||
#include "inttypes.h"
|
#include "inttypes.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
volatile uint32_t Spi_complete; // TODO in the driver ?
|
volatile uint32_t Spi_complete; // TODO in the driver ?
|
||||||
uint8_t s_eeDirtyMsk;
|
uint8_t s_eeDirtyMsk;
|
||||||
uint16_t s_eeDirtyTime10ms;
|
tmr10ms_t s_eeDirtyTime10ms;
|
||||||
|
|
||||||
// Logic for storing to EEPROM/loading from EEPROM
|
// Logic for storing to EEPROM/loading from EEPROM
|
||||||
// If main needs to wait for the eeprom, call mainsequence without actioning menus
|
// If main needs to wait for the eeprom, call mainsequence without actioning menus
|
||||||
|
|
|
@ -20,14 +20,16 @@
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifdef REV0
|
#if defined(SIMU)
|
||||||
#define WRITE_DELAY_10MS 100
|
#define WRITE_DELAY_10MS 200
|
||||||
|
#elif defined(PCBSKY9X) && defined(REV0)
|
||||||
|
#define WRITE_DELAY_10MS 200
|
||||||
#else
|
#else
|
||||||
#define WRITE_DELAY_10MS 500
|
#define WRITE_DELAY_10MS 500
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint8_t s_eeDirtyMsk;
|
extern uint8_t s_eeDirtyMsk;
|
||||||
extern uint16_t s_eeDirtyTime10ms;
|
extern tmr10ms_t s_eeDirtyTime10ms;
|
||||||
|
|
||||||
// States in Eeprom32_process_state
|
// States in Eeprom32_process_state
|
||||||
#define E32_IDLE 1
|
#define E32_IDLE 1
|
||||||
|
|
|
@ -37,9 +37,9 @@
|
||||||
#include "inttypes.h"
|
#include "inttypes.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
uint8_t s_write_err = 0; // error reasons
|
uint8_t s_write_err = 0; // error reasons
|
||||||
uint8_t s_eeDirtyMsk;
|
uint8_t s_eeDirtyMsk;
|
||||||
uint16_t s_eeDirtyTime10ms;
|
tmr10ms_t s_eeDirtyTime10ms;
|
||||||
|
|
||||||
RlcFile theFile; //used for any file operation
|
RlcFile theFile; //used for any file operation
|
||||||
EeFs eeFs;
|
EeFs eeFs;
|
||||||
|
|
|
@ -37,14 +37,18 @@
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#if defined(PCBGRUVIN9X) && !defined(REV0)
|
#if defined(SIMU)
|
||||||
|
#define WRITE_DELAY_10MS 200
|
||||||
|
#elif defined(PCBX9D)
|
||||||
|
#define WRITE_DELAY_10MS 1000
|
||||||
|
#elif defined(PCBGRUVIN9X) && !defined(REV0)
|
||||||
#define WRITE_DELAY_10MS 500
|
#define WRITE_DELAY_10MS 500
|
||||||
#else
|
#else
|
||||||
#define WRITE_DELAY_10MS 200
|
#define WRITE_DELAY_10MS 200
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint8_t s_eeDirtyMsk;
|
extern uint8_t s_eeDirtyMsk;
|
||||||
extern uint16_t s_eeDirtyTime10ms;
|
extern tmr10ms_t s_eeDirtyTime10ms;
|
||||||
|
|
||||||
#if defined(CPUARM)
|
#if defined(CPUARM)
|
||||||
#define blkid_t uint16_t
|
#define blkid_t uint16_t
|
||||||
|
|
43
src/lcd.cpp
43
src/lcd.cpp
|
@ -62,10 +62,14 @@ void lcd_img(xcoord_t x, uint8_t y, const pm_uchar * img, uint8_t idx, LcdFlags
|
||||||
ASSERT_IN_DISPLAY(p);
|
ASSERT_IN_DISPLAY(p);
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
uint8_t val = inv ? ~b : b;
|
uint8_t val = inv ? ~b : b;
|
||||||
if (!(att & GREY1))
|
if (!(att & GREY(1)))
|
||||||
*p = val;
|
*p = val;
|
||||||
if (!(att & GREY2))
|
if (!(att & GREY(2)))
|
||||||
*(p+DISPLAY_PLAN_SIZE) = val;
|
*(p+DISPLAY_PLAN_SIZE) = val;
|
||||||
|
if (!(att & GREY(4)))
|
||||||
|
*(p+2*DISPLAY_PLAN_SIZE) = val;
|
||||||
|
if (!(att & GREY(8)))
|
||||||
|
*(p+3*DISPLAY_PLAN_SIZE) = val;
|
||||||
p++;
|
p++;
|
||||||
#else
|
#else
|
||||||
*p++ = inv ? ~b : b;
|
*p++ = inv ? ~b : b;
|
||||||
|
@ -79,10 +83,14 @@ uint8_t lcdLastPos;
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
#define LCD_BYTE_FILTER(p, keep, add) \
|
#define LCD_BYTE_FILTER(p, keep, add) \
|
||||||
do { \
|
do { \
|
||||||
if (!(flags & GREY1)) \
|
if (!(flags & GREY(1))) \
|
||||||
*(p) = ((*(p)) & (keep)) | (add); \
|
*(p) = ((*(p)) & (keep)) | (add); \
|
||||||
if (!(flags & GREY2)) \
|
if (!(flags & GREY(2))) \
|
||||||
*(p+DISPLAY_PLAN_SIZE) = ((*(p+DISPLAY_PLAN_SIZE)) & (keep)) | (add); \
|
*(p+DISPLAY_PLAN_SIZE) = ((*(p+DISPLAY_PLAN_SIZE)) & (keep)) | (add); \
|
||||||
|
if (!(flags & GREY(4))) \
|
||||||
|
*(p+2*DISPLAY_PLAN_SIZE) = ((*(p+2*DISPLAY_PLAN_SIZE)) & (keep)) | (add); \
|
||||||
|
if (!(flags & GREY(8))) \
|
||||||
|
*(p+3*DISPLAY_PLAN_SIZE) = ((*(p+3*DISPLAY_PLAN_SIZE)) & (keep)) | (add); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define LCD_BYTE_FILTER(p, keep, add) *(p) = (*(p) & (keep)) | (add)
|
#define LCD_BYTE_FILTER(p, keep, add) *(p) = (*(p) & (keep)) | (add)
|
||||||
|
@ -463,7 +471,7 @@ void lcd_mask(uint8_t *p, uint8_t mask, LcdFlags att)
|
||||||
{
|
{
|
||||||
ASSERT_IN_DISPLAY(p);
|
ASSERT_IN_DISPLAY(p);
|
||||||
|
|
||||||
if (!(att & GREY1)) {
|
if (!(att & GREY(1))) {
|
||||||
if (att & FORCE)
|
if (att & FORCE)
|
||||||
*p |= mask;
|
*p |= mask;
|
||||||
else if (att & ERASE)
|
else if (att & ERASE)
|
||||||
|
@ -472,9 +480,28 @@ void lcd_mask(uint8_t *p, uint8_t mask, LcdFlags att)
|
||||||
*p ^= mask;
|
*p ^= mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(att & GREY2)) {
|
p += DISPLAY_PLAN_SIZE;
|
||||||
p += DISPLAY_PLAN_SIZE;
|
if (!(att & GREY(2))) {
|
||||||
|
if (att & FORCE)
|
||||||
|
*p |= mask;
|
||||||
|
else if (att & ERASE)
|
||||||
|
*p &= ~mask;
|
||||||
|
else
|
||||||
|
*p ^= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
p += DISPLAY_PLAN_SIZE;
|
||||||
|
if (!(att & GREY(4))) {
|
||||||
|
if (att & FORCE)
|
||||||
|
*p |= mask;
|
||||||
|
else if (att & ERASE)
|
||||||
|
*p &= ~mask;
|
||||||
|
else
|
||||||
|
*p ^= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
p += DISPLAY_PLAN_SIZE;
|
||||||
|
if (!(att & GREY(8))) {
|
||||||
if (att & FORCE)
|
if (att & FORCE)
|
||||||
*p |= mask;
|
*p |= mask;
|
||||||
else if (att & ERASE)
|
else if (att & ERASE)
|
||||||
|
@ -625,6 +652,8 @@ void lcd_invert_line(int8_t y)
|
||||||
for (xcoord_t x=0; x<DISPLAY_W; x++) {
|
for (xcoord_t x=0; x<DISPLAY_W; x++) {
|
||||||
ASSERT_IN_DISPLAY(p);
|
ASSERT_IN_DISPLAY(p);
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
|
*(p+3*DISPLAY_PLAN_SIZE) ^= 0xff;
|
||||||
|
*(p+2*DISPLAY_PLAN_SIZE) ^= 0xff;
|
||||||
*(p+DISPLAY_PLAN_SIZE) ^= 0xff;
|
*(p+DISPLAY_PLAN_SIZE) ^= 0xff;
|
||||||
#endif
|
#endif
|
||||||
*p++ ^= 0xff;
|
*p++ ^= 0xff;
|
||||||
|
|
|
@ -104,8 +104,8 @@
|
||||||
#define MIDSIZE 0x0100
|
#define MIDSIZE 0x0100
|
||||||
#define SMLSIZE 0x0200
|
#define SMLSIZE 0x0200
|
||||||
#define TINSIZE 0x0400
|
#define TINSIZE 0x0400
|
||||||
#define GREY1 0x1000
|
#define GREY(x) ((x)*0x1000)
|
||||||
#define GREY2 0x2000
|
#define GREY_MASK(x) ((x) & 0xF000)
|
||||||
#else
|
#else
|
||||||
#define MIDSIZE DBLSIZE
|
#define MIDSIZE DBLSIZE
|
||||||
#define SMLSIZE 0x00
|
#define SMLSIZE 0x00
|
||||||
|
@ -121,7 +121,7 @@
|
||||||
#define DISPLAY_PLAN_SIZE (DISPLAY_W*((DISPLAY_H+7)/8))
|
#define DISPLAY_PLAN_SIZE (DISPLAY_W*((DISPLAY_H+7)/8))
|
||||||
|
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
#define DISPLAY_BUF_SIZE (2*DISPLAY_PLAN_SIZE)
|
#define DISPLAY_BUF_SIZE (4*DISPLAY_PLAN_SIZE)
|
||||||
#else
|
#else
|
||||||
#define DISPLAY_BUF_SIZE DISPLAY_PLAN_SIZE
|
#define DISPLAY_BUF_SIZE DISPLAY_PLAN_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
@ -216,6 +216,7 @@ inline void lcd_square(xcoord_t x, uint8_t y, xcoord_t w, LcdFlags att=0) { lcd_
|
||||||
lcd_vline(x+5, y+8, 2);
|
lcd_vline(x+5, y+8, 2);
|
||||||
|
|
||||||
extern void lcd_img(xcoord_t x, uint8_t y, const pm_uchar * img, uint8_t idx, LcdFlags att=0);
|
extern void lcd_img(xcoord_t x, uint8_t y, const pm_uchar * img, uint8_t idx, LcdFlags att=0);
|
||||||
|
extern void lcd_bmp(xcoord_t x, uint8_t y, const pm_uchar * img);
|
||||||
extern void lcdSetRefVolt(unsigned char val);
|
extern void lcdSetRefVolt(unsigned char val);
|
||||||
extern void lcdInit();
|
extern void lcdInit();
|
||||||
extern void lcd_clear();
|
extern void lcd_clear();
|
||||||
|
@ -224,7 +225,7 @@ extern void lcdSetContrast();
|
||||||
extern void lcdRefresh();
|
extern void lcdRefresh();
|
||||||
|
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
const pm_char * bmpLoad(uint8_t *dest, const char *filename);
|
const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t width, const uint8_t height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6))
|
#define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6))
|
||||||
|
|
|
@ -433,8 +433,8 @@ void menuMainView(uint8_t event)
|
||||||
displaySliders();
|
displaySliders();
|
||||||
|
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
// Model Bitmap
|
// Model bitmap
|
||||||
lcd_img(BITMAP_X, BITMAP_Y, modelBitmap, 0, 0);
|
lcd_bmp(BITMAP_X, BITMAP_Y, modelBitmap);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Switches
|
// Switches
|
||||||
|
|
|
@ -223,7 +223,7 @@ void check_rotary_encoder(uint8_t & event)
|
||||||
|
|
||||||
// TODO remove later...
|
// TODO remove later...
|
||||||
uint8_t key = event & EVT_KEY_MASK;
|
uint8_t key = event & EVT_KEY_MASK;
|
||||||
if (key==KEY_LEFT || key==KEY_RIGHT)
|
if (key==KEY_MOVE_UP || key==KEY_MOVE_DOWN)
|
||||||
event = 0;
|
event = 0;
|
||||||
}
|
}
|
||||||
#elif defined(ROTARY_ENCODERS)
|
#elif defined(ROTARY_ENCODERS)
|
||||||
|
|
|
@ -55,7 +55,7 @@ OS_TID btTaskId;
|
||||||
OS_STK btStack[BT_STACK_SIZE];
|
OS_STK btStack[BT_STACK_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(PCBSKY9X) && defined(DEBUG)
|
||||||
OS_TID debugTaskId;
|
OS_TID debugTaskId;
|
||||||
OS_STK debugStack[DEBUG_STACK_SIZE];
|
OS_STK debugStack[DEBUG_STACK_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
@ -102,7 +102,7 @@ void loadModelBitmap()
|
||||||
strncpy(lfn+sizeof(BITMAPS_PATH), g_model.bitmap, sizeof(g_model.bitmap));
|
strncpy(lfn+sizeof(BITMAPS_PATH), g_model.bitmap, sizeof(g_model.bitmap));
|
||||||
lfn[sizeof(BITMAPS_PATH)+sizeof(g_model.bitmap)] = '\0';
|
lfn[sizeof(BITMAPS_PATH)+sizeof(g_model.bitmap)] = '\0';
|
||||||
strcat(lfn+sizeof(BITMAPS_PATH), BITMAPS_EXT);
|
strcat(lfn+sizeof(BITMAPS_PATH), BITMAPS_EXT);
|
||||||
bmpLoad(modelBitmap, lfn);
|
bmpLoad(modelBitmap, lfn, MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2549,11 +2549,7 @@ void perOut(uint8_t mode, uint8_t tick10ms)
|
||||||
mixWarning = lv_mixWarning;
|
mixWarning = lv_mixWarning;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SIMU)
|
#define TIME_TO_WRITE() (s_eeDirtyMsk && (tmr10ms_t)(get_tmr10ms() - s_eeDirtyTime10ms) >= (tmr10ms_t)WRITE_DELAY_10MS)
|
||||||
#define TIME_TO_WRITE s_eeDirtyMsk
|
|
||||||
#else
|
|
||||||
#define TIME_TO_WRITE (s_eeDirtyMsk && (tmr10ms_t)(get_tmr10ms() - s_eeDirtyTime10ms) >= (tmr10ms_t)WRITE_DELAY_10MS)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BOLD_FONT
|
#ifdef BOLD_FONT
|
||||||
ACTIVE_MIXES_TYPE activeMixes;
|
ACTIVE_MIXES_TYPE activeMixes;
|
||||||
|
@ -2927,16 +2923,16 @@ void perMain()
|
||||||
#if defined(PCBSKY9X)
|
#if defined(PCBSKY9X)
|
||||||
if (Eeprom32_process_state != E32_IDLE)
|
if (Eeprom32_process_state != E32_IDLE)
|
||||||
ee32_process();
|
ee32_process();
|
||||||
else if (TIME_TO_WRITE)
|
else if (TIME_TO_WRITE())
|
||||||
eeCheck();
|
eeCheck();
|
||||||
#elif defined(CPUARM)
|
#elif defined(CPUARM)
|
||||||
if (TIME_TO_WRITE)
|
if (TIME_TO_WRITE())
|
||||||
eeCheck();
|
eeCheck();
|
||||||
#else
|
#else
|
||||||
if (!eeprom_buffer_size) {
|
if (!eeprom_buffer_size) {
|
||||||
if (theFile.isWriting())
|
if (theFile.isWriting())
|
||||||
theFile.nextWriteStep();
|
theFile.nextWriteStep();
|
||||||
else if (TIME_TO_WRITE)
|
else if (TIME_TO_WRITE())
|
||||||
eeCheck();
|
eeCheck();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -3665,7 +3661,7 @@ int main(void)
|
||||||
|
|
||||||
CoInitOS();
|
CoInitOS();
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(PCBSKY9X) && defined(DEBUG)
|
||||||
debugTaskId = CoCreateTaskEx(debugTask, NULL, 10, &debugStack[DEBUG_STACK_SIZE-1], DEBUG_STACK_SIZE, 1, false);
|
debugTaskId = CoCreateTaskEx(debugTask, NULL, 10, &debugStack[DEBUG_STACK_SIZE-1], DEBUG_STACK_SIZE, 1, false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
42
src/open9x.h
42
src/open9x.h
|
@ -172,6 +172,10 @@
|
||||||
#include "stock/board_stock.h"
|
#include "stock/board_stock.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CPUARM) && defined(DEBUG)
|
||||||
|
#include "debug.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(SIMU)
|
#if defined(SIMU)
|
||||||
#include "simpgmspace.h"
|
#include "simpgmspace.h"
|
||||||
#elif defined(CPUARM)
|
#elif defined(CPUARM)
|
||||||
|
@ -222,6 +226,24 @@ extern void boardInit();
|
||||||
extern char modelNames[MAX_MODELS][sizeof(g_model.name)];
|
extern char modelNames[MAX_MODELS][sizeof(g_model.name)];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CPUARM)
|
||||||
|
// This doesn't need protection on this processor
|
||||||
|
#define tmr10ms_t uint32_t
|
||||||
|
extern volatile tmr10ms_t g_tmr10ms;
|
||||||
|
#define get_tmr10ms() g_tmr10ms
|
||||||
|
#else
|
||||||
|
#define tmr10ms_t uint16_t
|
||||||
|
extern volatile tmr10ms_t g_tmr10ms;
|
||||||
|
extern inline uint16_t get_tmr10ms()
|
||||||
|
{
|
||||||
|
uint16_t time ;
|
||||||
|
cli();
|
||||||
|
time = g_tmr10ms ;
|
||||||
|
sei();
|
||||||
|
return time ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO try to merge the 2 include files
|
// TODO try to merge the 2 include files
|
||||||
#if defined(PCBSKY9X)
|
#if defined(PCBSKY9X)
|
||||||
#include "eeprom_arm.h"
|
#include "eeprom_arm.h"
|
||||||
|
@ -238,7 +260,7 @@ extern char modelNames[MAX_MODELS][sizeof(g_model.name)];
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
#define MODEL_BITMAP_WIDTH 64
|
#define MODEL_BITMAP_WIDTH 64
|
||||||
#define MODEL_BITMAP_HEIGHT 32
|
#define MODEL_BITMAP_HEIGHT 32
|
||||||
#define MODEL_BITMAP_SIZE (2+MODEL_BITMAP_WIDTH*MODEL_BITMAP_HEIGHT/8)
|
#define MODEL_BITMAP_SIZE (2+4*(MODEL_BITMAP_WIDTH*MODEL_BITMAP_HEIGHT/8))
|
||||||
extern uint8_t modelBitmap[MODEL_BITMAP_SIZE];
|
extern uint8_t modelBitmap[MODEL_BITMAP_SIZE];
|
||||||
void loadModelBitmap();
|
void loadModelBitmap();
|
||||||
#define LOAD_MODEL_BITMAP() loadModelBitmap()
|
#define LOAD_MODEL_BITMAP() loadModelBitmap()
|
||||||
|
@ -1075,24 +1097,6 @@ extern int16_t calc1000toRESX(int16_t x);
|
||||||
extern int16_t calcRESXto1000(int16_t x);
|
extern int16_t calcRESXto1000(int16_t x);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CPUARM)
|
|
||||||
// This doesn't need protection on this processor
|
|
||||||
#define tmr10ms_t uint32_t
|
|
||||||
extern volatile tmr10ms_t g_tmr10ms;
|
|
||||||
#define get_tmr10ms() g_tmr10ms
|
|
||||||
#else
|
|
||||||
#define tmr10ms_t uint16_t
|
|
||||||
extern volatile tmr10ms_t g_tmr10ms;
|
|
||||||
extern inline uint16_t get_tmr10ms()
|
|
||||||
{
|
|
||||||
uint16_t time ;
|
|
||||||
cli();
|
|
||||||
time = g_tmr10ms ;
|
|
||||||
sei();
|
|
||||||
return time ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TMR_VAROFS 5
|
#define TMR_VAROFS 5
|
||||||
|
|
||||||
extern const char stamp1[];
|
extern const char stamp1[];
|
||||||
|
|
46
src/simu.cpp
46
src/simu.cpp
|
@ -381,7 +381,13 @@ long Open9xSim::onTimeout(FXObject*,FXSelector,void*)
|
||||||
#else
|
#else
|
||||||
static FXuint keys2[]={KEY_F8, KEY_F7, KEY_F4, KEY_F3, KEY_F6, KEY_F5, KEY_F1, KEY_F2 };
|
static FXuint keys2[]={KEY_F8, KEY_F7, KEY_F4, KEY_F3, KEY_F6, KEY_F5, KEY_F1, KEY_F2 };
|
||||||
#endif
|
#endif
|
||||||
#if defined(PCBSKY9X)
|
#if defined(PCBX9D)
|
||||||
|
GPIOE->IDR |= PIN_TRIM_LH_L | PIN_TRIM_LH_R | PIN_TRIM_LV_DN | PIN_TRIM_LV_UP;
|
||||||
|
GPIOC->IDR |= PIN_TRIM_RV_DN | PIN_TRIM_RV_UP | PIN_TRIM_RH_L | PIN_TRIM_RH_R;
|
||||||
|
GPIOE->IDR |= 0xFFFFFFFF;
|
||||||
|
GPIOB->IDR |= 0xFFFFFFFF;
|
||||||
|
GPIOC->IDR |= 0xFFFFFFFF;
|
||||||
|
#elif defined(PCBSKY9X)
|
||||||
PIOA->PIO_PDSR |= (0x00800000 | 0x01000000 | 0x00000002 | 0x00000001);
|
PIOA->PIO_PDSR |= (0x00800000 | 0x01000000 | 0x00000002 | 0x00000001);
|
||||||
PIOB->PIO_PDSR |= (0x00000050);
|
PIOB->PIO_PDSR |= (0x00000050);
|
||||||
PIOC->PIO_PDSR |= (0x10000000 | 0x00000400 | 0x00000200);
|
PIOC->PIO_PDSR |= (0x10000000 | 0x00000400 | 0x00000200);
|
||||||
|
@ -393,7 +399,8 @@ long Open9xSim::onTimeout(FXObject*,FXSelector,void*)
|
||||||
|
|
||||||
for(unsigned i=0; i<DIM(keys2);i++){
|
for(unsigned i=0; i<DIM(keys2);i++){
|
||||||
if(getApp()->getKeyState(keys2[i])) {
|
if(getApp()->getKeyState(keys2[i])) {
|
||||||
#if defined(PCBSKY9X)
|
#if defined(PCBX9D)
|
||||||
|
#elif defined(PCBSKY9X)
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case 6:
|
case 6:
|
||||||
PIOA->PIO_PDSR &= ~0x00800000;
|
PIOA->PIO_PDSR &= ~0x00800000;
|
||||||
|
@ -498,32 +505,25 @@ void Open9xSim::refreshDiplay()
|
||||||
if (lcd_refresh) {
|
if (lcd_refresh) {
|
||||||
lcd_refresh = false;
|
lcd_refresh = false;
|
||||||
FXColor offColor = IS_BACKLIGHT_ON() ? BL_COLOR : FXRGB(200,200,200);
|
FXColor offColor = IS_BACKLIGHT_ON() ? BL_COLOR : FXRGB(200,200,200);
|
||||||
|
#if !defined(PCBX9D)
|
||||||
FXColor onColor = FXRGB(0,0,0);
|
FXColor onColor = FXRGB(0,0,0);
|
||||||
#if defined(PCBX9D)
|
|
||||||
FXColor grey1Color = FXRGB(0xC0,0xC0,0xC0);
|
|
||||||
FXColor grey2Color = FXRGB(0xA0,0xA0,0xA0);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (int x=0;x<W;x++) {
|
for (int x=0;x<W;x++) {
|
||||||
for (int y=0; y<H; y++) {
|
for (int y=0; y<H; y++) {
|
||||||
#if defined(PCBX9D)
|
#if defined(PCBX9D)
|
||||||
if ((lcd_buf[x+(y/8)*W] & (1<<(y%8))) && (lcd_buf[DISPLAY_PLAN_SIZE+x+(y/8)*W] & (1<<(y%8)))) {
|
#define PALETTE_IDX(p, x, mask) ((((p)[(x)] & (mask)) ? 0x1 : 0) + (((p)[DISPLAY_PLAN_SIZE+(x)] & (mask)) ? 0x2 : 0) + (((p)[2*DISPLAY_PLAN_SIZE+(x)] & (mask)) ? 0x4 : 0) + (((p)[3*DISPLAY_PLAN_SIZE+(x)] & (mask)) ? 0x8 : 0))
|
||||||
bmp->setPixel(2*x, 2*y, onColor);
|
uint8_t mask = (1 << (y%8));
|
||||||
bmp->setPixel(2*x+1, 2*y, onColor);
|
uint32_t z = PALETTE_IDX(lcd_buf, (y/8)*W+x, mask);
|
||||||
bmp->setPixel(2*x, 2*y+1, onColor);
|
if (z) {
|
||||||
bmp->setPixel(2*x+1, 2*y+1, onColor);
|
FXColor color;
|
||||||
}
|
if (IS_BACKLIGHT_ON())
|
||||||
else if (lcd_buf[DISPLAY_PLAN_SIZE+x+(y/8)*W] & (1<<(y%8))) {
|
color = FXRGB(47-(z*47)/15, 123-(z*123)/15, 227-(z*227)/15);
|
||||||
bmp->setPixel(2*x, 2*y, grey1Color);
|
else
|
||||||
bmp->setPixel(2*x+1, 2*y, grey1Color);
|
color = FXRGB(200-(z*200)/15, 200-(z*200)/15, 200-(z*200)/15);
|
||||||
bmp->setPixel(2*x, 2*y+1, grey1Color);
|
bmp->setPixel(2*x, 2*y, color);
|
||||||
bmp->setPixel(2*x+1, 2*y+1, grey1Color);
|
bmp->setPixel(2*x+1, 2*y, color);
|
||||||
}
|
bmp->setPixel(2*x, 2*y+1, color);
|
||||||
else if (lcd_buf[x+(y/8)*W] & (1<<(y%8))) {
|
bmp->setPixel(2*x+1, 2*y+1, color);
|
||||||
bmp->setPixel(2*x, 2*y, grey2Color);
|
|
||||||
bmp->setPixel(2*x+1, 2*y, grey2Color);
|
|
||||||
bmp->setPixel(2*x, 2*y+1, grey2Color);
|
|
||||||
bmp->setPixel(2*x+1, 2*y+1, grey2Color);
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (lcd_buf[x+(y/8)*W] & (1<<(y%8))) {
|
if (lcd_buf[x+(y/8)*W] & (1<<(y%8))) {
|
||||||
|
|
|
@ -144,7 +144,7 @@ bool isAudioFileAvailable(uint32_t i, char * filename)
|
||||||
{
|
{
|
||||||
uint8_t category = (i >> 24);
|
uint8_t category = (i >> 24);
|
||||||
|
|
||||||
#if defined(SIMU)
|
#if 0
|
||||||
printf("isAudioFileAvailable(%08x)\n", i); fflush(stdout);
|
printf("isAudioFileAvailable(%08x)\n", i); fflush(stdout);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../open9x.h"
|
#include "../open9x.h"
|
||||||
#include "fifo.h"
|
#include "../fifo.h"
|
||||||
|
|
||||||
void btSetBaudrate(uint32_t index)
|
void btSetBaudrate(uint32_t index)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
|
|
||||||
void pwrInit();
|
void pwrInit();
|
||||||
void eepromInit();
|
void eepromInit();
|
||||||
|
void DEBUG_UART_Configure( uint32_t baudrate, uint32_t masterClock);
|
||||||
|
void DEBUG_UART_Stop();
|
||||||
|
|
||||||
uint32_t Master_frequency ;
|
uint32_t Master_frequency ;
|
||||||
volatile uint32_t Tenms ;
|
volatile uint32_t Tenms ;
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "audio_driver.h"
|
#include "audio_driver.h"
|
||||||
#include "haptic_driver.h"
|
#include "haptic_driver.h"
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
#if defined(BLUETOOTH)
|
#if defined(BLUETOOTH)
|
||||||
#include "bluetooth.h"
|
#include "bluetooth.h"
|
||||||
|
|
|
@ -37,6 +37,8 @@
|
||||||
|
|
||||||
#if !defined(SIMU)
|
#if !defined(SIMU)
|
||||||
|
|
||||||
|
extern Fifo32 debugFifo;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Outputs a character on the UART line.
|
* Outputs a character on the UART line.
|
||||||
*
|
*
|
||||||
|
@ -54,37 +56,6 @@ void debugPutc(const char c)
|
||||||
pUart->UART_THR = c;
|
pUart->UART_THR = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Outputs a string to the UART
|
|
||||||
void debugPuts(const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list arglist;
|
|
||||||
char tmp[256];
|
|
||||||
|
|
||||||
va_start(arglist, format);
|
|
||||||
vsnprintf(tmp, 256, format, arglist);
|
|
||||||
va_end(arglist);
|
|
||||||
|
|
||||||
const char *t = tmp;
|
|
||||||
while (*t) {
|
|
||||||
debugPutc(*t++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump(unsigned char *data, unsigned int size)
|
|
||||||
{
|
|
||||||
debugPuts("DUMP %d bytes ...\n\r", size);
|
|
||||||
unsigned int i = 0, j=0;
|
|
||||||
while (i*32+j < size) {
|
|
||||||
debugPuts("%.2X ", data[i*32+j]);
|
|
||||||
j++;
|
|
||||||
if (j==32) {
|
|
||||||
i++; j=0;
|
|
||||||
debugPuts("\n\r");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
debugPuts("\n\r");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures a UART peripheral with the specified parameters.
|
* Configures a UART peripheral with the specified parameters.
|
||||||
*
|
*
|
||||||
|
@ -128,22 +99,9 @@ void DEBUG_UART_Stop()
|
||||||
NVIC_DisableIRQ(UART0_IRQn) ;
|
NVIC_DisableIRQ(UART0_IRQn) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fifo32 debugFifo;
|
|
||||||
|
|
||||||
extern "C" void UART0_IRQHandler()
|
extern "C" void UART0_IRQHandler()
|
||||||
{
|
{
|
||||||
debugFifo.push(CONSOLE_USART->UART_RHR);
|
debugFifo.push(CONSOLE_USART->UART_RHR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void debugTask(void* pdata)
|
|
||||||
{
|
|
||||||
uint8_t rxchar ;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
while (!debugFifo.pop(rxchar))
|
|
||||||
CoTickDelay(5); // 10ms
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -39,7 +39,7 @@
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
#include "board.h"
|
// #include "board.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
|
@ -172,6 +172,9 @@ void boardInit()
|
||||||
adcInit();
|
adcInit();
|
||||||
delaysInit();
|
delaysInit();
|
||||||
audioInit();
|
audioInit();
|
||||||
|
#if defined(DEBUG)
|
||||||
|
debugInit();
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO init_ppm() ;
|
// TODO init_ppm() ;
|
||||||
|
|
||||||
|
@ -184,7 +187,6 @@ void boardInit()
|
||||||
__enable_irq() ;
|
__enable_irq() ;
|
||||||
|
|
||||||
eepromInit();
|
eepromInit();
|
||||||
uartInit();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,7 @@ void eepromInit(); // TODO check it's not in another include
|
||||||
void delaysInit();
|
void delaysInit();
|
||||||
void adcInit();
|
void adcInit();
|
||||||
void audioInit();
|
void audioInit();
|
||||||
|
void debugInit();
|
||||||
|
|
||||||
void adcRead();
|
void adcRead();
|
||||||
void init_trainer_ppm();
|
void init_trainer_ppm();
|
||||||
|
|
|
@ -34,16 +34,7 @@
|
||||||
|
|
||||||
#include "../open9x.h"
|
#include "../open9x.h"
|
||||||
|
|
||||||
void uartSendChar(uint8_t c)
|
void debugInit(void)
|
||||||
{
|
|
||||||
USART_SendData(UART_DEBUG, c);
|
|
||||||
|
|
||||||
/* Wait for end of previous transfer */
|
|
||||||
while (USART_GetFlagStatus(UART_DEBUG, USART_FLAG_TC) == RESET);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void uartInit(void)
|
|
||||||
{
|
{
|
||||||
USART_InitTypeDef USART_InitStructure;
|
USART_InitTypeDef USART_InitStructure;
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
@ -72,3 +63,10 @@ void uartInit(void)
|
||||||
USART_Cmd(UART_DEBUG, ENABLE);
|
USART_Cmd(UART_DEBUG, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void debugPutc(const char c)
|
||||||
|
{
|
||||||
|
USART_SendData(UART_DEBUG, c);
|
||||||
|
|
||||||
|
/* Wait for end of previous transfer */
|
||||||
|
while (USART_GetFlagStatus(UART_DEBUG, USART_FLAG_TC) == RESET);
|
||||||
|
}
|
|
@ -26,7 +26,7 @@
|
||||||
#define PIN_TRIM_LV_UP GPIO_Pin_5 //PE.05
|
#define PIN_TRIM_LV_UP GPIO_Pin_5 //PE.05
|
||||||
|
|
||||||
// Switchs
|
// Switchs
|
||||||
#define PIN_SW_F GPIO_Pin_14 //PE.14
|
#define PIN_SW_F GPIO_Pin_14 //PE.14
|
||||||
#define PIN_SW_E_L GPIO_Pin_3 //PB.03
|
#define PIN_SW_E_L GPIO_Pin_3 //PB.03
|
||||||
#define PIN_SW_E_H GPIO_Pin_4 //PB.04
|
#define PIN_SW_E_H GPIO_Pin_4 //PB.04
|
||||||
#define PIN_SW_B_H GPIO_Pin_5 //PB.05
|
#define PIN_SW_B_H GPIO_Pin_5 //PB.05
|
||||||
|
|
|
@ -85,6 +85,8 @@ uint32_t readTrims()
|
||||||
if (~c & PIN_TRIM_RH_R)
|
if (~c & PIN_TRIM_RH_R)
|
||||||
result |= 0x80; // RH_R
|
result |= 0x80; // RH_R
|
||||||
|
|
||||||
|
// printf("readTrims(): %x %x => %x\n", c, e, result); fflush(stdout);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,14 +107,12 @@ void readKeysAndTrims()
|
||||||
++enuk;
|
++enuk;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(SIMU)
|
|
||||||
in = readTrims();
|
in = readTrims();
|
||||||
|
|
||||||
for (i = 1; i < 256; i <<= 1) {
|
for (i = 1; i < 256; i <<= 1) {
|
||||||
keys[enuk].input(in & i, (EnumKeys)enuk);
|
keys[enuk].input(in & i, (EnumKeys)enuk);
|
||||||
++enuk;
|
++enuk;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t keyState(EnumKeys enuk)
|
uint32_t keyState(EnumKeys enuk)
|
||||||
|
|
|
@ -23,6 +23,9 @@ void Set_Address(u8 x, u8 y)
|
||||||
WriteCommand(((y>>4)&0x0F)|0x70); //Set Row Address MSB RA [7:4]
|
WriteCommand(((y>>4)&0x0F)|0x70); //Set Row Address MSB RA [7:4]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PALETTE_IDX(p, x, mask) (((p[x] & mask) ? 0x1 : 0) + ((p[DISPLAY_PLAN_SIZE+x] & mask) ? 0x2 : 0) + ((p[2*DISPLAY_PLAN_SIZE+x] & mask) ? 0x4 : 0) + ((p[3*DISPLAY_PLAN_SIZE+x] & mask) ? 0x8 : 0))
|
||||||
|
const uint8_t lcdPalette[4] = { 0, 0x03, 0x06, 0x0F };
|
||||||
|
|
||||||
void lcdRefresh()
|
void lcdRefresh()
|
||||||
{
|
{
|
||||||
for (uint8_t y=0; y<DISPLAY_H; y++) {
|
for (uint8_t y=0; y<DISPLAY_H; y++) {
|
||||||
|
@ -31,8 +34,11 @@ void lcdRefresh()
|
||||||
Set_Address(0, y);
|
Set_Address(0, y);
|
||||||
AspiCmd(0xAF);
|
AspiCmd(0xAF);
|
||||||
for (uint8_t x=0; x<DISPLAY_W; x+=2) {
|
for (uint8_t x=0; x<DISPLAY_W; x+=2) {
|
||||||
#if 1
|
#if 0
|
||||||
uint8_t data = (p[x] & mask ? 0x80 : 0) + (p[x+1] & mask ? 0x08 : 0) + (p[DISPLAY_PLAN_SIZE+x] & mask ? 0x40 : 0) + (p[DISPLAY_PLAN_SIZE+x+1] & mask ? 0x04 : 0);
|
uint8_t data = (p[x] & mask ? 0x80 : 0) + (p[x+1] & mask ? 0x08 : 0) + (p[DISPLAY_PLAN_SIZE+x] & mask ? 0x40 : 0) + (p[DISPLAY_PLAN_SIZE+x+1] & mask ? 0x04 : 0);
|
||||||
|
#elif 1
|
||||||
|
uint8_t data = (PALETTE_IDX(p, x, mask) << 4) + (PALETTE_IDX(p, x+1, mask));
|
||||||
|
//uint8_t data = (lcdPalette(PALETTE_IDX(p, x, mask)) << 4) + lcdPalette(PALETTE_IDX(p, x+1, mask));
|
||||||
#else
|
#else
|
||||||
// this code shows the 16 grey tones...
|
// this code shows the 16 grey tones...
|
||||||
uint8_t data = (x * 16) / 212;
|
uint8_t data = (x * 16) / 212;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue