/***************************************************************************** * 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;*/ }