Exemple #1
0
/*****************************************************************************
* Function Name : test_dflash
* Description   : Write four different strings to a page in the data flash,
*                 then read them back and send their contents out over the
*                 radio. Bonus points if you can identify the film without
*                 reverting to the internet.
* Parameters    : type - The type field of the dflash test packet
*                 status - Status field of the dflash test packet (not yet used)
*                 length - The length of the payload data array
*                 data - not used
* Return Value  : success indicator - 0 for failed, 1 for succeeded
*****************************************************************************/
unsigned char test_dflash(unsigned char type, unsigned char status,
                          unsigned char length, unsigned char* data)
{
    MacPacket packet;
    Payload pld;

    char mem_data[256] = {};

    //char* str1 = "You must be here to fix the cable.";  // 38+1
    char str1[] = "D";  // 38+1
    char str2[] = "Lord. You can imagine where it goes from here.";  //46+1
    char str3[] = "He fixes the cable?"; //19+1
    char str4[] = "Don't be fatuous, Jeffrey."; //26+1
    int  page  = 0x100;

    strcpy(mem_data, str1);
    strcpy(mem_data + strlen(str1), str2);
    strcpy(mem_data + strlen(str1) + strlen(str2), str3);
    strcpy(mem_data + strlen(str1) + strlen(str2) + strlen(str3), str4);

    // Write into dfmem
    dfmemWrite((unsigned char *)(mem_data), sizeof(mem_data), page, 0, 1);

    // ---------- string 1 -----------------------------------------------------
    // Get a new packet from the pool
    packet = radioRequestPacket(strlen(str1));
    if(packet == NULL) return 0;
    //macSetDestAddr(packet, RADIO_DEST_ADDR);

    // Prepare the payload
    pld = packet->payload;
    paySetStatus(pld, STATUS_UNUSED);
    paySetType(pld, type);

    // Read out dfmem into the payload
    dfmemRead(page, 0, strlen(str1), payGetData(pld));

    // Enqueue the packet for broadcast
    radioEnqueueTxPacket(packet);

    // ---------- string 2 -----------------------------------------------------
    // Get a new packet from the pool
    packet = radioRequestPacket(strlen(str2));
    if(packet == NULL) return 0;
    //macSetDestAddr(packet, RADIO_DEST_ADDR);

    // Prepare the payload
    pld = packet->payload;
    paySetStatus(pld, STATUS_UNUSED);
    paySetType(pld, type);

    // Read out dfmem into the payload
    dfmemRead(page, strlen(str1), strlen(str2), payGetData(pld));

    // Enqueue the packet for broadcast
    radioEnqueueTxPacket(packet);

    // ---------- string 3 -----------------------------------------------------
    // Get a new packet from the pool
    packet = radioRequestPacket(strlen(str3));
    if(packet == NULL) return 0;
    //macSetDestAddr(packet, RADIO_DEST_ADDR);

    // Prepare the payload
    pld = packet->payload;
    paySetStatus(pld, STATUS_UNUSED);
    paySetType(pld, type);

    // Read out dfmem into the payload
    dfmemRead(page, strlen(str1) + strlen(str2), strlen(str3),
              payGetData(pld));

    // Enqueue the packet for broadcast
    radioEnqueueTxPacket(packet);

    // ---------- string 4 -----------------------------------------------------
    // Get a new packet from the pool
    packet = radioRequestPacket(strlen(str4));
    if(packet == NULL) return 0;
    //macSetDestAddr(packet, RADIO_DEST_ADDR);

    // Prepare the payload
    pld = packet->payload;
    paySetStatus(pld, STATUS_UNUSED);
    paySetType(pld, type);

    // Read out dfmem into the payload
    dfmemRead(page, strlen(str1) + strlen(str2) + strlen(str3), strlen(str4),
              payGetData(pld));

    // Enqueue the packet for broadcast
    radioEnqueueTxPacket(packet);

    return 1; //success
}
//Callback function when imageproc receives tactile command from radio
void handleSkinRequest(unsigned char length, unsigned char *frame, unsigned int src_addr) {
    tactile_src_addr = src_addr;
    rx_idx = frame[0];
    //unsigned char tempframe[TACTILE_ROWS * TACTILE_COLS * 2 + 1];
    //static unsigned char tempframe[100];
    //buffer = tempframe;
    buffer_length = 0;
    expected_length = 2;
    int i;
    switch (rx_idx) {
        case TACTILE_MODE_G: //query number of rows and columns
            sendTactileCommand(length, frame);
            /*
            //TACTILE_ROWS = 0x00;
            //TACTILE_COLS = 0x00;
            buffer_length = 4;
            //expected_length = 3;
            buffer[0] = rx_idx;
            buffer[1] = 0x02;
            buffer[2] = TACTILE_ROWS;
            buffer[3] = TACTILE_COLS;
            setRXFlag();
            //buffer = rowcol;
            //buffer = tempframe;*/
            break;
        case TACTILE_MODE_A: //sample individual pixel
            sendTactileCommand(length,frame);
            break;
        case TACTILE_MODE_B: //sample frame
            sendTactileCommand(length,frame);
            break;
        case TACTILE_MODE_C: //poll pixel
            sendTactileCommand(length,frame);
            break;
        case TACTILE_MODE_E: //start scan
            sendTactileCommand(length,frame);
            break;
        case TACTILE_MODE_F: //stop scan
            rx_idx = TACTILE_RX_IDLE;
            sendTactileCommand(length,frame);
            break;
        case TACTILE_MODE_S: //turn streaming on or off
            streaming = frame[1];
            unsigned char temp[3] = {rx_idx,1,streaming};
            radioSendData(tactile_src_addr, 0, CMD_TACTILE, sizeof(temp), temp, 0);
            rx_idx = TACTILE_RX_IDLE;
            break;
        case TACTILE_MODE_T: //test frame
            buffer_length = 0;
            expected_length = max_buffer_length;
            //buffer = tempframe;
            sendTactileCommand(length,frame);
            break;
        case TACTILE_MODE_L: //load force-torque calibration parameters
            Nop();
            float temp_f[6];
            memcpy(temp_f,&frame[2],6*sizeof(float));
            int n_ind;
            for (n_ind = 0; n_ind < 6; n_ind++) {
                N[n_ind][frame[1]] = temp_f[n_ind]; //frame[1] indicates index [0-ROWS*COLS*3)
            }
            //char* test3 = (char*)&temp_f;
            //unsigned char temp1[6] = {rx_idx,sizeof(float),test3[0],test3[1],test3[2],test3[3]};
            //radioSendData(tactile_src_addr, 0, CMD_TACTILE, sizeof(temp1), temp1, 0);
            
            
            rx_idx = TACTILE_RX_IDLE;
            break;
        case 'Y': //write N to dfmem
            dfmemGetGeometryParams(&mem_geo);
            int N_pages = (sizeof(N)/mem_geo.bytes_per_page) + 1; //how many pages needed to hold N
            //for (i = N_pages; i > 0; i--) {
            //    dfmemWrite(N + mem_geo.bytes_per_page*(N_pages-i),i > 1 ? mem_geo.bytes_per_page : sizeof(N)-mem_geo.bytes_per_page*(N_pages-1) ,mem_geo.max_pages-i,0,0);
            //}
            dfmemWrite(N,sizeof(N),mem_geo.max_pages-1,0,0);
            rx_idx = TACTILE_RX_IDLE;
            break;

        case 'Z': 
            /*//read N from dfmem
            dfmemGetGeometryParams(&mem_geo);
            int N_pages1 = (sizeof(N)/mem_geo.bytes_per_page) + 1; //how many pages needed to hold N
            //for (i = N_pages1; i > 0; i--) {
            //    dfmemRead(mem_geo.max_pages-i, 0, i > 1 ? mem_geo.bytes_per_page : sizeof(N)-mem_geo.bytes_per_page*(N_pages1-1), N + mem_geo.bytes_per_page*(N_pages1-i));
            //}
            dfmemRead(mem_geo.max_pages-1, 0, sizeof(N), N);
            */
            rx_idx = TACTILE_RX_IDLE;
            /*DisableIntT1;
            int pwm = frame[1]+(frame[2]<<8);
            tiHSetDC(1,pwm);*/
            
            //zero forces
            if (zeroForces == 0) {
                zeroForces = 1;
            }
            
            break;
        default:
            sendTactileCommand(length,frame);
            break;
    }
    //blocking wait for skinproc to answer
    /*while (buffer_length < expected_length) {
        Nop();
    }
    handleSkinData(buffer_length, buffer);
    rx_idx = TACTILE_RX_IDLE;*/
}