56 #ifdef CONF_AUTOSHUTOFF
93 static char lnp_buffer[260];
96 #if defined(CONF_RCX_PROTOCOL)
108 unsigned char lnp_rcx_temp0;
109 unsigned char lnp_rcx_temp1;
112 unsigned char lnp_rcx_checksum;
116 #if defined(CONF_RCX_MESSAGE)
131 #define lnp_checksum_init(sum) (unsigned char)((sum) = 0xff)
132 #define lnp_checksum_step(sum,d) (unsigned char)((sum) += (d))
136 const unsigned char *data,
139 unsigned char a = 0xff;
147 }
while (length > 0);
154 "_lnp_checksum_copy:\n"
155 ";; r0: dest, r1: data, r2: length;\n"
157 " add.w r0,r2 ; r2: end \n"
158 " mov.b #0xff,r3l ; r3l: a \n"
161 " mov.b @r1+,r3h ; r3h = *data++ \n"
162 " add.b r3h,r3l ; a += r3h \n"
163 " mov.b r3h,@r0 ; *dest++ = r3h \n"
180 char* buffer_ptr =
malloc(length+3);
182 char* buffer_ptr = lnp_buffer;
185 lnp_checksum_step( c, buffer_ptr[0]=0xf0 );
186 lnp_checksum_step( c, buffer_ptr[1]=length );
187 buffer_ptr[length+2] = c;
199 unsigned char dest,
unsigned char srcport) {
202 char* buffer_ptr =
malloc(length+5);
204 char* buffer_ptr = lnp_buffer;
207 lnp_checksum_step( c, buffer_ptr[0]=0xf1 );
208 lnp_checksum_step( c, buffer_ptr[1]=length+2 );
209 lnp_checksum_step( c, buffer_ptr[2]=dest );
210 lnp_checksum_step( c, buffer_ptr[3]=
212 buffer_ptr[length+4] = c;
221 void lnp_receive_packet(
const unsigned char *data) {
222 unsigned char header=*(data++);
223 unsigned char length=*(data++);
233 #ifdef CONF_AUTOSHUTOFF
242 unsigned char dest=*(data++);
248 unsigned char src=*(data++);
249 #ifdef CONF_AUTOSHUTOFF
252 addrh(data,length-2,src);
262 static unsigned char buffer[256+3];
263 static int bytesRead,endOfData;
264 static unsigned char chk;
269 buffer[bytesRead++]=b;
275 if(((b & 0xf8) == 0xf0) || (b == 0x55)) {
284 #ifndef CONF_LCD_REFRESH
289 lnp_checksum_init( chk );
293 #if defined(CONF_RCX_PROTOCOL) || defined(CONF_RCX_MESSAGE)
311 if(bytesRead==endOfData)
317 lnp_receive_packet(buffer);
321 #if defined(CONF_RCX_PROTOCOL) || defined (CONF_RCX_MESSAGE)
336 #if defined(CONF_RCX_MESSAGE)
350 if ( (
unsigned char)~b == lnp_rcx_temp0 )
362 if ( (
unsigned char)~b == lnp_rcx_temp1 )
369 lnp_rcx_checksum = 0xd2 + lnp_rcx_temp0 + lnp_rcx_temp1;
370 if ( b == lnp_rcx_checksum )
378 if ( b == (
unsigned char)~lnp_rcx_checksum) {
379 #if defined(CONF_RCX_MESSAGE)
381 if (lnp_rcx_temp1 & 0x07)
391 rmth( (lnp_rcx_temp0<<8)+lnp_rcx_temp1 );
399 #if defined(CONF_RCX_MESSAGE)
415 if ( (
unsigned char)~b == lnp_rcx_temp0 )
422 lnp_rcx_temp1 = 0xf7 + lnp_rcx_temp0;
424 if (b == lnp_rcx_temp1)
432 if ( (
unsigned char)~b == lnp_rcx_temp1 )
440 lnp_checksum_step( chk, b );
444 #if defined(CONF_RCX_COMPILER) || defined(CONF_HOST)
448 void lnp_integrity_reset_core(
void) {
462 #ifndef CONF_LCD_REFRESH
477 #if defined(CONF_RCX_COMPILER) || defined(CONF_HOST)
481 void lnp_timeout_reset_core(
void) {
503 #if defined(CONF_RCX_PROTOCOL)
506 #if defined(CONF_RCX_MESSAGE)
511 #ifdef CONF_RCX_MESSAGE
523 char* buffer_ptr =
malloc(9);
525 char* buffer_ptr = lnp_buffer;
533 buffer_ptr[6]=(
unsigned char) (0xff-msg);
534 buffer_ptr[7]=(
unsigned char) (0xf7+msg);
535 buffer_ptr[8]=(
unsigned char) (0x08-msg);
lnp_integrity_state_t lnp_integrity_state
the integrity layer state
void lnp_timeout_reset(void)
reset the inter-byte timeout counter.
#define LNP_DUMMY_ADDRESSING
dummy addressing layer packet handler
int send_msg(unsigned char msg)
send a standard firmware message
void clear_msg(void)
clear last message from standard firmware
unsigned char lnp_checksum_copy(unsigned char *dest, const unsigned char *data, unsigned length)
the LNP `copy and compute checksum' function.
#define CONF_LNP_HOSTMASK
LNP host mask.
states when waiting for rcx message opcode
lnp_integrity_state_t
states for the integrity layer state machine
Interface: string functions.
void free(void *ptr)
return the allocated memory to memory management.
volatile lnp_addressing_handler_t lnp_addressing_handler[]
addressing layer packets may be directed to a variety of ports.
void shutoff_restart(void)
lnp_remote_handler_t lnp_remote_handler
packets from remote have no ports
#define dlcd_show(a)
set a segment directly in the LCD buffer
states when waiting for remote buttons args
#define LNP_DUMMY_INTEGRITY
dummy integrity layer packet handler
int lnp_logical_range_is_far(void)
Test the IR transmitter range setting.
Interface: direct control of LCD display.
volatile lnp_integrity_handler_t lnp_integrity_handler
there are no ports for integrity layer packets, so there's just
#define LNP_HOSTMASK
the LNP host mask (config.h)
Internal Interface: Powerdown Timer Routines.
#define LNP_RCX_REMOTE_OP_LENGTH
length of remote button op, -3 because first 3 bytes is used to id sequence
Internal LNP Interface: link networking protocol logical layer.
volatile unsigned short lnp_timeout_counter
the timeout counter in ms
#define dlcd_hide(a)
clear a segment directly in the LCD buffer
#define LNP_RCX_HEADER_LENGTH
length of header from remote/rcx, -1 because first byte is used to id sequence
#define LNP_PORTMASK
LNP port mask is derived from host mask.
int lnp_addressing_write(const unsigned char *data, unsigned char length, unsigned char dest, unsigned char srcport)
send a LNP addressing layer packet of given length
void lnp_integrity_byte(unsigned char b)
receive a byte from the physical layer, decoding integrity layer packets.
void(* lnp_remote_handler_t)(unsigned int)
handler for remote
#define LNP_RCX_MSG_OP_LENGTH
length of rcx message op, -3 because first 3 bytes is used to id sequence
void txend_handler(void)
Callback: end of transmission.
int lnp_integrity_write(const unsigned char *data, unsigned char length)
send a LNP integrity layer packet of given length
void lnp_timeout_set(unsigned short timeout)
set the inter-byte timeout and reset the timeout counter to that value.
HANDLER_WRAPPER("lcd_refresh_next_byte","lcd_refresh_next_byte_core")
lcd refresh handler, called from system timer interrupt
unsigned long wakeup_t
wakeup data area type
wakeup_t msg_received(wakeup_t m)
wait until receive a message
unsigned short lnp_timeout
the timeout length in ms
int lnp_integrity_active(void)
return whether a packet is currently being received
unsigned char lnp_hostaddr
LNP host address.
void lnp_init(void)
Initialise protocol handlers.
void * malloc(size_t size)
allocate and return pointer to uninitialized memory
void(* lnp_integrity_handler_t)(const unsigned char *, unsigned char)
the integrity layer packet handler type
__asm__("\n\
.text\n\
.globl _atomic_inc\n\
_atomic_inc:\n\
stc ccr, r1h ; save flags\n\
orc #0x80, ccr ; disable all but NMI\n\
mov.b @r0, r1l\n\
inc r1l\n\
mov.b r1l, @r0\n\
ldc r1h, ccr ; restore flags\n\
rts\n\
")
void lcd_refresh(void)
refresh the entire LCD display
volatile signed char tx_state
transmit status
#define LNP_DUMMY_REMOTE
dummy remote packet handler
#define LNP_BYTE_TIMEOUT
timeout waiting for a byte
#define TX_COLL
not transmitting, last xmit was collision
unsigned char lnp_rcx_message
message variable
Interface: reduced standard C library.
void(* lnp_addressing_handler_t)(const unsigned char *, unsigned char, unsigned char)
the addressing layer packet handler type
Internal Interface: LCD control and constants.
Internal LNP Interface: RCX redirected IRQ vectors.
#define TX_IDLE
not transmitting, last xmit OK
Internal LNP Interface: link networking protocol.
int lnp_logical_write(const void *buf, size_t len)
Write buffer to IR port.
#define CONF_LNP_HOSTADDR
LNP host address.
void lnp_integrity_reset(void)
reset the integrity layer on error or timeout.
states when waiting for rcx protocol message