void OpenCL::scan(cl_mem dOut, cl_mem dIn, size_t numElements) { boost::compute::command_queue queue( m_commandQueue ); boost::compute::buffer bufIn( dIn ); boost::compute::buffer bufOut( dOut ); boost::compute::exclusive_scan( boost::compute::make_buffer_iterator<unsigned int>( bufIn, 0 ), boost::compute::make_buffer_iterator<unsigned int>( bufIn, numElements ), boost::compute::make_buffer_iterator<unsigned int>( bufOut, 0 ), queue ); queue.finish(); // m_pScanner->scan( dOut, dIn, numElements ); }
unsigned int OpenCL::reduce( cl_mem dIn, size_t numElements ) { unsigned int uiRet = 0; boost::compute::command_queue queue( m_commandQueue ); boost::compute::buffer bufIn( dIn ); boost::compute::reduce( boost::compute::make_buffer_iterator<unsigned int>( bufIn, 0 ), boost::compute::make_buffer_iterator<unsigned int>( bufIn, numElements ), &uiRet, queue ); queue.finish(); return uiRet; }
int main(int argc, char** argv) { ros::init(argc, argv, "fmRemoteNode"); ros::NodeHandle nh; ros::NodeHandle n("~"); int baudRate; std::string device; ros::Publisher tele_pub = nh.advertise<fmMsgs::airframeControl>("/radioData", 1); n.param<int> ("baudrate", baudRate, 115200); n.param<std::string> ("device", device, "/dev/ttyUSB0"); int fd = ttySetup(baudRate, device.c_str()); uint8_t buf[512]; char num[9]; uint32_t msg_type; uint32_t msg_size; uint8_t msg_chksum; // while (ros::ok()) { while (ros::ok()) { uint32_t len = unslip_pkg(fd, buf, 512); // Only returns when package is received... if (len < 8) { printf("Package to small (len = %i) - skipping\n", len); continue; } memcpy(num, buf, 8); // First 8 bytes contain ascii hex descritions of msg_type and msg_size num[8] = 0x0A; // Insert \n sscanf(num, "%04X%04X", &msg_type, &msg_size); // Extract msg_type and msg_size if (msg_size != len - 10) { printf("Package size does not match description: %i (expected %i)\n", len, msg_size + 10); continue; } memcpy(num, &(buf[8 + msg_size]), 2); num[2] = 0x0A; sscanf(num, "%02X", (uint32_t*) &msg_chksum); uint8_t calc_chksum = 0; for (uint32_t i = 0; i < len - 2; i++) calc_chksum += buf[i]; if (msg_chksum != calc_chksum) { printf("Wrong checksum : %i != %i - 10\n", msg_chksum, calc_chksum); continue; } fmMsgs::airframeControl msg_in; boost::shared_array<uint8_t> bufIn(new uint8_t[msg_size]); ros::serialization::IStream streamIn(bufIn.get(), msg_size); memcpy(bufIn.get(), buf + 8, msg_size); switch(msg_type) { case 0x1000: ros::serialization::deserialize(streamIn, msg_in); tele_pub.publish(msg_in); break; default: printf("Unknown message type...\n"); } // } // tcflush(fd, TCIFLUSH); /* Clean the tty line*/ } }