|
Here is some code for IR detection, with the help from Kekoa. However it
doesn't work. I know the hardware is all working because if I run minicom
and then run this programme and point the RCX at the lego tower junk appears on
the screen. If I take my TV remote and point it at the light sensor I get a
reading of about 235-250. However if I point the light sensor at the RCX I
don't get a higher reading and the sensor stays at about the value of 225.
Here's the send IR send and light sensor part.
int send_ir_data(void)
{
int result;
char *buffer="xxxxxxxxxx";
while (1) {
result = dir_write_nb(buffer,5);
msleep(100);
}
return 0;
}
int get_light_sensor(void)
{
ds_passive(&SENSOR_2);
while(1)
{
lcd_int(LIGHT_2);
lcd_refresh();
msleep(150);
}
return 0;
}
I've added this function (Non blocking IR send) into direct-ir.c (with the
help from Kekoa)
size_t dir_write_nb(void* const buf,size_t len) {
if(buf==NULL || len==0) // catch empty cases
return 0;
if(dir_tx_state != TX_OK) // Still sending
return 0;
dir_tx_read=buf; // what to transmit
dir_tx_end=buf+len;
dir_tx_verify=buf; // checks and balances
dir_tx_state=TX_ACTIVE;
T1_CR =0x09; // set up IR carrier
T1_CSR =0x13; // for transmission
T1_CORA=0x1a;
S_SR&=~(SSR_TRANS_EMPTY | SSR_TRANS_END); // clear flags
S_CR|=SCR_TRANSMIT | SCR_TX_IRQ | SCR_TE_IRQ; // enable
return len; // successful xmit
}
Any ideas anyone?
Phil
In lugnet.robotics.rcx.legos, Kekoa Proudfoot writes:
> Kekoa Proudfoot <kekoa@pixel.Stanford.EDU> wrote:
>
> > Do you mean dir_write? This is a problem with LegOS only. If you want
> > non-blocking writes, comment out (in version 0.1.7 at least):
> >
> > while(dir_tx_state==TX_ACTIVE)
> > ; // FIXME: scheduler integration
> > if(dir_tx_state==TX_OK)
> > return len; // successful xmit
> > return -1; // default is error
> >
> > And replace with:
> >
> > return len;
>
> I forgot to mention. At the top of dir_write, you probably want to add:
>
> if (dir_tx_state == TX_ACTIVE)
> return -1;
>
> Or something to that effect, so you don't transmit a second message while
> a first is still transmitting, and so you have a way of querying the
> whether or not the last transmission is still in flight (by sending a NULL
> message).
>
> Mind you, I haven't implemented any of this specifically, I am just drawing
> parallels between what LegOS implements and what I have implemented in an
> as-yet-unreleased future version of Librcx.
>
> -Kekoa
|
|
Message has 1 Reply: | | Re: Blocking IR
|
| Regarding your program. Try sending 0s, not xs, i.e.: char *buffer = "\0\0\0\0\0"; Zeros are coded with the IR on 91% of the time, while xs are coded with the IR on only 45% of the time, neglecting the modulation, which cuts that all down by half. (...) (25 years ago, 16-Jun-99, to lugnet.robotics.rcx.legos)
|
Message is in Reply To:
| | Re: Blocking IR
|
| (...) I forgot to mention. At the top of dir_write, you probably want to add: if (dir_tx_state == TX_ACTIVE) return -1; Or something to that effect, so you don't transmit a second message while a first is still transmitting, and so you have a way of (...) (25 years ago, 10-Jun-99, to lugnet.robotics.rcx.legos)
|
12 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|