nnCron - LPT - LCD

Обсуждение программ nnCron и nnCron LITE

Re: nnCron - LPT - LCD

Postby Ilya » Sat, 30 Aug 2008, 14:52

Dark_Jones wrote:Сделал такое слово:
Code: Select all
: lpt-z-space Z"                                                   " ;

: LPT-TYPE-PROGRESS ( n% w r c )
\ выводит "прогресс бар" из # в позицию r c
\ w - максимальная длина
\ n% - процент (0-100) от максимальной длины
LPT-AT
Z" ##################################################" SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ LPT-TYPE
;

Как бы сделать более плавную полосу? То есть не "#" выводить, а столбцы пикселей?

Может я неправильно понял, но можно попробовать так:
Code: Select all
CREATE lcd-bar 20 ALLOT
: LPT-TYPE-PROGRESS ( n% w r c )
lcd-bar 20 0xFF FILL
\ выводит "прогресс бар" из # в позицию r c
\ w - максимальная длина
\ n% - процент (0-100) от максимальной длины
LPT-AT
lcd-bar
SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ lpt-type1
;
\ ......
Action:
\ ......


Попробовал добавить GLOBAL LOCAL - при одновременном выводе двух мигающих сообщений они стали глючить.
А можно пример?
Всё-таки непонятно с save3num и adr->3num - если два разных потока (не связанных с задачей LCD) будут вызывать эти слова, то HERE выдаст разные адреса или один и тот же, не перепутаются ли они без аргументов?

Ты прав! Для этих целей лучше использовать разные буфера.
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: nnCron - LPT - LCD

Postby Ilya » Sat, 30 Aug 2008, 15:50

Ilya wrote:
Dark_Jones wrote:Сделал такое слово:
Code: Select all
: lpt-z-space Z"                                                   " ;

: LPT-TYPE-PROGRESS ( n% w r c )
\ выводит "прогресс бар" из # в позицию r c
\ w - максимальная длина
\ n% - процент (0-100) от максимальной длины
LPT-AT
Z" ##################################################" SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ LPT-TYPE
;

Как бы сделать более плавную полосу? То есть не "#" выводить, а столбцы пикселей?

Может я неправильно понял, но можно попробовать так:
Code: Select all
CREATE lcd-bar 20 ALLOT
: LPT-TYPE-PROGRESS ( n% w r c )
lcd-bar 20 0xFF FILL
\ выводит "прогресс бар" из # в позицию r c
\ w - максимальная длина
\ n% - процент (0-100) от максимальной длины
LPT-AT
lcd-bar
SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ lpt-type1
;
\ ......
Action:
\ ......


Попробовал добавить GLOBAL LOCAL - при одновременном выводе двух мигающих сообщений они стали глючить.
А можно пример?
Всё-таки непонятно с save3num и adr->3num - если два разных потока (не связанных с задачей LCD) будут вызывать эти слова, то HERE выдаст разные адреса или один и тот же, не перепутаются ли они без аргументов?

Ты прав! Для этих целей лучше использовать разные буфера.

ЗЫ. Вот ссылка на доку по индикатору(ам).
http://www.chipdip.ru/library/DOC000177698.pdf
В плане таблицы кодировки символов.
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: nnCron - LPT - LCD

Postby Dark_Jones » Mon, 01 Sep 2008, 11:46

Вот пример:
Code: Select all
S" ()_()             ()_()" 0 0 LPT-AT-TYPE
S" (o o)             (o o)" 1 0 LPT-AT-TYPE
S" Forever!!!" 1 7 LPT-TYPE-FLASH
S" nnCron" 0 9 LPT-TYPE-FLASH
7000 PAUSE
STOP STOP

Если использовать GLOBAL и LOCAL в слове LPT-TYPE-FLASH, то будут выводится какие-то лишние символы, строки периодически меняются местами и т.д. Без GLOBAL и LOCAL всё нормально.

Твой LPT-TYPE-PROGRESS у меня не пошёл - вместо заполненного знакоместа (как в таблице - даташите) выводится буква "я".
Но было бы интереснее выводить знакоместа, заполненные не полностью: сначала один столбик пикселей, потом - второй и так до полного заполнения знакоместа. Потом - начинает заполняться первый столбик пикселей второго знакоместа и т.д. Это - просто "хотелка" сейчас не особо напрягает.

Вобщем, сделал себе задачку и кучку слов: выводит различную инфу по кругу, но при необходимости может перескакивать между "экранами", например, для вывода изменяющейся громкости, переключающегося трека в винампе (или вывода какого-нибудь меню - пока не делал). Если интересно - могу показать. Но крон периодически падает, периодически ругается на внутреннюю ошибку и вообще ведёт себя нестабильно... :oops:

Немного оффтопика, но некоторые функции есть в ЛСДсмартие и их хотелось бы получить в кроне:
Вопрос - как делить и умножать числа двойной длины? Мне надо перевести байты в гигабайты (байтов может быть много - вплоть до терабайта, поэтому в одинарное число не перевести).

Много раз видел вопрос про отслеживание сетевого трафика. Он оставался без ответа поэтому снова подниму его. Мне бы хотелось узнать текущую скорость скачки/закачки (и, умножив на время, получить количество скачанного/отданного).
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Ilya » Mon, 01 Sep 2008, 21:53

Dark_Jones wrote:Вот пример:
Твой LPT-TYPE-PROGRESS у меня не пошёл - вместо заполненного знакоместа (как в таблице - даташите) выводится буква "я".
Но было бы интереснее выводить знакоместа, заполненные не полностью: сначала один столбик пикселей, потом - второй и так до полного заполнения знакоместа. Потом - начинает заполняться первый столбик пикселей второго знакоместа и т.д. Это - просто "хотелка" сейчас не особо напрягает.

На всякий случай повторю "плагин" и само слово (чего-то вначале выложил, а потом поменял):
Code: Select all
WINAPI: DlPortWritePortUchar dlportio.dll
0x378 CONSTANT c-lpt-data
0x37A CONSTANT c-lpt-control
USER-CREATE lpt-dec-buf 50 ALLOT

HEX
CREATE RusTable
   41 C, A0 C, 42 C, A1 C, E0 C, 45 C, A3 C, A4 C, A5 C, A6 C, 4B C, A7 C, 4D C, 48 C, 4F C,
   A8 C, 50 C, 43 C, 54 C, A9 C, AA C, 58 C, E1 C, E5 C, AC C, E2 C, AD C, AE C, C4 C, AF C,
   B0 C, B1 C, 61 C, B2 C, B3 C, B4 C, E3 C, 65 C, B6 C, B7 C, B8 C, B9 C, BA C, BB C, BC C,
   BD C, 6F C, BE C, 70 C, 63 C, BF C, 79 C, E4 C, 78 C, E5 C, C0 C, C1 C, E6 C, C2 C, C3 C,
   C4 C, C5 C,   C6 C, C7 C,
DECIMAL

: lpt-char-decode ( n -- n1 )
DUP 192 256 WITHIN
IF
0xC0 - RusTable + C@
ELSE
CASE
   0xA8 OF 0xA2 ENDOF
   0xB8 OF 0xB5 ENDOF
   DUP
ENDCASE
THEN
;

: lpt-str-decode ( adr n -- adr1 n1 )
lpt-dec-buf 50 ERASE
2>R 0 2R> OVER + SWAP
?DO
   DUP I C@ lpt-char-decode SWAP lpt-dec-buf + C!
   1+
LOOP
DROP
lpt-dec-buf ASCIIZ>
;

: strob
0x1 c-lpt-control DlPortWritePortUchar DROP
1 PAUSE
0x0 c-lpt-control DlPortWritePortUchar DROP
;

: strob-data
0x5 c-lpt-control DlPortWritePortUchar DROP
1 PAUSE
0x0 c-lpt-control DlPortWritePortUchar DROP
;

: lpt-data ( n --  )
0x4 c-lpt-control DlPortWritePortUchar DROP
4 PAUSE
c-lpt-data DlPortWritePortUchar DROP
strob-data
0 c-lpt-data DlPortWritePortUchar DROP
;

: lpt-adr ( n --  )
c-lpt-data DlPortWritePortUchar DROP
strob
0 c-lpt-data DlPortWritePortUchar DROP
;

\ Очищаем инидикатор
: LPT-CLS
1 lpt-adr
;

\ Позиционируем курсор в позицию row column
: LPT-AT ( r c -- )
SWAP
CASE
   0 OF  ENDOF
   1 OF 0x40 + ENDOF
   2 OF 0x14 + ENDOF
   3 OF 0x54 + ENDOF
ENDCASE
0x80 + lpt-adr
;

\ Выводим строку в текущиую позицию
: lpt-type1 ( adr n -- )
OVER + SWAP
?DO
   I C@ lpt-data
LOOP
;
\ Инициализируем индикатор
: lpt-init-8b
15 PAUSE
0x38 lpt-adr
10 PAUSE
0x0C lpt-adr
1 PAUSE
0x06 lpt-adr
;
: LPT-TYPE
lpt-str-decode lpt-type1
;


Code: Select all
CREATE lcd-bar 20 ALLOT
    : lpt-z-space Z"                                                   " ;

    : LPT-TYPE-PROGRESS ( n% w r c )
    \ выводит "прогресс бар" из # в позицию r c
    \ w - максимальная длина
    \ n% - процент (0-100) от максимальной длины
    lcd-bar 20 0xFF FILL
    LPT-AT
     lcd-bar
    SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ lpt-type1
    ;


Вобщем, сделал себе задачку и кучку слов: выводит различную инфу по кругу, но при необходимости может перескакивать между "экранами", например, для вывода изменяющейся громкости, переключающегося трека в винампе (или вывода какого-нибудь меню - пока не делал). Если интересно - могу показать. Но крон периодически падает, периодически ругается на внутреннюю ошибку и вообще ведёт себя нестабильно... :oops:

Давай посмотрим!
А то у самого всё руки не доходят до полезностей!
Немного оффтопика, но некоторые функции есть в ЛСДсмартие и их хотелось бы получить в кроне:
Вопрос - как делить и умножать числа двойной длины? Мне надо перевести байты в гигабайты (байтов может быть много - вплоть до терабайта, поэтому в одинарное число не перевести).

Много раз видел вопрос про отслеживание сетевого трафика. Он оставался без ответа поэтому снова подниму его. Мне бы хотелось узнать текущую скорость скачки/закачки (и, умножив на время, получить количество скачанного/отданного).

Про деление/умножение надо посмотреть (или спросить в форуме)! ;)
Про "трафик" - самому интересно, а у тебя в ЛСДсмартие работает?
Если да, то какой тип подключения (мудем, езернет, дсл ...)
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: nnCron - LPT - LCD

Postby Dark_Jones » Tue, 02 Sep 2008, 13:13

Вот мой плагин (добавил слова и привёл к большим буквам :oops: ):
Code: Select all
\ Плагин для работы с LPT-портом
WINAPI: DlPortWritePortUchar dlportio.dll

0x378 CONSTANT c-lpt-data
0x37A CONSTANT c-lpt-control
USER-CREATE lpt-dec-buf 50 ALLOT
CREATE lpt-string-buf 255 ALLOT
0 VALUE lpt-break
1 VALUE LCD-SCREEN-NUM

HEX
CREATE RusTable
   41 C, A0 C, 42 C, A1 C, E0 C, 45 C, A3 C, A4 C, A5 C, A6 C, 4B C, A7 C, 4D C, 48 C, 4F C,
   A8 C, 50 C, 43 C, 54 C, A9 C, AA C, 58 C, E1 C, E5 C, AC C, E2 C, AD C, AE C, C4 C, AF C,
   B0 C, B1 C, 61 C, B2 C, B3 C, B4 C, E3 C, 65 C, B6 C, B7 C, B8 C, B9 C, BA C, BB C, BC C,
   BD C, 6F C, BE C, 70 C, 63 C, BF C, 79 C, E4 C, 78 C, E5 C, C0 C, C1 C, E6 C, C2 C, C3 C,
   C4 C, C5 C, C6 C, C7 C,
DECIMAL

: LPT-CHAR-DECODE ( n -- n1 )
DUP 192 256 WITHIN
IF
  0xC0 - RusTable + C@
ELSE
  CASE
    0xA8 OF 0xA2 ENDOF
    0xB8 OF 0xB5 ENDOF
    DUP
  ENDCASE
THEN ;

: LPT-STR-DECODE ( adr n -- adr1 n1 )
lpt-dec-buf 50 ERASE
2>R 0 2R> OVER + SWAP
?DO
   DUP I C@ LPT-CHAR-DECODE SWAP lpt-dec-buf + C!
   1+
LOOP
DROP
lpt-dec-buf ASCIIZ> ;

: STROB
0x1 c-lpt-control DlPortWritePortUchar DROP
1 PAUSE
0x0 c-lpt-control DlPortWritePortUchar DROP
;

: STROB-DATA
0x5 c-lpt-control DlPortWritePortUchar DROP
1 PAUSE
0x0 c-lpt-control DlPortWritePortUchar DROP
;

: LPT-DATA ( n --  )
0x4 c-lpt-control DlPortWritePortUchar DROP
4 PAUSE
c-lpt-data DlPortWritePortUchar DROP
STROB-DATA
0 c-lpt-data DlPortWritePortUchar DROP
;

: LPT-ADR ( n --  )
c-lpt-data DlPortWritePortUchar DROP
STROB
0 c-lpt-data DlPortWritePortUchar DROP
;

: LPT-CLS
\ Очищаем инидикатор
1 LPT-ADR
0 TO lpt-break ;

: LPT-AT ( r c -- )
\ Позиционируем курсор в позицию row column
SWAP
CASE
   0 OF  ENDOF
   1 OF 0x40 + ENDOF
   2 OF 0x14 + ENDOF
   3 OF 0x54 + ENDOF
ENDCASE
0x80 + LPT-ADR ;

: LPT-INIT-8B
\ Инициализируем индикатор
15 PAUSE
0x38 LPT-ADR
10 PAUSE
0x0C LPT-ADR
1 PAUSE
0x06 LPT-ADR ;

: LPT-TYPE ( a u )
\ Выводим строку в текущую позицию
LPT-STR-DECODE OVER + SWAP
?DO
   I C@ LPT-DATA
LOOP ;

: LPT-AT-TYPE ( a u r c )
\ Выводим строку в позицию r c
LPT-AT
LPT-TYPE ;

: lpt-z-space Z"                                                   " ;

: LPT-SCREEN-BREAK
\ Прерывает показ текущего экрана
\ и останавливает слова LPT-TYPE-FLASH и LPT-TYPE-SCROLL
-1 TO lpt-break
250 PAUSE ;

: LPT-LEAVE
\ Прерывает цикл DO...LOOP по слову LPT-SCREEN-BREAK
lpt-break
IF
  RDROP LEAVE
THEN ;

: LPT-PAUSE ( t*10 -- )
\ Приостанавливет работу на t*10 миллисекунд
\ Прерывает паузу по слову LPT-SCREEN-BREAK
0 ?DO
  10 PAUSE
  LPT-LEAVE
LOOP ;

: LCD-SCREEN-BREAK-NUM ( n -- )
\ Прерывает выдачу экранов и выводит экран с номером n
DUP 1 + LCD-SCREEN-NUM <>
IF
  TO LCD-SCREEN-NUM
  LPT-SCREEN-BREAK
ELSE
  DROP
THEN ;

: LPT-TYPE-PROGRESS ( n% w r c )
\ выводит "прогресс бар" из # в позицию r c
\ w - максимальная длина
\ n% - процент (0-100) от максимальной длины
LPT-AT
Z" ##################################################" SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ LPT-TYPE
;

: save3num->adr HERE ! HERE CELL+ ! HERE 2 CELLS + ! HERE ;
: adr->3num DUP @ SWAP CELL+ DUP @ SWAP CELL+ @ ;
: save4num->adr save3num->adr 3 CELLS + ! HERE ;
: adr->4num DUP @ SWAP CELL+ adr->3num ;

:NONAME
BEGIN
  DUP adr->3num LPT-AT ASCIIZ> LPT-TYPE
  50 LPT-PAUSE
  DUP adr->3num LPT-AT ASCIIZ>
  lpt-z-space SWAP LPT-TYPE DROP
  50 LPT-PAUSE
  lpt-break
UNTIL
DROP ; TASK: lpt-type-flash

: LPT-TYPE-FLASH ( a u r c -- )
\ Выводим мерцающую строку в позицию r c
0 TO lpt-break
2SWAP S>ZALLOC >R SWAP R> save3num->adr lpt-type-flash START DROP ;

:NONAME
BEGIN
  DUP adr->4num 2>R ASCIIZ> 2R> ROT
  0 ?DO
     2DUP LPT-AT
     2OVER I + SWAP LPT-TYPE
     25 LPT-PAUSE
     LPT-LEAVE
  LOOP
  2DROP 2DROP
  lpt-break
UNTIL
DROP ; TASK: lpt-type-scroll

: LPT-TYPE-SCROLL ( a u w r c -- )
\ Выводим строку из w-символов в позицию r c
\ Если длина строки больше w-символов, то скроллим строку
0 TO lpt-break
2>R
OVER OVER >
IF
  DUP >R lpt-z-space SWAP 2DUP 2>R S+ 2R> 2SWAP S+ S>ZALLOC R> R> R> 2SWAP save4num->adr lpt-type-scroll START DROP
ELSE
  OVER - lpt-z-space SWAP S+
  2R> LPT-AT-TYPE
THEN ;

: LPT-STRING-TYPE ( a u )
\ Выводит сообщение на LCD из задач
\ Для перевода строки используется слово "crlf"
lpt-string-buf PLACE
0 TO LCD-SCREEN-NUM
LPT-SCREEN-BREAK ;


А вот кусок кронтаба:
Code: Select all
#( LCD-SCREEN
SingleInstance
NoLog
Action:
S" Стартовал LCD-SCREEN" CRON-LOG
LPT-INIT-8B
BEGIN
     LCD-SCREEN-NUM
     CASE
         0 OF LPT-CLS
              1 TO LCD-SCREEN-NUM
              lpt-string-buf COUNT
              3 0 DO               
                2DUP crlf StringGet ?DUP
                IF
                  SWAP 0 2OVER I 0 LPT-AT-TYPE
                  DROP SWAP 1 + /STRING
                ELSE
                  I 0 LPT-AT-TYPE LEAVE
                THEN
              LOOP
              lpt-string-buf COUNT NIP 40 * LPT-PAUSE
           ENDOF
         1 OF LPT-CLS
              2 TO LCD-SCREEN-NUM
              S" ()_()    nnCron    ()_()" 0 0 LPT-AT-TYPE
              S" (o o)              (o o)" 1 0 LPT-AT-TYPE
              S" Forever!!!" 1 7 LPT-TYPE-FLASH
              700 LPT-PAUSE
              LPT-SCREEN-BREAK
           ENDOF
         2 OF LPT-CLS
              3 TO LCD-SCREEN-NUM
              S" Память: " AvailPhys 1048576 / N>S S+ S" /" S+ TotalPhys 1048576 / N>S S+ S"  (" S+ MemLoad N>S S+ PERCENT S+ S" )" S+ 0 0 LPT-AT-TYPE
              S" Загружен: " 1 0 LPT-AT-TYPE
              30 0 DO
                 500 (CPU-USAGE) DUP >R DOUBLENUMB S" % " S+ 1 10 LPT-AT-TYPE
                 R> 10 1 14 LPT-TYPE-PROGRESS
                 LPT-LEAVE
              LOOP
           ENDOF
         3 OF LPT-CLS
              4 TO LCD-SCREEN-NUM
              150 0 DO
                  GET-CUR-TIME
                  S" (" WW S+ S" ) " S+ DD S+ S" ." S+ MM S+ S" ." S+ YYYY S+ S"  " S+ hh S+ S" :" S+ mm S+ S" :" S+ ss S+ 0 0 LPT-AT-TYPE
                  S" Работает: " UPTIME Sec2Day S+ 1 0 LPT-AT-TYPE
                  10 LPT-PAUSE
                  LPT-LEAVE
              LOOP
           ENDOF
         4 OF LPT-CLS
              5 TO LCD-SCREEN-NUM
              PROC-EXIST: "winamp.exe"
              IF
                S" Winamp играет:" 0 0 LPT-AT-TYPE
                BEGIN
                     -1
                     S" c:\Program Files\nnCron\winamp.txt" FILE NIP 8 >
                     IF
                       S" c:\Program Files\nnCron\winamp.txt" FILE 9 /STRING DUP >R 24 1 0 LPT-TYPE-SCROLL
                       150 R> + 0 DO
                           S" c:\Program Files\nnCron\winamp.txt" FILE
                           10 LPT-PAUSE
                           S" c:\Program Files\nnCron\winamp.txt" FILE COMPARE
                           IF
                             DROP 0 LPT-SCREEN-BREAK
                           THEN
                           LPT-LEAVE
                       LOOP
                     ELSE
                       LPT-SCREEN-BREAK
                     THEN
                UNTIL
                LPT-SCREEN-BREAK
              THEN
           ENDOF
         5 OF LPT-CLS
              6 TO LCD-SCREEN-NUM
              S" Громкость:" 0 0 LPT-AT-TYPE
              70 0 DO
                  MIXER-VOLUME@ DUP 96 <
                  IF   
                    DOUBLENUMB PERCENT S+
                  ELSE
                    DROP S" 99%"
                  THEN
                  MIXER-STATE
                  IF
                    MIXER-VOLUME@ ?DUP
                    IF
                      >R S"  #" S+ 0 11 LPT-AT-TYPE R> 9 0 16 LPT-TYPE-PROGRESS
                    ELSE
                      S"  Убавлено " S+ 0 11 LPT-AT-TYPE
                    THEN
                  ELSE
                    S"  Выключено " S+ 0 11 LPT-AT-TYPE
                  THEN
                  10 LPT-PAUSE
                  LPT-LEAVE
              LOOP
           ENDOF
         6 OF LPT-CLS
              7 TO LCD-SCREEN-NUM
              GAME-EXIST?
              IF
                S" Играю в " S" C:\Program Files\nnCron\Flags\Game.sem" FILE 4 - S+ 0 0 LPT-AT-TYPE
                S" Прошло " FT-CUR S" C:\Program Files\nnCron\Flags\Game.sem" FILE-TIME FTIME- Sec2Time S+ S"  времени" S+ 1 0 LPT-AT-TYPE
                1500 LPT-PAUSE
              THEN
           ENDOF
         DUP OF
             1 TO LCD-SCREEN-NUM
           ENDOF
     ENDCASE
     LPT-CLS
AGAIN
)#

#( VolMon
SingleInstance
Action:
BEGIN
  MIXER-VOLUME@
  PAUSE: 100
  MIXER-VOLUME@ <>
  IF
    5 LCD-SCREEN-BREAK-NUM \ прерываем показ экрана и выводим экран №5 (с громкостью)
  THEN
AGAIN
)#

#( Test_ext_Int
NoActive
Action:
S" Это первая строка" crlf S+ S" А это - вторая строка" S+ LPT-STRING-TYPE


Напомню, что у меня индикатор 2*24.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Dark_Jones » Tue, 02 Sep 2008, 13:41

Эти ошибки не исправлены:
- после ухода в режим гибернейт (выключение в спящий режим) и последующим включением (пробуждением) - задача останавливается с внутренней ошибкой.
- при первом запуске иногда валит крон - исправляется изменением строки 1 VALUE LCD-SCREEN-NUM на 2 VALUE LCD-SCREEN-NUM. Хотя сейчас вроде эта ошибка не повторялась.

Да, LCDSmartie выводит скорость и трафик. Подключён по LAN.

Винамп у меня с помощью np-dll сохраняет имя трека в файл, а уже по изменению файла я вывожу OSD, LCD и веду статистику "любимых" треков.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Dark_Jones » Wed, 03 Sep 2008, 11:24

Ещё редко появляется забавный глюк - при включении появляется заполненная строка (обычный самотест), а после загрузки крона и запуска задачи эти заполненные знакоместа не исчезают полностью и поверх них выводится инфа из задачи. Получается, что LPC-CLS не всегда работает. Если запустить (а потом прибить) LCDSmartie, то заполненные знакоместа исчезают и всё выводится нормально.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Ilya » Fri, 05 Sep 2008, 01:47

Dark_Jones wrote:Вот мой плагин (добавил слова и привёл к большим буквам :oops: ):

Code: Select all
\ Плагин для работы с LPT-портом
 ....................
: LPT-LEAVE
\ Прерывает цикл DO...LOOP по слову LPT-SCREEN-BREAK
lpt-break
IF
  RDROP LEAVE
THEN ;

: LPT-PAUSE ( t*10 -- )
\ Приостанавливет работу на t*10 миллисекунд
\ Прерывает паузу по слову LPT-SCREEN-BREAK
0 ?DO
  10 PAUSE
  LPT-LEAVE
LOOP ;
.................

Недопустимо определение LEAVE вне цикла (LPT-LEAVE), т.е. надо ~ так:
Code: Select all
: LPT-PAUSE ( t*10 -- )
\ Приостанавливет работу на t*10 миллисекунд
\ Прерывает паузу по слову LPT-SCREEN-BREAK
0 ?DO
  10 PAUSE
  lpt-break
IF
  RDROP LEAVE
THEN
LOOP ;


Code: Select all
: LPT-TYPE-PROGRESS ( n% w r c )
\ выводит "прогресс бар" из # в позицию r c
\ w - максимальная длина
\ n% - процент (0-100) от максимальной длины
LPT-AT
Z" ##################################################" SWAP DUP >R ROT 100 */ DUP R> SWAP - lpt-z-space SWAP S+ LPT-TYPE
;

Обрати внимание, в последнем моём посте выводятся ИМЕННО КВАДРАТИКИ, потому как вывод осущетсвляется через lpt-type1 без перекодировки!
Code: Select all
:NONAME
BEGIN
  DUP adr->3num LPT-AT ASCIIZ> LPT-TYPE
  50 LPT-PAUSE
  DUP adr->3num LPT-AT ASCIIZ>
  lpt-z-space SWAP LPT-TYPE DROP
  50 LPT-PAUSE
  lpt-break
UNTIL
DROP ; TASK: lpt-type-flash


Потоки лучше завершать корректно, либо по слову STOP, либо по TERMINATE.
Т.е. ~ так:
Code: Select all
:NONAME
BEGIN
  DUP adr->3num LPT-AT ASCIIZ> LPT-TYPE
  50 LPT-PAUSE
  DUP adr->3num LPT-AT ASCIIZ>
  lpt-z-space SWAP LPT-TYPE DROP
  50 LPT-PAUSE
  lpt-break
UNTIL
DROP
TERMINATE \ остановить текущий поток (удалить)
; TASK: lpt-type-flash
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: nnCron - LPT - LCD

Postby Dark_Jones » Fri, 05 Sep 2008, 11:39

Ilya wrote:Недопустимо определение LEAVE вне цикла (LPT-LEAVE), т.е. надо ~ так:
Code: Select all
: LPT-PAUSE ( t*10 -- )
\ Приостанавливет работу на t*10 миллисекунд
\ Прерывает паузу по слову LPT-SCREEN-BREAK
0 ?DO
  10 PAUSE
  lpt-break
IF
  RDROP LEAVE
THEN
LOOP ;

Я полагаю, что RDROP здесь уже будет лишним.... :wink:
А никак нельзя обойти это ограничение? Ну очень неудобно получается.

Ilya wrote:Обрати внимание, в последнем моём посте выводятся ИМЕННО КВАДРАТИКИ, потому как вывод осущетсвляется через lpt-type1 без перекодировки!

Да, не заметил 1. Попробую исправить.

Ilya wrote:Потоки лучше завершать корректно, либо по слову STOP, либо по TERMINATE.

Не знал. Думал, что потоки как и задачи сами завершаются. Кстати, а в задачах не надо писать TERMINATE?
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Dark_Jones » Fri, 05 Sep 2008, 19:02

Да, квадратики теперь выводятся.
Но крон ругается на слово TERMINATE.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Ilya » Fri, 05 Sep 2008, 19:33

Dark_Jones wrote:Да, квадратики теперь выводятся.
Но крон ругается на слово TERMINATE.

Николай компилируте Крон Фортом spf 3.75, а в spf 4.xx уже есть это слово:
Code: Select all
: TERMINATE ( -- )
  \ остановить текущий поток (удалить)
  DESTROY-HEAP
  -1 ExitThread
;
 

Может оно (останавливать так поток) и нафиг не нана !?
Кто его знает, что в этих "форточках" твориться.
Лучше перебздеть, чем недобздеть! :lol:

Не знал. Думал, что потоки как и задачи сами завершаются. Кстати, а в задачах не надо писать TERMINATE?

Задачи вроде не надо.
Мультитаск - дело такое. :?

А никак нельзя обойти это ограничение? Ну очень неудобно получается.

Наверняка есть, нана подумать.
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: nnCron - LPT - LCD

Postby Dark_Jones » Sat, 06 Sep 2008, 22:22

Остались только проблемы с неустойчивой работой:
- после включения из спящего режима пишет в лог: LCD-SCREEN: Внутренняя ошибка. Error # -1073741674;
- периодически вываливается и предлагает закрыть или отладить крон (это происходит после паузы в первом окне, где есть мерцание). В лог ничего не выводится (типа "старт ннкрон" и "загрузка кронтабов"), т.ч. скорее всего падает мультитаск мерцания;
- иногда после рестарта всей системы неправильно инициализирует индикатор и весь вывод ведётся только в первую строку, накладываясь друг на друга. Перезапуск крона не помогает. Помогает запуск и прибитие LCDSmartie.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby VoidVolker » Sun, 07 Sep 2008, 11:46

Я вот тут за вами давно наблюдаю - вот хочу подсказать, как сделать это все более простым и надежным, а также поделиться опытом(т.к. сам работаю с графикой). Предлагаю сделать только несколько базовых слов для работы с самим дисплеем (необходимый минимум):
LCD-EMIT ( char -- ) Печатать символ на дисплее в текущей позиции каретки (скажем за позицию каретки отвечает переменная LCD-CARET-POS)
\ Если дисплей монохромный
LCD-PIXEL-ON ( x y -- ) Включить в точке (x;y) пиксел
LCD-PIXEL-OFF ( x y -- ) Выключить в точке (x;y) пиксел
\ И если цветной
LCD-PIXEL ( x y color -- ) Рисовать в точке (x;y) пиксел цвета color
И вот уже на базе этих нескольких слов можно будет рисовать на дисплее все что угодно. Напрример:
Code: Select all
: LCD-CLS   ( -- )   \ Очистить дисплей
  LCD-HEIGTH 0 DO
    LCD-WIDTH 0 DO
      I J LCD-PIXEL-OFF 
      \ I J LCD-BG LCD-PIXEL  \ Для цветного, где LCD-BG - value-переменная содержащая цвет фона
    LOOP
  LOOP
;

: LCD-TYPE   ( a u -- )  \ Напечатать строку на дисплее
  LCD-CLS
  MAX-STR-LEN MIN  \ Применяем ограничение длины строки
  OVER + SWAP DO
    I C@ EMIT
  LOOP
;

А все ненужные слова спрятать в модуле.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2938
Joined: Tue, 25 Apr 2006, 17:56

Re: nnCron - LPT - LCD

Postby Dark_Jones » Sun, 07 Sep 2008, 12:05

У нас знакосинтезирующие дисплеи... Не уверен, что тут такой же подход как и к графическим. Хотя на будущее - возможно перейду на графический.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: nnCron - LPT - LCD

Postby Ilya » Sun, 07 Sep 2008, 12:27

VoidVolker wrote:Я вот тут за вами давно наблюдаю - вот хочу подсказать, как сделать это все более простым и надежным, а также поделиться опытом(т.к. сам работаю с графикой). Предлагаю сделать только несколько базовых слов для работы с самим дисплеем (необходимый минимум):
LCD-EMIT ( char -- ) Печатать символ на дисплее в текущей позиции каретки (скажем за позицию каретки отвечает переменная LCD-CARET-POS)
\ Если дисплей монохромный
LCD-PIXEL-ON ( x y -- ) Включить в точке (x;y) пиксел
LCD-PIXEL-OFF ( x y -- ) Выключить в точке (x;y) пиксел
\ И если цветной
LCD-PIXEL ( x y color -- ) Рисовать в точке (x;y) пиксел цвета color
И вот уже на базе этих нескольких слов можно будет рисовать на дисплее все что угодно. Напрример:
А все ненужные слова спрятать в модуле.


К сожалению данные LCD-индикаторы являются "знакосинтезирующими", т.е. не о каких пикселях речи быть не может! :(
А так спасибо за поддержку! :D
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests

cron