├── LICENSE ├── README.md ├── addon_config.mk ├── example-image ├── Makefile ├── addons.make ├── bin │ └── data │ │ ├── .gitkeep │ │ └── image.jpg ├── config.make ├── rpiLED.qbs └── src │ ├── main.cpp │ ├── ofApp.cpp │ └── ofApp.h ├── example-screen.gif ├── example-screen.jpg ├── example-screen ├── Makefile ├── addons.make ├── config.make ├── rpiLED.qbs └── src │ ├── main.cpp │ ├── ofApp.cpp │ └── ofApp.h ├── libs └── rgb_matrix │ ├── include │ ├── canvas.h │ ├── gpio.h │ ├── graphics.h │ ├── led-matrix.h │ ├── thread.h │ ├── threaded-canvas-manipulator.h │ └── transformer.h │ └── lib │ ├── .gitignore │ └── linux │ └── librgbmatrix.a └── src ├── ofxRpiLED.cpp └── ofxRpiLED.h /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | 341 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ofxRpiLED 2 | 3 | OpenFrameworks LED matrix addon for Raspberry Pi based on Henner Zeller's [rpi-rgb-led-matrix][led-lib] library. 4 | 5 | ![Output of example-screen](https://raw.githubusercontent.com/urshofer/ofxRpiLED/master/example-screen.gif) 6 | 7 | **Hardware** 8 | 9 | - Raspberry PI Model B / 2 10 | - [Adafruit LED Hat][ada-hat] 11 | 12 | **Defaults** 13 | 14 | If ```setup()``` is run without parameters, the addon sets defaults for a single LED Matrix of 64 x 32 pixel. Please refer to the documentation of [rpi-rgb-led-matrix][led-lib] on how to set up a different screen size. 15 | 16 | **Examples** 17 | 18 | There are two examples within this repo: 19 | 20 | - example-image: loads and displays an image file. Headless application with ```ofAppNoWindow``` output. 21 | - example-screen: does some 3d graphics and redirects the screen onto the LED-Matrix using the ```grabScreen()``` function of ofImage. 22 | 23 | **LED Library** 24 | 25 | The addon uses hzeller's [LED library][led-lib] precompiled. Probably you'll need to recompile the library if you are using a different hardware setup. 26 | 27 | The LED library is precompiled with the following configuration options: 28 | 29 | ``` 30 | # Uncomment the following line for Adafruit Matrix HAT gpio mappings. 31 | # If you have an Adafruit HAT ( https://www.adafruit.com/products/2345 ), 32 | # you need to use this option as the HAT swaps pins around that are not 33 | # compatible with the default mapping. 34 | DEFINES+=-DADAFRUIT_RGBMATRIX_HAT 35 | 36 | # Uncomment if you want to use the Adafruit HAT with stable PWM timings 37 | # The newer version of this library allows for much more stable (less flicker) 38 | # output, but it does not work with the Adafruit HAT unless you do a 39 | # simple hardware hack on them: connectk GPIO 4 (OE) with 18; they have 40 | # convenient solder holes on the board. 41 | # Then uncomment the following define. 42 | DEFINES+=-DADAFRUIT_RGBMATRIX_HAT_PWM 43 | ``` 44 | 45 | It is recommended to install an image with a realtime kernel (for instance [this one][emlid-rt]) to minimize a loaded system having an influence on the image quality according to Zellers readme. 46 | 47 | [ada-hat]: https://www.adafruit.com/products/2345/ 48 | [led-lib]: https://github.com/hzeller/rpi-rgb-led-matrix/ 49 | [emlid-rt]: http://docs.emlid.com/Downloads/Real-time-Linux-RPi2/ 50 | -------------------------------------------------------------------------------- /addon_config.mk: -------------------------------------------------------------------------------- 1 | # All variables and this file are optional, if they are not present the PG and the 2 | # makefiles will try to parse the correct values from the file system. 3 | # 4 | # Variables that specify exclusions can use % as a wildcard to specify that anything in 5 | # that position will match. A partial path can also be specified to, for example, exclude 6 | # a whole folder from the parsed paths from the file system 7 | # 8 | # Variables can be specified using = or += 9 | # = will clear the contents of that variable both specified from the file or the ones parsed 10 | # from the file system 11 | # += will add the values to the previous ones in the file or the ones parsed from the file 12 | # system 13 | # 14 | # The PG can be used to detect errors in this file, just create a new project with this addon 15 | # and the PG will write to the console the kind of error and in which line it is 16 | 17 | meta: 18 | ADDON_NAME = ofxRpiLED 19 | ADDON_DESCRIPTION = Addon for driving an LED matrix on the Raspberry PI 20 | ADDON_AUTHOR = Urs Hofer 21 | ADDON_TAGS = "Hardware Interface" 22 | ADDON_URL = https://github.com/urshofer/ofxRpiLED 23 | 24 | common: 25 | # dependencies with other addons, a list of them separated by spaces 26 | # or use += in several lines 27 | # ADDON_DEPENDENCIES = 28 | 29 | # include search paths, this will be usually parsed from the file system 30 | # but if the addon or addon libraries need special search paths they can be 31 | # specified here separated by spaces or one per line using += 32 | # ADDON_INCLUDES = 33 | 34 | # any special flag that should be passed to the compiler when using this 35 | # addon 36 | # ADDON_CFLAGS = 37 | 38 | # any special flag that should be passed to the linker when using this 39 | # addon, also used for system libraries with -lname 40 | # ADDON_LDFLAGS = 41 | 42 | # linux only, any library that should be included in the project using 43 | # pkg-config 44 | # ADDON_PKG_CONFIG_LIBRARIES = 45 | 46 | # osx/iOS only, any framework that should be included in the project 47 | # ADDON_FRAMEWORKS = 48 | 49 | # source files, these will be usually parsed from the file system looking 50 | # in the src folders in libs and the root of the addon. if your addon needs 51 | # to include files in different places or a different set of files per platform 52 | # they can be specified here 53 | # ADDON_SOURCES = 54 | 55 | # some addons need resources to be copied to the bin/data folder of the project 56 | # specify here any files that need to be copied, you can use wildcards like * and ? 57 | # ADDON_DATA = 58 | 59 | # when parsing the file system looking for libraries exclude this for all or 60 | # a specific platform 61 | # ADDON_LIBS_EXCLUDE = 62 | 63 | # when parsing the file system looking for sources exclude this for all or 64 | # a specific platform 65 | #ADDON_SOURCES_EXCLUDE = libs/oscpack/src/ip/win32/% 66 | 67 | # when parsing the file system looking for include paths exclude this for all or 68 | # a specific platform 69 | # ADDON_INCLUDES_EXCLUDE = 70 | 71 | OFXRPILED_ROOT = $(OF_ROOT)/addons/ofxRpiLED/libs/rgb_matrix 72 | ADDON_LDFLAGS = $(OFXRPILED_ROOT)/lib/linux/librgbmatrix.a -lrt -lm -lpthread 73 | -------------------------------------------------------------------------------- /example-image/Makefile: -------------------------------------------------------------------------------- 1 | # Attempt to load a config.make file. 2 | # If none is found, project defaults in config.project.make will be used. 3 | ifneq ($(wildcard config.make),) 4 | include config.make 5 | endif 6 | 7 | # make sure the the OF_ROOT location is defined 8 | ifndef OF_ROOT 9 | OF_ROOT=$(realpath ../../..) 10 | endif 11 | 12 | # call the project makefile! 13 | include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk 14 | -------------------------------------------------------------------------------- /example-image/addons.make: -------------------------------------------------------------------------------- 1 | ofxRpiLED 2 | -------------------------------------------------------------------------------- /example-image/bin/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/example-image/bin/data/.gitkeep -------------------------------------------------------------------------------- /example-image/bin/data/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/example-image/bin/data/image.jpg -------------------------------------------------------------------------------- /example-image/config.make: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # CONFIGURE PROJECT MAKEFILE (optional) 3 | # This file is where we make project specific configurations. 4 | ################################################################################ 5 | 6 | ################################################################################ 7 | # OF ROOT 8 | # The location of your root openFrameworks installation 9 | # (default) OF_ROOT = ../../.. 10 | ################################################################################ 11 | # OF_ROOT = ../../.. 12 | 13 | ################################################################################ 14 | # PROJECT ROOT 15 | # The location of the project - a starting place for searching for files 16 | # (default) PROJECT_ROOT = . (this directory) 17 | # 18 | ################################################################################ 19 | # PROJECT_ROOT = . 20 | 21 | ################################################################################ 22 | # PROJECT SPECIFIC CHECKS 23 | # This is a project defined section to create internal makefile flags to 24 | # conditionally enable or disable the addition of various features within 25 | # this makefile. For instance, if you want to make changes based on whether 26 | # GTK is installed, one might test that here and create a variable to check. 27 | ################################################################################ 28 | # None 29 | #APPNAME = projectGenerator 30 | #PROJECT_AFTER_OSX = cp "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME" "$TARGET_BUILD_DIR/commandLinePG"; rm -rf "$TARGET_BUILD_DIR/$PRODUCT_NAME.app"; mv "$TARGET_BUILD_DIR/commandLinePG" "$TARGET_BUILD_DIR/projectGenerator" 31 | 32 | ################################################################################ 33 | # PROJECT EXTERNAL SOURCE PATHS 34 | # These are fully qualified paths that are not within the PROJECT_ROOT folder. 35 | # Like source folders in the PROJECT_ROOT, these paths are subject to 36 | # exlclusion via the PROJECT_EXLCUSIONS list. 37 | # 38 | # (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) 39 | # 40 | # Note: Leave a leading space when adding list items with the += operator 41 | ################################################################################ 42 | # PROJECT_EXTERNAL_SOURCE_PATHS = 43 | 44 | ################################################################################ 45 | # PROJECT EXCLUSIONS 46 | # These makefiles assume that all folders in your current project directory 47 | # and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations 48 | # to look for source code. The any folders or files that match any of the 49 | # items in the PROJECT_EXCLUSIONS list below will be ignored. 50 | # 51 | # Each item in the PROJECT_EXCLUSIONS list will be treated as a complete 52 | # string unless teh user adds a wildcard (%) operator to match subdirectories. 53 | # GNU make only allows one wildcard for matching. The second wildcard (%) is 54 | # treated literally. 55 | # 56 | # (default) PROJECT_EXCLUSIONS = (blank) 57 | # 58 | # Will automatically exclude the following: 59 | # 60 | # $(PROJECT_ROOT)/bin% 61 | # $(PROJECT_ROOT)/obj% 62 | # $(PROJECT_ROOT)/%.xcodeproj 63 | # 64 | # Note: Leave a leading space when adding list items with the += operator 65 | ################################################################################ 66 | # PROJECT_EXCLUSIONS = 67 | 68 | ################################################################################ 69 | # PROJECT LINKER FLAGS 70 | # These flags will be sent to the linker when compiling the executable. 71 | # 72 | # (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs 73 | # 74 | # Note: Leave a leading space when adding list items with the += operator 75 | ################################################################################ 76 | 77 | # Currently, shared libraries that are needed are copied to the 78 | # $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to 79 | # add a runtime path to search for those shared libraries, since they aren't 80 | # incorporated directly into the final executable application binary. 81 | # TODO: should this be a default setting? 82 | # PROJECT_LDFLAGS=-Wl,-rpath=./libs 83 | 84 | ################################################################################ 85 | # PROJECT DEFINES 86 | # Create a space-delimited list of DEFINES. The list will be converted into 87 | # CFLAGS with the "-D" flag later in the makefile. 88 | # 89 | # (default) PROJECT_DEFINES = (blank) 90 | # 91 | # Note: Leave a leading space when adding list items with the += operator 92 | ################################################################################ 93 | # PROJECT_DEFINES = 94 | 95 | ################################################################################ 96 | # PROJECT CFLAGS 97 | # This is a list of fully qualified CFLAGS required when compiling for this 98 | # project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS 99 | # defined in your platform specific core configuration files. These flags are 100 | # presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. 101 | # 102 | # (default) PROJECT_CFLAGS = (blank) 103 | # 104 | # Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in 105 | # your platform specific configuration file will be applied by default and 106 | # further flags here may not be needed. 107 | # 108 | # Note: Leave a leading space when adding list items with the += operator 109 | ################################################################################ 110 | # PROJECT_CFLAGS = 111 | 112 | ################################################################################ 113 | # PROJECT OPTIMIZATION CFLAGS 114 | # These are lists of CFLAGS that are target-specific. While any flags could 115 | # be conditionally added, they are usually limited to optimization flags. 116 | # These flags are added BEFORE the PROJECT_CFLAGS. 117 | # 118 | # PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. 119 | # 120 | # (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) 121 | # 122 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. 123 | # 124 | # (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) 125 | # 126 | # Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the 127 | # PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration 128 | # file will be applied by default and further optimization flags here may not 129 | # be needed. 130 | # 131 | # Note: Leave a leading space when adding list items with the += operator 132 | ################################################################################ 133 | PROJECT_OPTIMIZATION_CFLAGS_RELEASE = -O3 134 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG = 135 | 136 | ################################################################################ 137 | # PROJECT COMPILERS 138 | # Custom compilers can be set for CC and CXX 139 | # (default) PROJECT_CXX = (blank) 140 | # (default) PROJECT_CC = (blank) 141 | # Note: Leave a leading space when adding list items with the += operator 142 | ################################################################################ 143 | # PROJECT_CXX = 144 | # PROJECT_CC = 145 | -------------------------------------------------------------------------------- /example-image/rpiLED.qbs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/example-image/rpiLED.qbs -------------------------------------------------------------------------------- /example-image/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "ofApp.h" 3 | #include "ofAppNoWindow.h" 4 | 5 | 6 | //======================================================================== 7 | int main( ){ 8 | ofAppNoWindow window; 9 | ofSetupOpenGL(&window,1024,768,OF_WINDOW); 10 | ofRunApp(new ofApp); 11 | } 12 | -------------------------------------------------------------------------------- /example-image/src/ofApp.cpp: -------------------------------------------------------------------------------- 1 | #include "ofApp.h" 2 | 3 | //-------------------------------------------------------------- 4 | void ofApp::setup(){ 5 | ofSetFrameRate(25); 6 | ofSetLogLevel(OF_LOG_ERROR); 7 | led.setup(); 8 | image.load("image.jpg"); 9 | } 10 | 11 | //-------------------------------------------------------------- 12 | void ofApp::update(){ 13 | 14 | } 15 | 16 | //-------------------------------------------------------------- 17 | void ofApp::draw(){ 18 | ofPixels & pixels = image.getPixels(); 19 | led.draw(pixels); 20 | } -------------------------------------------------------------------------------- /example-image/src/ofApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "ofxRpiLED.h" 5 | 6 | class ofApp : public ofBaseApp{ 7 | public: 8 | ofxRpiLED led; 9 | ofImage image; 10 | void setup(); 11 | void update(); 12 | void draw(); 13 | }; 14 | -------------------------------------------------------------------------------- /example-screen.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/example-screen.gif -------------------------------------------------------------------------------- /example-screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/example-screen.jpg -------------------------------------------------------------------------------- /example-screen/Makefile: -------------------------------------------------------------------------------- 1 | # Attempt to load a config.make file. 2 | # If none is found, project defaults in config.project.make will be used. 3 | ifneq ($(wildcard config.make),) 4 | include config.make 5 | endif 6 | 7 | # make sure the the OF_ROOT location is defined 8 | ifndef OF_ROOT 9 | OF_ROOT=$(realpath ../../..) 10 | endif 11 | 12 | # call the project makefile! 13 | include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk 14 | -------------------------------------------------------------------------------- /example-screen/addons.make: -------------------------------------------------------------------------------- 1 | ofxRpiLED 2 | -------------------------------------------------------------------------------- /example-screen/config.make: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # CONFIGURE PROJECT MAKEFILE (optional) 3 | # This file is where we make project specific configurations. 4 | ################################################################################ 5 | 6 | ################################################################################ 7 | # OF ROOT 8 | # The location of your root openFrameworks installation 9 | # (default) OF_ROOT = ../../.. 10 | ################################################################################ 11 | # OF_ROOT = ../../.. 12 | 13 | ################################################################################ 14 | # PROJECT ROOT 15 | # The location of the project - a starting place for searching for files 16 | # (default) PROJECT_ROOT = . (this directory) 17 | # 18 | ################################################################################ 19 | # PROJECT_ROOT = . 20 | 21 | ################################################################################ 22 | # PROJECT SPECIFIC CHECKS 23 | # This is a project defined section to create internal makefile flags to 24 | # conditionally enable or disable the addition of various features within 25 | # this makefile. For instance, if you want to make changes based on whether 26 | # GTK is installed, one might test that here and create a variable to check. 27 | ################################################################################ 28 | # None 29 | #APPNAME = projectGenerator 30 | #PROJECT_AFTER_OSX = cp "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME" "$TARGET_BUILD_DIR/commandLinePG"; rm -rf "$TARGET_BUILD_DIR/$PRODUCT_NAME.app"; mv "$TARGET_BUILD_DIR/commandLinePG" "$TARGET_BUILD_DIR/projectGenerator" 31 | 32 | ################################################################################ 33 | # PROJECT EXTERNAL SOURCE PATHS 34 | # These are fully qualified paths that are not within the PROJECT_ROOT folder. 35 | # Like source folders in the PROJECT_ROOT, these paths are subject to 36 | # exlclusion via the PROJECT_EXLCUSIONS list. 37 | # 38 | # (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) 39 | # 40 | # Note: Leave a leading space when adding list items with the += operator 41 | ################################################################################ 42 | # PROJECT_EXTERNAL_SOURCE_PATHS = 43 | 44 | ################################################################################ 45 | # PROJECT EXCLUSIONS 46 | # These makefiles assume that all folders in your current project directory 47 | # and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations 48 | # to look for source code. The any folders or files that match any of the 49 | # items in the PROJECT_EXCLUSIONS list below will be ignored. 50 | # 51 | # Each item in the PROJECT_EXCLUSIONS list will be treated as a complete 52 | # string unless teh user adds a wildcard (%) operator to match subdirectories. 53 | # GNU make only allows one wildcard for matching. The second wildcard (%) is 54 | # treated literally. 55 | # 56 | # (default) PROJECT_EXCLUSIONS = (blank) 57 | # 58 | # Will automatically exclude the following: 59 | # 60 | # $(PROJECT_ROOT)/bin% 61 | # $(PROJECT_ROOT)/obj% 62 | # $(PROJECT_ROOT)/%.xcodeproj 63 | # 64 | # Note: Leave a leading space when adding list items with the += operator 65 | ################################################################################ 66 | # PROJECT_EXCLUSIONS = 67 | 68 | ################################################################################ 69 | # PROJECT LINKER FLAGS 70 | # These flags will be sent to the linker when compiling the executable. 71 | # 72 | # (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs 73 | # 74 | # Note: Leave a leading space when adding list items with the += operator 75 | ################################################################################ 76 | 77 | # Currently, shared libraries that are needed are copied to the 78 | # $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to 79 | # add a runtime path to search for those shared libraries, since they aren't 80 | # incorporated directly into the final executable application binary. 81 | # TODO: should this be a default setting? 82 | # PROJECT_LDFLAGS=-Wl,-rpath=./libs 83 | 84 | ################################################################################ 85 | # PROJECT DEFINES 86 | # Create a space-delimited list of DEFINES. The list will be converted into 87 | # CFLAGS with the "-D" flag later in the makefile. 88 | # 89 | # (default) PROJECT_DEFINES = (blank) 90 | # 91 | # Note: Leave a leading space when adding list items with the += operator 92 | ################################################################################ 93 | # PROJECT_DEFINES = 94 | 95 | ################################################################################ 96 | # PROJECT CFLAGS 97 | # This is a list of fully qualified CFLAGS required when compiling for this 98 | # project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS 99 | # defined in your platform specific core configuration files. These flags are 100 | # presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. 101 | # 102 | # (default) PROJECT_CFLAGS = (blank) 103 | # 104 | # Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in 105 | # your platform specific configuration file will be applied by default and 106 | # further flags here may not be needed. 107 | # 108 | # Note: Leave a leading space when adding list items with the += operator 109 | ################################################################################ 110 | # PROJECT_CFLAGS = 111 | 112 | ################################################################################ 113 | # PROJECT OPTIMIZATION CFLAGS 114 | # These are lists of CFLAGS that are target-specific. While any flags could 115 | # be conditionally added, they are usually limited to optimization flags. 116 | # These flags are added BEFORE the PROJECT_CFLAGS. 117 | # 118 | # PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. 119 | # 120 | # (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) 121 | # 122 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. 123 | # 124 | # (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) 125 | # 126 | # Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the 127 | # PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration 128 | # file will be applied by default and further optimization flags here may not 129 | # be needed. 130 | # 131 | # Note: Leave a leading space when adding list items with the += operator 132 | ################################################################################ 133 | PROJECT_OPTIMIZATION_CFLAGS_RELEASE = -O3 134 | # PROJECT_OPTIMIZATION_CFLAGS_DEBUG = 135 | 136 | ################################################################################ 137 | # PROJECT COMPILERS 138 | # Custom compilers can be set for CC and CXX 139 | # (default) PROJECT_CXX = (blank) 140 | # (default) PROJECT_CC = (blank) 141 | # Note: Leave a leading space when adding list items with the += operator 142 | ################################################################################ 143 | # PROJECT_CXX = 144 | # PROJECT_CC = 145 | -------------------------------------------------------------------------------- /example-screen/rpiLED.qbs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/example-screen/rpiLED.qbs -------------------------------------------------------------------------------- /example-screen/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "ofApp.h" 3 | 4 | //======================================================================== 5 | int main( ){ 6 | ofSetupOpenGL(320,240, OF_WINDOW); 7 | ofRunApp( new ofApp()); 8 | } 9 | -------------------------------------------------------------------------------- /example-screen/src/ofApp.cpp: -------------------------------------------------------------------------------- 1 | #include "ofApp.h" 2 | 3 | //-------------------------------------------------------------- 4 | void ofApp::setup(){ 5 | ofSetFrameRate(25); 6 | ofBackground(0,0,0); 7 | led.setup(); 8 | box[0].set( 10 ); 9 | box[0].setPosition(16,16,1); 10 | box[1].set( 10 ); 11 | box[1].setPosition(32,16,1); 12 | box[2].set( 10 ); 13 | box[2].setPosition(48,16,1); 14 | std::cout << "[ofApp::setup] Ready..." << endl; 15 | } 16 | 17 | //-------------------------------------------------------------- 18 | void ofApp::update(){ 19 | 20 | } 21 | 22 | //-------------------------------------------------------------- 23 | void ofApp::draw(){ 24 | ofSetColor(255, 255, 255); 25 | ofDrawBitmapString(ofGetFrameRate(),1,30); 26 | 27 | float spinX = sin(ofGetElapsedTimef()*.35f); 28 | float spinY = cos(ofGetElapsedTimef()*.075f); 29 | ofSetColor(0, 255, 0); 30 | box[0].rotate(spinX, 1.0, 0.0, 0.0); 31 | box[0].rotate(spinY, 0, 1.0, 0.0); 32 | box[0].drawWireframe(); 33 | 34 | ofSetColor(255, 0, 0); 35 | box[1].rotate(spinX, 1.0, 0.0, 0.0); 36 | box[1].rotate(spinY, 0, 1.0, 0.0); 37 | box[1].drawWireframe(); 38 | 39 | ofSetColor(0, 0, 255); 40 | box[2].rotate(spinX, 1.0, 0.0, 0.0); 41 | box[2].rotate(spinY, 0, 1.0, 0.0); 42 | box[2].drawWireframe(); 43 | 44 | image.grabScreen(0,0,64,32); 45 | led.draw(image); 46 | } 47 | -------------------------------------------------------------------------------- /example-screen/src/ofApp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ofMain.h" 4 | #include "ofxRpiLED.h" 5 | 6 | 7 | class ofApp : public ofBaseApp{ 8 | 9 | public: 10 | 11 | ofxRpiLED led; 12 | ofImage image; 13 | ofBoxPrimitive box[3]; 14 | 15 | void setup(); 16 | void update(); 17 | void draw(); 18 | }; 19 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/canvas.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Copyright (C) 2014 Henner Zeller 3 | // 4 | // This program is free software; you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation version 2. 7 | // 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | // GNU General Public License for more details. 12 | // 13 | // You should have received a copy of the GNU General Public License 14 | // along with this program. If not, see 15 | 16 | #ifndef RPI_CANVAS_H 17 | #define RPI_CANVAS_H 18 | #include 19 | 20 | namespace rgb_matrix { 21 | // An interface for things a Canvas can do. The RGBMatrix implements this 22 | // interface, so you can use it directly wherever a canvas is needed. 23 | // 24 | // This abstraction also allows you to e.g. create delegating 25 | // implementations that do a particular transformation, e.g. re-map 26 | // pixels (as you might lay out the physical RGB matrix in a different way), 27 | // compose images (OR, XOR, transparecy), scale, rotate, anti-alias or 28 | // translate coordinates in a funky way. 29 | // 30 | // It is a good idea to have your applications use the concept of 31 | // a Canvas to write the content to instead of directly using the RGBMatrix. 32 | class Canvas { 33 | public: 34 | virtual ~Canvas() {} 35 | virtual int width() const = 0; // Pixels available in x direction. 36 | virtual int height() const = 0; // Pixels available in y direction. 37 | 38 | // Set pixel at coordinate (x,y) with given color. Pixel (0,0) is the 39 | // top left corner. 40 | // Each color is 8 bit (24bpp), 0 black, 255 brightest. 41 | virtual void SetPixel(int x, int y, 42 | uint8_t red, uint8_t green, uint8_t blue) = 0; 43 | 44 | // Clear screen to be all black. 45 | virtual void Clear() = 0; 46 | 47 | // Fill screen with given 24bpp color. 48 | virtual void Fill(uint8_t red, uint8_t green, uint8_t blue) = 0; 49 | }; 50 | 51 | // A canvas transformer is an object that, given a Canvas, returns a 52 | // canvas that applies transformations before writing to the original 53 | // Canvas. 54 | // 55 | // To simplify assumptions for implementations and users of implementations, 56 | // the following conditions and constraints apply: 57 | // 58 | // 1) The CanvasTransformer _never_ takes ownership of the delegatee. 59 | // 2) The ownership of the returned Canvas is _not_ passed to the caller. 60 | // 3) The returned Canvas can only be assumed to be valid for the lifetime 61 | // of the CanvasTranformer and the lifetime of the original canvas. 62 | // 4) The returned canvas is only valid up to the next call of Transform(). 63 | // 64 | // * Point 2)-4) imply that the CanvasTransformer can hand out the same 65 | // canvas object every time, just configured to write to the new 66 | // delegatee. 67 | // * Point 4) implies that one instance of CanvasTransformer cannot be used in 68 | // parallel in multiple threads calling Transform(). 69 | // * The constraints also imply that it is valid for a CanvasTransformer to 70 | // return the passed in canvas itself. 71 | class CanvasTransformer { 72 | public: 73 | virtual ~CanvasTransformer() {} 74 | 75 | // Return a Canvas* that applies transformations before delegating to 76 | // the output canvas. 77 | virtual Canvas *Transform(Canvas *output) = 0; 78 | }; 79 | 80 | } // namespace rgb_matrix 81 | #endif // RPI_CANVAS_H 82 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/gpio.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Copyright (C) 2013 Henner Zeller 3 | // 4 | // This program is free software; you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation version 2. 7 | // 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | // GNU General Public License for more details. 12 | // 13 | // You should have received a copy of the GNU General Public License 14 | // along with this program. If not, see 15 | 16 | #ifndef RPI_GPIO_H 17 | #define RPI_GPIO_H 18 | 19 | #include 20 | 21 | #include 22 | 23 | // Putting this in our namespace to not collide with other things called like 24 | // this. 25 | namespace rgb_matrix { 26 | // For now, everything is initialized as output. 27 | class GPIO { 28 | public: 29 | // Available bits that actually have pins. 30 | static const uint32_t kValidBits; 31 | 32 | GPIO(); 33 | 34 | // Initialize before use. Returns 'true' if successful, 'false' otherwise 35 | // (e.g. due to a permission problem). 36 | bool Init(); 37 | 38 | // Initialize outputs. 39 | // Returns the bits that are actually set. 40 | uint32_t InitOutputs(uint32_t outputs); 41 | 42 | // Set the bits that are '1' in the output. Leave the rest untouched. 43 | inline void SetBits(uint32_t value) { 44 | if (!value) return; 45 | *gpio_set_bits_ = value; 46 | #ifdef RGB_SLOWDOWN_GPIO 47 | *gpio_set_bits_ = value; 48 | # if RGB_SLOWDOWN_GPIO > 1 49 | *gpio_set_bits_ = value; // for really slow cases 50 | # endif 51 | #endif 52 | } 53 | 54 | // Clear the bits that are '1' in the output. Leave the rest untouched. 55 | inline void ClearBits(uint32_t value) { 56 | if (!value) return; 57 | *gpio_clr_bits_ = value; 58 | #ifdef RGB_SLOWDOWN_GPIO 59 | *gpio_clr_bits_ = value; 60 | # if RGB_SLOWDOWN_GPIO > 1 61 | *gpio_clr_bits_ = value; // for really slow cases 62 | # endif 63 | #endif 64 | } 65 | 66 | // Write all the bits of "value" mentioned in "mask". Leave the rest untouched. 67 | inline void WriteMaskedBits(uint32_t value, uint32_t mask) { 68 | // Writing a word is two operations. The IO is actually pretty slow, so 69 | // this should probably be unnoticable. 70 | ClearBits(~value & mask); 71 | SetBits(value & mask); 72 | } 73 | 74 | inline void Write(uint32_t value) { WriteMaskedBits(value, output_bits_); } 75 | 76 | private: 77 | uint32_t output_bits_; 78 | volatile uint32_t *gpio_port_; 79 | volatile uint32_t *gpio_set_bits_; 80 | volatile uint32_t *gpio_clr_bits_; 81 | }; 82 | 83 | // A PinPulser is a utility class that pulses a GPIO pin. There can be various 84 | // implementations. 85 | class PinPulser { 86 | public: 87 | // Factory for a PinPulser. Chooses the right implementation depending 88 | // on the context (CPU and which pins are affected). 89 | // "gpio_mask" is the mask that should be output (since we only 90 | // need negative pulses, this is what it does) 91 | // "nano_wait_spec" contains a list of time periods we'd like 92 | // invoke later. This can be used to pre-process timings if needed. 93 | static PinPulser *Create(GPIO *io, uint32_t gpio_mask, 94 | const std::vector &nano_wait_spec); 95 | 96 | virtual ~PinPulser() {} 97 | 98 | // Send a pulse with a given length (index into nano_wait_spec array). 99 | virtual void SendPulse(int time_spec_number) = 0; 100 | 101 | // If SendPulse() is asynchronously implemented, wait for pulse to finish. 102 | virtual void WaitPulseFinished() {} 103 | }; 104 | 105 | } // end namespace rgb_matrix 106 | #endif // RPI_GPIO_H 107 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/graphics.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Very simple graphics library to do simple things. 3 | // 4 | // Might be useful to consider using Cairo instead and just have an interface 5 | // between that and the Canvas. Well, this is a quick set of things to get 6 | // started (and nicely self-contained). 7 | #ifndef RPI_GRAPHICS_H 8 | #define RPI_GRAPHICS_H 9 | 10 | #include "canvas.h" 11 | 12 | #include 13 | #include 14 | 15 | namespace rgb_matrix { 16 | struct Color { 17 | Color(uint8_t rr, uint8_t gg, uint8_t bb) : r(rr), g(gg), b(bb) {} 18 | uint8_t r; 19 | uint8_t g; 20 | uint8_t b; 21 | }; 22 | 23 | // Font loading bdf files. If this ever becomes more types, just make virtual 24 | // base class. 25 | class Font { 26 | public: 27 | // Initialize font, but it is only usable after LoadFont() has been called. 28 | Font(); 29 | ~Font(); 30 | 31 | bool LoadFont(const char *path); 32 | 33 | // Return height of font in pixels. Returns -1 if font has not been loaded. 34 | int height() const { return font_height_; } 35 | 36 | // Return baseline. Pixels from the topline to the baseline. 37 | int baseline() const { return base_line_; } 38 | 39 | // Return width of given character, or -1 if font is not loaded or character 40 | // does not exist. 41 | int CharacterWidth(uint32_t unicode_codepoint) const; 42 | 43 | // Draws the unicode character at position "x","y" with "color". The "y" 44 | // position is the baseline of the font. 45 | // If we don't have it in the font, draws the replacement character "�" if 46 | // available. 47 | // Returns how much we advance on the screen, which is the width of the 48 | // character or 0 if we didn't draw any chracter. 49 | int DrawGlyph(Canvas *c, int x, int y, const Color &color, 50 | uint32_t unicode_codepoint) const; 51 | private: 52 | Font(const Font& x); // No copy constructor. Use references or pointer instead. 53 | 54 | struct Glyph; 55 | typedef std::map CodepointGlyphMap; 56 | 57 | const Glyph *FindGlyph(uint32_t codepoint) const; 58 | 59 | int font_height_; 60 | int base_line_; 61 | CodepointGlyphMap glyphs_; 62 | }; 63 | 64 | // -- Some utility functions. 65 | 66 | // Draw text, encoded in UTF-8, with given "font" at "x","y" with "color". 67 | // Returns how far we advance on the screen. 68 | int DrawText(Canvas *c, const Font &font, int x, int y, const Color &color, 69 | const char *utf8_text); 70 | 71 | // Draw a circle centered at "x", "y", with a radius of "radius" and with "color" 72 | void DrawCircle(Canvas *c, int xx, int y, int radius, const Color &color); 73 | 74 | // Draw a line from "x0", "y0" to "x1", "y1" and with "color" 75 | void DrawLine(Canvas *c, int x0, int y0, int x1, int y1, const Color &color); 76 | 77 | } // namespace rgb_matrix 78 | 79 | #endif // RPI_GRAPHICS_H 80 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/led-matrix.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Copyright (C) 2013 Henner Zeller 3 | // 4 | // This program is free software; you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation version 2. 7 | // 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | // GNU General Public License for more details. 12 | // 13 | // You should have received a copy of the GNU General Public License 14 | // along with this program. If not, see 15 | 16 | // Controlling 16x32 or 32x32 RGB matrixes via GPIO. It allows daisy chaining 17 | // of a string of these, and also connecting a parallel string on newer 18 | // Raspberry Pis with more GPIO pins available. 19 | 20 | #ifndef RPI_RGBMATRIX_H 21 | #define RPI_RGBMATRIX_H 22 | 23 | #include 24 | #include 25 | 26 | #include "gpio.h" 27 | #include "canvas.h" 28 | #include "thread.h" 29 | #include "transformer.h" 30 | 31 | namespace rgb_matrix { 32 | class FrameCanvas; // Canvas for Double- and Multibuffering 33 | namespace internal { class Framebuffer; } 34 | 35 | // The RGB matrix provides the framebuffer and the facilities to constantly 36 | // update the LED matrix. 37 | // 38 | // This implement the Canvas interface that represents the display with 39 | // (32 * chained_displays)x(rows * parallel_displays) pixels. 40 | // 41 | // If can do multi-buffering using the CreateFrameCanvas() and SwapOnVSync() 42 | // methods. This is useful for animations and to prevent tearing. 43 | // 44 | // If you arrange the panels in a different way in the physical space, write 45 | // a delegating Canvas that does coordinate remapping, like the 46 | // LargeSquare64x64Canvas in demo-main.cc. 47 | class RGBMatrix : public Canvas { 48 | public: 49 | // Initialize RGB matrix with GPIO to write to. 50 | // 51 | // The "rows" are the number 52 | // of rows supported by the display, so 32 or 16. Number of "chained_display"s 53 | // tells many of these are daisy-chained together (output of one connected 54 | // to input of next). 55 | // 56 | // The "parallel_display" number determines if there is one or two displays 57 | // connected in parallel to the GPIO port - this only works with newer 58 | // Raspberry Pi that have 40 interface pins. 59 | // 60 | // If "io" is not NULL, starts refreshing the screen immediately; you can 61 | // defer that by setting GPIO later with SetGPIO(). 62 | // 63 | // The resulting canvas is (rows * parallel_displays) high and 64 | // (32 * chained_displays) wide. 65 | RGBMatrix(GPIO *io, int rows = 32, int chained_displays = 1, 66 | int parallel_displays = 1); 67 | virtual ~RGBMatrix(); 68 | 69 | // Set GPIO output if it was not set already in constructor (otherwise: NoOp). 70 | // Starts display refresh thread if this is the first setting. 71 | void SetGPIO(GPIO *io); 72 | 73 | // Set PWM bits used for output. Default is 11, but if you only deal with 74 | // limited comic-colors, 1 might be sufficient. Lower require less CPU and 75 | // increases refresh-rate. 76 | // 77 | // Returns boolean to signify if value was within range. 78 | // 79 | // This sets the PWM bits for the current active FrameCanvas and future 80 | // ones that are created with CreateFrameCanvas(). 81 | bool SetPWMBits(uint8_t value); 82 | uint8_t pwmbits(); // return the pwm-bits of the currently active buffer. 83 | 84 | // Map brightness of output linearly to input with CIE1931 profile. 85 | void set_luminance_correct(bool on); 86 | bool luminance_correct() const; 87 | 88 | // Set brightness in percent. 1%..100%. 89 | // This will only affect newly set pixels. 90 | void SetBrightness(uint8_t brightness); 91 | uint8_t brightness(); 92 | 93 | //-- Double- and Multibuffering. 94 | 95 | // Create a new buffer to be used for multi-buffering. The returned new 96 | // Buffer implements a Canvas with the same size of thie RGBMatrix. 97 | // You can use it to draw off-screen on it, then swap it with the active 98 | // buffer using SwapOnVSync(). That would be classic double-buffering. 99 | // 100 | // You can also create as many FrameCanvas as you like and for instance use 101 | // them to pre-fill scenes of an animation for fast playback later. 102 | // 103 | // The ownership of the created Canvases remains with the RGBMatrix, so you 104 | // don't have to worry about deleting them. 105 | FrameCanvas *CreateFrameCanvas(); 106 | 107 | // This method waits to the next VSync and swaps the active buffer with the 108 | // supplied buffer. The formerly active buffer is returned. 109 | // 110 | // If you pass in NULL, the active buffer is returned, but it won't be 111 | // replaced with NULL. You can use the NULL-behavior to just wait on 112 | // VSync or to retrieve the initial buffer when preparing a multi-buffer 113 | // animation. 114 | FrameCanvas *SwapOnVSync(FrameCanvas *other); 115 | 116 | // Set image transformer that maps the logical canvas we provide to the 117 | // physical canvas (e.g. panel mapping, rotation ...). 118 | // Does _not_ take ownership of the transformer. 119 | void SetTransformer(CanvasTransformer *transformer); 120 | inline CanvasTransformer *transformer() { return transformer_; } 121 | 122 | // -- Canvas interface. These write to the active FrameCanvas 123 | // (see documentation in canvas.h) 124 | virtual int width() const; 125 | virtual int height() const; 126 | virtual void SetPixel(int x, int y, 127 | uint8_t red, uint8_t green, uint8_t blue); 128 | virtual void Clear(); 129 | virtual void Fill(uint8_t red, uint8_t green, uint8_t blue); 130 | 131 | private: 132 | class UpdateThread; 133 | friend class UpdateThread; 134 | 135 | const int rows_; 136 | const int chained_displays_; 137 | const int parallel_displays_; 138 | 139 | uint8_t pwm_bits_; 140 | bool do_luminance_correct_; 141 | uint8_t brightness_; 142 | 143 | FrameCanvas *active_; 144 | 145 | GPIO *io_; 146 | Mutex active_frame_sync_; 147 | UpdateThread *updater_; 148 | std::vector created_frames_; 149 | CanvasTransformer *transformer_; 150 | }; 151 | 152 | class FrameCanvas : public Canvas { 153 | public: 154 | // Set PWM bits used for this Frame. 155 | // Simple comic-colors, 1 might be sufficient (111 RGB, i.e. 8 colors). 156 | // Lower require less CPU. 157 | // Returns boolean to signify if value was within range. 158 | bool SetPWMBits(uint8_t value); 159 | uint8_t pwmbits(); 160 | 161 | // Map brightness of output linearly to input with CIE1931 profile. 162 | void set_luminance_correct(bool on); 163 | bool luminance_correct() const; 164 | 165 | void SetBrightness(uint8_t brightness); 166 | uint8_t brightness(); 167 | 168 | // -- Canvas interface. 169 | virtual int width() const; 170 | virtual int height() const; 171 | virtual void SetPixel(int x, int y, 172 | uint8_t red, uint8_t green, uint8_t blue); 173 | virtual void Clear(); 174 | virtual void Fill(uint8_t red, uint8_t green, uint8_t blue); 175 | 176 | private: 177 | friend class RGBMatrix; 178 | 179 | FrameCanvas(internal::Framebuffer *frame) : frame_(frame){} 180 | virtual ~FrameCanvas(); 181 | internal::Framebuffer *framebuffer() { return frame_; } 182 | 183 | internal::Framebuffer *const frame_; 184 | }; 185 | } // end namespace rgb_matrix 186 | #endif // RPI_RGBMATRIX_H 187 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/thread.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Copyright (C) 2013 Henner Zeller 3 | // 4 | // This program is free software; you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation version 2. 7 | // 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | // GNU General Public License for more details. 12 | // 13 | // You should have received a copy of the GNU General Public License 14 | // along with this program. If not, see 15 | 16 | #ifndef RPI_THREAD_H 17 | #define RPI_THREAD_H 18 | 19 | #include 20 | #include 21 | 22 | namespace rgb_matrix { 23 | // Simple thread abstraction. 24 | class Thread { 25 | public: 26 | Thread(); 27 | 28 | // The destructor waits for Run() to return so make sure it does. 29 | virtual ~Thread(); 30 | 31 | // Wait for the Run() method to return. 32 | void WaitStopped(); 33 | 34 | // Start thread. If realtime_priority is > 0, then this will be a 35 | // thread with SCHED_FIFO and the given priority. 36 | // If cpu_affinity is set !=, chooses the given bitmask of CPUs 37 | // this thread should have an affinity to. 38 | // On a Raspberry Pi 1, this doesn't matter, as there is only one core, 39 | // Raspberry Pi 2 can has 4 cores, so any combination of (1<<0) .. (1<<3) is 40 | // valid. 41 | virtual void Start(int realtime_priority = 0, uint32_t cpu_affinity_mask = 0); 42 | 43 | // Override this. 44 | virtual void Run() = 0; 45 | 46 | private: 47 | static void *PthreadCallRun(void *tobject); 48 | bool started_; 49 | pthread_t thread_; 50 | }; 51 | 52 | // Non-recursive Mutex. 53 | class Mutex { 54 | public: 55 | Mutex() { pthread_mutex_init(&mutex_, NULL); } 56 | ~Mutex() { pthread_mutex_destroy(&mutex_); } 57 | void Lock() { pthread_mutex_lock(&mutex_); } 58 | void Unlock() { pthread_mutex_unlock(&mutex_); } 59 | void WaitOn(pthread_cond_t *cond) { pthread_cond_wait(cond, &mutex_); } 60 | 61 | private: 62 | pthread_mutex_t mutex_; 63 | }; 64 | 65 | // Useful RAII wrapper around mutex. 66 | class MutexLock { 67 | public: 68 | MutexLock(Mutex *m) : mutex_(m) { mutex_->Lock(); } 69 | ~MutexLock() { mutex_->Unlock(); } 70 | private: 71 | Mutex *const mutex_; 72 | }; 73 | 74 | } // end namespace rgb_matrix 75 | 76 | #endif // RPI_THREAD_H 77 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/threaded-canvas-manipulator.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Copyright (C) 2014 Henner Zeller 3 | // 4 | // This program is free software; you can redistribute it and/or modify 5 | // it under the terms of the GNU General Public License as published by 6 | // the Free Software Foundation version 2. 7 | // 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | // GNU General Public License for more details. 12 | // 13 | // You should have received a copy of the GNU General Public License 14 | // along with this program. If not, see 15 | 16 | // Utility base class for continuously updating the canvas. 17 | #ifndef RPI_THREADED_CANVAS_MANIPULATOR_H 18 | #define RPI_THREADED_CANVAS_MANIPULATOR_H 19 | 20 | #include "thread.h" 21 | #include "canvas.h" 22 | 23 | namespace rgb_matrix { 24 | // 25 | // Typically, your programs will crate a canvas and then updating the image 26 | // in a loop. If you want to do stuff in parallel, then this utility class 27 | // helps you doing that. Also a demo for how to use the Thread class. 28 | // 29 | // Extend it, then just implement Run(). Example: 30 | /* 31 | class MyCrazyDemo : public ThreadedCanvasManipulator { 32 | public: 33 | MyCrazyDemo(Canvas *canvas) : ThreadedCanvasManipulator(canvas) {} 34 | virtual void Run() { 35 | unsigned char c; 36 | while (running()) { 37 | // Calculate the next frame. 38 | c++; 39 | for (int x = 0; x < canvas()->width(); ++x) { 40 | for (int y = 0; y < canvas()->height(); ++y) { 41 | canvas()->SetPixel(x, y, c, c, c); 42 | } 43 | } 44 | usleep(15 * 1000); 45 | } 46 | } 47 | }; 48 | 49 | // Later, in your main method. 50 | RGBMatrix matrix(&gpio); 51 | MyCrazyDemo *demo = new MyCrazyDemo(&matrix); 52 | demo->Start(); // Start doing things. 53 | // This now runs in the background, you can do other things here, 54 | // e.g. aquiring new data or simply wait. But for waiting, you wouldn't 55 | // need a thread in the first place. 56 | demo->Stop(); 57 | delete demo; 58 | */ 59 | class ThreadedCanvasManipulator : public Thread { 60 | public: 61 | ThreadedCanvasManipulator(Canvas *m) : running_(false), canvas_(m) {} 62 | virtual ~ThreadedCanvasManipulator() { Stop(); } 63 | 64 | virtual void Start(int realtime_priority=0, uint32_t affinity_mask=0) { 65 | { 66 | MutexLock l(&mutex_); 67 | running_ = true; 68 | } 69 | Thread::Start(realtime_priority, affinity_mask); 70 | } 71 | 72 | // Stop the thread at the next possible time Run() checks the running_ flag. 73 | void Stop() { 74 | MutexLock l(&mutex_); 75 | running_ = false; 76 | } 77 | 78 | // Implement this and run while running() returns true. 79 | virtual void Run() = 0; 80 | 81 | protected: 82 | inline Canvas *canvas() { return canvas_; } 83 | inline bool running() { 84 | MutexLock l(&mutex_); 85 | return running_; 86 | } 87 | 88 | private: 89 | Mutex mutex_; 90 | bool running_; 91 | Canvas *const canvas_; 92 | }; 93 | } // namespace rgb_matrix 94 | 95 | #endif // RPI_THREADED_CANVAS_MANIPULATOR_H 96 | -------------------------------------------------------------------------------- /libs/rgb_matrix/include/transformer.h: -------------------------------------------------------------------------------- 1 | // -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*- 2 | // Copyright (C) 2014 Henner Zeller 3 | // Copyright (C) 2015 Christoph Friedrich 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation version 2. 8 | // 9 | // This program is distributed in the hope that it will be useful, 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | // GNU General Public License for more details. 13 | // 14 | // You should have received a copy of the GNU General Public License 15 | // along with this program. If not, see 16 | 17 | #ifndef RPI_TRANSFORMER_H 18 | #define RPI_TRANSFORMER_H 19 | 20 | #include 21 | #include 22 | 23 | #include "canvas.h" 24 | 25 | namespace rgb_matrix { 26 | 27 | // Transformer for RotateCanvas 28 | class RotateTransformer : public CanvasTransformer { 29 | public: 30 | RotateTransformer(int angle = 0); 31 | virtual ~RotateTransformer(); 32 | 33 | void SetAngle(int angle); 34 | inline int angle() { return angle_; } 35 | 36 | virtual Canvas *Transform(Canvas *output); 37 | 38 | private: 39 | // Transformer canvas to rotate the input canvas in 90° steps 40 | class TransformCanvas; 41 | 42 | int angle_; 43 | TransformCanvas *const canvas_; 44 | }; 45 | 46 | // Transformer for linked transformer objects 47 | // First transformer added will be considered last 48 | // (so it would the transformer that gets the original Canvas object) 49 | class LinkedTransformer : public CanvasTransformer { 50 | public: 51 | typedef std::vector List; 52 | 53 | LinkedTransformer() {} 54 | LinkedTransformer(List transformer_list) : list_(transformer_list) {} 55 | 56 | // The ownership of the given transformers is _not_ taken over unless 57 | // you explicitly call DeleteTransformers(). 58 | void AddTransformer(CanvasTransformer *transformer); 59 | void AddTransformer(List transformer_list); 60 | void SetTransformer(List transformer_list); 61 | 62 | // Delete transformers that have been added or set. 63 | void DeleteTransformers(); 64 | 65 | // -- CanvasTransformer interface 66 | virtual Canvas *Transform(Canvas *output); 67 | 68 | private: 69 | List list_; 70 | }; 71 | 72 | class LargeSquare64x64Transformer : public CanvasTransformer { 73 | public: 74 | LargeSquare64x64Transformer(); 75 | virtual ~LargeSquare64x64Transformer(); 76 | 77 | virtual Canvas *Transform(Canvas *output); 78 | 79 | private: 80 | class TransformCanvas; 81 | 82 | TransformCanvas *const canvas_; 83 | }; 84 | 85 | } // namespace rgb_matrix 86 | 87 | #endif // RPI_TRANSFORMER_H 88 | -------------------------------------------------------------------------------- /libs/rgb_matrix/lib/.gitignore: -------------------------------------------------------------------------------- 1 | compiler-flags 2 | -------------------------------------------------------------------------------- /libs/rgb_matrix/lib/linux/librgbmatrix.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/urshofer/ofxRpiLED/cc1f187fa6703bc2c45f76bb37dd08cb99cd889b/libs/rgb_matrix/lib/linux/librgbmatrix.a -------------------------------------------------------------------------------- /src/ofxRpiLED.cpp: -------------------------------------------------------------------------------- 1 | #include "ofxRpiLED.h" 2 | 3 | 4 | // Constructor 5 | ofxRpiLED::ofxRpiLED() { 6 | rows = 32; // A 32x32 display. Use 16 when this is a 16x32 display. 7 | chain = 2; // Number of boards chained together. 8 | parallel = 1; // Number of chains in parallel (1..3). > 1 for plus or Pi2 9 | } 10 | 11 | // Desonstructor 12 | ofxRpiLED::~ofxRpiLED() { 13 | canvas->Clear(); 14 | delete canvas; 15 | } 16 | 17 | void ofxRpiLED::setup() { 18 | /* 19 | * Set up GPIO pins. This fails when not running as root. 20 | */ 21 | if (!io.Init()) 22 | return; 23 | 24 | canvas = new RGBMatrix(&io, rows, chain, parallel); 25 | 26 | /* 27 | * Clear and cache size 28 | */ 29 | 30 | canvas->Fill(0,0,0); 31 | cW = canvas->width(); 32 | cH = canvas->height(); 33 | } 34 | 35 | void ofxRpiLED::setup(int _rows, int _chain, int _parallel){ 36 | rows = _rows; 37 | chain = _chain; 38 | parallel = _parallel; 39 | setup(); 40 | } 41 | 42 | void ofxRpiLED::clear(){ 43 | canvas->Clear(); 44 | } 45 | 46 | void ofxRpiLED::draw(ofPixels &p){ 47 | int w = cW > p.getWidth() ? cW : p.getWidth(); 48 | int h = cH > p.getHeight() ? cH : p.getHeight(); 49 | for (int x = 0; x < w; x++) { 50 | for (int y = 0; y < h; y++) { 51 | ofColor c = p.getColor(x, y); 52 | canvas->SetPixel(x, y, c.r, c.g, c.b); 53 | } 54 | } 55 | } 56 | 57 | void ofxRpiLED::draw(ofImage &i){ 58 | int w = cW > i.getWidth() ? cW : i.getWidth(); 59 | int h = cH > i.getHeight() ? cH : i.getHeight(); 60 | for (int x = 0; x < w; x++) { 61 | for (int y = 0; y < h; y++) { 62 | ofColor c = i.getColor(x, y); 63 | canvas->SetPixel(x, y, c.r, c.g, c.b); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/ofxRpiLED.h: -------------------------------------------------------------------------------- 1 | #include "ofMain.h" 2 | #include "../libs/rgb_matrix/include/led-matrix.h" 3 | 4 | using rgb_matrix::GPIO; 5 | using rgb_matrix::RGBMatrix; 6 | using rgb_matrix::Canvas; 7 | 8 | class ofxRpiLED { 9 | 10 | private: 11 | int rows; // A 32x32 display. Use 16 when this is a 16x32 display. 12 | int chain; // Number of boards chained together. 13 | int parallel; // Number of chains in parallel (1..3). > 1 for plus or Pi2 14 | int cW; 15 | int cH; 16 | Canvas *canvas; 17 | GPIO io; 18 | 19 | public: 20 | ofxRpiLED(); 21 | ~ofxRpiLED(); 22 | void setup(); 23 | void setup(int _rows, int _chain, int _parallel); 24 | void clear(); 25 | void draw(ofImage &i); 26 | void draw(ofPixels &p); 27 | }; 28 | --------------------------------------------------------------------------------