Giter VIP home page Giter VIP logo

ntcore's Introduction

ntcore

Travis CI Build Status Appveyor Build status

ntcore is the reimplementation of the NetworkTables protocol for both Java and C++, communicating with the former by way of a JNI interface. ntcore implements v3 of the NetworkTables spec.

Build Requirements

To build ntcore, a few requirements must be met:

  • Platform Native Toolchain - You must have a toolchain for your native platform installed if you wish to build ntcore for your machine. On Windows, this is Visual Studio. On Mac, this is Clang, and on Linux, this is GCC. Your toolchain must support the -std=c++11 language flag.
  • Platform Native JDK - In order to compile ntcore your native platform, you must have the JDK for your platform installed, so that the correct JNI headers can be included.
  • ARM Toolchain - To crosscompile ntcore for the roboRIO, you must have the FRC ARM toolchain installed, which can be found here.
  • Cross Toolchains (coming soon)

Building

Gradle is the main build system used by ntcore. All tasks are run with the gradlew wrapper, which is included in the root of the repository. All targets that can be accomplished by Gradle are referred to as tasks. The main task available is build. To run Gradle, cd into the build directory and run:

./gradlew build

This will build the roboRIO ntcore library, in addition to the library for your native platform. Note if the roboRIO compiler cannot be found, the build will skip the roboRIO build. To build for either only the roboRIO, or every platform except the roboRIO, use the following flags:

-PskipAthena
-PonlyAthena

Note if you choose the onlyAthena flag, tests will not be ran, as they depend on the current platform being built.

In addition, more platforms can be built. For instance, with additional cross compilers more Arm binaries can be built. In addition, the second bitness for your current platform can be built with an additional flag. To enable every possible platform, use the following flag.

-PbuildAll

If you are building the native version on a 64 bit Linux computer, use a GCC installation which has multilib support enabled (it can compile both 32 and 64 bit programs). The package providing that support on most Linux distributions is called gcc-multilib.

By default, debug binaries of the libraries will be built. To switch to instead build release binaries, use the following flag

-PreleaseBuild

Custom Cross Compilers

Coming soon

Testing

By default, tests will be built for any native platform, and will be run during any execution of the build or publish tasks. To skip building and running the tests, use the -PskipAllTests command line flag.

Publishing

to use ntcore in downstream projects as a Maven-style dependency, use the publish command. This will publish the following artifact id's:

  • edu.wpi.first.ntcore:ntcore-cpp
  • edu.wpi.first.ntcore:ntcore-java

The ntcore-cpp artifact will contain the following 2 classifiers:

  • headers (contains C++ headers)
  • sources (contains C++ sources)

In addition, a classifier will be created for each binary built by the current build. The internal layout of the artifacts will be as follows.

  • /os/arch/shared/ (shared binaries located here)
  • /os/arch/static/ (static binaries located here)

The ntcore-java artifact will contain a jar with no classifiers. This is the java jar file. In addition, the following 2 classifiers will be contained

  • sources (contains Java sources)
  • javadoc (contains Javadoc sources)

All of these artifacts by default are published to ~/releases/maven/development. To switch to the release repository (~/release/maven/release), use the flag -PreleaseType=OFFICIAL.

All downstream projects are configured to use the individual classifier artifacts. The previouse desktop classifier does not exist anymore.

When you do a publish of ntcore locally, the locally built copy will override all references to networktables dependencies from the FRC Maven server. To undo this, you must delete ~/releases/maven/<repo>/edu/wpi/first/ntcore.

ntcore's People

Contributors

333fred avatar austinschuh avatar austinshalit avatar calcmogul avatar jacibrunning avatar jlleitschuh avatar josephjackson avatar peterjohnson avatar samcarlberg avatar sciencewhiz avatar thadhouse avatar virtuald avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ntcore's Issues

Allow for disabling of tests

If you're including the project elsewhere, it's not really necessary to build the test cases. It would be nice to have a flag to disable building them.

Memory leak on NetworkTable::AddTableListener/NetworkTable::RemoveTableListener

Test code:

class BasicListener : public ITableListener {
    void ValueChanged(ITable* source,
        llvm::StringRef key,
        std::shared_ptr<nt::Value> value,
        bool isNew) {
    }
};

int main() {
    system("PAUSE");
    NetworkTable::SetServerMode();
    NetworkTable::Initialize();

    std::shared_ptr<NetworkTable> ptr = NetworkTable::GetTable("SmartDashboard");
    BasicListener* bl = new BasicListener();

    for (int i = 0; i < 1000000; i++) {     
        ptr->AddTableListener(bl);
        ptr->RemoveTableListener(bl);
    }

    NetworkTable::Shutdown();
    delete bl;

    system("PAUSE");
    return 0;
}

At the second pause, memory usage is over 100MB.

I did some digging into this issue. Looking at Notifier::RemoveEntryListener, it doesn't ever delete from m_entry_listeners

From first glance it looks like "uids" are dependant on the ordering of the vector and that's why entry listeners are never deleted. Perhaps m_entry_listeners would be better as a std::unordered_map or std::map

Implement initial connection flag

Dispatcher needs to keep track of all previous clients by name and set the initial connection flag appropriately. It also needs to record the initial connection flag in the connection list so that it's user visible.

Custom Compiler Prefix

Support a -P flag that allows for setting a different cross-compiler prefix than arm-frc-linux-gnueabi-, to support nonstandard compilers.

Race condition during dispatcher stop

I've been running into a weird race condition while trying to write unit tests, switching between client and server mode. If I start and stop the server side multiple times, then start and stop the client side, after a few client cycles the Stop() method seems to enter a race condition. When I break the code and look at the threads, it seems like a server thread is trying to grab the shutdown mutex, and the Stop() method is stuck in joining the clientserver thread, waiting for the thread to actually exit. It seems weird that a server is still running, but I wonder if this is happening because it's getting detached instead of joined in one of the earlier shutdowns. I'll put a monitor to detect if any of the early threads as I do this are being detached instead of joined, maybe that will help debugging. Also I've only noticed this on Windows, and if you actually set break points in the Stop() method the issue never occurs, which makes it even harder to debug.

Finish API docs

Finish documentation comments for all public API functions/structures.

Add support for adding any number value

Right now, calls to putValue with a float value (and I suspect Integer as well) cause an IllegalArgumentException to be thrown.

Lines 722 and 723 in NetworkTable.putValue(String, Object) could be changed to the following bolded lines.

  @Override
  public boolean putValue(String key, Object value) throws IllegalArgumentException {
    if (value instanceof Boolean)
      return NetworkTablesJNI.putBoolean(path + PATH_SEPARATOR + key, ((Boolean)value).booleanValue());
    else if (value instanceof Number)
      return NetworkTablesJNI.putDouble(path + PATH_SEPARATOR + key, ((Number)value).doubleValue());
    ... // Ommitted for brevity

Similarly, putNumber(String, double) could be overloaded with a putNumber(String, Number) that would just delegate to the first method:

public void putNumber(String key, Number value) {
  putNumber(key, value.doubleValue());
}

ARM JDK Download Script

The ARM JDK can automatically be downloaded using the following script:

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-arm64-vfp-hflt.tar.gz"

It would be a simple fix to add this to the build with an untar command and the install would be totally automated.

Also, the link in the gradle script is out of date.

Build on Mac

There doesn't seem to be any way to build this project on a mac. Or at least the instructions are lacking. Is there any known way to compile on a Mac?

Supress Spammy output

NT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskt:157)
NT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskto:157)
NT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskt:157)
NT: ERROR: select() to  port 1735 erroNT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskto:157)
NT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskto:157)
NT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskto�:157)
NT: ERROR: select() to  port 1735 error 61 - Connection refused (ntcore-deskto:157)

Is there any way to suppress this output?
Can we pipe it into an alternative stream?
This error is a normal part of the operation of GRIP and it cluttering our console log.

@333fred @PeterJohnson

Server side polled rpc calls do not work

When a server calls a polled RPC on itself, the condition variable for the poll call works properly, however the PostRpcResponse call never actually sends the response. This seems to be because polled rpcs and responses are dependent on the client connection id, however with a server rpc call, the connection id is set to 0xffff, and PostRpcResponse does not handle this correctly.

Implementing a way to send Server connection info

One thing I had been thinking about was it would be nice if clients could get information on all the clients connected to the server. One big use case for this is we could print all the connected clients to a widget on the smart dashboard, and we could see if coprocessors connected properly. I can think of a few ways to implement this, and was wondering which one seems the best.

  1. Implement a new Message type, that whenever a new client is connected to the server it sends new connection info to new clients. This would be the hardest to implement and most invasive, but cleanest in the long run.
  2. Send the data over its own NetworkTable value using Raw type. This is actually fairly easily to implement in the NetworkTables code, but we could also potentially add this to WPILib as well if we don't want to pollute NetworkTables.

If we do either of these, it would be nice to have a prebuilt SmartDashboard widget that could read these.

Would either of these be a good idea, or would there be a better way to implement this?

Need arm compiler to publish desktop

There's no clear way to publish without an arm compiler. Even if the -PmakeDesktop flag is provided, the build still dies if there's no arm compiler present.

Keys never reported as being new in ITableListener

In Java, keys appear to never be reported as being new in a table listener. That is, the "isNew" parameter of the callback is always false. I have not tested other languages.

In the debugging I have done, I cannot find a situation where "isNew" is ever true, but it is possible that the conditions for a key to be considered new have simply changed in a way that I am not aware of since last year.

No entry points found for Windows DLL's.

I was able to get a successful build on a VS 2013 machine, but when trying to open the DLL it says it cannot find the entry point its looking for. Running dumpbin on the compiled DLL shows no functions at all being exported from the DLL. Are there any special gradle flags needed to get the exports to build correctly?

More unit tests

From TODO, the following need unit tests:

  • Message class
  • SequenceNumber class
  • NetworkCommunication class
  • Dispatcher class
  • Storage incoming processing
  • Notifiers
  • RPC
  • C++ API
  • C API
  • SavePersistent safe file handling (part of C++ API)
  • More LoadPersistent warning cases
  • Automatic persistent saves

C++ compiler failed while compiling gtest-all.cc & gmock-all.cc

Hello,
I've been trying to build ntcore on Linux, but there are these 2 .cc files that fail to compile.
Output:

compiling gtest-all.cc failed.
In file included from /usr/include/c++/5.3.0/random:49:0,
                 from /usr/include/c++/5.3.0/bits/stl_algo.h:66,
                 from /usr/include/c++/5.3.0/algorithm:62,
                 from /home/calvin/ntcore/gmock/gtest/src/gtest.cc:46,
                 from /home/calvin/ntcore/gmock/gtest/src/gtest-all.cc:42:
/usr/include/c++/5.3.0/bits/random.h:106:26: error: expected unqualified-id before ‘__int128’
       { typedef unsigned __int128 type; };
                          ^

compiling gmock-all.cc failed.
In file included from /usr/include/c++/5.3.0/random:49:0,
                 from /usr/include/c++/5.3.0/bits/stl_algo.h:66,
                 from /usr/include/c++/5.3.0/algorithm:62,
                 from /home/calvin/ntcore/gmock/include/gmock/gmock-actions.h:43,
                 from /home/calvin/ntcore/gmock/include/gmock/gmock.h:58,
                 from /home/calvin/ntcore/gmock/src/gmock-all.cc:40:
/usr/include/c++/5.3.0/bits/random.h:106:26: error: expected unqualified-id before ‘__int128’
       { typedef unsigned __int128 type; };
                          ^

I've been able to build on Windows, so is there something that I'm missing in GCC?
Also, why is this library not included in WPILib? It seems weird that NetworkTables.jar would be included despite missing a dependency.

Building on Raspberry Pi

I am trying to build this repo on my Raspberry Pi, but am having some issues.

Cloning the repo worked fine, and even building it with './gradlew :native:build' worked fine. The problem is that despite gradle saying the build succeeded, I cannot find the libntcore.a library anywhere on the RPi.

Running './gradlew build' does not work (throwing an error with the g++ -m32 arg) but I don't think it worked on a Mac either.

Any advice is much appreciated,
Henry Loh

JVM crash during shutdown

Likely due to destruction order, the Java bindings cause the JVM to crash during shutdown if a callback has been used, as the Logger destructor calls the std::function destructor, which results in the JavaGlobal destructor being called, and it attempts to attach to the current thread and delete the global reference, which fails due to the JVM already being destroyed. Oddly the AttachCurrentThread function succeeds in this case. Need to figure out a way for it not to crash given a normal cleanup.. maybe hook into JNI_OnUnload instead of the destructor? Although we still want to delete the global reference if the callback is removed.

Setting a value does not notify listeners on the setting system.

In previous implementations, if you set a value, it would notify all the listeners on the setting system. This implementation does not seem to be doing that, and only notifying either when immediate_notify is true, or when processing an incoming message.

Provide labview event interface

To improve labview performance, we should provide a labview-specific event/notifier interface for RPCs and value changes.

Builds fail with Visual Studio 2015.

On my system I only have VS 2015 installed, and I get a linker error when gradle tries to compile the program.

See file:///C:/Users/thad/Documents/GitHub/ntcore/build/tmp/linkX64NtcoreSharedLibrary/output.txt for all output for linkX64NtcoreSharedLibrary.
linking ntcore.dll failed.
LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'

Finished linkX64NtcoreSharedLibrary, see full log file:///C:/Users/thad/Documents/GitHub/ntcore/build/tmp/linkX64NtcoreSharedLibrary/output.txt.

I noticed that looking in the options.txt file, it puts the VS directory to "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64", which is for VS2013. Is it supposed to be detecting VS 2015 and switching to it?

Naming for new atomic get set operation

In the past, SmartDashboard has always had the issue where you had to put a number to the dashboard before you could read it and change values from the SmartDashboard. Most teams I know would just run a bunch of Put*** calls in RobotInit, that would write safe defaults, and then could be safely read from robot code and edited from the dashboard. However, the addition of persistent entries has made this a much harder task. The Put calls in RobotInit are no longer safe, as they very likely will override the value read from persistent. We've had this happen to us, where we set values persistent, run testing for an hour, and then when we reboot all the persistent values are overridden because we forgot to remove the put calls in RobotInit. I thought about first reading to check if the key exists, and only putting if it does not, however that's not thread safe, and the SmartDashboard class in WPILib does not have a built in method to check if key exists (I plan on pushing some patches to WPILib later to add some of the new NT3 functionality).

I have been working on an atomic operation to first check if the key exists, returning the value in the table if it does, otherwise setting the table to a passed in value, and then returning that. I think I have the code working, and wrote working tests, however I don't really know what a good name for a method like that would be. Currently I have it set to GetSetEntryValue, however that doesn't sound right, and I can't come up with anything better. Any ideas? Also do you think this would be a valid addition? You can see the code here ThadHouse@9f2de77

Java NetworkTables Server incorrectly encodes Supplementary Multilingual Plane with Surrogate Pairs (artf3973)

The NWT spec says that all strings are UTF8. Pasting the string "cat🐱mouse" ("cat\u{1F431}mouse") in outline viewer as a server should encode it in UTF-8 as the binary string "cat\xF0\x9F\x90\xB1mouse". However the actual string sent across the network is "cat\xED\xA0\xBD\xED\xB0\xB1mouse" which is the UTF-8 encoding of "cat\xD8\x3D\xDC\x31mouse", where "\uD83D\uDC31" is the UTF-16 surrogate pair encoding of \u{1F431} (🐱)

Thus, it appears that surrogate pairs for characters that are not in Unicode Plane 0 are not being re-encoded in utf-8 properly.

Sending a correct UTF-8 encoding ("cat\xF0\x9F\x90\xB1mouse") via a custom C++ NWT client causes the java server to crash and Outline viewer to stop responding to updates or sending out updates and this error is printed:

edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@6a59828c entered connection state: SERVER_ERROR: class java.io.UTFDataFormatException: malformed input around byte 3

Add support for array-of-struct

Right now we have support for array-of-native and raw data types. The latter can easily be used to create an array of structured data but there's currently no standard way of doing this. A standardized format for array-of-struct would enable viewers and users to have a common way to communicate more complex data in an atomic fashion. It could be as simple as prepending a string of data types (ala Python's struct module) to the raw data elements, as you can derive the element size from the string of data types and the array size from the raw data length divided by the element size.

Improved synchronization

The code doesn't implement any really improved synchronization technique. Consider documenting and implementing Greg's A/B approach.

NT_GetEntryInfo throws an Access Violation Exception

If there is at least 1 valid entry, the code throws an Access Violation when trying to call NT_DisposeString while converting the StringRef to an NT_String. The code mallocs for the NT_EntryInfo array, but the NT_String contained in that seems to point to garbage, which fails why trying to free it before copying.

testntcore.exe!check_bytes(const unsigned char * const first, const unsigned char value, const unsigned int size) Line 194  
testntcore.exe!is_block_an_aligned_allocation(const void * const block) Line 251    
testntcore.exe!free_dbg_nolock(void * const block, const int block_use) Line 870    
testntcore.exe!_free_dbg(void * block, int block_use) Line 1011 
testntcore.exe!free(void * block) Line 16   C++
testntcore.exe!NT_DisposeString(NT_String * str) Line 406   
testntcore.exe!nt::ConvertToC(llvm::StringRef in, NT_String * out) Line 141
testntcore.exe!ConvertToC(const nt::EntryInfo & in, NT_EntryInfo * out) Line 26
testntcore.exe!NT_GetEntryInfo(const char * prefix, unsigned int prefix_len, int types, unsigned int * count) Line 160

No support for transactions in the Java version of NetworkTable?

Hi
We are using NetworkTable to get information about potential targets from GRIP. The problem is that we need to retrieve multiple arrays of double as one transaction so that the information is coherent. It looks like NetworkTable implemented beginTransaction()/endTransaction() in the past but it appears it is no longer the case.
We believe this is why we sporadically get out-of-bound exceptions when sharing an index between the multiple arrays.
Thank you for looking into it.

NT_GetEntryInfo name getting mangled by compiler

I was doing some checking to make sure all methods marked extern could be seen on the RoboRIO, and all but 1 worked. NT_GetEntryInfo was not being seen. I used nm, and it looks like NT_GetEntryInfo is getting mangled. It was becoming this. _Z15NT_GetEntryInfoPKcjiPj. I tried recompiling, and had the same result.

111 Errors

I am working with VS2015 and I am sure I have done everything write, as I have no errors in my code, however when I build I get this:

Severity    Code    Description Project File    Line
Error   LNK1169 one or more multiply defined symbols found  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\x64\Debug\RocketTracker.exe    1
Error   LNK2005 _Getcvt already defined in msvcprtd.lib(MSVCP140D.dll)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xwctomb.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(ios.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(iosptrs.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlCompareStringA.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlCompareStringW.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlLCMapStringA.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlLCMapStringW.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(winapinls.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(winapisupp.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(wlocale.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xdateord.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xlocale.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xlock.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xthrow.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Base64.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Dispatcher.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(leb128.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Log.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Message.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(NetworkConnection.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(NetworkTable.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Notifier.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(ntcore_cpp.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(raw_istream.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(raw_socket_istream.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(RpcServer.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(SafeThread.obj)   1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(SmallVector.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(SocketError.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Storage.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(StringMap.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(StringRef.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TableKeyNotDefinedException.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TCPAcceptor.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TCPConnector.obj) 1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TCPStream.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(timestamp.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Value.obj)    1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(WireDecoder.obj)  1
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in Source.obj  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(WireEncoder.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(ios.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(iosptrs.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlCompareStringA.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlCompareStringW.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlLCMapStringA.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(StlLCMapStringW.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(winapinls.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(winapisupp.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(wlocale.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xdateord.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xlocale.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xlock.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xthrow.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Base64.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Dispatcher.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(leb128.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Log.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Message.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(NetworkConnection.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(NetworkTable.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Notifier.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(ntcore_cpp.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(raw_istream.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(raw_socket_istream.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(RpcServer.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(SafeThread.obj)   1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(SmallVector.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(SocketError.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Storage.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(StringMap.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(StringRef.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TableKeyNotDefinedException.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TCPAcceptor.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TCPConnector.obj) 1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(TCPStream.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(timestamp.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(Value.obj)    1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(WireDecoder.obj)  1
Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in Source.obj   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\ntcore.lib(WireEncoder.obj)  1
Error   LNK2005 "void __cdecl std::_Xout_of_range(char const *)" (?_Xout_of_range@std@@YAXPEBD@Z) already defined in msvcprtd.lib(MSVCP140D.dll)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xthrow.obj)  1
Error   LNK2005 "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPEBD@Z) already defined in msvcprtd.lib(MSVCP140D.dll)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xthrow.obj)  1
Error   LNK2005 "void __cdecl std::_Xbad_function_call(void)" (?_Xbad_function_call@std@@YAXXZ) already defined in msvcprtd.lib(MSVCP140D.dll)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xthrow.obj)  1
Error   LNK2005 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ) already defined in msvcprtd.lib(MSVCP140D.dll)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xthrow.obj)  1
Error   LNK2005 "void __cdecl std::_Facet_Register(class std::_Facet_base *)" (?_Facet_Register@std@@YAXPEAV_Facet_base@1@@Z) already defined in msvcprtd.lib(locale0_implib.obj)   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1
Error   LNK2005 "public: __int64 __cdecl std::ios_base::width(__int64)" (?width@ios_base@std@@QEAA_J_J@Z) already defined in ntcore.lib(RpcServer.obj)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: __int64 __cdecl std::ios_base::width(void)const " (?width@ios_base@std@@QEBA_JXZ) already defined in ntcore.lib(RpcServer.obj) RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: __int64 __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::sputn(char const *,__int64)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z) already defined in ntcore.lib(RpcServer.obj)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: __cdecl std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QEAA@XZ) already defined in msvcprtd.lib(MSVCP140D.dll) RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xlock.obj)   1
Error   LNK2005 "public: __cdecl std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QEAA@H@Z) already defined in msvcprtd.lib(MSVCP140D.dll)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(xlock.obj)   1
Error   LNK2005 "public: void __cdecl std::basic_ostream<char,struct std::char_traits<char> >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ) already defined in ntcore.lib(RpcServer.obj)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: void __cdecl std::basic_ios<char,struct std::char_traits<char> >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z) already defined in ntcore.lib(RpcServer.obj) RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z) already defined in msvcprtd.lib(MSVCP140D.dll)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1
Error   LNK2005 "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,char const *)" (?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z) already defined in msvcprtd.lib(MSVCP140D.dll)   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1
Error   LNK2005 "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPEAV12@@Z) already defined in msvcprtd.lib(MSVCP140D.dll)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(ios.obj) 1
Error   LNK2005 "public: int __cdecl std::ios_base::flags(void)const " (?flags@ios_base@std@@QEBAHXZ) already defined in ntcore.lib(RpcServer.obj)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: int __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z) already defined in ntcore.lib(RpcServer.obj)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: class std::basic_streambuf<char,struct std::char_traits<char> > * __cdecl std::basic_ios<char,struct std::char_traits<char> >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in ntcore.lib(RpcServer.obj)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: class std::basic_ostream<char,struct std::char_traits<char> > * __cdecl std::basic_ios<char,struct std::char_traits<char> >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in ntcore.lib(RpcServer.obj)    RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::basic_ostream<char,struct std::char_traits<char> >::operator<<(double)" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z) already defined in ntcore.lib(Storage.obj)   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::basic_ostream<char,struct std::char_traits<char> >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ) already defined in ntcore.lib(RpcServer.obj) RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: char __cdecl std::basic_ios<char,struct std::char_traits<char> >::widen(char)const " (?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z) already defined in ntcore.lib(RpcServer.obj)   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: char __cdecl std::basic_ios<char,struct std::char_traits<char> >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ) already defined in ntcore.lib(RpcServer.obj)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "public: bool __cdecl std::ios_base::good(void)const " (?good@ios_base@std@@QEBA_NXZ) already defined in ntcore.lib(RpcServer.obj)  RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\msvcprtd.lib(MSVCP140D.dll)  1
Error   LNK2005 "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z) already defined in msvcprtd.lib(MSVCP140D.dll) RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(ios.obj) 1
Error   LNK2005 "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(bool)" (?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z) already defined in msvcprtd.lib(MSVCP140D.dll)   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1
Error   LNK2005 "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP140D.dll)   RocketTracker   C:\Users\benar\Desktop\FRC\RocketTracker\RocketTracker\libcpmt.lib(locale0.obj) 1

ntcore client does not successfully connect to 2.0 servers

Using OutlineViewer.jar from the latest wpilib tools, I connected to a OutlineViewer.jar from last year running a NetworkTables server, and received the following error messages from it on stdout.

edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@3cdc0ee8 entered connection state: GOT_CONNECTION_FROM_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@3cdc0ee8 entered connection state: SERVER_ERROR: class edu.wpi.first.wpilibj.networktables2.connection.BadMessageException: Client Connected with bad protocol revision: 0x300
Close: edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@3cdc0ee8
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@2290f5d4 entered connection state: GOT_CONNECTION_FROM_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@2290f5d4 entered connection state: CONNECTED_TO_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@7e670420 entered connection state: GOT_CONNECTION_FROM_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@2290f5d4 entered connection state: CLIENT_DISCONNECTED
Close: edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@2290f5d4
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@7e670420 entered connection state: CONNECTED_TO_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@4a1cbe5e entered connection state: GOT_CONNECTION_FROM_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@7e670420 entered connection state: CLIENT_DISCONNECTED
Close: edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@7e670420
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@4a1cbe5e entered connection state: CONNECTED_TO_CLIENT
edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@4a1cbe5e entered connection state: CLIENT_DISCONNECTED
Close: edu.wpi.first.wpilibj.networktables2.server.ServerConnectionAdapter@4a1cbe5e
...

A similar error occurs when connecting to a Python robot using pynetworktables.

windows build

After a quick replacement of constexpr with const, I think I've found the move constructor things you meant. Build output is here. Not sure how to move forward on this one, but hey, it made it 20% through! 👍

Out of memory checks

Check for null returns in the few places that use malloc to handle out of memory errors (relatively) gracefully.

Unable to compile with cmake on linux

Using CMake on linux I get the following build errors

ntcore/test/rpc_local.cpp:8:29: error: unknown type name
'ConnectionInfo'; did you mean 'nt::ConnectionInfo'?
const ConnectionInfo& conn_info) {
^~~~~~~~~~~~~~
nt::ConnectionInfo

and

ntcore/test/rpc_speed.cpp:9:29: error: unknown type name
'ConnectionInfo'; did you mean 'nt::ConnectionInfo'?
const ConnectionInfo& conn_info) {
^~~~~~~~~~~~~~
nt::ConnectionInfo

The compilation succeeds when I manually change the referenced lines to what the compiler suggests.

This error occurs on Ubuntu 16.04 using openjdk-8 on both a armhf device and on an x86_64 pc. Both devices compiled the code natively. No cross compilation was attempted.

Gradle builds don't detect 32 bit only devices

I noticed when trying to perform a default gradle build on an arm device, which is 32 bit only, it would not compile correctly. The x64 portion of the build would sometimes complete and sometimes just hang for hours, and the x86 build automatically failed, because arm GCC does not have the -m32 flag. I don't have a 32 bit desktop system to test this on, but it would probably have the same issue. I don't know if gradle has an easy way to detect a 32 bit only system, and remove the -m32 flag. I was able to get an always compiling local arm build by running ./gradlew :arm:build -PcompilerPrefix=, but thats not a valid hack for normal use.

SetUpdateRate inconsistencies

The documentation for setUpdateRate is inconsistent. In the end location of it (Dispatcher.cpp), it says

// don't allow update rates faster than 10 ms or slower than 1 second
if (interval < 0.01)
  interval = 0.01;
else if (interval > 1.0)
  interval = 1.0;

But in NetworkTable.h, it says "update interval in seconds (range 0.1 to 1.0)" in the documentation comment. It says something similar in the Javadoc.

In addition, though this could be an implementation issue on my part, when I tried to use setUpdateRate with 0.01, it appeared to be at 100ms instead of 10ms.

SetTeam fails in C++

We are using an Nvidia Tegra with Ubuntu for image processing, then sending target information to the roboRIO with NetworkTables. When we attempt to connect to our robot using the SetTeam method, we get "Connection Refused" errors, but passing the IP address or mDNS host name to SetIPAddress directly works.

We looked at the source and noticed that SetTeam inserts a newline at the end of the mDNS host name. This is not the case for the Java version. After we removed the newlines from the method and recompiled, SetTeam worked for us.

Server crashes upon exit if RPC callbacks exist.

If an RPC callback has been created, the library segfaults on exit. It seems like this is caused by the destructor for Storage.cpp notifying all the callbacks. However by that time, its very possible that the callbacks don't exist anymore. Is there a reason that the destructor for that is notifying the RPC's?

SetTeam still uses old cRIO address

Why does the SetTeam function still use the 10.xx.xx.2 ip address? Since ntcore does not compile for cRIO currently, it seems like there is no point in keeping the SetTeam function using the IP address. I had to help a few teams last year fix their dashboards because they were setting to the old IP that wasn't valid anymore. Usually it seems like the RoboRIO gets an IP of 10.xx.xx.20, but because of Mdns it could be random. Should SetTeam be changed to use Mdns instead?

I have a pull request ready for this, but wanted to discuss it first.

Creating a client causes an Assertion Exception on Win32

In TCPConector.cpp, on line 76, it tries to append '\0', which causes the StringRef to fail, because it is seeing '\0' as null. I tried modifying that line to try and fix it, and there were some cases where I would get it to not throw the error, but I could never get it to connect to a server. Client on a RoboRIO did work however, so its limited to the Win32 builds.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.