I'm using an explorerkit and I'm running 1 function to check button inputs by masking the appropriate bits from the 4 bit port and it's correctly identifying a button press(verified using printf()), but the other end of the interface(a [[notification]]) never seems to be called. It's similar in set up to the gpio library.
I check the buttons port on tile[0] using a server task, and the client receives a notification when appropriate. I ran the same code I'm using completely isolated and it worked with the server on tile[0].core[0] and client on tile[1].core[0]. On the actual program the server runs on tile[0].core[3] and the client is running on tile[1].core[0]. I've stopped all other tasks on tile 1 and still get nothing. The task that gets the notification has 13 interfaces being passed into it though with 11 of those from tile 1 to tile 0. If I have to I can write another function and define an interface to control it all across tiles using a single interface(should be 1 channel then? I'm not clear on this) but I don't have time right now. I'm well within the tile constraints but I wasn't sure if there was another unwritten limit that's causing my issue.
Code: Select all
/*
 * Slash RC car.xc
 *
 *  Created on: May 20, 2016
 *      Author: Maginnovision
 */
#include <gpio.h>
#include "Interfaces.h"
#include "Ports.h"
#include "ThreadDefinitions.h"
int main() {
    //Interfaces for reading/writing PWM values
    controller_if steering, motor;
    //Interfaces for wheel speed data
    wheel_speed_if leftwheel, rightwheel;
    wheel_handler_if wheels;
    //Interfaces for I2C interfaces
    i2c_master_if imu_i2c[1];
    i2c_slave_callback_if rpi_slave;
    path_follower_if path_following[3];
    path_follower_data_if path_data;
    datalogger_if datalogger;
    datalogger_pathing_if datalogger_pathdata;
    imu_if imu[3];
    input_gpio_if button_if[2];
    output_gpio_if led_if[4];
    par {
        //ESC PWM
        on tile[0].core[0]: read_pwm(motor_input, motor, path_following[0], 0);
        on tile[0].core[0]: write_pwm(motor_output, motor);
        //Steering servo PWM
        on tile[0].core[0]: read_pwm(steering_input, steering, path_following[1], 1);
        on tile[0].core[0]: write_pwm(steering_output, steering);
        on tile[0].core[0]: read_toggle(red_toggle, path_following[2]);
        //IMU server and I2C master
        on tile[0].core[1]: IMU(imu_i2c[0], imu);
        on tile[0]: i2c_master(imu_i2c, 1, imu_scl, imu_sda, 400);
        //Datalogging threads
        on tile[0].core[2]: Datalogger(rpi_slave, datalogger, datalogger_pathdata);
        on tile[0]: i2c_slave(rpi_slave, rpi_scl, rpi_sda, 0x11);
        //Button handler and led handler
        on tile[0].core[3]: input_gpio_with_events(button_if, buttons_port);
        on tile[0].core[4]: output_gpio(led_if, 4, leds_port, null);
        on tile[1].core[0]: path_follower(path_following, imu[2], wheels, datalogger, path_data,
                led_if[0], led_if[1], led_if[2], led_if[3], button_if[0], button_if[1]);
        on tile[1]: pathing_data(path_data, datalogger_pathdata);
        //Wheel speed threads and higher level handler
        on tile[1].core[1]: wheel_speed(left_wheel_a, left_wheel_b, leftwheel, imu[0]);
        on tile[1].core[2]: wheel_speed(right_wheel_a, right_wheel_b, rightwheel, imu[1]);
        on tile[1].core[3]: wheels_handler(leftwheel, rightwheel, wheels);
    }
    return 0;
}
Code: Select all
[[combinable]]
 void input_gpio_with_events(server input_gpio_if i[2], in port p)
{
    unsigned pval = 0, last_pval = 0;
    p :> pval;
    while (1) {
        select {
        case i[int j].input() -> unsigned result: {
            result = (pval >> j) & 1;
            break;
        }
        case i[int j].event_seen(): {
            delay_milliseconds(50);
            break;
        }
        case p when pinsneq(pval) :> last_pval: {
            if ((pval & 0x01) != (last_pval & 0x01) && (pval & 0x01)) i[0].event();
            if ((pval & 0x02) != (last_pval & 0x02) && (pval & 0x02)) i[1].event();
            pval = last_pval;
            break;
        }
        }
    }
}Code: Select all
 case button1.event(): {
            button1.event_seen();
            current->manual = !current->manual;
            led_green.output(current->manual);
            robot[0].button();
            robot[1].button();
            break;
        }
        case button2.event(): {
            button2.event_seen();
            ++rgbled;
            rgbled_red.output(0); rgbled_green.output(0); rgbled_blue.output(0);
            if (rgbled == 1) rgbled_red.output(1);
            if (rgbled == 2) rgbled_green.output(1);
            if (rgbled == 3) rgbled_blue.output(1);
            if (rgbled == 4) {rgbled = 0; rgbled_red.output(0); rgbled_green.output(0); rgbled_blue.output(0);}
            break;
        }