Code Monkey home page Code Monkey logo

epub-inkplate's People

Contributors

johnboiles avatar turgu1 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  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  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  avatar  avatar

epub-inkplate's Issues

M5Paper Progress?

Have you made any progress converting it to run on the M5Paper?
I really need this please for documenting M5Products.

Partial Refreshs of EPD

Thank you for writing this great software for the inkplate! It's really impressive that an esp32 can leverage such work. Is it possible to implement partial refreshs to save battery life and speed up refreshs?

Font library problems - arduino

Hello, your open source project is excellent.
I also have an open source ink screen project that needs TTF fonts, but it is the arduino platform. Can you tell me how to implement your TTF font library.

inkplate_6plus_release compile errors

After updating platformio.ini default_envs to inkplate_6plus_release I tried to compile using platformio run but I'm getting this errors:

src/controllers/common_actions.cpp: In static member function 'static void CommonActions::power_it_off()':
src/controllers/common_actions.cpp:48:21: error: 'TouchKeys' has not been declared
     #define INT_PIN TouchKeys::INTERRUPT_PIN
                     ^~~~~~~~~
src/controllers/common_actions.cpp:56:34: note: in expansion of macro 'INT_PIN'
     inkplate_platform.deep_sleep(INT_PIN, 1);
                                  ^~~~~~~
src/controllers/book_param_controller.cpp: In member function 'void BookParamController::input_event(EventMgr::Event)':
src/controllers/book_param_controller.cpp:250:35: error: 'SELECT' is not a member of 'EventMgr::Event'
     if (event == EventMgr::Event::SELECT) {
                                   ^~~~~~
Compiling .pio/build/inkplate_6plus_release/src/viewers/book_viewer.o
*** [.pio/build/inkplate_6plus_release/src/controllers/common_actions.o] Error 1
*** [.pio/build/inkplate_6plus_release/src/controllers/book_param_controller.o] Error 1
src/main.cpp: In function 'void mainTask(void*)':
src/main.cpp:79:25: error: 'TouchKeys' has not been declared
         #define INT_PIN TouchKeys::INTERRUPT_PIN
                         ^~~~~~~~~
src/main.cpp:99:40: note: in expansion of macro 'INT_PIN'
           inkplate_platform.deep_sleep(INT_PIN, 1);
                                        ^~~~~~~

This is the first time I use platformio and not sure if I'm missing some step here, but just for the record inkplate_6_release compiled correctly and I was able to flash it into my device.

I also notice that you are still testing 6plus version, please let me know if have a compiled version of it and I can help you with testing.
Thanks in advance for the good effort.

Pagination Issues for Dual Foldable InkPlate 6Plus Readers

Dear Guy,

Many, many thanks for your excellent work on the Inkplate ePub Reader!

Since I love the idea of having an eReader that feels and acts more like a real book, I have put together a rudimentary folding ebook reader using two Inkplate 6Plus readers and a 3D Printed Case (The case currently only folds 90 degrees, but that is enough for now for the purpose).
20220317_104814
I know this is a poor substitute for a foldable display, but eInk doesn't seem to want to treat this as a priority.
https://www.engadget.com/e-ink-folding-ereader-prototype-170116617.html

The problem of course with this solution is page turning. Reading the same book at the same time with 2 eReaders means 2 separate page turns for each device to advance the book properly in both eReaders.

Based on my rudimentary knowledge of programming and your excellent explanations in your readme and User Guide, I understand that pagination is a calculation involving the size of the screen, the font size, a variety of other factors that vary from book to book, etc.

What I was wondering was whether it would take a lot of coding work to implement one or both of the following:

(1) Make one tap of each ereader advance the book 2 pages (thereby eliminating two of the four taps currently needed); and

(2) Make it possible to have the option to change the direction of the page flow with the side of the screen being tapped--in other words, make it possible to go forward with a tap on either the right or left side, assigning backwards to the remaining side.

I realize that while the second idea might have some general application, the first idea would only make sense for the dual ereader scenario. Unfortunately, I have no idea how to implement either of these ideas. What i was wondering was whether, if the changes did not require a lot of coding for you, you could direct me to the proper place in the source code for me to plug it in, and then recompile the software for my machines only.

I know this is a lot to ask for such a limited use, but any help at all would be greatly appreciated!

Thanks again for all you've done on this project.

Best,

Rod Stenlake

P.S. I would have posted this on the eRadonica message board, but I have been unable to log in for quite some time.

Soldered Inkplate 6 PLUS boot loop

I can't get either the 2.0.0 or 2.0.1 release for the Inkplate 6 Plus to start. This is using the "Soldered" variant of the device (https://soldered.com/product/soldered-inkplate-6plus-with-enclosure-e-paper-display-with-touchscreen-copy/), I am not sure if that makes a difference.

Here is the boot sequence I get, followed by a reboot, over and over, with or without an SD card inserted.

I (721) psram: This chip is ESP32-D0WD
I (722) spiram: Found 64MBit SPI RAM device
I (723) spiram: SPI RAM mode: flash 40m sram 40m
I (724) spiram: PSRAM initialized, cache is in low/high (2-core) mode.
I (731) cpu_start: Pro cpu up.
I (735) cpu_start: Starting app cpu, entry point is 0x40083c64
I (0) cpu_start: App cpu up.
I (1626) spiram: SPI SRAM memory test OK
I (1635) cpu_start: Pro cpu start user code
I (1635) cpu_start: cpu freq: 240000000
I (1636) cpu_start: Application information:
I (1638) cpu_start: Project name:     EPub-InkPlate
I (1644) cpu_start: App version:      2.0.1
I (1649) cpu_start: Compile time:     May  1 2022 18:56:00
I (1655) cpu_start: ELF file SHA256:  1f56aaecd8043574...
I (1661) cpu_start: ESP-IDF:          4.3.2
I (1666) heap_init: Initializing. RAM available for dynamic allocation:
I (1673) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1679) heap_init: At 3FFC13C0 len 0001EC40 (123 KiB): DRAM
I (1686) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1692) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1699) heap_init: At 4009FDD0 len 00000230 (0 KiB): IRAM
I (1705) spiram: Adding pool of 4084K of external SPI memory to heap allocator
I (1714) spi_flash: detected chip: generic
I (1718) spi_flash: flash io: dio
I (1729) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (1732) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 3, 4MB external flash
Minimum free heap size: 4373811 bytes
Heap summary for capabilities 0x00000C06:
  Totals:
    free 0 allocated 0 min_free 0 largest_free_block 0
I (1762) main: EPub-Inkplate Startup.
I (1782) MCP23017: MCP at address 0x20 has been detected
I (1792) MCP23017: MCP at address 0x22 has NOT been detected
E (1792) MCP23017: The MCP at address 0x22 has not been detected.
E (1792) MCP23017: The MCP at address 0x22 has not been detected.
I (1932) gpio: GPIO[36]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 1| Intr:2 
E (3982) Wire: Unable to complete request_from: ESP_ERR_TIMEOUT.
E (3982) main: InkPlate6Ctrl Error.
E (3982) main: Config Error.
E (3982) Fonts: Unable to read fonts definition file fonts_list.xml.
E (3992) main: Font loading error.
E (3992) Fonts: Fonts.get(): Wrong index: 0 vs size: 0

abort() was called at PC 0x401ec55a on core 0

Backtrace:0x400838de:0x3ffdd9b0 0x4009255d:0x3ffdd9d0 0x4009a32a:0x3ffdd9f0 0x401ec55a:0x3ffdda60 0x401ec587:0x3ffdda80 0x401e9ddf:0x3ffddaa0 0x401d58bb:0x3ffddac0 0x400f8157:0x3ffddd60 00


ELF file SHA256: 1f56aaecd8043574

Rebooting...

I have tested that the SD card can be read from, with the MicroPython firmware and this example: https://github.com/SolderedElectronics/Inkplate-micropython/blob/master/Examples/Soldered_Inkplate6PLUS/exampleSd.py

Thoughts about pixel-perfect fonts...

I've been playing around with different fonts, and here are some of my thoughts...

I have an Inkplate 10, and the DPI isn't incredibly high (approximately 146 DPI, if my math is right), so unfortunately, fonts don't really look all that great. This is because the built-in vector fonts are intended for use with very high DPI displays (like phones) or full anti-aliasing. On the Inkplate, they look sort of choppy, which just isn't great for long-term reading. (I do realize that fonts are somewhat anti-aliased in 3-bit mode, but I strongly dislike 3-bit mode because a) text often appears very washed-out, b) it still looks pretty choppy, and c) I greatly appreciate the partial refreshes offered in 1-bit mode).

The solution to this, of course, is to use bitmap (aka raster) fonts at their native resolutions. For example, use of the PPMondwest-Regular.otf font (attached) with the size set to "12" looks very clean. It does not look clean at other sizes (at this time the other size options are "8", "10", or "15"). I put these numbers in quotes because they're what's used in the settings, and they are pt values, which are more confusing when talking about bitmap fonts. (PPMondwest-Regular.otf is a 16 px font, which is perfectly equal to 12 pt.)

The hard part is a) finding good bitmap fonts, b) at varying sizes, and c) with full bold/italic variants. However, I think it would be a worthwhile effort, because text just looks so much better with pixel-perfect fonts. Perhaps old computer operating system fonts would be a good source, since 2-3 decades ago basically all fonts were bitmap? Perhaps there are modern sources for good bitmap font families? I'm not sure.

Let me know what you think!

Attachment: PPMondwest-Regular.otf.zip

Feature request - text highlighting?

First of all, many thanks for a great project! I plan on buying an inkplate purely because of this project!

I would just like to know, is text highlighting supported? I would like to use something like readwise with this.

Fonts looking strange on Inkplate 6

Hi Guy,
I'm trying this on my Inkplate 6, so far build and compiled without any problems, added some books in the SD and this is what I'm getting:
IMG_20210417_072639_8963
Page example:
IMG_20210417_072558_8962

Maybe I'm doing something wrong?
It's getting some white lines in the middle where it does not print anything.

More details

Building with this default environment:

[platformio]
default_envs = inkplate_6_release

Additional notes:

This happens also if I try the release version:
sh upload.sh
esptool.py v3.0
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32-D0WDQ6 (revision 1)

Same problem, but additionally I cannot use the buttons. Compiling it and flashing with Platformio touch buttons work again.

Inkplate 6, continually restarting after upload

I've followed the instructions, loaded the SD card, and used upload.sh which runs successfully to upload release-1.2.1.2 to my Inkplate 6.

However, after uploading, the device just continually restarts, without ever succeeding.

I can see the device continually restarting, by opening the serial monitor in the Arduino IDE with baudrate 115200.

Is there any way to debug further what could be the issue?

This is what I see in the monitor, repeating every second,

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4
load:0x3fff0034,len:4876
load:0x40078000,len:13032
load:0x40080400,len:4100
entry 0x40080684

Dynamically add/remove default fonts?

Hello, I'm wondering if it would be possible to dynamically scan the fonts directory so that new fonts can be added without changing the code or reflashing the device? I see that currently the selection of fonts is hard-coded in src/models/fonts.cpp and it would be nice to be able to add new default fonts just by dragging them in. I think requiring the same naming convention ("FontName-Regular", "FontName-Bold", "FontName-Italic", "FontName-BoldItalic") would be fine. I assume that any otf or ttf fonts would already be supported by the software. Thanks and let me know what you think!

Small issue when trying to idf.py build

Very nice project!
I'm developing an epaper component for the IDF and I though would be very nice to make an ePub reader that support multiple epapers. But I see you made a great work here so I guess will start using yours.

Tried to compile, my idf version is this one:
ESP-IDF v4.2-dev

/home/martin/.espressif/tools/xtensa-esp32-elf/esp-2020r2-8.2.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld: esp-idf/esp32/libesp32.a(cpu_start.c.obj):(.literal.main_task+0x24): undefined reference to `app_main'
/home/martin/.espressif/tools/xtensa-esp32-elf/esp-2020r2-8.2.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld: esp-idf/esp32/libesp32.a(cpu_start.c.obj): in function `main_task':
/home/martin/esp/esp-idf/components/esp32/cpu_start.c:567: undefined reference to `app_main'
collect2: error: ld returned 1 exit status

Or I'm building this wrong and I have to build it using Platformio? Thanks in advance

Feature Request: Button to Force Page Refresh

I was thinking it might be nice if there was a menu option to force an immediate page refresh, or at least modify how often it occurs. I might consider trying to implement this myself, but I'm really unfamiliar with the code/libraries involved, so it may take some time.

/usr/bin/pkg-config: No such file or directory (M1 Mac/InkPlate 10)

So, I've tried just about everything to debug this issue over the past week, but I simply cannot seem to get this project to build correctly. I get the feeling this is a path issue, which I've tried to correct.

I will mention that I've struggled with the readme somewhat, insofar as it's not always clear which steps are required and which steps have already been completed - so I'm hoping I read correctly and set up my environment correctly.

Any suggestions on how to start debugging this would be greatly appreciated!

`Processing inkplate_10_release (platform: espressif32; board: esp-wrover-kit; framework: espidf)

Verbose mode can be enabled via -v, --verbose option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp-wrover-kit.html
PLATFORM: Espressif 32 (5.2.0) > Espressif ESP-WROVER-KIT
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (ftdi) On-board (ftdi) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:

  • framework-espidf @ 3.40402.0 (4.4.2)
  • tool-cmake @ 3.16.4
  • tool-esptoolpy @ 1.40201.0 (4.2.1)
  • tool-ninja @ 1.9.0
  • toolchain-esp32ulp @ 1.22851.191205 (2.28.51)
  • toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch3
    /bin/sh: /usr/bin/pkg-config: No such file or directory
    OSError: '/usr/bin/pkg-config --cflags --libs lib_freetype/lib/pkgconfig/freetype2.pc' exited 127:
    File "/Users/nate/.platformio/penv/lib/python3.10/site-packages/platformio/builder/main.py", line 188:
    env.SConscript("$BUILD_SCRIPT")
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Script/SConscript.py", line 597:
    return _SConscript(self.fs, *files, **subst_kw)
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Script/SConscript.py", line 285:
    exec(compile(scriptdata, scriptname, 'exec'), call_stack[-1].globals)
    File "/Users/nate/.platformio/platforms/espressif32/builder/main.py", line 312:
    target_elf = env.BuildProgram()
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Util.py", line 737:
    return self.method(*nargs, **kwargs)
    File "/Users/nate/.platformio/penv/lib/python3.10/site-packages/platformio/builder/tools/piobuild.py", line 60:
    env.ProcessProgramDeps()
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Util.py", line 737:
    return self.method(*nargs, **kwargs)
    File "/Users/nate/.platformio/penv/lib/python3.10/site-packages/platformio/builder/tools/piobuild.py", line 117:
    env.ProcessFlags(env.get("BUILD_FLAGS"))
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Util.py", line 737:
    return self.method(*nargs, **kwargs)
    File "/Users/nate/.platformio/penv/lib/python3.10/site-packages/platformio/builder/tools/piobuild.py", line 217:
    env.Append(**env.ParseFlagsExtended(flags))
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Util.py", line 737:
    return self.method(*nargs, **kwargs)
    File "/Users/nate/.platformio/penv/lib/python3.10/site-packages/platformio/builder/tools/piobuild.py", line 180:
    for key, value in env.ParseFlags(str(raw)).items():
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Environment.py", line 834:
    do_parse(arg)
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Environment.py", line 686:
    arg = self.backtick(arg[1:])
    File "/Users/nate/.platformio/packages/tool-scons/scons-local-4.4.0/SCons/Environment.py", line 597:
    raise OSError("'%s' exited %d" % (command, status))
    ==================================================== [FAILED] Took 0.23 seconds ====================================================

Environment Status Duration


inkplate_10_release FAILED 00:00:00.234
============================================== 1 failed, 0 succeeded in 00:00:00.234 ==============================================`

Solaris epub gets stuck on "Loading a book" screen

Thank you for writing this software, it works great for most of the ebooks I have been trying. Unfortunately, I am having trouble getting the epub here to work. It just gets stuck on the "Loading a book" screen (and it works fine in other ebook readers on my desktop and phone). Is there any way to get any more debug output in order to figure out what is going wrong?

Thanks in advance, let me know if any more information would help

Inkplate 10, continually restarts after upload

Figured out I had a 64GB sd card which was in ExFat format,
when I changed to a 16GB in FAT32 format, then things were working :)

Originally posted by @mhfowler in #4 (comment)

Having a similar issue as resolved in comment above but with the Inkplate 10.

Using version: release-1.3.1-inkplate_10, no problems running Inkplate_Basic_BW.

After uploading stuck in restart loop, error text below. I've tried multiple FAT32 sd cards of different sizes (64GB, 32GB, 16GB) and same looping reboot text. Any ideas on troubleshooting next steps?

Output from minicom:

ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x32 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1580
ho 0 tail 12 room 4
load:0x40078000,len:12692
load:0x40080400,len:3080
entry 0x400805e4
I (730) psram: This chip is ESP32-D0WD
I (732) spiram: Found 64MBit SPI RAM device
I (732) spiram: SPI RAM mode: flash 40m sram 40m
I (733) spiram: PSRAM initialized, cache is in low/high (2-core) mode.
I (741) cpu_start: Pro cpu up.
I (744) cpu_start: Starting app cpu, entry point is 0x40083b3c
I (737) cpu_start: App cpu up.
I (1633) spiram: SPI SRAM memory test OK
I (1642) cpu_start: Pro cpu start user code
I (1642) cpu_start: cpu freq: 240000000
I (1642) cpu_start: Application information:
I (1645) cpu_start: Project name:     EPub-InkPlate
I (1650) cpu_start: App version:      1.3.1
I (1655) cpu_start: Compile time:     Sep 26 2021 13:44:26
I (1661) cpu_start: ELF file SHA256:  303e9a8a480a7054...
I (1667) cpu_start: ESP-IDF:          4.3.0
I (1673) heap_init: Initializing. RAM available for dynamic allocation:
I (1680) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1686) heap_init: At 3FFC1298 len 0001ED68 (123 KiB): DRAM
I (1692) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1699) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1705) heap_init: At 4009FD28 len 000002D8 (0 KiB): IRAM
I (1711) spiram: Adding pool of 4085K of external SPI memory to heap allocator
I (1721) spi_flash: detected chip: gd
I (1724) spi_flash: flash io: dio
I (1735) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (1738) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 1, 4MB external flash
Minimum free heap size: 4374583 bytes
Heap summary for capabilities 0x00000C06:
  Totals:
    free 0 allocated 0 min_free 0 largest_free_block 0
I (1768) main: EPub-Inkplate Startup.
I (1878) SDCard: Setup SD card
I (1878) gpio: GPIO[15]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 
E (1898) vfs_fat_sdmmc: sdmmc_card_init failed (0x107).
assertion "xQueue" failed: file "/home/turgu1/.platformio/packages/framework-espidf/components/freg

abort() was called at PC 0x401f26d4 on core 0

Backtrace:0x4009133e:0x3ffddb40 0x40091b49:0x3ffddb60 0x40099a52:0x3ffddb80 0x401f26d4:0x3ffddbf0 0


ELF file SHA256: 303e9a8a480a7054

Rebooting...

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.