work in progress
Experiment - work in progress...
RefRX.cpp
- Committer:
- MatteoT
- Date:
- 2013-07-20
- Revision:
- 5:444939b4790a
- Parent:
- 4:87d3a005c4de
File content as of revision 5:444939b4790a:
#include "RefRX.h" #define REFRX_THREAD_START 1 // /////static members bool RefRX::_initialized = false; Mutex RefRX::_refs_access; float RefRX::_ref1 = 0; float RefRX::_ref2 = 0; float RefRX::_ref3 = 0; float RefRX::_ref4 = 0; int RefRX::_listen_port = 0; int RefRX::_destination_control_port = 0; Thread* RefRX::_RX_thread = NULL; // /////end of static members bool RefRX::get (float &ref1, float &ref2, float &ref3, float &ref4) { if(!_initialized) return false; bool lock = _refs_access.trylock(); if(!lock) return false; ref1 = _ref1; ref2 = _ref2; ref3 = _ref3; ref4 = _ref4; _refs_access.unlock(); return true; } void RefRX::init (const int listen_port, const int destination_control_port, Thread & worker_thread) { if(_initialized) return; _listen_port = listen_port; _destination_control_port = destination_control_port; _RX_thread = &worker_thread; _initialized = true; _RX_thread->signal_set(REFRX_THREAD_START); } void RefRX::worker (void const *args) { _RX_thread->signal_wait(REFRX_THREAD_START); //Setup RX socket UDPSocket sock; sock.bind(_listen_port); Endpoint remote_endpoint; DigitalOut led3 (LED3); led3 = 1; Thread::wait(1000); //Start listeing loop while(1) { const float one_over_uint32_max = 2.3283064365386963e-10; uint32_t refs[] = { 0, 0, 0, 0}; const unsigned int refs_size = 4 * sizeof(refs[0]); //listen for the values char in_buffer[256]; int result = sock.receiveFrom(remote_endpoint, in_buffer, sizeof(in_buffer)); switch (result) { case -1: //TODO: memorize error without the following message. //printf("Failed to read from UDP Socket\n\r"); led3 = 0; break; case 0: // error ? led3 = 0; break; default: //socket.getRemoteEndpoint().getAddress().toString() //socket.getRemoteEndpoint().getPort()); //retrive and share refs (convert to float) std::memcpy(refs,in_buffer,refs_size); _refs_access.lock(); _ref1 = one_over_uint32_max * refs[0]; _ref2 = one_over_uint32_max * refs[1]; _ref3 = one_over_uint32_max * refs[2]; _ref4 = one_over_uint32_max * refs[3]; _refs_access.unlock(); led3 = 0; Thread::wait(100); led3 = 1; //respond /* if (!socket.getRemoteEndpoint().getAddress().isEmpty()) { buffer.write("OK\r\n",4); socket.send(buffer, socket.getRemoteEndpoint()); }*/ } Thread::yield(); } }