fourstix / QwiicSerLCD

Version of Arduino LiquidCrystal Library for Sparkfun Serial Enabled LCD with a Qwiic Adapter
MIT License
1 stars 14 forks source link

licensing issue; code is derived from LGPL 2.1 code #27

Closed bperrybap closed 3 years ago

bperrybap commented 3 years ago

While the licensing of LiquidCrystal (or bundled Arduino libraries in general) was not obvious prior to 2015, things got much clearer in 2015 to more clearly state the current and past license for the LiquidCrystal library going back to 2006 was/is LGPL 2.1

This library code is a derivative of LiquidCrystal and LiquidCrystal_I2C both of which were/are licensed LGPL 2.1+ LGPL 2.1+ does not allow re-licensing derivative code with a different license with substantially different terms such as public domain or MIT The LGPL 2.1+ terms require that this library must also be licensed as LGPL 2.1+ or can use the "+" convert option to convert the license to a later/newer license such as gpl v3

This is from SerLCD.cpp

 * License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).
 *
 * This library is based heavily on the LiquidCrystal_I2C library and the sample code provided with
 * the SparkFun Serial OpenLCD display.  The original LiquidCrystal library by David A. Mellis and
 * modified by Limor Fried and the OpenLCD code by Nathan Seidle at SparkFun.
 *
 * The LiquidCrystal_I2C library was based on the work by DFRobot.
 * (That's the only attribution I found in the code I have. If anyone can provide better information,
 * Plese let me know and I'll be happy to give credit where credit is due.)

I have notes on LiquidCrystal and LiquidCrystal_I2C files that go back more than 10 years. Unfortunately, some of the web pages & files are no longer available.

Here is a more complete background history of the LiquidCrystal_I2C code.

The key take away is that the LiquidCrystal_I2C library is not an original work by DFRobot. The DFR code is a derivative of an earlier LiquidCrystal_I2C work by Mario H. which is derivative of LiquidCrystal

The LiquidCrystal_I2C files found out on the net typically have no copyright or licensing notices in them but they are clearly from the same origin given they are all nearly identical to the much older LiquidCrystal_I2C files by Mario H which originally were hosted here https://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C

This web page: http://playground.arduino.cc/Code/LCDi2c mentions Marios LiquidCrystal_I2C library as being available as of 2009-09-14 Mario's web page also claims his library was released in 2009 and in the V1 zip image here: http://www.xs4all.nl/~hmario/arduino/LiquidCrystal_I2C/V1.0/LiquidCrystal_I2C_V1.0.zip all the files but 1 are dated 2009. And in the info sub directory there is a file called "readme.txt" which states:

LiquidCrystal_I2C V1.0

The LiquidCrystal_I2C library is a modified version of the standard LiquidCrystal library as found on
the Arduino website.

So given Mario's LiquidCrystal_I2C library predates DFRobot LiquidCrytal_I2C and DFRobot LiquidCrystal_I2C seems to have started with Mario's code, DFRobot LiquidCrystal_I2C would be a derivative of Mario's LiquidCrystal_I2C library and Mario's library is a derivative of the IDE LiquidCrystal library.

While the IDE LiquidCrystal code did not contain copyright notices or license information in the LiquidCrystal source files themselves, at the point in time when LiquidCrystal_I2C was created, the IDE LiquidCrystal code was licensed as LGPL 2.1 as indicated in the license.txt file in the root directory of the arduino.cc IDE repository which was committed October 11, 2007 and has not changed since. It can be seen here: https://github.com/arduino/Arduino/blob/master/license.txt license.txt was a catchall license for all Arduino core files and libraries provided by the IDE. It contains a small note:

===========================

next, the gnu lesser general public license that covers the arduino core and libraries.

===========================

What is below that tiny comment in the readme file is a LGPL 2.1 license agreement. So it seems that the intent was that the LiquidCrystal library was released as LGPL 2.1

In 2015 the IDE LiquidCrystal source files were updated to contain a copyright notice and license within the files.

Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved.
Copyright (c) 2010 Arduino LLC. All right reserved.

[ with a LGPL 2.1+ notice ]

To make it clear that the license for the LiquidCrystal library originally was and still is LGPL 2.1

fourstix commented 3 years ago

Thanks, I used LiquidCrystal_I2C as a model for what external API functions to implement. I tried to find the licensing for LiquidCrystal_I2C but couldn't. I figured LiquidCrystal_I2C was based on LiquidCrystal and included what information I found on that.

I did the best I could to properly attribute sources with what information I had available at the time. But it sounds like LiquidCrystal_I2C is GPL, so I'm fine with changing the licensing from MIT to GPL.

I'd also like to give proper attribution to the author of LiquidCrystal_I2C in the source, do you know Mario H's full name?

Also, are you suggesting that I attribute LiquidCrystal as below?

Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved. Copyright (c) 2010 Arduino LLC. All right reserved.

If that's the correct attribution, I'll be glad to change that too.

bperrybap commented 3 years ago

Don't feel bad. the Arduino team started off doing a very poor job specifying licensing terms. This didn't provide a good model for it users. Arduino.cc also made certain claims about using Arduino in products with respect to s/w licensing for many years that were simply factually incorrect. Also, not helpful to the community. There are lots of crazy stories related to this and the stupid/goofy and really really dumb things they did related to the "Arduino" trademark. I started getting after the Arduino.cc team and even LadyAda over 10 years ago to clean up their licensing act. About 10 years ago, there was a big effort to clean up the all Arduino IDE bundled libraries. Way back in the early Arduino days, licensing and copyrights were so vague and often just missing to the point where it technically wasn't legal for anyone to use the the code without getting usage rights directly from the authors - assuming you could even find them.

You know after all these years I never found Mario H's full name.

Both LiquidCrystal and LiquidCrystal_I2C are LGPL 2.1 not GPL so you do not need to use GPL if you don't want to. LGPL is more liberal than GPL (a lot more liberal than GPL v3) and closer to MIT than GPL. While LGPL and MIT are similar LGPL does have a few additional restrictions/requirements over MIT.

I went and looked closer at the library code. I think it is a bit tricky and a little bit of gray area since while you used the LiquidCrystal API in your code and probably much of the header file from LiquidCrystal/LiquidCrystal_I2C, there appears to be very little, if any, code in the .cpp file that came from either of those libraries. However, if you did start with the LiquidCrystal.h header or the LiquidCrystal_I2C.h file, which it kind of looks like you did, then, technically the library becomes a derivative subject the LiquidCrystal LGPL 2.1 terms.

fourstix commented 3 years ago

Ah, I believe I'm doing this all wrong. :-)

While researching this, I found that there is now a published spec for LiquidCrystal type libraries by the Arduino Community. That is what I should use as a reference rather than using LiquidCrystal_I2C as a guide for the API. (That's really all I used LiquidCrystal_I2C for, was to determine the names and parameters of functions.)

I'm going to do a scrub of the header and code, renaming or adding any functions or parameters if needed, so it's compliant with the latest spec version and reference the published Arduino spec in the comments and documentation. That way, there will be no issue of any derivation. Plus, as a bonus, it will guarantee the code is up to date.

I'll give thanks with attributions to the authors of LiquidCrystal and LiquidCrystal_I2C for making there code available as examples of how to implement the spec.

It will take a little more time than just changing the license, but I think it's worth it just to be sure things aren't out sync with the spec. I think it will also be much cleaner to do it this way, given the murky history of things.

Thanks for your help.

fourstix commented 3 years ago

This issue is superseded by issue #28 Implementing Issue #28 will close this issue.

bperrybap commented 3 years ago

I'm curious, can you post the link to the spec for LiquidCrystal type libraries

fourstix commented 3 years ago

Probably the best source is in the Arduino Library Documentation located here: https://www.arduino.cc/en/Reference/LiquidCrystal

That seems to be the official API definition by the Arduino Community.

bperrybap commented 3 years ago

Sure, but while the LiquidCrystal reference pages show various API functions, they do show any internal implementation details. It does not specify things like specific symbol names used internally by the actual code such as the LCD symbols. From looking at the SerLCD.h header file it appears to have come from the LiquidCrystal.h header file. There is 100% match of those internal LCD symbol names, and comments around them vs the LiquidCrystal.h header file so it seems fairly likely that is where they came from. i.e. if the LiquidCrystal reference pages were the only source of input, all the LCD_ symbols and comments around them in the SerLCD.h header file would certainly not match what is in LiquidCrystal.h

To change LGPL/GPL code even if radically different to where no original code remains, still means it is derivative of the original LGPL/GPL code given where it started. It is a side effect of starting with LGPL / GPL code.

Something to keep in mind....