diff --git a/TODO b/TODO deleted file mode 100644 index 7cd3fdf..0000000 --- a/TODO +++ /dev/null @@ -1,219 +0,0 @@ -* Global - -- Known bugs - ° Valgrind / libconfuse bugs (Listener & Aggregator): - . http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=639074 - . http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=639115 -- Handle the aggregation format version - In the aggregation files, a version number describing the file format - should be added (as the 2nd field, right after the client's MAC - address). That would allow the positioning server to handle several - formats instead of just the last version. -- Check the size of the received packets to avoid buffer overflows. -- Use select(2) or poll(2) - Using polling for sockets would avoid setting up some threads, - especially the autocalibration threads in the Listener, - i.e. autocalibrate() and autocalibrate_hello(), and listen_for_aps() - in the Aggregator. - See also select_tut(2). -- Option -V should tell if DEBUG is enabled or not. -- Eliminate remaining exit() calls to avoid memory leaks on exit. -- Use atexit() / on_exit() instead of goto to clean at exit? -- Add option dump-configuration (displays the config & exits). -- Makefiles: - ° Use intall instead of cp? - ° Merge Makefile and Makefile_atheros*. Use template makefiles, - autohell, cmake…? -- Support string-based positioning requests - Along with the binary requests, implement a string-based request - format. Each packet will contain a CSV string describing the - request's information. This will make easier to develop clients in - other languages than C and over other protocols than UDP. -- Mark arguments as const in function headers if needed - Mostly done in the Positioner C++ code (which should be checked - though), but not constantly in C modules. - [Done in libowlps & libowlps-client.] -- Allow to use hostnames instead of IP addresses in all modules - getaddrinfo(3) (or gethostbyname(3)) should be used when opening - sockets in libowlps, then string buffer size have to be adapted in - all modules to be able to contain a long hostname. -- Use struct ether_addr to store MAC addresses? - We could use the struct ether_addr to store binary MAC addresses, - and convert them to strings with ether_ntoa() instead of - owl_mac_bytes_to_string(). See ether_aton(3). - - -* libowlps - -- Use stdbool.h instead of #define owl_bool. -- Currently unused functions: - ° owl_timestamp_is_null() - - -* Aggregator - -- Flush the requests' list when exiting. -- Rename ap_check_interval to something more meaningful - Something like autocalibration_order_interval. -- Test for the maximum verbose level. -- -o should be optional. -- Add an option to (not) flush the output file. -- Outputs should include all the timestamps - The CSV output file and the socket should include the capture - timestamp and the reception timestamp on the aggregator. This would - help the Positioner's --replay option (to be adapted to use the - aggregation time instead of the request time). -- Allow a different aggregation timeout for each request type. -- Refactoring: - ° monitor_requests() - ° got_request() -- Use the type of a request to identify it? - (along with the mobile MAC address and the request time) -- got_request(): option for the maximal difference time - For implicit packets, we consider that packets from the same MAC - and received within an interval of 10ms are part of the same - request. We should define an option to allow user to choose the - time he wants. - - -* Listener - -- Known bugs: - ° On OpenWrt Backfire (10.03), when the program is statically linked, - using both -D and -A at the same time makes the program to block on - the first thread. This is a known issue of uClibc: - https://dev.openwrt.org/ticket/4809 - ° With autocalibration on, all the APs declared in listeners.csv must - be in coverage or the reference points will not be generated. -- Better handling of retried packets - Currently we ignore any packet with the Retry bit. This can lead to - completely ignore the given packet (or even request) if the original - packet is never received, which can happen under certain - circumstances. -- Refactor and review read_packet(). -- Handle better the configuration file reading - Get rid of the "Cannot open configuration file" error, in quiet - mode and when the default configuration file has to be used (no - file specified by the user with -f). -- Filter the number of implicit packets per mobile? - Currently, in passive or mixed mode, *all* the received packets are - transmitted to the aggregator. -- Option "read-only autocalibration"? - Listen for autocalibration requests without sending requests. -- read_packet(): use ieee80211_header_size for all implicit packets - Currently the size is corrected only for data packets. -- BSD port - http://www.unixgarden.com/index.php/programmation/introduction-a-la-programmation-wifi-en-c-sous-netbsd -- Use the "official" radiotap parser? (Expat license) - http://git.sipsolutions.net/?p=radiotap.git - - -* Client - -- Add verbose & quiet options. -- Log sent requests? -- Allow to use a string for the direction? - Could be nice, but probably useless. - - -* UDP to HTTP - -- Command-line options (port numbers, -v/-q, -h, -V). -- Delete inactive clients after a given amount of time. -- Refactor prepare_answer(). - - -* Positioner - -- Known bugs - ° Cannot compute the error (Real) for autocalibration requests. - ° Unit tests are currently unmaintained. Do not try to run them. - -- Algorithms - ° Add to the result the information "area error" (whether on not the - computed result is in the same room as the real position). - ° Handle the power and antenna gain difference between the - calibration mobile (or pseudo-mobile, for autocalibration) and the - mobile to position. - ° MinMax: add option to set the step (and use a different step for X, - Y and Z?). - ° MinMax: reduce the research space as proposed by F. Lassabe (PhD - report, Fig. 2.6 p. 38 and explanations pp. 38-39). - -- Autocalibration - ° Allow to generate a list of reference points instead of using a - regular meshing. - ° Generate reference points in 3D. - ° To select the reference APs, we should use the distance along with - the angle and coverage. - ° Handle 2 APs, not only >2 APs. - ° Find why some CalibrationRequest were not deleted when - calling Stock::delete_calibration_request() (via - ReferencePoint::delete_requests()). - ° Option z-level-number: the Z coordinate represents the number of - the building's level. If unactivated, the topology is used to - determine a change of level. - ° Generated CalibrationRequest have always nb_packets == 1. It is - tricky to set a number of packets for generated requests, since the - APs can transmit a different number of packets in their - autocalibration requests. A solution could be to use the biggest - number amongst the reference autocalibration requests used. A simpler - solution could be to assume that all the APs transmit the same number - of packets. - -- Refactoring - ° Split Stock::generate_reference_point() into several functions. - ° Write a class for Request::type? - CalibrationRequest::direction uses a dedicated class Direction, why - not Request::type? That would simplify writing of the type to - streams (no need to cast each time anymore). - ° Wi-Fi devices' list - . Merge Stock::mobiles & Stock::aps? - . Factorise AccessPointsReaderCSV & MobilesReaderCSV? - ° Members renaming - . InputMedium: - . - current_line_nb & get_current_line_nb() - . - get_next_request() −> read_next_request() - . Input: get_next_request() −> read_next_request() - . Area: p_min et p_max −> coord_min et coord_max - -- User interface - ° When reading the APs, add them to the mobiles' list (or another - way to be able to have a single entry for an AP). - ° Add option positioning.self-calibrate (or autocalibrate), short - option -A, to activate automatically the options needed by the - autocalibration. - ° Improve --verbose (and/or debug level): print the options, etc. - ° Case-insensitive string comparison (for algorithm names, etc.). - ° Use a prefix for configuration files (search for config files set - with relative path in owlps-positioner.cfg in the same directory). - -- Optimisation & code improvement - ° Multithreading: - . algorithms (parallelize computation of the different algorithms - for the same request); - . and/or requests (parallelize computation of several requests). - It would be possible (overkill?) to have a group of worker threads - and a job queue. - ° ReferencePoint: the request list should be an unordered_set - instead of a vector, to guarantee the unicity of the elements. - ° Pre-allocate vectors' memory with reserve(). - "C++ en action", p. 217. - ° Copy of containers to streams (in some operator<<() for - instance). - "C++ en action", p. 275. - ° Review all the classes to respect principles exposed in "Coder - proprement", chapter 6, p. 103: do not implement accessors for each - class attribute, etc. - -- Unit tests - ° Update (rewrite?) tests. - ° Unfinished tests: - . InputDataReader - . Input - . Output - . Positioning - ° Test InterlinkNetworks::compute() ? - ° Timestamp: there is a probability of 10^-6 that the value in - nanoseconds and the rounded value in milliseconds are identical, in - which case some tests can fail. diff --git a/TODO.t2t b/TODO.t2t new file mode 100644 index 0000000..f9c72a1 --- /dev/null +++ b/TODO.t2t @@ -0,0 +1,360 @@ +Work to do in OwlPS +(that is quite a few) + + + + += Documentation = + +- Generalise the use of Doxygen, at least in the libraries. + +- Topics to write on: + - Architecture + - Deployment + - General user manual (common command-line options, etc.) + - Per module user manual (manpages) + + + + += Global = + +- Known bugs: + - Valgrind / libconfuse bugs (Listener & Aggregator): + - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=639074 + - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=639115 + +- Handle the aggregation format version + + In the aggregation files, a version number describing the file format + should be added (as the 2nd field, right after the client's MAC + address). That would allow the positioning server to handle several + formats instead of just the last version. + +- Add a library to parse aggregation files, handling the different + formats ? + + It could be used by Positioner and external programs. + +- Check the size of the received packets to avoid buffer overflows. + +- Use select(2) or poll(2) + + Using polling for sockets would avoid setting up some threads, + especially the autocalibration threads in the Listener, i.e. + autocalibrate() and autocalibrate_hello(), and listen_for_aps() in the + Aggregator. + + See also select_tut(2). + +- Option -V should tell if DEBUG is enabled or not. + +- Eliminate remaining exit() calls to avoid memory leaks on exit. + +- Use atexit() / on_exit() instead of goto to clean at exit? + +- Add option dump-configuration (displays the config & exits). + +- Makefiles: + - Use install instead of cp? + - autotools, cmake? + +- Support string-based positioning requests + + Along with the binary requests, implement a string-based request + format. Each packet will contain a CSV string describing the request's + information. This will make easier to develop clients in other + languages than C and over other protocols than UDP. + +- Mark arguments as const in function headers if needed + + Mostly done in the Positioner C++ code (which should nonetheless be + checked), but not constantly in C modules. + //Done in libowlps & libowlps-client.// + +- Allow to use hostnames instead of IP addresses in all modules + + getaddrinfo(3) (or gethostbyname(3)) should be used when opening + sockets in libowlps, then string buffer size have to be adapted in all + modules to be able to contain a long hostname. + +- Use struct ether_addr to store MAC addresses? + + We could use the struct ether_addr to store binary MAC addresses, and + convert them to strings with ether_ntoa(3) instead of + owl_mac_bytes_to_string(). + +- Handle IPv6. + + + + += libowlps = + +- Use stdbool.h instead of #define owl_bool. + +- Currently unused functions: + - owl_timestamp_is_null() + + + + += Aggregator = + +- Flush the requests' list when exiting. + +- Rename ap_check_interval to something more meaningful + (something like autocalibration_order_interval). + +- Test for the maximum verbose level. + +- -o should be optional. + +- Add an option to (not) flush the output file. + +- Outputs should include all the timestamps + + The CSV output file and the socket should include the capture + timestamp and the reception timestamp on the Aggregator. This would + help the Positioner's --replay option (to be adapted to use the + aggregation time instead of the request time). + +- Allow a different aggregation timeout for each request type. + +- Refactoring: + - monitor_requests() + - got_request() + +- got_request(): option for the maximal difference time + + For implicit packets, we consider that packets from the same MAC and + received within an interval of 10ms are part of the same request. We + should define an option to allow user to choose the time he wants. + + + + += Listener = + +- Known bugs: + - On OpenWrt Backfire (10.03), when the program is statically linked, + using both -D and -A at the same time makes the program to block on + the first thread. This is a known issue of uClibc: + https://dev.openwrt.org/ticket/4809 + - With autocalibration on, all the CPs declared in listeners.csv must + be in coverage or the reference points will not be generated. + +- Better handling of retried packets ? + + Currently we ignore any packet with the Retry bit. This can lead to + completely ignore the given packet (or even request) if the original + packet is never received, which can happen under certain + circumstances. + + Before changing this behaviour, it must be thought seriously: taking + into account only the original packet means that all the listeners + measure the signal strength from the same packet, which is what we + want in most cases. + + This could be implemented as an option. + +- Refactor and review read_packet(). + +- Handle better the configuration file reading + + Get rid of the "Cannot open configuration file" error, in quiet mode + and when the default configuration file has to be used (no file + specified by the user with -f). + +- Filter the number of implicit packets per mobile? + + Currently, in passive or mixed mode, //all// the received packets are + transmitted to the aggregator. + +- Option "read-only autocalibration" allowing to listen for + autocalibration requests without sending requests. + +- read_packet(): use ieee80211_header_size for all implicit packets + + Currently the size is corrected only for data packets. + +- BSD port + + http://www.unixgarden.com/index.php/programmation/introduction-a-la-programmation-wifi-en-c-sous-netbsd + +- Use the "official" radiotap parser? + + http://git.sipsolutions.net/?p=radiotap.git (Expat license) + + + + += Client = + +- Add verbose & quiet options. + +- Log sent requests? + +- Allow to use a string for the direction? + Could be nice, but probably useless. + +- Qt version of the client + + We could either modify the current OwlPS Client to add an optional GUI + (optional dependency on Qt) or create a new, purely graphical client. + A Qt client would be portable to Android thanks to the Necessitas + project: http://necessitas.kde.org/ + + A port of Qt for Apple iOS was also developed but seems inactive: + https://qt.gitorious.org/+qt-iphone/qt/qt-iphone-clone + + + + += UDP to HTTP = + +- Command-line options (port numbers, -v/-q, -h, -V). + +- Delete inactive clients after a given amount of time. + +- Refactor prepare_answer(). + + + + += Positioner = + + +== Known bugs == + +- Cannot compute the error (Real) for autocalibration requests. + +- Unit tests are currently unmaintained. Do not try to run them. + + +== Algorithms == + +- Add to the result the information "area error" (whether on not the + computed result is in the same room as the real position). + +- Handle the power and antenna gain difference between the calibration + mobile (or pseudo-mobile, for autocalibration) and the mobile to + position. + +- MinMax: add option to set the step (and use a different step for X, Y + and Z?). + +- MinMax: reduce the research space as proposed by F. Lassabe (PhD + report, Fig. 2.6 p. 38 and explanations pp. 38-39). + + +== Autocalibration == + +- Allow to generate a list of reference points instead of using a + regular meshing. + +- Generate reference points in 3D. + +- To select the reference CPs, we should use the distance along with the + angle and coverage. + +- Handle 2 CPs, not only >2 CPs. + +- Find why some CalibrationRequest were not deleted when calling + Stock::delete_calibration_request() (via + ReferencePoint::delete_requests()). + +- Option z-level-number: the Z coordinate represents a floor number. If + unactivated, Z is in metres and the topology is used to determine a + change of level. + +- Generated CalibrationRequest have always nb_packets == 1. + + It is tricky to set a number of packets for generated requests, since + the CPs can transmit a different number of packets in their + autocalibration requests. A solution could be to use the biggest + number amongst the reference autocalibration requests used. A simpler + solution could be to assume that all the CPs transmit the same number + of packets. + + +== Refactoring == + +- Split Stock::generate_reference_point() into several functions. + +- Write a class for Request::type? + + CalibrationRequest::direction uses a dedicated class Direction, why + not Request::type? That would simplify writing of the type to streams + (no need to cast each time any more). + +- Wi-Fi devices' list + - Merge Stock::mobiles & Stock::aps? + - Factorise AccessPointsReaderCSV & MobilesReaderCSV? + +- Members renaming + - InputMedium: + - current_line_nb & get_current_line_nb() + - get_next_request() −> read_next_request() + - Input: get_next_request() −> read_next_request() + - Area: p_min et p_max −> coord_min et coord_max + + +== User interface == + +- When reading the CPs, add them to the mobiles' list (or another way to + be able to have a single entry for a CP). + +- Add option positioning.self-calibrate (or autocalibrate), short option + -A, to activate automatically the options needed by the + autocalibration. + +- Improve --verbose (and/or debug level): print the options, etc. + +- Case-insensitive string comparison (for algorithm names, etc.). + +- Use a prefix for configuration files (search for config files set with + relative path in owlps-positioner.cfg in the same directory). + + +== Optimisation & code improvement == + +- Multithreading: + - algorithms (parallelize computation of the different algorithms for + the same request); + - and/or requests (parallelize computation of several requests). + + It would be possible (overkill?) to have a group of worker threads + and a job queue. + + See OpenMPI & friends. + +- ReferencePoint: the request list should be an unordered_set instead of + a vector, to guarantee the unicity of the elements. + +- Pre-allocate vectors' memory with reserve(). + "C++ en action", p. 217. + +- Copy of containers to streams (in some operator<<() for instance). + "C++ en action", p. 275. + +- Review all the classes to respect principles exposed in "Coder + proprement", chapter 6, p. 103: do not implement accessors for each + class attribute, etc. + + +== Unit tests == + +- Update (rewrite?) tests. + +- Unfinished tests: + - InputDataReader + - Input + - Output + - Positioning + +- Test InterlinkNetworks::compute() ? + +- Timestamp: there is a probability of 10^-6 that the value in + nanoseconds and the rounded value in milliseconds are identical, in + which case some tests can fail.