diff --git a/README.md b/README.md index 935fbf5..3933f0a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# ECE-477 - -Purdue University Fall 2021 Senior Design Project. -The team: - - Moiz Rasheed (msrasheed) - - Ethan Campbell (chessman007) - - Jackie Malayter (iampizzaprincess) - - Josh Panos (jpanos) +# Purdue University Fall 2020 Senior Design Project. -This is the source code for our pollination drone project. + This is the source code for our pollination drone project. [See here for more info](http://jpanos.github.io/ECE-477) + +## Team Members +Team members, their role and contact information can be found below. + - [Josh Panos](https://jpanos.github.io/ECE-477/Team/progress/panos.html), Hardware Engineer, Email: Joshua.Panos1@gmail.com + - [Moiz Rasheed](https://jpanos.github.io/ECE-477/Team/progress/mrasheed.html), Team Lead, Github: msrasheed + - [Jackie Malayter](https://jpanos.github.io/ECE-477/Team/progress/malayter.html), Systems Engineer, Email: + - [Ethan Campbell](https://jpanos.github.io/ECE-477/Team/progress/campb338.html), Software Engineer, Email: diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c419263..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/web/Files/P2_FinalReview-WS.pptx.pdf b/docs/Files/P2_FinalReview-WS.pptx.pdf similarity index 100% rename from web/Files/P2_FinalReview-WS.pptx.pdf rename to docs/Files/P2_FinalReview-WS.pptx.pdf diff --git a/web/Files/README.txt b/docs/Files/README.txt similarity index 100% rename from web/Files/README.txt rename to docs/Files/README.txt diff --git a/web/Files/docs/0_InitialProjectProposal.docx b/docs/Files/docs/0_InitialProjectProposal.docx similarity index 100% rename from web/Files/docs/0_InitialProjectProposal.docx rename to docs/Files/docs/0_InitialProjectProposal.docx diff --git a/web/Files/docs/1_FinalProjectProposal.docx b/docs/Files/docs/1_FinalProjectProposal.docx similarity index 100% rename from web/Files/docs/1_FinalProjectProposal.docx rename to docs/Files/docs/1_FinalProjectProposal.docx diff --git a/web/Files/docs/2_FunctionalSpecification.docx b/docs/Files/docs/2_FunctionalSpecification.docx similarity index 100% rename from web/Files/docs/2_FunctionalSpecification.docx rename to docs/Files/docs/2_FunctionalSpecification.docx diff --git a/web/Files/docs/4_SoftwareOverview.docx b/docs/Files/docs/4_SoftwareOverview.docx similarity index 100% rename from web/Files/docs/4_SoftwareOverview.docx rename to docs/Files/docs/4_SoftwareOverview.docx diff --git a/web/Files/docs/5_ComponentAnalysis.docx b/docs/Files/docs/5_ComponentAnalysis.docx similarity index 100% rename from web/Files/docs/5_ComponentAnalysis.docx rename to docs/Files/docs/5_ComponentAnalysis.docx diff --git a/web/Files/docs/6_BillOfMaterials.xlsx b/docs/Files/docs/6_BillOfMaterials.xlsx similarity index 100% rename from web/Files/docs/6_BillOfMaterials.xlsx rename to docs/Files/docs/6_BillOfMaterials.xlsx diff --git a/web/Files/docs/7_Mechanical_Overview.docx b/docs/Files/docs/7_Mechanical_Overview.docx similarity index 100% rename from web/Files/docs/7_Mechanical_Overview.docx rename to docs/Files/docs/7_Mechanical_Overview.docx diff --git a/web/Files/docs/ECE477_kicad.zip b/docs/Files/docs/ECE477_kicad.zip similarity index 100% rename from web/Files/docs/ECE477_kicad.zip rename to docs/Files/docs/ECE477_kicad.zip diff --git a/web/Files/docs/P1_MidtermDesignReview.pdf b/docs/Files/docs/P1_MidtermDesignReview.pdf similarity index 100% rename from web/Files/docs/P1_MidtermDesignReview.pdf rename to docs/Files/docs/P1_MidtermDesignReview.pdf diff --git a/web/Files/documents.html b/docs/Files/documents.html similarity index 96% rename from web/Files/documents.html rename to docs/Files/documents.html index 32e5512..6af32fb 100644 --- a/web/Files/documents.html +++ b/docs/Files/documents.html @@ -1,137 +1,137 @@ - - - - - - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - -
-
- - - - - - - - - + + + + + + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + diff --git a/web/Files/img/BannerImgExample.jpg b/docs/Files/img/BannerImgExample.jpg similarity index 100% rename from web/Files/img/BannerImgExample.jpg rename to docs/Files/img/BannerImgExample.jpg diff --git a/web/Files/img/Thumbs.db b/docs/Files/img/Thumbs.db similarity index 100% rename from web/Files/img/Thumbs.db rename to docs/Files/img/Thumbs.db diff --git a/web/Files/references.html b/docs/Files/references.html similarity index 96% rename from web/Files/references.html rename to docs/Files/references.html index 63417c5..e7a13b0 100644 --- a/web/Files/references.html +++ b/docs/Files/references.html @@ -1,92 +1,92 @@ - - - - - - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - -
-
- - - - - - - - + + + + + + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + diff --git a/web/Files/refs/Pixhawk4Mini_Pinouts.pdf b/docs/Files/refs/Pixhawk4Mini_Pinouts.pdf similarity index 100% rename from web/Files/refs/Pixhawk4Mini_Pinouts.pdf rename to docs/Files/refs/Pixhawk4Mini_Pinouts.pdf diff --git a/web/Files/refs/Pixhawk4mini_technical_data_sheet.pdf b/docs/Files/refs/Pixhawk4mini_technical_data_sheet.pdf similarity index 100% rename from web/Files/refs/Pixhawk4mini_technical_data_sheet.pdf rename to docs/Files/refs/Pixhawk4mini_technical_data_sheet.pdf diff --git a/web/Files/refs/bq29330_datasheet.pdf b/docs/Files/refs/bq29330_datasheet.pdf similarity index 100% rename from web/Files/refs/bq29330_datasheet.pdf rename to docs/Files/refs/bq29330_datasheet.pdf diff --git a/web/Files/refs/bq76920.pdf b/docs/Files/refs/bq76920.pdf old mode 100755 new mode 100644 similarity index 100% rename from web/Files/refs/bq76920.pdf rename to docs/Files/refs/bq76920.pdf diff --git a/web/Files/refs/lp385_datasheet.pdf b/docs/Files/refs/lp385_datasheet.pdf similarity index 100% rename from web/Files/refs/lp385_datasheet.pdf rename to docs/Files/refs/lp385_datasheet.pdf diff --git a/web/Files/refs/p78_2000_s_datasheet.pdf b/docs/Files/refs/p78_2000_s_datasheet.pdf similarity index 100% rename from web/Files/refs/p78_2000_s_datasheet.pdf rename to docs/Files/refs/p78_2000_s_datasheet.pdf diff --git a/web/Files/refs/sg90_datasheet.pdf b/docs/Files/refs/sg90_datasheet.pdf similarity index 100% rename from web/Files/refs/sg90_datasheet.pdf rename to docs/Files/refs/sg90_datasheet.pdf diff --git a/web/Files/refs/stm32h745z_reference_manual.pdf b/docs/Files/refs/stm32h745z_reference_manual.pdf similarity index 100% rename from web/Files/refs/stm32h745z_reference_manual.pdf rename to docs/Files/refs/stm32h745z_reference_manual.pdf diff --git a/web/Files/refs/stm32h745zg_datasheet.pdf b/docs/Files/refs/stm32h745zg_datasheet.pdf similarity index 100% rename from web/Files/refs/stm32h745zg_datasheet.pdf rename to docs/Files/refs/stm32h745zg_datasheet.pdf diff --git a/web/Files/refs/ttp223b_datasheet.pdf b/docs/Files/refs/ttp223b_datasheet.pdf similarity index 100% rename from web/Files/refs/ttp223b_datasheet.pdf rename to docs/Files/refs/ttp223b_datasheet.pdf diff --git a/web/Files/support/TechSupportRequest.docx b/docs/Files/support/TechSupportRequest.docx similarity index 100% rename from web/Files/support/TechSupportRequest.docx rename to docs/Files/support/TechSupportRequest.docx diff --git a/web/Media/README.txt b/docs/Media/README.txt similarity index 100% rename from web/Media/README.txt rename to docs/Media/README.txt diff --git a/web/Media/img/BannerImgExample.jpg b/docs/Media/img/BannerImgExample.jpg similarity index 100% rename from web/Media/img/BannerImgExample.jpg rename to docs/Media/img/BannerImgExample.jpg diff --git a/web/Media/img/Schematic_Capacitor_Bank.jpg b/docs/Media/img/Schematic_Capacitor_Bank.jpg similarity index 100% rename from web/Media/img/Schematic_Capacitor_Bank.jpg rename to docs/Media/img/Schematic_Capacitor_Bank.jpg diff --git a/web/Media/img/Schematic_IC_pinout.jpg b/docs/Media/img/Schematic_IC_pinout.jpg similarity index 100% rename from web/Media/img/Schematic_IC_pinout.jpg rename to docs/Media/img/Schematic_IC_pinout.jpg diff --git a/web/Media/img/Schematic_PWR_Connections.jpg b/docs/Media/img/Schematic_PWR_Connections.jpg similarity index 100% rename from web/Media/img/Schematic_PWR_Connections.jpg rename to docs/Media/img/Schematic_PWR_Connections.jpg diff --git a/web/Media/img/Thumbs.db b/docs/Media/img/Thumbs.db similarity index 100% rename from web/Media/img/Thumbs.db rename to docs/Media/img/Thumbs.db diff --git a/web/Media/img/photo5078098378939803865.jpg b/docs/Media/img/photo5078098378939803865.jpg similarity index 100% rename from web/Media/img/photo5078098378939803865.jpg rename to docs/Media/img/photo5078098378939803865.jpg diff --git a/web/Media/img/spaceTeam.jpg b/docs/Media/img/spaceTeam.jpg similarity index 100% rename from web/Media/img/spaceTeam.jpg rename to docs/Media/img/spaceTeam.jpg diff --git a/web/Media/img/teamSpace.png b/docs/Media/img/teamSpace.png similarity index 100% rename from web/Media/img/teamSpace.png rename to docs/Media/img/teamSpace.png diff --git a/web/Media/media.html b/docs/Media/media.html similarity index 97% rename from web/Media/media.html rename to docs/Media/media.html index 28116d9..e5db023 100644 --- a/web/Media/media.html +++ b/docs/Media/media.html @@ -1,143 +1,143 @@ - - - - - - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - -
- -
- - - - -
-
- - - - - - - - + + + + + + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + +
+ +
+ + + + +
+
+ + + + + + + + diff --git a/web/README.txt b/docs/README.txt similarity index 100% rename from web/README.txt rename to docs/README.txt diff --git a/web/Team/README.txt b/docs/Team/README.txt similarity index 100% rename from web/Team/README.txt rename to docs/Team/README.txt diff --git a/web/Team/img/BannerImgExample.jpg b/docs/Team/img/BannerImgExample.jpg similarity index 100% rename from web/Team/img/BannerImgExample.jpg rename to docs/Team/img/BannerImgExample.jpg diff --git a/web/Team/img/EthanProfile.jpg b/docs/Team/img/EthanProfile.jpg similarity index 100% rename from web/Team/img/EthanProfile.jpg rename to docs/Team/img/EthanProfile.jpg diff --git a/web/Team/img/Thumbs.db b/docs/Team/img/Thumbs.db similarity index 100% rename from web/Team/img/Thumbs.db rename to docs/Team/img/Thumbs.db diff --git a/web/Team/img/anonymous.jpg b/docs/Team/img/anonymous.jpg similarity index 100% rename from web/Team/img/anonymous.jpg rename to docs/Team/img/anonymous.jpg diff --git a/web/Team/img/jackie.png b/docs/Team/img/jackie.png similarity index 100% rename from web/Team/img/jackie.png rename to docs/Team/img/jackie.png diff --git a/web/Team/img/moiz.jpg b/docs/Team/img/moiz.jpg similarity index 100% rename from web/Team/img/moiz.jpg rename to docs/Team/img/moiz.jpg diff --git a/web/Team/img/panos.jpg b/docs/Team/img/panos.jpg similarity index 100% rename from web/Team/img/panos.jpg rename to docs/Team/img/panos.jpg diff --git a/web/Team/member1.html b/docs/Team/member1.html similarity index 100% rename from web/Team/member1.html rename to docs/Team/member1.html diff --git a/web/Team/member2.html b/docs/Team/member2.html similarity index 100% rename from web/Team/member2.html rename to docs/Team/member2.html diff --git a/web/Team/member3.html b/docs/Team/member3.html similarity index 100% rename from web/Team/member3.html rename to docs/Team/member3.html diff --git a/web/Team/member4.html b/docs/Team/member4.html similarity index 100% rename from web/Team/member4.html rename to docs/Team/member4.html diff --git a/web/Team/progress/Markdown_1.0.1/License.text b/docs/Team/progress/Markdown_1.0.1/License.text similarity index 100% rename from web/Team/progress/Markdown_1.0.1/License.text rename to docs/Team/progress/Markdown_1.0.1/License.text diff --git a/web/Team/progress/Markdown_1.0.1/Markdown Readme.text b/docs/Team/progress/Markdown_1.0.1/Markdown Readme.text similarity index 100% rename from web/Team/progress/Markdown_1.0.1/Markdown Readme.text rename to docs/Team/progress/Markdown_1.0.1/Markdown Readme.text diff --git a/web/Team/progress/Markdown_1.0.1/Markdown.pl b/docs/Team/progress/Markdown_1.0.1/Markdown.pl old mode 100755 new mode 100644 similarity index 100% rename from web/Team/progress/Markdown_1.0.1/Markdown.pl rename to docs/Team/progress/Markdown_1.0.1/Markdown.pl diff --git a/web/Team/progress/campb338.html b/docs/Team/progress/campb338.html similarity index 98% rename from web/Team/progress/campb338.html rename to docs/Team/progress/campb338.html index 85e7a6c..5f8b2df 100644 --- a/web/Team/progress/campb338.html +++ b/docs/Team/progress/campb338.html @@ -1,252 +1,252 @@ - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - -
-
- - - - - - - - - -
-

Progress Report for -Ethan Campbell-

-
-

Week 2:

- Date: -9/4/2020-
- Total hours: -10-
- Description of design efforts:
- This week, I spent a great deal of time researching what methods would be best for detecting apple blossom flowers. I have found a couple methods that are promising to implement on the Jetson Nano. The first method would take a significant amount of time to implement from scratch, but the method has been proven to work well in a research paper. The next method would involve using TensorRT.

- -Additionally, I have done some research into figuring out what structure and material will work for our pollination appendage. The goal is to pick a material that can naturally carry sticky pollen from flower to flower. In Japan especially, hand pollination is done with horsehair, and that seems like a suitable mating material to use. I have contacted an expert at Purdue within the Horticulture Department. He seemed to know about autonomous pollination methods already, so I am trying to set up a meeting with him for next week.

- -As a group we spent a large amount of time planning out exactly how we think the drone will work. This involved a lot of discussion and documentation. Hopefully this planning will pay off when it comes time to implement the designs for system of the drone and pollination method.

- -I placed an order for artificial apple blossoms that seem realistic enough to test our pollination method on, however the order was just cancelled by the supplier. I am continuing to look for a suitable replacement.
- -
- -

Week 3:

- Date: -9/11/2020-
- Total hours: -18-
- Description of design efforts:
-This week we were able to start testing the drone. After doing several calibration checks and rotorless flights, we determined we would attempt to hover the drone slightly off the ground. This first flight did not go well because we forgot to check the rotor spin direction for each motor, and just placed the rotors uniformly. This was bad because the drone was unable to balance itself and instead of self correcting, the drone spiraled into an unstable state. Luckily, nothing appeared very damaged except one of the rotors. It only had a small chip missing from the tip, but we ordered replacement rotors immediately. -

- -

-I was able to acquire fairly realistic artificial apple blossom branches. I believe this will be useful when we are testing our vision algorithms. -

- -

- -We now have two solid options for datasets to train the neural network with. First, we could manually take many pictures of the artificial blossoms and label them ourselves. We would take the pictures from different cameras and in different lighting settings. We would likely need around 100 images at least to start training the Convolutional Neural Network (CNN). While this method of dataset creation may seem tedious, it’s far better than creating a general use dataset. Those datasets often have tens of thousands of images. We could get away with taking so few photos because we would be testing with just the artificial apple blossoms. This test method would give us a good idea of how the CNN responds to tweaks and changes without us having to retrain the CNN on a massive dataset. The second method is to use a dataset of apple blossoms provided by the USDA. That dataset is much more comprehensive than anything we could create manually. I will likely try both implementations with our CNN. -

- -I have started to set up the PyTorch environment for training the CNN. Luckily, PyTorch already has a great framework for setting up a CNN, but tweaking it for optimality will require a great deal of research. I am also looking into TensorFlow. I will be training the CNN on my Nvidia GTX 1080. That should be sufficient for our purposes. Once the CNN has been trained, we can export the model to the Jetson Nano. Nvidia provides a framework called TensorRT for the Jetson Nano. That framework will run a neural network optimally on Nvidia’s hardware. I have included their diagram that advertises the benefits of using TensorRT. -

- -

-My goal for next week is to start training a CNN. -

-

- - - - -

Week 4:

- Date: -9/18/2020-
- Total hours: -17-
- Description of design efforts:
-This week we had a few setbacks, but got several things done as well. We tested the drone again, but the flight didn’t last very long at all. The drone crashed almost immediately. However, we have more important problems to tackle. -

-We started programming the STM32H745 with boilerplate code generated by STM32CubeIDE. After a single write however, it appeared the STM Link chip was non-responsive. This is a big problem because that chip is responsible for all debugging and usb communication for the board. We have not encountered a problem like this before, and we tried many suggestions listed online for solving similar problems. Additionally, we contacted STM support and course staff for suggestions on how to solve the problem. Because we were able to clear and rewrite the firmware for the entire board, we were optimistic that it was a software issue. It turned out that part of the generated boilerplate code was disabling the STM Link chip. We disabled the Hardware Abstraction Library (HAL) code, and the software ran successfully on the STM32H745. We determined there is something wrong with the autogenerated HAL code. More investigation will be required to determine what command exactly was disabling the STM Link chip, but at least now we are able to successfully program the STM32H745. -

-I have begun writing the framework for communication between the Jetson Nano and the STM32H745. I am more comfortable using the CMSIS library to interact with the STM32H745’s peripherals, but HAL does seem promising if we can get it working. -

-We also started investigating the software and the hardware required for stereoscopic vision. We settled on using two standard CSI cameras and mounting them securely on a substrate. For development purposes, I fabricated a test board where we could easily adjust camera separation distance. -

- -

- - -

Week 5:

- Date: -9/25/2020-
- Total hours: -18-
- Description of design efforts:
-This week I worked mostly on developing the uart communication for the Jetson Nano and the STM32H745. Initially I suspected the Jetson Nano serial gpio pins were defective. I was unable to transmit or receive a signal. After digging through some forum posts of people with similar problems, I tried disabling the nvgetty service for the Jetson Nano. This can be accomplished by running these commands: -

-sudo systemctl stop nvgetty -
-sudo systemctl disable nvgetty -

-Disabling nvgetty ended up allowing me to use the device \dev\ttyTHS1. Now, I have installed a python library for accessing the serial peripheral and that works nicely. -

-After the Nano uart was working, I got started on the STM32H745. Moiz had already proven the STM32H745 uart peripheral was working, so I got started on variable-length message transmission. While developing this, I found the Hardware Abstraction Language (HAL) framework provided by STM has the functionality of sending and receiving uart. HAL can most easily be included in a project by generating the starter code from STM32CubeMx. Within that program, if the UART peripheral is enabled, HAL code headers will be included in the project. Next the header files must be included - in my case it was stm32h7xx_hal_uart.h. I was then able to use the provided HAL functions to handle uart data. In particular, this function was very useful for sending variable-size packets via uart: -

-HAL_UART_Transmit(); -

-The biggest disadvantage of using this method is the HAL uart library seems to be blocking. That means the functions will stop all other operations of the program until the function completes. This could be a problem because the uart transmission may take a while relative to the rest of our operations on the board. This could be bad if the STM32H745 is expected to be making flight decisions while it is transmitting uart signals. The remedy to this is to use the Direct Memory Access (DMA) peripheral to help transmit the packets asynchronously. This is a significantly more complicated solution that I will be investigating in the coming weeks. -

-

- -

- -

Week 6:

- Date: -10/2/2020-
- Total hours: -21-
- Description of design efforts:
-This week I wrote the framework for STM32H745 and Jetson Nano UART communication. The best approach when writing an API is usually to write all of the functionality into separate files. Then, in the main structure of the program, the external source and header files can be referenced and utilized. Additionally, in a well written API it is good practice to abstract out the functionality of the provided functions. The user should make a function call and not have to worry about how the function accomplishes its tasks. This is often referred to as blackboxing. -

-For the UART communication library, I wrote two functions initFlowers() and getFlowers(). initFlowers() initializes a global array of flower structures. getFlowers() queries the Jetson Nano for flower data. For now, the Jetson Nano is running a python listen server that responds to a specific query protocol from the STM32H745. I designed the protocol to be flexible for different types of queries. I have included a diagram outlining the protocol. -

- -

-There were many challenges when trying to get the communication working. The UART HAL library ended up being useful, but required some tinkering. Additionally, the protocol communication is taking about one second and it is blocking. This could be bad, but Moiz is implementing a DMA option for the Mavlink communication that is non-blocking. Additionally, another challenge was aligning the bytes between the python server and the STM software. Choosing the correct endian and packing structures correctly was key. The last problem was fairly minor. The breadboarding was very messy and some stray capacitances and inductances were causing some erroneous bits. Straightening the wires and reducing the amount of things plugged into the breadboard fixed this issue. -

-

- -

Week 7:

- Date: -10/9/2020-
- Total hours: -17-
- Description of design efforts:
-This week we were able to successfully fly the drone. We aren’t sure what was causing our problems with drone flight previously. However, after rebuilding the drone, reattaching the ESCs, and recalibrating the sensors, the drone flew as expected. The most concerning data from our flight was our expected battery life which ended up being only 8 minutes. However, there are still some optimizations we can make to improve our flight time. -

-Additionally this week, I looked into optimizing our object detection code. The biggest advantage of using the Jetson Nano is the onboard CUDA assisted processing. Using CUDA will improve our performance significantly with OpenCV. However, it seems OpenCV python libraries do not necessarily support CUDA, so we will likely have to transition our code to C++. I am familiar with C++, but the OpenCV implementation is very complicated and I am doing a great deal of research into the API currently. -

-

CUDA processing flow (En).PNG
CC BY 3.0, Link

-

-Above is a quick summary diagram on why CUDA is important. The architecture is extremely useful for repetitive processes that can be run in parallel. Image processing can often utilize CUDA effectively. Next week I hope to have a CUDA assisted OpenCV object detector for flower blossoms functioning. -

- - -

Week 9:

- Date: -10/24/2020-
- Total hours: -21-
- Description of design efforts:
-The last two weeks have been fairly busy for me. Last week, we finished our Midterm Design Review. That went very well and I am proud of my team’s progress and commitment to the project. -

-One of the obstacles I had been putting off for a while was redesigning the camera mount for the stereo vision cameras. The old mount was cumbersome and imprecise. I have experience with CAD and I was able to draft up a model of a temporary testing mounting block. This is significantly more precise than the original design, but will have to be redesigned again for the final build. I used my 3D printer to print the mount and attached the cameras. They are significantly better secured than the previous mount, and allow for different spacing settings. -

- -

- -

-From a software engineering perspective, I spent a long time figuring out how to build/install the latest version of OpenCV and with which configurations to build the library. Now, I feel like I have a fairly optimal build of OpenCV 4.3. This allows for the latest CUDA implementations with the Jetson Nano. The main caveat, however, is that I will need to program in C++ to take full advantage of the CUDA libraries. I have already converted our blob detector to C++ and OpenCV 4.3. With the new build of OpenCV and the ported code to C++, we saw an approximate 7x speed up in image processing speed and latency. This week I will be implementing our first revision of stereo depth perception in C++. -

- - -

Week 10:

- Date: -10/30/2020-
- Total hours: -25-
- Description of design efforts:
-This week I attempted to implement the Stereo Vision Algorithm, cv::cuda::StereoBM, however there is a major issue. The algorithm assumes that two image frames have been captured at the same time. I have embedded a gif of our image streams coming from our camera source framework, GStreamer. I initially chose to use Opencv and GStreamer for ease of use, but it turns out GStreamer is not low enough latency for our application. Gstreamer is great for supporting complex encoding, transformation, and piping to many different systems. However, the disadvangtage is Gstreamer does not support two sychronous streams or two streams with similar enough latency to allow for Stereo Vision Calculations. Instead, there is a much lower level framework provided by Nvidia called Argus. Argus works well because you can request single frames with extremely low latency. We will use this method, but the development time is expected to be significantly higher than using Gstreamer. This is because Argus is a much lower level C++ framework. I will be putting in extra hours to implement this change as soon as possible this week. -

- -

-The gif shows how the timing of the streams are not identical. This is enough latency to introduce large error into our stereo vision calculations. -

-Additionally, I helped Moiz debug off board autonomous control for the Drone. We are making significant progress in that area. -

- - -

Week 11:

- Date: -11/6/2020-
- Total hours: -27-
- Description of design efforts:
-This week I implemented the Argus framework for our camera streaming pipeling. There were many challenges when accomplishing this task. -The first challenge was using Nvidia's Argus function calls and API to generate information that is compatible with an OpenCV frame. -Argus generates an EGL stream for camera data from our two CSI(camera serial interface) cameras. That data is then converted into a format and color space that OpenCV can load into Mat frames. After that, blob detection and stereo vision can work like it did before, but much faster than using Gstreamer. -

-When I implemented this change, performance was magnificently terrible. Each stream had many seconds of latency and poor fps. The solution I implemented was multi-threading. I am familiar with implementing multi-threading with pthread, but Nvidia supports its own Thread objects that integrate nicely with Argus. Now, I have five threads running to manage the camera stream. The first thread, dubbed the main thread, is responsible for spawning the child threads and calling OpenCV functions to do the upper-level image processing. Then, there are two producer threads and two consumer threads. This works well because the producer threads copy data from the cameras into a DMA buffer constantly, and the consumer threads tell the dma buffer to transfer to a structure in memory, in our case a OpenCV Mat object. -

-After this change, performance was better but did not meet the no noticable latency and high fps requirements for real time image processing. My reasoning was the main loop wasn't being context switched very often relative to the other threads. So, I implemented primitive syncronization methods to reduce the amount of wasted time the producer and consumer threads spent on the control stack. The main loop essentially requests new frames instead of reading from a constantly updating stream of information. This also allows the frames to be synchronized through software. I have attached a gif of the performance of the new system functioning. -

- -

-Next week I will be finalizing the OpenCV stereo image processing with this new camera streaming implementation. -

- -

Week 12:

- Date: -11/13/2020-
- Total hours: -30-
- Description of design efforts:
-This week I made a first pass through stereo depth perception using OpenCV StereoBM. There were some initial challenges with integrating the function calls nicely with my current C++ implementation. However, after a bit of debugging, I made everything work together nicely. The next challenge is fairly significant - optimization. We need to decide how often we want to poll distance from the stereo vision module. If we want a real time implementation, low resolution will likely be necessary along with a decent amount of noise. However depending on the variation of StereoBM we use, SGBM for example, we could produce much more precise and full point clouds. Right now I am optimizing parameters for real time processing because that will be simplest. The next challenge is implementing the image rectification I discussed in a previous post. On the first couple hours of attempts, the rectification did not work. However, if we want the stero vision to be precise, rectification will be required. Afterwards, I can linearly transform the disparity map produced by StereoBM to generate absolute distances from the camera. The details of this transform are simple but beyond the scope of this post, if interested please visit this article published in the OpenCV docs: -

-OpenCV Depth Map -

-I have posted a video of the depth perception performance in real time. Right now, StereoBM is running with a built-in CUDA implementation and processing with very low latency. The depth map it produces is a grayscale blob-like representation of relative distances from the camera. The lighter the color, the closer the predicted blob is. More can be read about this in the link posted above. I will be spending next week calibrating and optimizing this algorithm to produce absolute distances with low latency. -

- -

- -

Week 13:

- Date: -11/20/2020-
- Total hours: -27-
- Description of design efforts:
-This week I further optimized stereo depth perception and it is now to a point where I can begin integrating with the rest of the software of the drone. Currently, I have a rapidly updating object that I can query a pixel (n,m) in an image frame, and get (x,y,z) absolute depth coordinates. This object updates with very low latency and high fps. I achieved this by recalibrating the stereo cameras and genereating intrinsics and extrinsics calibration files. These files are used by OpenCV to rectify and translate image frames into absolute depth measurements. In the demonstration attached, I am querying the middle pixel in the depth map, and printing its (x,y,z) depth coordinates in the terminal. The middle collumn represents predicted depth from the camera in decimeters - and it is approximately 95% accurate. When I remove the flowers, the depths become negative values and unusable with the assumtion of infinite dept. This week I am focusing on combining the flower detection with the depth perception, and then communicating the information with the STM32h745. -

- -

- - -
- - - -
- - - - - - - - - + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
+

Progress Report for -Ethan Campbell-

+
+

Week 2:

+ Date: -9/4/2020-
+ Total hours: -10-
+ Description of design efforts:
+ This week, I spent a great deal of time researching what methods would be best for detecting apple blossom flowers. I have found a couple methods that are promising to implement on the Jetson Nano. The first method would take a significant amount of time to implement from scratch, but the method has been proven to work well in a research paper. The next method would involve using TensorRT.

+ +Additionally, I have done some research into figuring out what structure and material will work for our pollination appendage. The goal is to pick a material that can naturally carry sticky pollen from flower to flower. In Japan especially, hand pollination is done with horsehair, and that seems like a suitable mating material to use. I have contacted an expert at Purdue within the Horticulture Department. He seemed to know about autonomous pollination methods already, so I am trying to set up a meeting with him for next week.

+ +As a group we spent a large amount of time planning out exactly how we think the drone will work. This involved a lot of discussion and documentation. Hopefully this planning will pay off when it comes time to implement the designs for system of the drone and pollination method.

+ +I placed an order for artificial apple blossoms that seem realistic enough to test our pollination method on, however the order was just cancelled by the supplier. I am continuing to look for a suitable replacement.
+ +
+ +

Week 3:

+ Date: -9/11/2020-
+ Total hours: -18-
+ Description of design efforts:
+This week we were able to start testing the drone. After doing several calibration checks and rotorless flights, we determined we would attempt to hover the drone slightly off the ground. This first flight did not go well because we forgot to check the rotor spin direction for each motor, and just placed the rotors uniformly. This was bad because the drone was unable to balance itself and instead of self correcting, the drone spiraled into an unstable state. Luckily, nothing appeared very damaged except one of the rotors. It only had a small chip missing from the tip, but we ordered replacement rotors immediately. +

+ +

+I was able to acquire fairly realistic artificial apple blossom branches. I believe this will be useful when we are testing our vision algorithms. +

+ +

+ +We now have two solid options for datasets to train the neural network with. First, we could manually take many pictures of the artificial blossoms and label them ourselves. We would take the pictures from different cameras and in different lighting settings. We would likely need around 100 images at least to start training the Convolutional Neural Network (CNN). While this method of dataset creation may seem tedious, it’s far better than creating a general use dataset. Those datasets often have tens of thousands of images. We could get away with taking so few photos because we would be testing with just the artificial apple blossoms. This test method would give us a good idea of how the CNN responds to tweaks and changes without us having to retrain the CNN on a massive dataset. The second method is to use a dataset of apple blossoms provided by the USDA. That dataset is much more comprehensive than anything we could create manually. I will likely try both implementations with our CNN. +

+ +I have started to set up the PyTorch environment for training the CNN. Luckily, PyTorch already has a great framework for setting up a CNN, but tweaking it for optimality will require a great deal of research. I am also looking into TensorFlow. I will be training the CNN on my Nvidia GTX 1080. That should be sufficient for our purposes. Once the CNN has been trained, we can export the model to the Jetson Nano. Nvidia provides a framework called TensorRT for the Jetson Nano. That framework will run a neural network optimally on Nvidia’s hardware. I have included their diagram that advertises the benefits of using TensorRT. +

+ +

+My goal for next week is to start training a CNN. +

+

+ + + + +

Week 4:

+ Date: -9/18/2020-
+ Total hours: -17-
+ Description of design efforts:
+This week we had a few setbacks, but got several things done as well. We tested the drone again, but the flight didn’t last very long at all. The drone crashed almost immediately. However, we have more important problems to tackle. +

+We started programming the STM32H745 with boilerplate code generated by STM32CubeIDE. After a single write however, it appeared the STM Link chip was non-responsive. This is a big problem because that chip is responsible for all debugging and usb communication for the board. We have not encountered a problem like this before, and we tried many suggestions listed online for solving similar problems. Additionally, we contacted STM support and course staff for suggestions on how to solve the problem. Because we were able to clear and rewrite the firmware for the entire board, we were optimistic that it was a software issue. It turned out that part of the generated boilerplate code was disabling the STM Link chip. We disabled the Hardware Abstraction Library (HAL) code, and the software ran successfully on the STM32H745. We determined there is something wrong with the autogenerated HAL code. More investigation will be required to determine what command exactly was disabling the STM Link chip, but at least now we are able to successfully program the STM32H745. +

+I have begun writing the framework for communication between the Jetson Nano and the STM32H745. I am more comfortable using the CMSIS library to interact with the STM32H745’s peripherals, but HAL does seem promising if we can get it working. +

+We also started investigating the software and the hardware required for stereoscopic vision. We settled on using two standard CSI cameras and mounting them securely on a substrate. For development purposes, I fabricated a test board where we could easily adjust camera separation distance. +

+ +

+ + +

Week 5:

+ Date: -9/25/2020-
+ Total hours: -18-
+ Description of design efforts:
+This week I worked mostly on developing the uart communication for the Jetson Nano and the STM32H745. Initially I suspected the Jetson Nano serial gpio pins were defective. I was unable to transmit or receive a signal. After digging through some forum posts of people with similar problems, I tried disabling the nvgetty service for the Jetson Nano. This can be accomplished by running these commands: +

+sudo systemctl stop nvgetty +
+sudo systemctl disable nvgetty +

+Disabling nvgetty ended up allowing me to use the device \dev\ttyTHS1. Now, I have installed a python library for accessing the serial peripheral and that works nicely. +

+After the Nano uart was working, I got started on the STM32H745. Moiz had already proven the STM32H745 uart peripheral was working, so I got started on variable-length message transmission. While developing this, I found the Hardware Abstraction Language (HAL) framework provided by STM has the functionality of sending and receiving uart. HAL can most easily be included in a project by generating the starter code from STM32CubeMx. Within that program, if the UART peripheral is enabled, HAL code headers will be included in the project. Next the header files must be included - in my case it was stm32h7xx_hal_uart.h. I was then able to use the provided HAL functions to handle uart data. In particular, this function was very useful for sending variable-size packets via uart: +

+HAL_UART_Transmit(); +

+The biggest disadvantage of using this method is the HAL uart library seems to be blocking. That means the functions will stop all other operations of the program until the function completes. This could be a problem because the uart transmission may take a while relative to the rest of our operations on the board. This could be bad if the STM32H745 is expected to be making flight decisions while it is transmitting uart signals. The remedy to this is to use the Direct Memory Access (DMA) peripheral to help transmit the packets asynchronously. This is a significantly more complicated solution that I will be investigating in the coming weeks. +

+

+ +

+ +

Week 6:

+ Date: -10/2/2020-
+ Total hours: -21-
+ Description of design efforts:
+This week I wrote the framework for STM32H745 and Jetson Nano UART communication. The best approach when writing an API is usually to write all of the functionality into separate files. Then, in the main structure of the program, the external source and header files can be referenced and utilized. Additionally, in a well written API it is good practice to abstract out the functionality of the provided functions. The user should make a function call and not have to worry about how the function accomplishes its tasks. This is often referred to as blackboxing. +

+For the UART communication library, I wrote two functions initFlowers() and getFlowers(). initFlowers() initializes a global array of flower structures. getFlowers() queries the Jetson Nano for flower data. For now, the Jetson Nano is running a python listen server that responds to a specific query protocol from the STM32H745. I designed the protocol to be flexible for different types of queries. I have included a diagram outlining the protocol. +

+ +

+There were many challenges when trying to get the communication working. The UART HAL library ended up being useful, but required some tinkering. Additionally, the protocol communication is taking about one second and it is blocking. This could be bad, but Moiz is implementing a DMA option for the Mavlink communication that is non-blocking. Additionally, another challenge was aligning the bytes between the python server and the STM software. Choosing the correct endian and packing structures correctly was key. The last problem was fairly minor. The breadboarding was very messy and some stray capacitances and inductances were causing some erroneous bits. Straightening the wires and reducing the amount of things plugged into the breadboard fixed this issue. +

+

+ +

Week 7:

+ Date: -10/9/2020-
+ Total hours: -17-
+ Description of design efforts:
+This week we were able to successfully fly the drone. We aren’t sure what was causing our problems with drone flight previously. However, after rebuilding the drone, reattaching the ESCs, and recalibrating the sensors, the drone flew as expected. The most concerning data from our flight was our expected battery life which ended up being only 8 minutes. However, there are still some optimizations we can make to improve our flight time. +

+Additionally this week, I looked into optimizing our object detection code. The biggest advantage of using the Jetson Nano is the onboard CUDA assisted processing. Using CUDA will improve our performance significantly with OpenCV. However, it seems OpenCV python libraries do not necessarily support CUDA, so we will likely have to transition our code to C++. I am familiar with C++, but the OpenCV implementation is very complicated and I am doing a great deal of research into the API currently. +

+

CUDA processing flow (En).PNG
CC BY 3.0, Link

+

+Above is a quick summary diagram on why CUDA is important. The architecture is extremely useful for repetitive processes that can be run in parallel. Image processing can often utilize CUDA effectively. Next week I hope to have a CUDA assisted OpenCV object detector for flower blossoms functioning. +

+ + +

Week 9:

+ Date: -10/24/2020-
+ Total hours: -21-
+ Description of design efforts:
+The last two weeks have been fairly busy for me. Last week, we finished our Midterm Design Review. That went very well and I am proud of my team’s progress and commitment to the project. +

+One of the obstacles I had been putting off for a while was redesigning the camera mount for the stereo vision cameras. The old mount was cumbersome and imprecise. I have experience with CAD and I was able to draft up a model of a temporary testing mounting block. This is significantly more precise than the original design, but will have to be redesigned again for the final build. I used my 3D printer to print the mount and attached the cameras. They are significantly better secured than the previous mount, and allow for different spacing settings. +

+ +

+ +

+From a software engineering perspective, I spent a long time figuring out how to build/install the latest version of OpenCV and with which configurations to build the library. Now, I feel like I have a fairly optimal build of OpenCV 4.3. This allows for the latest CUDA implementations with the Jetson Nano. The main caveat, however, is that I will need to program in C++ to take full advantage of the CUDA libraries. I have already converted our blob detector to C++ and OpenCV 4.3. With the new build of OpenCV and the ported code to C++, we saw an approximate 7x speed up in image processing speed and latency. This week I will be implementing our first revision of stereo depth perception in C++. +

+ + +

Week 10:

+ Date: -10/30/2020-
+ Total hours: -25-
+ Description of design efforts:
+This week I attempted to implement the Stereo Vision Algorithm, cv::cuda::StereoBM, however there is a major issue. The algorithm assumes that two image frames have been captured at the same time. I have embedded a gif of our image streams coming from our camera source framework, GStreamer. I initially chose to use Opencv and GStreamer for ease of use, but it turns out GStreamer is not low enough latency for our application. Gstreamer is great for supporting complex encoding, transformation, and piping to many different systems. However, the disadvangtage is Gstreamer does not support two sychronous streams or two streams with similar enough latency to allow for Stereo Vision Calculations. Instead, there is a much lower level framework provided by Nvidia called Argus. Argus works well because you can request single frames with extremely low latency. We will use this method, but the development time is expected to be significantly higher than using Gstreamer. This is because Argus is a much lower level C++ framework. I will be putting in extra hours to implement this change as soon as possible this week. +

+ +

+The gif shows how the timing of the streams are not identical. This is enough latency to introduce large error into our stereo vision calculations. +

+Additionally, I helped Moiz debug off board autonomous control for the Drone. We are making significant progress in that area. +

+ + +

Week 11:

+ Date: -11/6/2020-
+ Total hours: -27-
+ Description of design efforts:
+This week I implemented the Argus framework for our camera streaming pipeling. There were many challenges when accomplishing this task. +The first challenge was using Nvidia's Argus function calls and API to generate information that is compatible with an OpenCV frame. +Argus generates an EGL stream for camera data from our two CSI(camera serial interface) cameras. That data is then converted into a format and color space that OpenCV can load into Mat frames. After that, blob detection and stereo vision can work like it did before, but much faster than using Gstreamer. +

+When I implemented this change, performance was magnificently terrible. Each stream had many seconds of latency and poor fps. The solution I implemented was multi-threading. I am familiar with implementing multi-threading with pthread, but Nvidia supports its own Thread objects that integrate nicely with Argus. Now, I have five threads running to manage the camera stream. The first thread, dubbed the main thread, is responsible for spawning the child threads and calling OpenCV functions to do the upper-level image processing. Then, there are two producer threads and two consumer threads. This works well because the producer threads copy data from the cameras into a DMA buffer constantly, and the consumer threads tell the dma buffer to transfer to a structure in memory, in our case a OpenCV Mat object. +

+After this change, performance was better but did not meet the no noticable latency and high fps requirements for real time image processing. My reasoning was the main loop wasn't being context switched very often relative to the other threads. So, I implemented primitive syncronization methods to reduce the amount of wasted time the producer and consumer threads spent on the control stack. The main loop essentially requests new frames instead of reading from a constantly updating stream of information. This also allows the frames to be synchronized through software. I have attached a gif of the performance of the new system functioning. +

+ +

+Next week I will be finalizing the OpenCV stereo image processing with this new camera streaming implementation. +

+ +

Week 12:

+ Date: -11/13/2020-
+ Total hours: -30-
+ Description of design efforts:
+This week I made a first pass through stereo depth perception using OpenCV StereoBM. There were some initial challenges with integrating the function calls nicely with my current C++ implementation. However, after a bit of debugging, I made everything work together nicely. The next challenge is fairly significant - optimization. We need to decide how often we want to poll distance from the stereo vision module. If we want a real time implementation, low resolution will likely be necessary along with a decent amount of noise. However depending on the variation of StereoBM we use, SGBM for example, we could produce much more precise and full point clouds. Right now I am optimizing parameters for real time processing because that will be simplest. The next challenge is implementing the image rectification I discussed in a previous post. On the first couple hours of attempts, the rectification did not work. However, if we want the stero vision to be precise, rectification will be required. Afterwards, I can linearly transform the disparity map produced by StereoBM to generate absolute distances from the camera. The details of this transform are simple but beyond the scope of this post, if interested please visit this article published in the OpenCV docs: +

+OpenCV Depth Map +

+I have posted a video of the depth perception performance in real time. Right now, StereoBM is running with a built-in CUDA implementation and processing with very low latency. The depth map it produces is a grayscale blob-like representation of relative distances from the camera. The lighter the color, the closer the predicted blob is. More can be read about this in the link posted above. I will be spending next week calibrating and optimizing this algorithm to produce absolute distances with low latency. +

+ +

+ +

Week 13:

+ Date: -11/20/2020-
+ Total hours: -27-
+ Description of design efforts:
+This week I further optimized stereo depth perception and it is now to a point where I can begin integrating with the rest of the software of the drone. Currently, I have a rapidly updating object that I can query a pixel (n,m) in an image frame, and get (x,y,z) absolute depth coordinates. This object updates with very low latency and high fps. I achieved this by recalibrating the stereo cameras and genereating intrinsics and extrinsics calibration files. These files are used by OpenCV to rectify and translate image frames into absolute depth measurements. In the demonstration attached, I am querying the middle pixel in the depth map, and printing its (x,y,z) depth coordinates in the terminal. The middle collumn represents predicted depth from the camera in decimeters - and it is approximately 95% accurate. When I remove the flowers, the depths become negative values and unusable with the assumtion of infinite dept. This week I am focusing on combining the flower detection with the depth perception, and then communicating the information with the STM32h745. +

+ +

+ + +
+ + + +
+ + + + + + + + + diff --git a/web/Team/progress/img/BOT_PCB.jpg b/docs/Team/progress/img/BOT_PCB.jpg similarity index 100% rename from web/Team/progress/img/BOT_PCB.jpg rename to docs/Team/progress/img/BOT_PCB.jpg diff --git a/web/Team/progress/img/Cube_Week4.jpg b/docs/Team/progress/img/Cube_Week4.jpg similarity index 100% rename from web/Team/progress/img/Cube_Week4.jpg rename to docs/Team/progress/img/Cube_Week4.jpg diff --git a/web/Team/progress/img/Drone.jpg b/docs/Team/progress/img/Drone.jpg similarity index 100% rename from web/Team/progress/img/Drone.jpg rename to docs/Team/progress/img/Drone.jpg diff --git a/web/Team/progress/img/Flight.jpg b/docs/Team/progress/img/Flight.jpg similarity index 100% rename from web/Team/progress/img/Flight.jpg rename to docs/Team/progress/img/Flight.jpg diff --git a/web/Team/progress/img/FlowerProtocol.png b/docs/Team/progress/img/FlowerProtocol.png similarity index 100% rename from web/Team/progress/img/FlowerProtocol.png rename to docs/Team/progress/img/FlowerProtocol.png diff --git a/web/Team/progress/img/Hardware.jpg b/docs/Team/progress/img/Hardware.jpg similarity index 100% rename from web/Team/progress/img/Hardware.jpg rename to docs/Team/progress/img/Hardware.jpg diff --git a/web/Team/progress/img/Motor_spin.jpg b/docs/Team/progress/img/Motor_spin.jpg similarity index 100% rename from web/Team/progress/img/Motor_spin.jpg rename to docs/Team/progress/img/Motor_spin.jpg diff --git a/web/Team/progress/img/New_IC.jpg b/docs/Team/progress/img/New_IC.jpg similarity index 100% rename from web/Team/progress/img/New_IC.jpg rename to docs/Team/progress/img/New_IC.jpg diff --git a/web/Team/progress/img/New_IC_Pin.jpg b/docs/Team/progress/img/New_IC_Pin.jpg similarity index 100% rename from web/Team/progress/img/New_IC_Pin.jpg rename to docs/Team/progress/img/New_IC_Pin.jpg diff --git a/web/Team/progress/img/New_PCB.jpg b/docs/Team/progress/img/New_PCB.jpg similarity index 100% rename from web/Team/progress/img/New_PCB.jpg rename to docs/Team/progress/img/New_PCB.jpg diff --git a/web/Team/progress/img/PCB.jpg b/docs/Team/progress/img/PCB.jpg similarity index 100% rename from web/Team/progress/img/PCB.jpg rename to docs/Team/progress/img/PCB.jpg diff --git a/web/Team/progress/img/PCB_Damaged.jpg b/docs/Team/progress/img/PCB_Damaged.jpg similarity index 100% rename from web/Team/progress/img/PCB_Damaged.jpg rename to docs/Team/progress/img/PCB_Damaged.jpg diff --git a/web/Team/progress/img/PCB_New.jpg b/docs/Team/progress/img/PCB_New.jpg similarity index 100% rename from web/Team/progress/img/PCB_New.jpg rename to docs/Team/progress/img/PCB_New.jpg diff --git a/web/Team/progress/img/PCB_Week4.jpg b/docs/Team/progress/img/PCB_Week4.jpg similarity index 100% rename from web/Team/progress/img/PCB_Week4.jpg rename to docs/Team/progress/img/PCB_Week4.jpg diff --git a/web/Team/progress/img/PCB_Week5.jpg b/docs/Team/progress/img/PCB_Week5.jpg similarity index 100% rename from web/Team/progress/img/PCB_Week5.jpg rename to docs/Team/progress/img/PCB_Week5.jpg diff --git a/web/Team/progress/img/PCB_Work.jpg b/docs/Team/progress/img/PCB_Work.jpg similarity index 100% rename from web/Team/progress/img/PCB_Work.jpg rename to docs/Team/progress/img/PCB_Work.jpg diff --git a/web/Team/progress/img/STLink.jpg b/docs/Team/progress/img/STLink.jpg similarity index 100% rename from web/Team/progress/img/STLink.jpg rename to docs/Team/progress/img/STLink.jpg diff --git a/web/Team/progress/img/ST_week4.jpg b/docs/Team/progress/img/ST_week4.jpg similarity index 100% rename from web/Team/progress/img/ST_week4.jpg rename to docs/Team/progress/img/ST_week4.jpg diff --git a/web/Team/progress/img/Schematic_Capacitor_Bank.jpg b/docs/Team/progress/img/Schematic_Capacitor_Bank.jpg similarity index 100% rename from web/Team/progress/img/Schematic_Capacitor_Bank.jpg rename to docs/Team/progress/img/Schematic_Capacitor_Bank.jpg diff --git a/web/Team/progress/img/Schematic_IC_pinout.jpg b/docs/Team/progress/img/Schematic_IC_pinout.jpg similarity index 100% rename from web/Team/progress/img/Schematic_IC_pinout.jpg rename to docs/Team/progress/img/Schematic_IC_pinout.jpg diff --git a/web/Team/progress/img/Schematic_PWR_Connections.jpg b/docs/Team/progress/img/Schematic_PWR_Connections.jpg similarity index 100% rename from web/Team/progress/img/Schematic_PWR_Connections.jpg rename to docs/Team/progress/img/Schematic_PWR_Connections.jpg diff --git a/web/Team/progress/img/TOP_PCB.jpg b/docs/Team/progress/img/TOP_PCB.jpg similarity index 100% rename from web/Team/progress/img/TOP_PCB.jpg rename to docs/Team/progress/img/TOP_PCB.jpg diff --git a/web/Team/progress/img/Touch_Sensor.jpg b/docs/Team/progress/img/Touch_Sensor.jpg similarity index 100% rename from web/Team/progress/img/Touch_Sensor.jpg rename to docs/Team/progress/img/Touch_Sensor.jpg diff --git a/web/Team/progress/img/_img1_240.jpg b/docs/Team/progress/img/_img1_240.jpg similarity index 100% rename from web/Team/progress/img/_img1_240.jpg rename to docs/Team/progress/img/_img1_240.jpg diff --git a/web/Team/progress/img/_img1_334.jpg b/docs/Team/progress/img/_img1_334.jpg similarity index 100% rename from web/Team/progress/img/_img1_334.jpg rename to docs/Team/progress/img/_img1_334.jpg diff --git a/web/Team/progress/img/_img1_387.jpg b/docs/Team/progress/img/_img1_387.jpg similarity index 100% rename from web/Team/progress/img/_img1_387.jpg rename to docs/Team/progress/img/_img1_387.jpg diff --git a/web/Team/progress/img/artificialAppleBlossoms.jpg b/docs/Team/progress/img/artificialAppleBlossoms.jpg similarity index 100% rename from web/Team/progress/img/artificialAppleBlossoms.jpg rename to docs/Team/progress/img/artificialAppleBlossoms.jpg diff --git a/web/Team/progress/img/battmonit.jpg b/docs/Team/progress/img/battmonit.jpg similarity index 100% rename from web/Team/progress/img/battmonit.jpg rename to docs/Team/progress/img/battmonit.jpg diff --git a/web/Team/progress/img/blobDetect.png b/docs/Team/progress/img/blobDetect.png similarity index 100% rename from web/Team/progress/img/blobDetect.png rename to docs/Team/progress/img/blobDetect.png diff --git a/web/Team/progress/img/blossoms1.jpg b/docs/Team/progress/img/blossoms1.jpg similarity index 100% rename from web/Team/progress/img/blossoms1.jpg rename to docs/Team/progress/img/blossoms1.jpg diff --git a/web/Team/progress/img/camD.png b/docs/Team/progress/img/camD.png similarity index 100% rename from web/Team/progress/img/camD.png rename to docs/Team/progress/img/camD.png diff --git a/web/Team/progress/img/camP.jpg b/docs/Team/progress/img/camP.jpg similarity index 100% rename from web/Team/progress/img/camP.jpg rename to docs/Team/progress/img/camP.jpg diff --git a/web/Team/progress/img/cameraBoard.jpg b/docs/Team/progress/img/cameraBoard.jpg similarity index 100% rename from web/Team/progress/img/cameraBoard.jpg rename to docs/Team/progress/img/cameraBoard.jpg diff --git a/web/Team/progress/img/colorblobWeek3.png b/docs/Team/progress/img/colorblobWeek3.png similarity index 100% rename from web/Team/progress/img/colorblobWeek3.png rename to docs/Team/progress/img/colorblobWeek3.png diff --git a/web/Team/progress/img/flight_1.gif b/docs/Team/progress/img/flight_1.gif similarity index 100% rename from web/Team/progress/img/flight_1.gif rename to docs/Team/progress/img/flight_1.gif diff --git a/web/Team/progress/img/i2c2.png b/docs/Team/progress/img/i2c2.png similarity index 100% rename from web/Team/progress/img/i2c2.png rename to docs/Team/progress/img/i2c2.png diff --git a/web/Team/progress/img/jackieweek9.jpg b/docs/Team/progress/img/jackieweek9.jpg similarity index 100% rename from web/Team/progress/img/jackieweek9.jpg rename to docs/Team/progress/img/jackieweek9.jpg diff --git a/web/Team/progress/img/latency.gif b/docs/Team/progress/img/latency.gif similarity index 100% rename from web/Team/progress/img/latency.gif rename to docs/Team/progress/img/latency.gif diff --git a/web/Team/progress/img/latency_2.gif b/docs/Team/progress/img/latency_2.gif similarity index 100% rename from web/Team/progress/img/latency_2.gif rename to docs/Team/progress/img/latency_2.gif diff --git a/web/Team/progress/img/mrasheed_week10_no_listen_set.png b/docs/Team/progress/img/mrasheed_week10_no_listen_set.png similarity index 100% rename from web/Team/progress/img/mrasheed_week10_no_listen_set.png rename to docs/Team/progress/img/mrasheed_week10_no_listen_set.png diff --git a/web/Team/progress/img/mrasheed_week10_set_pos_firmware_source.png b/docs/Team/progress/img/mrasheed_week10_set_pos_firmware_source.png similarity index 100% rename from web/Team/progress/img/mrasheed_week10_set_pos_firmware_source.png rename to docs/Team/progress/img/mrasheed_week10_set_pos_firmware_source.png diff --git a/web/Team/progress/img/mrasheed_week11_simulation.png b/docs/Team/progress/img/mrasheed_week11_simulation.png similarity index 100% rename from web/Team/progress/img/mrasheed_week11_simulation.png rename to docs/Team/progress/img/mrasheed_week11_simulation.png diff --git a/web/Team/progress/img/mrasheed_week12_drone_aftermath.jpg b/docs/Team/progress/img/mrasheed_week12_drone_aftermath.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week12_drone_aftermath.jpg rename to docs/Team/progress/img/mrasheed_week12_drone_aftermath.jpg diff --git a/web/Team/progress/img/mrasheed_week13_crash_pos_set.png b/docs/Team/progress/img/mrasheed_week13_crash_pos_set.png similarity index 100% rename from web/Team/progress/img/mrasheed_week13_crash_pos_set.png rename to docs/Team/progress/img/mrasheed_week13_crash_pos_set.png diff --git a/web/Team/progress/img/mrasheed_week13_drone_bubble.jpg b/docs/Team/progress/img/mrasheed_week13_drone_bubble.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week13_drone_bubble.jpg rename to docs/Team/progress/img/mrasheed_week13_drone_bubble.jpg diff --git a/web/Team/progress/img/mrasheed_week13_hover_pos_set.png b/docs/Team/progress/img/mrasheed_week13_hover_pos_set.png similarity index 100% rename from web/Team/progress/img/mrasheed_week13_hover_pos_set.png rename to docs/Team/progress/img/mrasheed_week13_hover_pos_set.png diff --git a/web/Team/progress/img/mrasheed_week13_vel_set.png b/docs/Team/progress/img/mrasheed_week13_vel_set.png similarity index 100% rename from web/Team/progress/img/mrasheed_week13_vel_set.png rename to docs/Team/progress/img/mrasheed_week13_vel_set.png diff --git a/web/Team/progress/img/mrasheed_week2_radio.jpg b/docs/Team/progress/img/mrasheed_week2_radio.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week2_radio.jpg rename to docs/Team/progress/img/mrasheed_week2_radio.jpg diff --git a/web/Team/progress/img/mrasheed_week3_calibration.png b/docs/Team/progress/img/mrasheed_week3_calibration.png similarity index 100% rename from web/Team/progress/img/mrasheed_week3_calibration.png rename to docs/Team/progress/img/mrasheed_week3_calibration.png diff --git a/web/Team/progress/img/mrasheed_week3_driveway.jpg b/docs/Team/progress/img/mrasheed_week3_driveway.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week3_driveway.jpg rename to docs/Team/progress/img/mrasheed_week3_driveway.jpg diff --git a/web/Team/progress/img/mrasheed_week3_flight_modes.png b/docs/Team/progress/img/mrasheed_week3_flight_modes.png similarity index 100% rename from web/Team/progress/img/mrasheed_week3_flight_modes.png rename to docs/Team/progress/img/mrasheed_week3_flight_modes.png diff --git a/web/Team/progress/img/mrasheed_week4_code_snippet.png b/docs/Team/progress/img/mrasheed_week4_code_snippet.png similarity index 100% rename from web/Team/progress/img/mrasheed_week4_code_snippet.png rename to docs/Team/progress/img/mrasheed_week4_code_snippet.png diff --git a/web/Team/progress/img/mrasheed_week5_drone.jpg b/docs/Team/progress/img/mrasheed_week5_drone.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week5_drone.jpg rename to docs/Team/progress/img/mrasheed_week5_drone.jpg diff --git a/web/Team/progress/img/mrasheed_week5_mavlink_heart.png b/docs/Team/progress/img/mrasheed_week5_mavlink_heart.png similarity index 100% rename from web/Team/progress/img/mrasheed_week5_mavlink_heart.png rename to docs/Team/progress/img/mrasheed_week5_mavlink_heart.png diff --git a/web/Team/progress/img/mrasheed_week5_usart_dumb_setup.png b/docs/Team/progress/img/mrasheed_week5_usart_dumb_setup.png similarity index 100% rename from web/Team/progress/img/mrasheed_week5_usart_dumb_setup.png rename to docs/Team/progress/img/mrasheed_week5_usart_dumb_setup.png diff --git a/web/Team/progress/img/mrasheed_week6_buff_alloc.png b/docs/Team/progress/img/mrasheed_week6_buff_alloc.png similarity index 100% rename from web/Team/progress/img/mrasheed_week6_buff_alloc.png rename to docs/Team/progress/img/mrasheed_week6_buff_alloc.png diff --git a/web/Team/progress/img/mrasheed_week6_dma_buff_mem_area.png b/docs/Team/progress/img/mrasheed_week6_dma_buff_mem_area.png similarity index 100% rename from web/Team/progress/img/mrasheed_week6_dma_buff_mem_area.png rename to docs/Team/progress/img/mrasheed_week6_dma_buff_mem_area.png diff --git a/web/Team/progress/img/mrasheed_week6_m7_mem_areas.png b/docs/Team/progress/img/mrasheed_week6_m7_mem_areas.png similarity index 100% rename from web/Team/progress/img/mrasheed_week6_m7_mem_areas.png rename to docs/Team/progress/img/mrasheed_week6_m7_mem_areas.png diff --git a/web/Team/progress/img/mrasheed_week6_mem_quads.jpg b/docs/Team/progress/img/mrasheed_week6_mem_quads.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week6_mem_quads.jpg rename to docs/Team/progress/img/mrasheed_week6_mem_quads.jpg diff --git a/web/Team/progress/img/mrasheed_week6_reduce_stack_ram_m4.png b/docs/Team/progress/img/mrasheed_week6_reduce_stack_ram_m4.png similarity index 100% rename from web/Team/progress/img/mrasheed_week6_reduce_stack_ram_m4.png rename to docs/Team/progress/img/mrasheed_week6_reduce_stack_ram_m4.png diff --git a/web/Team/progress/img/mrasheed_week7_minimal_mv_msgs.jpg b/docs/Team/progress/img/mrasheed_week7_minimal_mv_msgs.jpg similarity index 100% rename from web/Team/progress/img/mrasheed_week7_minimal_mv_msgs.jpg rename to docs/Team/progress/img/mrasheed_week7_minimal_mv_msgs.jpg diff --git a/web/Team/progress/img/mrasheed_week9_bq29330_half.png b/docs/Team/progress/img/mrasheed_week9_bq29330_half.png similarity index 100% rename from web/Team/progress/img/mrasheed_week9_bq29330_half.png rename to docs/Team/progress/img/mrasheed_week9_bq29330_half.png diff --git a/web/Team/progress/img/panos_week2_drone.jpg b/docs/Team/progress/img/panos_week2_drone.jpg similarity index 100% rename from web/Team/progress/img/panos_week2_drone.jpg rename to docs/Team/progress/img/panos_week2_drone.jpg diff --git a/web/Team/progress/img/panos_week2_power.jpg b/docs/Team/progress/img/panos_week2_power.jpg similarity index 100% rename from web/Team/progress/img/panos_week2_power.jpg rename to docs/Team/progress/img/panos_week2_power.jpg diff --git a/web/Team/progress/img/pcb1.jpg b/docs/Team/progress/img/pcb1.jpg similarity index 100% rename from web/Team/progress/img/pcb1.jpg rename to docs/Team/progress/img/pcb1.jpg diff --git a/web/Team/progress/img/pcbmonitor.jpg b/docs/Team/progress/img/pcbmonitor.jpg similarity index 100% rename from web/Team/progress/img/pcbmonitor.jpg rename to docs/Team/progress/img/pcbmonitor.jpg diff --git a/web/Team/progress/img/pycharm.png b/docs/Team/progress/img/pycharm.png similarity index 100% rename from web/Team/progress/img/pycharm.png rename to docs/Team/progress/img/pycharm.png diff --git a/web/Team/progress/img/sclh.jpg b/docs/Team/progress/img/sclh.jpg similarity index 100% rename from web/Team/progress/img/sclh.jpg rename to docs/Team/progress/img/sclh.jpg diff --git a/web/Team/progress/img/scll.jpg b/docs/Team/progress/img/scll.jpg similarity index 100% rename from web/Team/progress/img/scll.jpg rename to docs/Team/progress/img/scll.jpg diff --git a/web/Team/progress/img/screwDrone.jpg b/docs/Team/progress/img/screwDrone.jpg similarity index 100% rename from web/Team/progress/img/screwDrone.jpg rename to docs/Team/progress/img/screwDrone.jpg diff --git a/web/Team/progress/img/soldering.jpeg b/docs/Team/progress/img/soldering.jpeg similarity index 100% rename from web/Team/progress/img/soldering.jpeg rename to docs/Team/progress/img/soldering.jpeg diff --git a/web/Team/progress/img/stereo1.gif b/docs/Team/progress/img/stereo1.gif similarity index 100% rename from web/Team/progress/img/stereo1.gif rename to docs/Team/progress/img/stereo1.gif diff --git a/web/Team/progress/img/stereo2.gif b/docs/Team/progress/img/stereo2.gif similarity index 100% rename from web/Team/progress/img/stereo2.gif rename to docs/Team/progress/img/stereo2.gif diff --git a/web/Team/progress/img/stm_nano.jpg b/docs/Team/progress/img/stm_nano.jpg similarity index 100% rename from web/Team/progress/img/stm_nano.jpg rename to docs/Team/progress/img/stm_nano.jpg diff --git a/web/Team/progress/img/stmsolder.jpg b/docs/Team/progress/img/stmsolder.jpg similarity index 100% rename from web/Team/progress/img/stmsolder.jpg rename to docs/Team/progress/img/stmsolder.jpg diff --git a/web/Team/progress/img/trt-info.png b/docs/Team/progress/img/trt-info.png similarity index 100% rename from web/Team/progress/img/trt-info.png rename to docs/Team/progress/img/trt-info.png diff --git a/web/Team/progress/img/week2flow.png b/docs/Team/progress/img/week2flow.png similarity index 100% rename from web/Team/progress/img/week2flow.png rename to docs/Team/progress/img/week2flow.png diff --git a/web/Team/progress/img/week2jackie.jpg b/docs/Team/progress/img/week2jackie.jpg similarity index 100% rename from web/Team/progress/img/week2jackie.jpg rename to docs/Team/progress/img/week2jackie.jpg diff --git a/web/Team/progress/malayter.html b/docs/Team/progress/malayter.html similarity index 98% rename from web/Team/progress/malayter.html rename to docs/Team/progress/malayter.html index 1ae50fc..a474064 100644 --- a/web/Team/progress/malayter.html +++ b/docs/Team/progress/malayter.html @@ -1,209 +1,209 @@ - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - -
-
- - - - - - - - - -
-

Progress Report for Jackie Malayter-

- -

Week 1:

- Date: 9-3-2020
- Total hours: 4.5-5 hours
- Description of design efforts:
-For week one, I went over the course material and got to know about how 477 will operate this semester. Of course, our group met up this week go over roles and finish our final project proposal. Personally, I started gathering the materials that I needed to start developing how I was going to perform computer vision on the nano. I found it was not convenient at all to not have internet on my nano, so I purchased a wifi antenna. I also started learning how to interface with the CSI camera included on my nano developer kit, including the pipeline included in the original nano operating system image. This was quite helpful to learn, because it enabled me to start using the camera in python scripts. Additionally, I filled out my sections on the website (except this progress report) and filled out some of the other sections, such as the main page and replacing some images on the team website.
- - -
- -

Week 2:

- Date: 9-3-2020
- Total hours: 10
- Description of design efforts:
-This week, I configured the wifi to my jetson nano. This involved installing a wifi driver on the nano, which was a good learning experience in learning ubuntu (I am not extremely fluent ubuntu). I learned a lot of ubuntu syntax and a lot about remote access- for example, I could ssh into my nano from my personal laptop, as my partner has a static ip address. Nonetheless, having internet connection on the nano itself is very useful for downloading various code repositories, understanding how they operate, and pivoting the code to do something slightly different. I began performing color blob detection on the nano using openCV. I did this with static images- however, I am aiming to perform color blob detection using the live camera feed from gstreamer. This will be an important step for the project, because it will allow us to test if we can use color blob detection in some part of our computer vision process, as it is far less computationally expensive, then say, a CNN (which we might have to use at some point). -
- -
-In the image above, that is me working on my nano using a simple facial recognition script I wrote to test out the camera in openCV. While I was doing this, Moiz and I used the command "tegrastats" to record the power usage of the nano while running this script. We used those statistics for our project constraints assignment. Moving forward with the nano, I would like to first perform simple live color blob detection. Then, I would like to move onto more advanced image processing. For example, I would like to explore using CNNs for flower identification, as well as starting to explore how to extract positional data from images. This might be difficult, so I am going to work with Ethan on this. -
-Finally, I guided the team on creating a function block diagram of our project. There was a lot of disagreement and unknowns about how our project was going to work, and Josh and I thought it would be extremely helpful to create a high level functional diagram of exactly how our drone was going to progress through its operation. This ended up being important for our constraints homework, because making a block diagram as a team got everyone on the same page of what our end product was going to do. Therefore, it was much easier to think about constraints and discuss them when we were all on the same page. Below is a picture of the diagram. -
- -
- -

Week 3:

- Date: 9-11-2020
- Total hours: 15 or so
- Description of design efforts:
-On Saturday, I helped Moiz plan on how to mount the hardware on the drone. This required me to desolder the ESCs on the drone because they were in the way of the pixhawk. Extra care had to be taken when desoldering because we did not want to destroy the power distribution board by overheating the components. Additionally, I took apart the drone so that we could make an entrance for the battery to fit into in the bottom of the drone. Below is a picture of me doing just that. -
- -
-This week, our homework was to analyze the components of our project. I analyzed the Jetson Nano and the STM32H7, as I wanted to learn more in depth about the features of these components. I already knew quite a bit about the Nano, because I have been working with it since the beginning of the semester. However, I also analyzed an Analog Devices BlackFin DSP chip that we were considering using this summer to offboard the image processing from the STM32H7. The Nano was definitely the superior choice for prototyping, because, among other things, it came with a dev kit and has a huge presence of documentation on the web. This isn't to say that the BlackFin DSP chip is "useless"- I could definitely see it being used on perhaps a more refined design- that is, we know exactly what needs to happen computationally, and we are simply seeking to reduce power consumption. In such a case, the nano definitely could be replaces with a less power hungry chip, which could be a BlackFin DSP processor. Additionally, I compared the STM32H7 with the STM32H4. From this, I grasped a better understanding of all the peripherals and features of the STM32H7, which was useful to me, because we just decided to use this micro during the summer and I didn't look too deep into it after that. -
-Finally, in between our group meetings and working with the drones, I started my color blob detection. I don't have anything interesting to show quite yet because I was working on finding a good IDE and have been debugging my code. Right now, I am using openCV's Simple Blob Detector. I am using greyscale images, which is not ideal, but I want to explore how I can incorporate color. Here is a picture of my pycharm IDE and an example of a flower picture with very rough blob detection (as you can see, my algorithm obviously needs more refinement, but it is a first step!). As you can wee, the blob detection is selecting the stamen of the flowers, but it is also picking out other things. This requires more work to isolte the stamen only. -
- - - -
- -

Week 4:

-Date: 9-17-2020
-Total Hours: 15 or so
- Description of design efforts:
- This week, I refined the image processing algorithm for detecting flowers and got it working with live camera feed on the nano. I will talk about how I did it. First of all, we designed our flower detection plan such that when we were in close range of a plant, we would use a faster algorithm than a neural net. It's my primary responsibility to make this faster, more simple algorithm. Assuming that we are already near a flower, I could use a less precise method than a neural net. Thus, I am using color masking and blob detection in openCV.
- I created a small data set of 14 images of blossoms to test out how I was going to create this algorithm. I tried all sorts of things, such as blob detection, masking out objects that weren't white (to isolate just the petals), and masking out objects that weren't yellow (to isolate the stamen only), but after I did these, I wasn't quite sure how to label the individual flowers. I then decided to keep it as simple as I could, while still getting a decent result. Below is a process of how the stamen are detected on the nano:
-1. Instantiate openCV simple blob detector and write gsstreamer command for CSI camera
-2. Begin video capture (and exit on esc key)
-3. For each frame, convert color to hsv colorspace and create a color mask for any colors in the range ([14,64,120]) to ([30,255,255])
-4. Invert color mask so that stamen blobs are dark
-5. Feed inverted mask into the simple blob detector, which detects groups of dark pixels
-6. Draw detected blobs on frame and display to user (of course, this step won't be needed on the drone, but is necessary for verification)
-
-Here is the picture of the mask and final product:
-
-On the left, you see the mask that openCV generated that the blob detection is being performed on, and the subsequent frame.
- -
-

Week 5


- Date: 9/25/2020
- Total Hours: 13 or so
- Description of Design Efforts:
-This week was not as productive as I would have hoped for. After successfully identifying flowers in the frame, it was time to start trying to use a stereo camera rig to identify the distance of flowers. Ethan and I crafted a stereo rig prototype on a piece of particle board. I successfully got my algorithm from last week working on both cameras at the same time. It seems rather slow, however, upon further investigation, I think it actually is slowed by the display of the video (specifically- the waitkey command is lagging the stream), which will not be a problem in the final product. Of course, more testing is necessary to verify this claim, and I must still keep designing my code to be as robust as possible. -I spend a lot of time trying some depth map algorithms and tyring to see if I could just compute the parallax of the identified flowers from last week. The depth map I tried worked very poorly, and using the identified flower locations from last week's algorithm has some issues. First of all, it is extremely difficult to correlate which point corresponds to the same flower between frames, espectially because one camera might miss a flower or 2. One of the reasons this is difficult is because of camera distortion, and, although I wanted to get away with not calibrating the cameras, I finally decided I should take this step. So, currently I am going to calibrate the cameras using a checkerboard to detect and reverse the distortion. Then, I will try using a fast feature extractor to make a better depth map and estimate the distance of the flowers. Initially, this algorithm may be slow, but I just need to get something working and then I can work on optimizing it later. Below are some of the calibration pictures I took. As you can see, the distortion is not terrible. - -
-
-
- -

Week 6


- Date:
- Total Hours: 13 or so
- Description of Design Efforts:
-This week, I began the calibration script of the two cameras and began extracting the camera calibration data using opencv. This calibration is a one-time thing, so it only needs to be performed once and then the "camera matrices" can be stored for future use on the jetson nano.
I have been working a lot on the image processing lately, and wanted to work more on hardware for a little bit. I am going to start working on I2C for the battery moniter peripheral. To prepare for this, I soldered the battery moniter on a development board. This was the first time I had ever soldered something with such tiny pins on a flat surface. I first practiced on an old ECE 362 board and surface mount capacitor to make sure that I was prepared. Below you can see some pictures of me soldering the actual battery moniter integrated circuit to the breakout board.
Additionally, I soldered additional pins onto my stm32h7 nucleo board. I have included some pictures of my soldering job, which isn't too terrible for maybe the third time I have soldered in my life. After that, I got the Cube IDE for my stm32h7 and will begin working on an I2C functionality between the battery moniter and the stm32h7. - -
-
-
-

Week 7

- Total Hours 15
- Description of Design Efforts:
-This week, I worked on the software formalization and I2C. In the software formalization, I read through and interpreted the liscening policies on using third party softwares. I was very surprised to see that openCV had patented algorithms in its open source release (SIFT/SURF algorithms). It is a good thing we had to pay attention to this or else we could be in legal trouble if we sold our product in the future. Most of the softare formaliation was going more in detail of the functional description of software components, which was right up my alley as a systems engineering. It was enjoyable to describe how the whole drone was going to work as one unit. -Additionally, I worked on I2C this week. We are using I2C to communication with the battery monitor. To be honest, we learned I2C in ECE362 during the peak of the covid-19 shutdowns and therefore I didn't learn it very well. So, I spent a lot of time this week learning about how I2C works. Luckily, STM's HAL (hardware abstraction libraries) do a lot of the work for you, but, nonetheless, I wanted to understand what exactly was happening. Here is something interesting I learned about I2C this week. So, the default clock to the I2C peripheral is 48 MHz, but the battery monitor can only support ~32kHz for I2C. However, I was really confused because the prescaler maxed out at 16, so I was very curious about how we were going to make this work. It turns out that the SCLL and SCLH bits in the timing register can be used to extend the clock period to yield a slower rate clock. I have show in diagrams below how the clock is slowed to the desired value. I should be finishing up I2C tomorrow. -
-
-
-
-

Week 8

- Total Hours 15
- Description of Design Efforts:
-This week, I continued working with the battery monitor, as well as helping generate a clock for our battery monitor using pulse width modulation. I configured I2C2 on our device to send the start bit and send the slave address, as well as request a write to the device. Then, I wanted to actually test this on the monitor chip. Unfortunately, upon being very skeptical that our battery monitor did not have an internal oscillator, we realized that our battery monitor is actually the analog front end to another battery monitoring chip (that somehow was not mentioned at all in the data sheet...). So, I could not test my I2C and try to get an ACK from the slave. Also, we had to select a new chip. Once we selected the new chip, the bq76920, I started working on more modular functions to write and read to the register addresses provided in the data sheet. What I have to do now, finally, is to create 2 ISRs - one for i2c2txne (transmitter register not empty) and i2c2rxne (recieve register not empty), so that we can actually transmit and recieve bytes via I2C. I am currently inthe process of writing those ISRs, and once the chip is shipped, I hopefully will be able to test and debug them. Below, you can see my 100 kHz I2C clock, sending the slave address 0x8, and requesting a write. Because I2C is not connected to any device, we see a NACK. -
-
-
-
-


-

Week 9

- Total Hours 15
- Description of Design Efforts:
-This week, I kept working on I2C. Last week, I got the I2C2 to talk to I2C1. This was to prepare for communication with the new battery monitor that we ordered. First, I initiated a read request from I2C1 (I2C2 is the master device). I successfully recieved data from the I2C1 slave on I2C2 using my interrupt service routines. Next, I wrote an interrupt service routine to write data to I2C1. Because the battery monitor requires its address to be sent followed by the destination register address, I had to write my ISR to send the two addresses and then send the desired byte. This was fairly simple; the process involves first sending a start bit with the slave address. Then, I enable the TXE interrupt on I2C2 after sending the start bit so that an interrupt is triggered. In the first TXE flag event, I place the desired register address into the transmit data register of the I2C2 peripheral. The second flag of TXE, I place the desired byte that I want to write to the battery monitor. The battery monitor really only supports byte writes, therefore this is sufficient functionality. Moving forward, I will test connection to the actual battery monitor and not I2C1 and debug from there. Otherwise, this PSSC is pretty much done and will require just some formalization. -
-Below: Picture of the transmitter sending 0xAA after sending the desired slave address. -
-
-
- -

Week 10

- Total Hours 15
- Description of Design Efforts;
-This week I soldered the battery monitor onto a dev board so that I could test it with my I2C code (I also learned how to desolder an IC in this process, which was a cool learning experience). I first changed the address to the bq76920's address 0x08 and attempted to write to the battery monitor. I recieved an ack from the monitor and the byte I was writing appeared on teh oscilloscope. However, I couldn't be too sure that I was actually writing to the battery monitor. So, to check, I wrote to a register 0x18 and then read the value at that address. I successfully verified what I wrote indeed was written to the battery monitor. The rest of the week I spent my time formalizing the process for getting data from the battery monitor. I am current debugging this because I thought that the circuit was capable of block reads, but I can only read a total of 2 bytes maximum. This is leading me to believe that the IC only supports 2 byte block reads because each of the registers has a high and a low address, which would make reading 2 bytes at a time much more logical. Unfortunately, when I try to read from some select registers, I am not able to read data from them, even though the datasheet says I should be able to. I am currently debugging that and will be able to read from the desired registers of the battery monitor in increments of 250 ms, which is the update rate of the cell voltages. -
-Below: Picture of my battery monitor test setup -
-
- - -
-

Week 11

- Total Hours 20
- Description of Design Efforts:
-Work continued this week for the battery monitor. I began programming the regular interrupt to read the 4 cell registers and the total battery register values. This was interestin because the timer I was using for the interrupt was on the M4 core of our microcontroller, but my code and my ISR was on the M7 core of the microcontroller. Because my original I2C code I had been working on contained global variables on the M7, I needed to figure out how to have shared global variabled between two cores. Moiz showed me how to use shared memory between two cores, which is essentially multithreading. Luckily, my multithreading process was very simple, because it was guaranteed that the two cores would not access the shared memory at the same time. So, there was no need for any sort of 'locks' on the shared memory, which simplified things greatly.
-On my development board, I successfully read values from the battery monitor; however, they were not accurate because the maximum voltage the monitor was powered at was 5V which was too low for the chip's -ADC to work. Therefore, I wired up the battery monitor to the PCB (I wired one of the PCBs for testing the monitor, while Josh wired a second). This time, I was getting more realistic voltages but they still did not seem 100% accurate. I am currently debugging why I am getting slightly strange battery monitor reads.
On top of my battery monitor progress, I spent some time testing the drone flight with Moiz and Josh.
-Below: Picture of the battery monitor on the PCB
-
-
-

Week 12

- Total Hours 18
- Description of Design Efforts:
-This week I did two things. First, I helped build a drone cage with Moiz. Second, I finally succeeded in reading accurate battery values from the batter monitoring integrated circuit. The drone cage was a necessity because there is a bug with MavLink causing the drone to flip itself over and crash into the ground. Nearly every test, propellors are usually broken, and we are on a limited supply. Therefore, we got some PVC pipe and pipe connectors and glued them together to create a protective cage around the drone. Although this is not perfect, it does protect some of the hardware and more propellors than without it. We are refining the bubble for further testing. -Fixing the bug in the battery monitor was a rather arduous process. There was not really one major thing that was flawed with the software, but very small things that would cause failure. For example, I casted a register as a uint32_t, but tried to pass in a negative value which was used for a special condition. As well, I forgot to clear the 'size' register in the I2C starting sequence, meaning that it was always requesting a read of 2 bits, while some of the reads I wanted to perform only required 1 bit. This issue impacted the interrupt because, if I was doing a 1 bit read or write, then I would accidentlly trigger an additional transmitter empty or reciever not empty interrupt. This caused unexpected transmissions on the oscilloscope. However, once I fixed that bug, my interrupt works great and I am reading the actual battery voltage from the chip with a close degree of accuracy. The next step is to read individual cells to predict the remaining battery life. Below is a video of my test. -
Measuring battery voltage with the battery monitor
- - - - - -
- - - - - - - - - + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
+

Progress Report for Jackie Malayter-

+ +

Week 1:

+ Date: 9-3-2020
+ Total hours: 4.5-5 hours
+ Description of design efforts:
+For week one, I went over the course material and got to know about how 477 will operate this semester. Of course, our group met up this week go over roles and finish our final project proposal. Personally, I started gathering the materials that I needed to start developing how I was going to perform computer vision on the nano. I found it was not convenient at all to not have internet on my nano, so I purchased a wifi antenna. I also started learning how to interface with the CSI camera included on my nano developer kit, including the pipeline included in the original nano operating system image. This was quite helpful to learn, because it enabled me to start using the camera in python scripts. Additionally, I filled out my sections on the website (except this progress report) and filled out some of the other sections, such as the main page and replacing some images on the team website.
+ + +
+ +

Week 2:

+ Date: 9-3-2020
+ Total hours: 10
+ Description of design efforts:
+This week, I configured the wifi to my jetson nano. This involved installing a wifi driver on the nano, which was a good learning experience in learning ubuntu (I am not extremely fluent ubuntu). I learned a lot of ubuntu syntax and a lot about remote access- for example, I could ssh into my nano from my personal laptop, as my partner has a static ip address. Nonetheless, having internet connection on the nano itself is very useful for downloading various code repositories, understanding how they operate, and pivoting the code to do something slightly different. I began performing color blob detection on the nano using openCV. I did this with static images- however, I am aiming to perform color blob detection using the live camera feed from gstreamer. This will be an important step for the project, because it will allow us to test if we can use color blob detection in some part of our computer vision process, as it is far less computationally expensive, then say, a CNN (which we might have to use at some point). +
+ +
+In the image above, that is me working on my nano using a simple facial recognition script I wrote to test out the camera in openCV. While I was doing this, Moiz and I used the command "tegrastats" to record the power usage of the nano while running this script. We used those statistics for our project constraints assignment. Moving forward with the nano, I would like to first perform simple live color blob detection. Then, I would like to move onto more advanced image processing. For example, I would like to explore using CNNs for flower identification, as well as starting to explore how to extract positional data from images. This might be difficult, so I am going to work with Ethan on this. +
+Finally, I guided the team on creating a function block diagram of our project. There was a lot of disagreement and unknowns about how our project was going to work, and Josh and I thought it would be extremely helpful to create a high level functional diagram of exactly how our drone was going to progress through its operation. This ended up being important for our constraints homework, because making a block diagram as a team got everyone on the same page of what our end product was going to do. Therefore, it was much easier to think about constraints and discuss them when we were all on the same page. Below is a picture of the diagram. +
+ +
+ +

Week 3:

+ Date: 9-11-2020
+ Total hours: 15 or so
+ Description of design efforts:
+On Saturday, I helped Moiz plan on how to mount the hardware on the drone. This required me to desolder the ESCs on the drone because they were in the way of the pixhawk. Extra care had to be taken when desoldering because we did not want to destroy the power distribution board by overheating the components. Additionally, I took apart the drone so that we could make an entrance for the battery to fit into in the bottom of the drone. Below is a picture of me doing just that. +
+ +
+This week, our homework was to analyze the components of our project. I analyzed the Jetson Nano and the STM32H7, as I wanted to learn more in depth about the features of these components. I already knew quite a bit about the Nano, because I have been working with it since the beginning of the semester. However, I also analyzed an Analog Devices BlackFin DSP chip that we were considering using this summer to offboard the image processing from the STM32H7. The Nano was definitely the superior choice for prototyping, because, among other things, it came with a dev kit and has a huge presence of documentation on the web. This isn't to say that the BlackFin DSP chip is "useless"- I could definitely see it being used on perhaps a more refined design- that is, we know exactly what needs to happen computationally, and we are simply seeking to reduce power consumption. In such a case, the nano definitely could be replaces with a less power hungry chip, which could be a BlackFin DSP processor. Additionally, I compared the STM32H7 with the STM32H4. From this, I grasped a better understanding of all the peripherals and features of the STM32H7, which was useful to me, because we just decided to use this micro during the summer and I didn't look too deep into it after that. +
+Finally, in between our group meetings and working with the drones, I started my color blob detection. I don't have anything interesting to show quite yet because I was working on finding a good IDE and have been debugging my code. Right now, I am using openCV's Simple Blob Detector. I am using greyscale images, which is not ideal, but I want to explore how I can incorporate color. Here is a picture of my pycharm IDE and an example of a flower picture with very rough blob detection (as you can see, my algorithm obviously needs more refinement, but it is a first step!). As you can wee, the blob detection is selecting the stamen of the flowers, but it is also picking out other things. This requires more work to isolte the stamen only. +
+ + + +
+ +

Week 4:

+Date: 9-17-2020
+Total Hours: 15 or so
+ Description of design efforts:
+ This week, I refined the image processing algorithm for detecting flowers and got it working with live camera feed on the nano. I will talk about how I did it. First of all, we designed our flower detection plan such that when we were in close range of a plant, we would use a faster algorithm than a neural net. It's my primary responsibility to make this faster, more simple algorithm. Assuming that we are already near a flower, I could use a less precise method than a neural net. Thus, I am using color masking and blob detection in openCV.
+ I created a small data set of 14 images of blossoms to test out how I was going to create this algorithm. I tried all sorts of things, such as blob detection, masking out objects that weren't white (to isolate just the petals), and masking out objects that weren't yellow (to isolate the stamen only), but after I did these, I wasn't quite sure how to label the individual flowers. I then decided to keep it as simple as I could, while still getting a decent result. Below is a process of how the stamen are detected on the nano:
+1. Instantiate openCV simple blob detector and write gsstreamer command for CSI camera
+2. Begin video capture (and exit on esc key)
+3. For each frame, convert color to hsv colorspace and create a color mask for any colors in the range ([14,64,120]) to ([30,255,255])
+4. Invert color mask so that stamen blobs are dark
+5. Feed inverted mask into the simple blob detector, which detects groups of dark pixels
+6. Draw detected blobs on frame and display to user (of course, this step won't be needed on the drone, but is necessary for verification)
+
+Here is the picture of the mask and final product:
+
+On the left, you see the mask that openCV generated that the blob detection is being performed on, and the subsequent frame.
+ +
+

Week 5


+ Date: 9/25/2020
+ Total Hours: 13 or so
+ Description of Design Efforts:
+This week was not as productive as I would have hoped for. After successfully identifying flowers in the frame, it was time to start trying to use a stereo camera rig to identify the distance of flowers. Ethan and I crafted a stereo rig prototype on a piece of particle board. I successfully got my algorithm from last week working on both cameras at the same time. It seems rather slow, however, upon further investigation, I think it actually is slowed by the display of the video (specifically- the waitkey command is lagging the stream), which will not be a problem in the final product. Of course, more testing is necessary to verify this claim, and I must still keep designing my code to be as robust as possible. +I spend a lot of time trying some depth map algorithms and tyring to see if I could just compute the parallax of the identified flowers from last week. The depth map I tried worked very poorly, and using the identified flower locations from last week's algorithm has some issues. First of all, it is extremely difficult to correlate which point corresponds to the same flower between frames, espectially because one camera might miss a flower or 2. One of the reasons this is difficult is because of camera distortion, and, although I wanted to get away with not calibrating the cameras, I finally decided I should take this step. So, currently I am going to calibrate the cameras using a checkerboard to detect and reverse the distortion. Then, I will try using a fast feature extractor to make a better depth map and estimate the distance of the flowers. Initially, this algorithm may be slow, but I just need to get something working and then I can work on optimizing it later. Below are some of the calibration pictures I took. As you can see, the distortion is not terrible. + +
+
+
+ +

Week 6


+ Date:
+ Total Hours: 13 or so
+ Description of Design Efforts:
+This week, I began the calibration script of the two cameras and began extracting the camera calibration data using opencv. This calibration is a one-time thing, so it only needs to be performed once and then the "camera matrices" can be stored for future use on the jetson nano.
I have been working a lot on the image processing lately, and wanted to work more on hardware for a little bit. I am going to start working on I2C for the battery moniter peripheral. To prepare for this, I soldered the battery moniter on a development board. This was the first time I had ever soldered something with such tiny pins on a flat surface. I first practiced on an old ECE 362 board and surface mount capacitor to make sure that I was prepared. Below you can see some pictures of me soldering the actual battery moniter integrated circuit to the breakout board.
Additionally, I soldered additional pins onto my stm32h7 nucleo board. I have included some pictures of my soldering job, which isn't too terrible for maybe the third time I have soldered in my life. After that, I got the Cube IDE for my stm32h7 and will begin working on an I2C functionality between the battery moniter and the stm32h7. + +
+
+
+

Week 7

+ Total Hours 15
+ Description of Design Efforts:
+This week, I worked on the software formalization and I2C. In the software formalization, I read through and interpreted the liscening policies on using third party softwares. I was very surprised to see that openCV had patented algorithms in its open source release (SIFT/SURF algorithms). It is a good thing we had to pay attention to this or else we could be in legal trouble if we sold our product in the future. Most of the softare formaliation was going more in detail of the functional description of software components, which was right up my alley as a systems engineering. It was enjoyable to describe how the whole drone was going to work as one unit. +Additionally, I worked on I2C this week. We are using I2C to communication with the battery monitor. To be honest, we learned I2C in ECE362 during the peak of the covid-19 shutdowns and therefore I didn't learn it very well. So, I spent a lot of time this week learning about how I2C works. Luckily, STM's HAL (hardware abstraction libraries) do a lot of the work for you, but, nonetheless, I wanted to understand what exactly was happening. Here is something interesting I learned about I2C this week. So, the default clock to the I2C peripheral is 48 MHz, but the battery monitor can only support ~32kHz for I2C. However, I was really confused because the prescaler maxed out at 16, so I was very curious about how we were going to make this work. It turns out that the SCLL and SCLH bits in the timing register can be used to extend the clock period to yield a slower rate clock. I have show in diagrams below how the clock is slowed to the desired value. I should be finishing up I2C tomorrow. +
+
+
+
+

Week 8

+ Total Hours 15
+ Description of Design Efforts:
+This week, I continued working with the battery monitor, as well as helping generate a clock for our battery monitor using pulse width modulation. I configured I2C2 on our device to send the start bit and send the slave address, as well as request a write to the device. Then, I wanted to actually test this on the monitor chip. Unfortunately, upon being very skeptical that our battery monitor did not have an internal oscillator, we realized that our battery monitor is actually the analog front end to another battery monitoring chip (that somehow was not mentioned at all in the data sheet...). So, I could not test my I2C and try to get an ACK from the slave. Also, we had to select a new chip. Once we selected the new chip, the bq76920, I started working on more modular functions to write and read to the register addresses provided in the data sheet. What I have to do now, finally, is to create 2 ISRs - one for i2c2txne (transmitter register not empty) and i2c2rxne (recieve register not empty), so that we can actually transmit and recieve bytes via I2C. I am currently inthe process of writing those ISRs, and once the chip is shipped, I hopefully will be able to test and debug them. Below, you can see my 100 kHz I2C clock, sending the slave address 0x8, and requesting a write. Because I2C is not connected to any device, we see a NACK. +
+
+
+
+


+

Week 9

+ Total Hours 15
+ Description of Design Efforts:
+This week, I kept working on I2C. Last week, I got the I2C2 to talk to I2C1. This was to prepare for communication with the new battery monitor that we ordered. First, I initiated a read request from I2C1 (I2C2 is the master device). I successfully recieved data from the I2C1 slave on I2C2 using my interrupt service routines. Next, I wrote an interrupt service routine to write data to I2C1. Because the battery monitor requires its address to be sent followed by the destination register address, I had to write my ISR to send the two addresses and then send the desired byte. This was fairly simple; the process involves first sending a start bit with the slave address. Then, I enable the TXE interrupt on I2C2 after sending the start bit so that an interrupt is triggered. In the first TXE flag event, I place the desired register address into the transmit data register of the I2C2 peripheral. The second flag of TXE, I place the desired byte that I want to write to the battery monitor. The battery monitor really only supports byte writes, therefore this is sufficient functionality. Moving forward, I will test connection to the actual battery monitor and not I2C1 and debug from there. Otherwise, this PSSC is pretty much done and will require just some formalization. +
+Below: Picture of the transmitter sending 0xAA after sending the desired slave address. +
+
+
+ +

Week 10

+ Total Hours 15
+ Description of Design Efforts;
+This week I soldered the battery monitor onto a dev board so that I could test it with my I2C code (I also learned how to desolder an IC in this process, which was a cool learning experience). I first changed the address to the bq76920's address 0x08 and attempted to write to the battery monitor. I recieved an ack from the monitor and the byte I was writing appeared on teh oscilloscope. However, I couldn't be too sure that I was actually writing to the battery monitor. So, to check, I wrote to a register 0x18 and then read the value at that address. I successfully verified what I wrote indeed was written to the battery monitor. The rest of the week I spent my time formalizing the process for getting data from the battery monitor. I am current debugging this because I thought that the circuit was capable of block reads, but I can only read a total of 2 bytes maximum. This is leading me to believe that the IC only supports 2 byte block reads because each of the registers has a high and a low address, which would make reading 2 bytes at a time much more logical. Unfortunately, when I try to read from some select registers, I am not able to read data from them, even though the datasheet says I should be able to. I am currently debugging that and will be able to read from the desired registers of the battery monitor in increments of 250 ms, which is the update rate of the cell voltages. +
+Below: Picture of my battery monitor test setup +
+
+ + +
+

Week 11

+ Total Hours 20
+ Description of Design Efforts:
+Work continued this week for the battery monitor. I began programming the regular interrupt to read the 4 cell registers and the total battery register values. This was interestin because the timer I was using for the interrupt was on the M4 core of our microcontroller, but my code and my ISR was on the M7 core of the microcontroller. Because my original I2C code I had been working on contained global variables on the M7, I needed to figure out how to have shared global variabled between two cores. Moiz showed me how to use shared memory between two cores, which is essentially multithreading. Luckily, my multithreading process was very simple, because it was guaranteed that the two cores would not access the shared memory at the same time. So, there was no need for any sort of 'locks' on the shared memory, which simplified things greatly.
+On my development board, I successfully read values from the battery monitor; however, they were not accurate because the maximum voltage the monitor was powered at was 5V which was too low for the chip's +ADC to work. Therefore, I wired up the battery monitor to the PCB (I wired one of the PCBs for testing the monitor, while Josh wired a second). This time, I was getting more realistic voltages but they still did not seem 100% accurate. I am currently debugging why I am getting slightly strange battery monitor reads.
On top of my battery monitor progress, I spent some time testing the drone flight with Moiz and Josh.
+Below: Picture of the battery monitor on the PCB
+
+
+

Week 12

+ Total Hours 18
+ Description of Design Efforts:
+This week I did two things. First, I helped build a drone cage with Moiz. Second, I finally succeeded in reading accurate battery values from the batter monitoring integrated circuit. The drone cage was a necessity because there is a bug with MavLink causing the drone to flip itself over and crash into the ground. Nearly every test, propellors are usually broken, and we are on a limited supply. Therefore, we got some PVC pipe and pipe connectors and glued them together to create a protective cage around the drone. Although this is not perfect, it does protect some of the hardware and more propellors than without it. We are refining the bubble for further testing. +Fixing the bug in the battery monitor was a rather arduous process. There was not really one major thing that was flawed with the software, but very small things that would cause failure. For example, I casted a register as a uint32_t, but tried to pass in a negative value which was used for a special condition. As well, I forgot to clear the 'size' register in the I2C starting sequence, meaning that it was always requesting a read of 2 bits, while some of the reads I wanted to perform only required 1 bit. This issue impacted the interrupt because, if I was doing a 1 bit read or write, then I would accidentlly trigger an additional transmitter empty or reciever not empty interrupt. This caused unexpected transmissions on the oscilloscope. However, once I fixed that bug, my interrupt works great and I am reading the actual battery voltage from the chip with a close degree of accuracy. The next step is to read individual cells to predict the remaining battery life. Below is a video of my test. +
Measuring battery voltage with the battery monitor
+ + + + + +
+ + + + + + + + + diff --git a/web/Team/progress/md b/docs/Team/progress/md old mode 100755 new mode 100644 similarity index 100% rename from web/Team/progress/md rename to docs/Team/progress/md diff --git a/web/Team/progress/mrasheed.html b/docs/Team/progress/mrasheed.html similarity index 95% rename from web/Team/progress/mrasheed.html rename to docs/Team/progress/mrasheed.html index 6d3deff..ecac75b 100644 --- a/web/Team/progress/mrasheed.html +++ b/docs/Team/progress/mrasheed.html @@ -1,86 +1,86 @@ - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - -
-
-
- - - -
-
- - - - - - - - + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
+
+
+ + + +
+
+ + + + + + + + diff --git a/web/Team/progress/mrasheed.md b/docs/Team/progress/mrasheed.md similarity index 100% rename from web/Team/progress/mrasheed.md rename to docs/Team/progress/mrasheed.md diff --git a/web/Team/progress/mrasheedmd.html b/docs/Team/progress/mrasheedmd.html similarity index 100% rename from web/Team/progress/mrasheedmd.html rename to docs/Team/progress/mrasheedmd.html diff --git a/web/Team/progress/panos.html b/docs/Team/progress/panos.html similarity index 95% rename from web/Team/progress/panos.html rename to docs/Team/progress/panos.html index 60dafd7..428ed98 100644 --- a/web/Team/progress/panos.html +++ b/docs/Team/progress/panos.html @@ -1,86 +1,86 @@ - - - - - - - - - - -ECE477 Course Documents - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - -
-
-
- - - -
-
- - - - - - - - + + + + + + + + + + +ECE477 Course Documents + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
+
+
+ + + +
+
+ + + + + + + + diff --git a/web/Team/progress/panos.md b/docs/Team/progress/panos.md similarity index 100% rename from web/Team/progress/panos.md rename to docs/Team/progress/panos.md diff --git a/web/Team/progress/panos.mdmd.html b/docs/Team/progress/panos.mdmd.html similarity index 100% rename from web/Team/progress/panos.mdmd.html rename to docs/Team/progress/panos.mdmd.html diff --git a/web/Team/progress/panosmd.html b/docs/Team/progress/panosmd.html similarity index 100% rename from web/Team/progress/panosmd.html rename to docs/Team/progress/panosmd.html diff --git a/web/Team/team.html b/docs/Team/team.html similarity index 95% rename from web/Team/team.html rename to docs/Team/team.html index 6298b44..facc797 100644 --- a/web/Team/team.html +++ b/docs/Team/team.html @@ -1,90 +1,90 @@ - - - - - - - - - - - - - - - -ECE477 Team Members - - - - - - - - - - - - - - - -
-
- - - - - - - - - - -
-

ECE477 Team Members:

- -
-
-
-
-
- - - -
-
- - - - - - - - + + + + + + + + + + + + + + + +ECE477 Team Members + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + +
+

ECE477 Team Members:

+ +
+
+
+
+
+ + + +
+
+ + + + + + + + diff --git a/web/credits.txt b/docs/credits.txt similarity index 100% rename from web/credits.txt rename to docs/credits.txt diff --git a/web/css/camera.css b/docs/css/camera.css similarity index 95% rename from web/css/camera.css rename to docs/css/camera.css index da8ae8f..06e05d3 100644 --- a/web/css/camera.css +++ b/docs/css/camera.css @@ -1,241 +1,241 @@ -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,800); - -/************************** -* -* GENERAL -* -**************************/ -.camera_wrap img, -.camera_wrap ol, .camera_wrap ul, .camera_wrap li, -.camera_wrap table, .camera_wrap tbody, .camera_wrap tfoot, .camera_wrap thead, .camera_wrap tr, .camera_wrap th, .camera_wrap td -.camera_thumbs_wrap a, .camera_thumbs_wrap img, -.camera_thumbs_wrap ol, .camera_thumbs_wrap ul, .camera_thumbs_wrap li, -.camera_thumbs_wrap table, .camera_thumbs_wrap tbody, .camera_thumbs_wrap tfoot, .camera_thumbs_wrap thead, .camera_thumbs_wrap tr, .camera_thumbs_wrap th, .camera_thumbs_wrap td { - background: none; - border: 0; - font: inherit; - font-size: 100%; - margin: 0; - padding: 0; - vertical-align: baseline; - list-style: none; - line-height: ; -} -.camera_wrap { - display: none; - float: none; - position: relative; - z-index: 1; - margin: 0 !important; - -} -.camera_wrap img { - max-width: none !important; - /*border-radius: 0 20px 0 0; - overflow: hidden;*/ -} -.camera_fakehover { - height: 100%; - position: relative; - width: inherit; - z-index: 1; -} -.camera_wrap { - width: inherit; - /*padding-bottom:99px;*/ -} -.camera_src { - display: none; -} -.cameraCont, .cameraContents { - height: 100%; - position: relative; - width: inherit; - z-index: 1; -} -.cameraSlide { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - width: inherit; -} -.cameraContent { - bottom: 0; - display: none; - left: 0; - position: absolute; - right: 0; - top: 0; - width: inherit; -} -.camera_target { - bottom: 0; - height: 100%; - left: 0; - overflow: hidden; - position: absolute; - right: 0; - text-align: left; - top: 0; - width: inherit; - z-index: 0; -} -.camera_overlayer { - bottom: 0; - height: 100%; - left: 0; - overflow: hidden; - position: absolute; - right: 0; - top: 0; - width: inherit; - z-index: 0; -} -.camera_target_content { - bottom: 0; - left: 0; - overflow: visible; - position: absolute; - right: 0; - top: 0; - z-index: 2; -} -.camera_target_content .camera_link { - display: block; - height: 100%; - text-decoration: none; -} -.camera_loader { - background: #fff url(../img/camera-loader.gif) no-repeat center; - background: rgba(255, 255, 255, 0.9) url(../img/camera-loader.gif) no-repeat center; - border: 1px solid #ffffff; - -webkit-border-radius: 18px; - -moz-border-radius: 18px; - border-radius: 18px; - height: 36px; - left: 50%; - overflow: hidden; - position: absolute; - margin: -18px 0 0 -18px; - top: 50%; - width: 36px; - z-index: 3; -} -.camera_clear { - display: block; - clear: both; -} -.showIt { - display: none; -} -.camera_clear { - clear: both; - display: block; - height: 1px; - margin: 0px; - position: relative; -} -.slider{ - position: relative; - margin-top:0; - z-index:1; - top: 0; - border: 0px solid #e7e7e7; - margin-bottom:0px; -} -.camera-banner{ - position: absolute; - width: 960px; - left: 50%; - margin-left: -480px; - font-family: 'Open Sans', sans-serif; - font-size: 50px; - line-height: 1em; - color: #fff; - text-transform: uppercase; - font-weight: bold; - top: 30%; -} -.camera_pag { - position: absolute; - z-index: 10; - bottom:87px; - left:10%; - padding:0; - display:inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.camera-caption { - position: absolute; - top:41%; - left:10%; - z-index:100; - display: block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - color:#2f2f2f; - font-family:'Righteous'; - font-size:64px; - line-height:58px; - font-style:normal; - text-transform:uppercase; - letter-spacing:-1px; -} -/*.camera-caption .title1 { - font-family:'Righteous'; - font-size:24px; - line-height:24px; - top:0; - color:#f4d35c; - letter-spacing:-1px; - margin-left:13px; -}*/ -.camera_prev span, .camera_next span{ - position: absolute; - display: block; - width:25px; - height:25px; - bottom:12px; - cursor: pointer; - z-index: 1000; -} -.camera_prev span{ - right:39px; - background:url(../img/prev.png) 0 top no-repeat; -} -.camera_prev span:hover{background:url(../img/prev.png) 0 bottom no-repeat;} -.camera_next span{ - right:13px; - background:url(../img/next.png) 0 top no-repeat; -} -.camera_next span:hover{background:url(../img/next.png) 0 bottom no-repeat;} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (min-width: 1200px) { -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (min-width: 980px) and (max-width: 1199px){ -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (max-width: 979px){ -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (max-width: 767px){ -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (min-width: 626px) and (max-width: 767px) { -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (max-width: 626px) { -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (max-width: 560px) { -} -@media (max-width: 480px) { -} -@media (max-width: 320px) { -} +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,800); + +/************************** +* +* GENERAL +* +**************************/ +.camera_wrap img, +.camera_wrap ol, .camera_wrap ul, .camera_wrap li, +.camera_wrap table, .camera_wrap tbody, .camera_wrap tfoot, .camera_wrap thead, .camera_wrap tr, .camera_wrap th, .camera_wrap td +.camera_thumbs_wrap a, .camera_thumbs_wrap img, +.camera_thumbs_wrap ol, .camera_thumbs_wrap ul, .camera_thumbs_wrap li, +.camera_thumbs_wrap table, .camera_thumbs_wrap tbody, .camera_thumbs_wrap tfoot, .camera_thumbs_wrap thead, .camera_thumbs_wrap tr, .camera_thumbs_wrap th, .camera_thumbs_wrap td { + background: none; + border: 0; + font: inherit; + font-size: 100%; + margin: 0; + padding: 0; + vertical-align: baseline; + list-style: none; + line-height: ; +} +.camera_wrap { + display: none; + float: none; + position: relative; + z-index: 1; + margin: 0 !important; + +} +.camera_wrap img { + max-width: none !important; + /*border-radius: 0 20px 0 0; + overflow: hidden;*/ +} +.camera_fakehover { + height: 100%; + position: relative; + width: inherit; + z-index: 1; +} +.camera_wrap { + width: inherit; + /*padding-bottom:99px;*/ +} +.camera_src { + display: none; +} +.cameraCont, .cameraContents { + height: 100%; + position: relative; + width: inherit; + z-index: 1; +} +.cameraSlide { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + width: inherit; +} +.cameraContent { + bottom: 0; + display: none; + left: 0; + position: absolute; + right: 0; + top: 0; + width: inherit; +} +.camera_target { + bottom: 0; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + right: 0; + text-align: left; + top: 0; + width: inherit; + z-index: 0; +} +.camera_overlayer { + bottom: 0; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + right: 0; + top: 0; + width: inherit; + z-index: 0; +} +.camera_target_content { + bottom: 0; + left: 0; + overflow: visible; + position: absolute; + right: 0; + top: 0; + z-index: 2; +} +.camera_target_content .camera_link { + display: block; + height: 100%; + text-decoration: none; +} +.camera_loader { + background: #fff url(../img/camera-loader.gif) no-repeat center; + background: rgba(255, 255, 255, 0.9) url(../img/camera-loader.gif) no-repeat center; + border: 1px solid #ffffff; + -webkit-border-radius: 18px; + -moz-border-radius: 18px; + border-radius: 18px; + height: 36px; + left: 50%; + overflow: hidden; + position: absolute; + margin: -18px 0 0 -18px; + top: 50%; + width: 36px; + z-index: 3; +} +.camera_clear { + display: block; + clear: both; +} +.showIt { + display: none; +} +.camera_clear { + clear: both; + display: block; + height: 1px; + margin: 0px; + position: relative; +} +.slider{ + position: relative; + margin-top:0; + z-index:1; + top: 0; + border: 0px solid #e7e7e7; + margin-bottom:0px; +} +.camera-banner{ + position: absolute; + width: 960px; + left: 50%; + margin-left: -480px; + font-family: 'Open Sans', sans-serif; + font-size: 50px; + line-height: 1em; + color: #fff; + text-transform: uppercase; + font-weight: bold; + top: 30%; +} +.camera_pag { + position: absolute; + z-index: 10; + bottom:87px; + left:10%; + padding:0; + display:inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.camera-caption { + position: absolute; + top:41%; + left:10%; + z-index:100; + display: block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color:#2f2f2f; + font-family:'Righteous'; + font-size:64px; + line-height:58px; + font-style:normal; + text-transform:uppercase; + letter-spacing:-1px; +} +/*.camera-caption .title1 { + font-family:'Righteous'; + font-size:24px; + line-height:24px; + top:0; + color:#f4d35c; + letter-spacing:-1px; + margin-left:13px; +}*/ +.camera_prev span, .camera_next span{ + position: absolute; + display: block; + width:25px; + height:25px; + bottom:12px; + cursor: pointer; + z-index: 1000; +} +.camera_prev span{ + right:39px; + background:url(../img/prev.png) 0 top no-repeat; +} +.camera_prev span:hover{background:url(../img/prev.png) 0 bottom no-repeat;} +.camera_next span{ + right:13px; + background:url(../img/next.png) 0 top no-repeat; +} +.camera_next span:hover{background:url(../img/next.png) 0 bottom no-repeat;} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (min-width: 1200px) { +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (min-width: 980px) and (max-width: 1199px){ +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (max-width: 979px){ +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (max-width: 767px){ +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (min-width: 626px) and (max-width: 767px) { +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (max-width: 626px) { +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (max-width: 560px) { +} +@media (max-width: 480px) { +} +@media (max-width: 320px) { +} diff --git a/web/css/chosen.css b/docs/css/chosen.css similarity index 100% rename from web/css/chosen.css rename to docs/css/chosen.css diff --git a/web/css/content.css b/docs/css/content.css similarity index 100% rename from web/css/content.css rename to docs/css/content.css diff --git a/web/css/default.css b/docs/css/default.css similarity index 93% rename from web/css/default.css rename to docs/css/default.css index 6310051..fe90e90 100644 --- a/web/css/default.css +++ b/docs/css/default.css @@ -1,258 +1,258 @@ -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - background: #000000; - font-family: 'Open Sans', sans-serif; - font-size: 13px; - font-weight: 200; - color: #454545; -} - -h1, h2, h3 { - margin: 0; - padding: 0; - font-weight: bold; - color: #221D1D; -} - -h2 { - font-size: 2.5em; -} - -p, ol, ul { - margin-top: 0px; -} - -p { - line-height: 200%; -} - -strong { -} - -a { - color: #2F2F2F; - /*text-decoration: none;*/ -} - -a:hover { - text-decoration: none; -} - -a img { - border: none; -} - -img.border { -} - -img.alignleft { - float: left; -} - -img.alignright { - float: right; -} - -img.aligncenter { - margin: 0px auto; -} - -hr { - display: none; -} - -/** WRAPPER */ -/* An outer wrapper which is used to wrap the entire site. This should be the top-level instantiation of any Boilerplate HTML page and is used to provide a white outline as part of the style. */ -#wrapper_site { - width: 1024px; - margin: 0px auto; - padding: 0px 0px 0px 0px; - background: #FFFFFF; -} - -/* An inner wrapper which is used to wrap the contents of a page. Global HTML page elements derive their widths from the width of this object, so instantiate it directly below the site wrapper */ -#wrapper_page { - width: 900px; - margin: 0px auto; - padding: 0px 0px 0px 0px; - background: #FFFFFF; -} - -.container { - width: inherit; - margin: 0px 0px; -} - -.clearfix { - clear: both; -} - -/** HEADER */ - -#header { -} - -/* Logo */ - -#logo { - width: inherit; - height: auto; - margin: 0px 0px 0px 0px; - color: #000000; - background: #FFFFFF; - vertical-align: middle; - text-align: center; -} - -#logo h1, #logo p { - margin: 0; - padding: 0; -} - -#logo h1 { - line-height: 80px; - letter-spacing: -1px; - text-align: right; - font-size: 3.4em; - color: #1F1F1F; -} - -#logo h1 span { - color: #1F1F1F; -} - -#logo p { - text-align: center; - font-size: 16px; - color: #595959; -} - -#logo p a { - color: #595959; -} - -#logo a { - border: none; - background: none; - text-decoration: none; - color: #1F1F1F; -} - -/** MENU */ - -#navbar { - overflow: hidden; - width: inherit; - height: 50px; - margin: 0px 50px; - background: #000000; - font-size: 20px; - color: #000000; -} - -#navbar ul { - margin: -10px 0px 0px 0px; - padding: 0px 0px; - list-style: none; - line-height: normal; - text-align: center; -} - -#navbar li { - display: inline-block; -} - -#navbar a { - display: block; - padding: 0px 20px 0px 20px; - line-height: 70px; - text-decoration: none; - text-align: center; - font-size: 14px; - font-weight: 200; - color: #FFFFFF; - border: none; -} - -#navbar a:hover { - text-decoration: none; - background-color: #B18904; -} - -#navbar .current_page_item a { -} - -#navbar .last { - border-right: none; -} - -/** PAGE */ - -#page { -} - -/** CONTENT */ - -#content { - width: inherit; - padding: 15px 15px 0px 0px; - margin: 10px auto 10px auto; -} - -/* Footer */ - -#footer { - overflow: hidden; - width: inherit; - height: 100px; - margin: 0 auto; - border-top: 1px solid #CBCBCB; -} - -#footer p { - margin: 0; - padding-top: 10px; - line-height: normal; - text-align: center; - color: #454545; -} - -#footer a { - color: #2F2F2F; -} - -/* Message Board */ - -#message-board { - overflow: hidden; - width: inherit; - margin: 0px auto; - padding: 0px 0px 30px 0px; -} - -#message-board .heading { - overflow: hidden; - padding: 0px 0px 0px 0px; -} - -#message-board .content { - overflow: hidden; - padding: 0 0px 0px 0px; - margin-top: 10px; -} - -#message-board h2 { - padding: 5px 0px 0px 40px; - background: url(../img/messages.png) no-repeat left 13px; - color: #000000; -} - -#banner { - width: inherit; - margin: 0px auto 0px auto; -} +html, body { + height: 100%; +} + +body { + margin: 0; + padding: 0; + background: #000000; + font-family: 'Open Sans', sans-serif; + font-size: 13px; + font-weight: 200; + color: #454545; +} + +h1, h2, h3 { + margin: 0; + padding: 0; + font-weight: bold; + color: #221D1D; +} + +h2 { + font-size: 2.5em; +} + +p, ol, ul { + margin-top: 0px; +} + +p { + line-height: 200%; +} + +strong { +} + +a { + color: #2F2F2F; + /*text-decoration: none;*/ +} + +a:hover { + text-decoration: none; +} + +a img { + border: none; +} + +img.border { +} + +img.alignleft { + float: left; +} + +img.alignright { + float: right; +} + +img.aligncenter { + margin: 0px auto; +} + +hr { + display: none; +} + +/** WRAPPER */ +/* An outer wrapper which is used to wrap the entire site. This should be the top-level instantiation of any Boilerplate HTML page and is used to provide a white outline as part of the style. */ +#wrapper_site { + width: 1024px; + margin: 0px auto; + padding: 0px 0px 0px 0px; + background: #FFFFFF; +} + +/* An inner wrapper which is used to wrap the contents of a page. Global HTML page elements derive their widths from the width of this object, so instantiate it directly below the site wrapper */ +#wrapper_page { + width: 900px; + margin: 0px auto; + padding: 0px 0px 0px 0px; + background: #FFFFFF; +} + +.container { + width: inherit; + margin: 0px 0px; +} + +.clearfix { + clear: both; +} + +/** HEADER */ + +#header { +} + +/* Logo */ + +#logo { + width: inherit; + height: auto; + margin: 0px 0px 0px 0px; + color: #000000; + background: #FFFFFF; + vertical-align: middle; + text-align: center; +} + +#logo h1, #logo p { + margin: 0; + padding: 0; +} + +#logo h1 { + line-height: 80px; + letter-spacing: -1px; + text-align: right; + font-size: 3.4em; + color: #1F1F1F; +} + +#logo h1 span { + color: #1F1F1F; +} + +#logo p { + text-align: center; + font-size: 16px; + color: #595959; +} + +#logo p a { + color: #595959; +} + +#logo a { + border: none; + background: none; + text-decoration: none; + color: #1F1F1F; +} + +/** MENU */ + +#navbar { + overflow: hidden; + width: inherit; + height: 50px; + margin: 0px 50px; + background: #000000; + font-size: 20px; + color: #000000; +} + +#navbar ul { + margin: -10px 0px 0px 0px; + padding: 0px 0px; + list-style: none; + line-height: normal; + text-align: center; +} + +#navbar li { + display: inline-block; +} + +#navbar a { + display: block; + padding: 0px 20px 0px 20px; + line-height: 70px; + text-decoration: none; + text-align: center; + font-size: 14px; + font-weight: 200; + color: #FFFFFF; + border: none; +} + +#navbar a:hover { + text-decoration: none; + background-color: #B18904; +} + +#navbar .current_page_item a { +} + +#navbar .last { + border-right: none; +} + +/** PAGE */ + +#page { +} + +/** CONTENT */ + +#content { + width: inherit; + padding: 15px 15px 0px 0px; + margin: 10px auto 10px auto; +} + +/* Footer */ + +#footer { + overflow: hidden; + width: inherit; + height: 100px; + margin: 0 auto; + border-top: 1px solid #CBCBCB; +} + +#footer p { + margin: 0; + padding-top: 10px; + line-height: normal; + text-align: center; + color: #454545; +} + +#footer a { + color: #2F2F2F; +} + +/* Message Board */ + +#message-board { + overflow: hidden; + width: inherit; + margin: 0px auto; + padding: 0px 0px 30px 0px; +} + +#message-board .heading { + overflow: hidden; + padding: 0px 0px 0px 0px; +} + +#message-board .content { + overflow: hidden; + padding: 0 0px 0px 0px; + margin-top: 10px; +} + +#message-board h2 { + padding: 5px 0px 0px 40px; + background: url(../img/messages.png) no-repeat left 13px; + color: #000000; +} + +#banner { + width: inherit; + margin: 0px auto 0px auto; +} diff --git a/web/css/ie.css b/docs/css/ie.css similarity index 100% rename from web/css/ie.css rename to docs/css/ie.css diff --git a/web/css/responsive.css b/docs/css/responsive.css similarity index 100% rename from web/css/responsive.css rename to docs/css/responsive.css diff --git a/web/css/styles.css b/docs/css/styles.css similarity index 95% rename from web/css/styles.css rename to docs/css/styles.css index 13b0ed9..2b05e84 100644 --- a/web/css/styles.css +++ b/docs/css/styles.css @@ -1,1968 +1,1968 @@ -@import url(https://fonts.googleapis.com/css?family=Ubuntu:400,700); -/*------ template stylization ------*/ -body { - font: 14px Arial, Helvetica, sans-serif; - line-height: 21px; - color: #000000; -} -p { - margin-bottom: 0; -} -a[href^="tel:"] { - color: inherit; - text-decoration: none; -} -a { - outline: none; -} -a:hover { - text-decoration: none; -} -h1.brand { - font-size: 30px !important; - line-height: 0 !important; - display: block; - margin: 0 !important; - padding: 41px 10px 18px 10px!important; - margin-bottom: 10px !important; -} -h1.brand a { - display: inline-block; -} -h2 { - color: #3a3a3a; - font: bold 30px/30px 'Ubuntu', Arial, Helvetica, sans-serif; - margin: 10px 0px 10px 0px; - text-transform: uppercase; - letter-spacing: -2px; -} -h3 { - color: #60b6e6; - font: 12px/12px Arial, Helvetica, sans-serif; - margin: 0; - margin-bottom: 21px; - text-transform: uppercase; -} -h4 { - color: #3a3a3a; - font: 18px/18px 'Ubuntu', Arial, Helvetica, sans-serif; - margin: 10px 0px 10px 0px; - letter-spacing: -1px; - text-transform: uppercase; -} -#content ul { - /*list-style: none;*/ -} -.extra-wrap { - overflow: hidden; -} -.main { - margin: 0 auto; - background-color: #ffffff; - max-width: 1050px; -} -/*-----btn-----*/ -.btn.btn-primary { - box-shadow: none; - background: none; - position: relative; - display: inline-block; - padding: 13px 26px 13px 26px; - font: 13px Arial, Helvetica, sans-serif; - color: #ffffff; - border: none; - background-color: #bad9ed; - letter-spacing: 0; - text-transform: uppercase; - text-shadow: none; - text-decoration: none !important; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - border-radius: 7px; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.btn.btn-primary:hover { - background: none; - color: #ffffff; - background-color: #3191FE; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.btn.btn-link { - box-shadow: none; - position: relative; - text-decoration: underline; - padding: 0; - font: bold 12px 'Ubuntu', Arial, Helvetica, sans-serif; - color: #ffffff; - text-transform: uppercase; - text-decoration: none; - border: none; - letter-spacing: 0; - text-shadow: none; - padding-left: 16px; - display: inline-block; - background: url(img/more_arrow.png) left center no-repeat; - -webkit-transition: all 0.2s ease !important; - -moz-transition: all 0.2s ease !important; - -o-transition: all 0.2s ease !important; - transition: all 0.2s ease !important; -} -.btn.btn-link.btn2 { - background: url(img/more_arrow2.png) left center no-repeat; - color: #60b6e6; -} -.btn.btn-link.btn2:hover { - text-decoration: underline; -} -/*-----list-----*/ -.list1 { - margin: 0; - list-style: none; - margin-top: -8px; - margin-bottom: -1px; -} -.list1 li { - font-size: 12px; - line-height: 11px; - padding-left: 11px; - margin-bottom: 6px; - background: url(img/list_arrow.png) left 9px no-repeat; -} -.list1 li:first-child + li + li + li + li { - margin-bottom: 0; -} -.list1 li a { - font: bold 10px Arial, Helvetica, sans-serif; - text-transform: uppercase; - color: #a2cbe6; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.list1 li a:hover { - color: #a2a2a2; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.list2 { - margin: 0; - list-style: none; - margin-top: -5px; -} -.list2 li { - font-size: 12px; - line-height: 21px; -} -.list2 li p { - line-height: 21px; -} -.list2 li > div > img { - float: left; - margin-right: 12px; -} -.list2 li > div { - margin-bottom: 44px; -} -.list3 { - margin: 0; - list-style: none; - margin-top: 43px; - margin-bottom: 41px; -} -.list3 li { - font-size: 12px; - line-height: 21px; - margin-bottom: 43px; -} -.list3 li p { - color: #a0a0a0 !important; - text-transform: none !important; -} -.list3 li:first-child + li { - margin-bottom: 0; -} -.list3 li > img { - float: left; - margin-right: 13px; - margin-top: 4px; -} -.list3 li p > span { - display: inline-block; - width: 67px; -} -.list4 { - margin: 0; - list-style: none; - margin-bottom: 20px; - margin-top: -10px; -} -.list4.box-list4 { - margin-bottom: 54px; -} -.list4 li { - font-size: 12px; - line-height: 21px; - margin-bottom: 49px; -} -.list4 .badge { - padding: 0; - margin: 0; - -webkit-border-radius: 50px; - -moz-border-radius: 50px; - border-radius: 50px; - width: 55px; - height: 44px; - text-align: center; - padding-top: 11px; - text-shadow: none; - background-color: #bad9ed; - font: bold 30px/30px 'Ubuntu', Arial, Helvetica, sans-serif; - color: #ffffff; - float: left; - margin-right: 15px; - margin-top: 4px; -} -.list5 { - margin: 0; - list-style: none; - margin-top: 14px; -} -.list5 li { - font-size: 12px; - line-height: 21px; - margin-bottom: 28px; - overflow: hidden; -} -.list5 li figure { - margin: 0; - float: left; - margin-right: 20px; -} -.list5 li figure img { - width: 100%; -} -.list5 li .caption { - overflow: hidden; -} -.list5 li .caption p { - margin-bottom: 20px; -} -.list5 li .caption a { - margin-bottom: 11px; - display: inline-block; - color: #378673; - font: 16px/20px Arial, Helvetica, sans-serif; - margin: 0; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.list5 li .caption a:hover { - color: #2b3329; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -/*-----thumbs-----*/ -.thumb-pad0 { - margin: 0; - margin-top: 30px; -} -.thumb-pad0 .thumbnail { - position: relative; - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad0 .thumbnail .caption { - padding: 0; - color: #a0a0a0; -} -.thumb-pad0 .thumbnail .caption ul { - margin: 0; - overflow: hidden; - margin-bottom: 54px; -} -.thumb-pad0 .thumbnail .caption ul li { - background: url(img/list_arrow.png) left 5px no-repeat; - padding-left: 20px; - margin-bottom: 10px; -} -.thumb-pad0 .thumbnail .caption ul li a { - font: 12px Arial, Helvetica, sans-serif; - line-height: 21px; - color: #f1511f; - display: inline-block; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.thumb-pad0 .thumbnail .caption ul li a:hover { - color: #181818; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.thumb-pad0 figure { - margin: 0; - float: left; - margin-right: 22px; -} -.thumb-pad0 figure img { - width: 100%; -} -.thumb-pad1 { - margin-top: -6px; - margin-bottom: 53px; - overflow: hidden; -} -.thumb-pad1 .thumbnail { - position: relative; - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad1 .thumbnail .caption { - padding: 0; - color: #a0a0a0; -} -.thumb-pad1 .thumbnail .caption p { - margin-bottom: 5px; -} -.thumb-pad1 figure { - margin: 0; - margin-bottom: 16px; -} -.thumb-pad1 figure img { - width: 100%; -} -.thumb-pad2 { - margin-bottom: 0; - display: inline-block; - margin-top: -6px; -} -.thumb-pad2 .thumbnail { - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad2 .thumbnail .caption { - padding: 0; - color: #a0a0a0; -} -.thumb-pad2 .thumbnail .caption p { - margin-bottom: 22px; -} -.thumb-pad2 figure { - margin: 0; - margin-bottom: 16px; -} -.thumb-pad2 figure img { - width: 100%; -} -.thumb-pad3 { - width: 100%; - margin-bottom: 36px; - margin-top: -6px; -} -.thumb-pad3 .thumbnail { - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad3 .thumbnail .caption { - padding: 0; - color: #a0a0a0; -} -.thumb-pad3 figure { - margin: 0; - display: inline-block; - width: 100%; -} -.thumb-pad3 figure img { - width: 100%; - max-width: 100%; -} -.thumb-pad4 { - padding: 20px 20px 15px 20px; - margin-bottom: 30px; - background-color: #e7e7e7; -} -.thumb-pad4 .thumbnail { - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad4 figure { - margin: 0; - width: 100%; - margin-bottom: 16px; -} -.thumb-pad4 figure img { - width: 100%; - max-width: 100%; -} -.thumb-pad4 .thumbnail .caption { - padding: 0; -} -.thumb-pad4 .thumbnail .caption p { - color: #7b7b7b; - margin-top: 11px; -} -.thumb-pad4 .thumbnail .caption a { - color: #378673; - font: 16px/20px Arial, Helvetica, sans-serif; - margin: 0; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.thumb-pad4 .thumbnail .caption a:hover { - color: #9bd156; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.thumb-pad5 { - margin: 0; - display: inline-block; - margin-bottom: 25px !important; -} -.thumb-pad5 .thumbnail { - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad5 .thumbnail .caption { - padding: 0; - color: #a0a0a0; - padding-right: 34px; -} -.thumb-pad5 figure { - margin: 0; - overflow: hidden; - display: inline-block; - float: left; - margin-right: 30px; -} -.thumb-pad5 figure img { - width: 100%; -} -.box4-box { - margin-top: 0; - padding-bottom: 17px; -} -.projects-box figure { - padding-bottom: 0 !important; - border-bottom: none !important; - margin-bottom: 12px !important; -} -.projects-box h4 { - font-weight: normal !important; -} -.projects-box .caption p { - text-transform: none !important; - font-size: 12px !important; - font-weight: normal !important; -} -.projects-box .thumb-pad8 { - margin-bottom: 36px !important; - padding-bottom: 23px !important; -} -.thumb-pad8 { - position: relative; - padding: 20px 20px 26px 20px; - margin-bottom: 23px; - margin-top: -6px; -} -.thumb-pad8 span { - background-color: #000; - width: 100%; - height: 0; - position: absolute; - z-index: 2; - bottom: 0; - left: 0; - right: 0; - -webkit-transition: all 0.4s ease; - -moz-transition: all 0.4s ease; - -o-transition: all 0.4s ease; - transition: all 0.4s ease; -} -.thumb-pad8 strong { - background-color: #D1D1D1; - width: 100%; - height: 100%; - position: absolute; - z-index: 1; - bottom: 0; - left: 0; - right: 0; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - transition: all 0.5s ease; -} -.thumb-pad8 .thumbnail { - position: relative; - z-index: 3; - padding: 0; - margin: 0; - border: none; - border-radius: 0; - box-shadow: none; -} -.thumb-pad8 figure { - margin: 0; - width: 100%; - margin-bottom: 16px; - padding-bottom: 22px; - border-bottom: 1px dashed #cdd0d2; -} -.thumb-pad8 figure img { - width: 100%; - max-width: 100%; -} -.thumb-pad8 .thumbnail .caption { - padding: 0; - color: #a0a0a0; -} -.thumb-pad8 .thumbnail .caption p { - text-transform: uppercase; - color: #afafaf; - margin-bottom: 8px; - font: bold 10px Arial, Helvetica, sans-serif; - line-height: 21px; - -webkit-transition: all 0.25s ease; - -moz-transition: all 0.25s ease; - -o-transition: all 0.25s ease; - transition: all 0.25s ease; -} -.thumb-pad8 .thumbnail .caption h4 { - margin-bottom: 7px; - font-size: 24px; - line-height: 28px; - font-weight: bold; - -webkit-transition: all 0.25s ease; - -moz-transition: all 0.25s ease; - -o-transition: all 0.25s ease; - transition: all 0.25s ease; -} -.projects-box .thumb-pad8 .thumbnail .caption h4 { - font-size: 17px; -} -.projects-box .thumb-pad8 .thumbnail .caption p { - margin-bottom: 5px; -} -/*-----carousel-----*/ -.list_carousel { - position: relative; -} -.caroufredsel_wrapper { - height: 72px !important; -} -.list_carousel #foo { - margin: 0; - padding: 0; - list-style: none; - display: block; - cursor: default; - height: 100% !important; -} -.list_carousel #foo > li { - padding: 0; - float: left; - cursor: default; -} -.list_carousel #foo li figure { - margin: 0; -} -.list_carousel.responsive { - width: auto; - margin: 0; -} -.list_carousel.responsive .caroufredsel_wrapper { - cursor: default !important; -} -.list_carousel .prev, .list_carousel .next { - display: inline-block; - width: 9px; - height: 13px; - cursor: pointer; -} -.list_carousel .prev { - background: url(img/prev_arrow.html) 0 top no-repeat; - -webkit-transition: all 0.25s ease; - -moz-transition: all 0.25s ease; - -o-transition: all 0.25s ease; - transition: all 0.25s ease; -} -.foo-btn span { - border-right: 1px solid #d5d5d5; - margin-left: 17px; - margin-right: 20px; - padding-top: 6px; - padding-bottom: 6px; -} -.list_carousel .next { - background: url(img/next_arrow.html) 0 top no-repeat; - -webkit-transition: all 0.25s ease; - -moz-transition: all 0.25s ease; - -o-transition: all 0.25s ease; - transition: all 0.25s ease; -} -.list_carousel .prev:hover { - background: url(img/prev_arrow.html) 0 bottom no-repeat; - -webkit-transition: all 0.25s ease; - -moz-transition: all 0.25s ease; - -o-transition: all 0.25s ease; - transition: all 0.25s ease; -} -.list_carousel .next:hover { - background: url(img/next_arrow.html) 0 bottom no-repeat; - -webkit-transition: all 0.25s ease; - -moz-transition: all 0.25s ease; - -o-transition: all 0.25s ease; - transition: all 0.25s ease; -} -.foo-btn { - position: absolute; - float: left; - top: -74px; - left: 310px; -} -/*-----blockquote-----*/blockquote { - padding: 0; - border: none; - margin: 0; - margin-bottom: 48px; - margin-top: -10px; -} -blockquote img { - float: left; - margin-top: -6px; - margin-right: 6px; -} -blockquote p { - margin-bottom: 18px; - font: 12px Arial, Helvetica, sans-serif; - line-height: 21px; -} -blockquote a { - color: #60b6e6; - font: 12px Arial, Helvetica, sans-serif; - text-transform: uppercase; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -blockquote a:hover { - color: #3a3a3a; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -/*-----header-----*/ -header { - padding: 0; - margin-bottom: 14px; -} -header figure { - margin: 14px 0 0 0; - width: 100%; - border: 1px solid #e7e7e7; - margin-bottom: 44px; -} -header figure > img { - width: 100%; -} -/*-----menu-----*/ -#menu { - -} -.navbar_ { - margin-bottom: 0 !important; - background-color: #000000; - padding: 5px 0px 5px 0px; - -moz-border-radius: none; - border-radius: none; -} -.nav-collapse .nav { - float: none !important; -} -.navbar_ .collapse { - overflow: visible; - line-height: 0 !important; - font-size: 0; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar_ .nav-collapse_ .nav li li { - font-size: 24px; - line-height: 24px; - display: block; -} -.navbar_ .navbar-inner { - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - margin: 0; - padding: 0px 20px 0px 20px; - min-height: inherit; - border: none; - background: none; - -webkit-border-radius: none; - -moz-border-radius: none; - border-radius: none; -} -.navbar_ .nav-collapse_ { - padding: 0; -} -.nav-collapse_ { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - position: relative; - float: none; - margin: 0; - padding: 0; - background: none; - text-align: center; -} -.nav-collapse_ .nav { - float: left; - margin: 0; - padding: 0; -} -.nav-collapse_ .nav li { - position: relative; - display: inline-block; - margin: 0px 0px 0px 20px; - padding: 0; - float: left; - text-transform: none; - zoom: 1; - -} -.nav-collapse_ .nav > li > a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - margin: 0; - color: #8e8e8e; - box-shadow: none !important; - font: bold 25px 'Ubuntu', Arial, Helvetica, sans-serif; - text-transform: uppercase; - text-shadow: none; - background: none; - padding: 0; - text-align: center; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.nav-collapse_ .nav > li.active > a { - color: #8e8e8e !important; - background: none !important; - box-shadow: none; -} -.nav-collapse_ .nav > li a:hover { - color: #ffffff !important; - border: none; - background: none !important; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.nav-collapse_ .nav > .sfHover > a { - color: #ffffff !important; - background: none !important; - box-shadow: none; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} - -/*-----subMenu1-----*/ -.nav-collapse .sub-menu > ul { - position: absolute; - display: none; - width: 130px; - left: 0px; - top: 30px; - list-style: none !important; - zoom: 1; - z-index: 11; - background: #000000; - padding: 0px 0px 10px 10px; - margin: 0; - text-align: left; -} -.nav-collapse .sub-menu > ul li { - background: none; - float: none; - margin: 0; - padding: 0; - border-right: none; - margin-bottom: 0px; -} -.nav-collapse .sub-menu li:last-child { - border-bottom: none; -} -.nav-collapse .sub-menu > ul li a { - display: block; - background: none; - padding: 0; - margin: 0; - font: 18px Arial, Helvetica, sans-serif; - color: #8e8e8e; - text-transform: uppercase; - display: inline-block; - letter-spacing: -1px; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.nav-collapse .sub-menu > ul li a span { - margin-left: 10px; - display: inline-block; - background: url(img/menu-marker2.png) no-repeat; - width: 6px; - height: 5px; - position: relative; - top: -3px; -} -.nav-collapse .sub-menu > ul li a:hover { - text-decoration: none; - color: #ffffff !important; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - transition: all 0.5s ease; -} -.nav-collapse .sub-menu > ul li.sfHover > a { - text-decoration: none; - color: #ffffff !important; -} - -/*-----subMenu2-----*/ -.nav-collapse .submenu2 > ul ul { - position: absolute; - display: none; - width: 80px; - left: 96px; - top: -25px; - list-style: none !important; - zoom: 1; - z-index: 11; - background: #3191FE; - padding: 25px 0 21px 21px; - margin: 0; - text-align: left; -} -.nav-collapse .submenu2 > ul ul li a { - display: block; - background: none; - padding: 0; - margin: 0; - font: 12px Arial, Helvetica, sans-serif; - color: #ffffff; - text-transform: uppercase; - display: inline-block; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.nav-collapse .submenu2 > ul ul li a:hover { - text-decoration: none; - color: #000000 !important; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - transition: all 0.5s ease; -} - -#menu a { - text-decoration: none; -} - -/*----content-----*/ -#content { - position: relative; - padding: 0 0 0 0; -} -.img-polaroid { - position: relative; - background: none; - padding: 0; - box-shadow: none; - border: 1px solid #ffffff; - max-width: inherit; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -#toTop { - display: none; - width: 42px; - height: 42px; - overflow: hidden; - background: url(img/top.png) 0 top no-repeat; - position: fixed; - margin-right: -690px !important; - right: 50%; - bottom: 40px; - z-index: 999; - -webkit-border-radius: 42px; - -moz-border-radius: 42px; - border-radius: 42px; -} -#toTop:hover { - background: url(img/top.png) 0 bottom no-repeat; -} -.mail { - font: 12px Arial, Helvetica, sans-serif; - line-height: 21px; - color: #3191FE; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.mail:hover { - color: #3a3a3a; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.box1 p > a { - color: #f1511f; - font-size: 11px; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.box1 p > a:hover { - color: #181818; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -.box1 ul { - margin: 0; - list-style: none; - overflow: hidden; - margin-bottom: 10px; -} -.box1 ul li { - margin-bottom: 19px; -} -.content-box { - background: #f2f2f2 url(img/contBox_bg.html) 0 top repeat-x; - padding-top: 4px; - margin-bottom: 22px; -} -.banner-box { - margin-bottom: 67px; -} -.banner-box .title { - font: bold 24px 'Ubuntu'; - color: #373737; - text-transform: uppercase; - height: 34px; - margin-bottom: 25px; - letter-spacing: -1px; -} -.banner-box .title > img { - float: left; - margin-right: 6px; - margin-top: -5px; -} -.banner-box hr { - border-bottom: none; - border-color: #ececec; - margin: 23px 0 25px 0; -} -.supportBanner { - margin-bottom: 60px; -} -.supportBanner > div { - background-color: #3a3a3a; - padding: 19px 25px 41px 26px; -} -.supportBanner .title1 { - font: bold 90px 'Ubuntu'; - color: #ffffff; - letter-spacing: -4px; - margin-bottom: 5px; -} -.supportBanner .title2 { - font: bold 30px 'Ubuntu'; - color: #ffffff; - text-transform: uppercase; - margin-top: -16px; - letter-spacing: -1px; -} -.supportBanner hr { - margin: 17px 0 31px 0; - border-bottom: none; - border-color: #8c8c8c; -} -.supportBanner h3 { - color: #ffffff; - margin-bottom: 27px; -} -.supportBanner .marg { - margin-bottom: 19px; - line-height: 20px; -} -.supportBanner a:hover { - color: #3191FE; -} -.error-search h2 { - margin-top: 30px; - line-height: 35px; - margin-bottom: 21px; -} -.capabilities-box h2 { - margin-top: 16px; -} -.testimonials-box { - margin-top: 31px; -} -.services-box { - margin-bottom: 21px; -} -/*-----subscribeForm-----*/ -#subscribe-form { - margin: 0; - position: relative; - margin-top: 11px; -} -#subscribe-form .error { - display: block; - overflow: hidden; - height: 0px; - position: absolute; - top: 45px; - text-align: left; - left: 0; - font: 11px Arial, Helvetica, sans-serif; - color: #a0a0a0; - -webkit-transition: all 0.3s ease; - -moz-transition: all 0.3s ease; - -o-transition: all 0.3s ease; - transition: all 0.3s ease; -} -#subscribe-form input { - width: 100%; - outline: 0; - box-shadow: none; - color: #787878; - font-family: Arial, Helvetica, sans-serif; - font-size: 12px; - line-height: 19px; - border-radius: 0; - padding: 3px 10px 4px 29px; - margin-right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - background-color: #e0e0e0; - border-top: 1px solid #a9a9a9; - border-bottom: 1px solid #ffffff; - border-left: 1px solid #c5c5c5; - margin-bottom: 6px; - height: 43px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -#subscribe-form label.invalid .error { - height: 19px; -} -#subscribe-form .success { - display: none; - border: 1px solid #fff; - border-radius: 0; - padding: 10px 0 10px 0; - background-color: #4c544a; - text-align: center; - color: #fff; - position: absolute; - z-index: 10; - left: 0; - right: 0; - top: 0; - width: 268px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -/*-----search-----*/ -#search-404 { - position: relative; - margin: 0; - margin-top: 12px; -} -#search-404 input { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin: 0; - padding: 2px 15px 2px 10px; - width: 100%; - outline: none; - border: 1px solid #d5d5d5; - background: #f2f2f2; - font: 12px Arial, Helvetica, sans-serif; - line-height: 21px; - color: #9d9d9d; - height: 32px; - margin-bottom: 25px; - -webkit-box-shadow: inset 0px 1px 1px #e0e0e0 !important; - -moz-box-shadow: inset 0px 1px 1px #e0e0e0 !important; - box-shadow: inset 0px 1px 1px #e0e0e0 !important; -} -.search_link { - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - transition: all 0.5s ease; -} -#search-404 .btn.btn-primary { - margin: 0; - padding: 14px 20px 14px 19px; -} -#search { - margin: 0; - position: relative; - display: inline-block; - margin-top: 11px; - float: right; -} -#search a { - position: absolute; - top: 6px; - right: 14px; -} -#search input { - width: 200px; - outline: none; - box-shadow: none; - border: none; - color: #b9beaa; - font: 12px Arial, Helvetica, sans-serif; - -webkit-border-radius: 35px; - -moz-border-radius: 35px; - border-radius: 35px; - padding: 9px 10px 13px 13px; - margin-right: 0; - float: left; - background: #2b3329; - text-transform: uppercase; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: 35px; - border-top: 1px solid #282d27; -} -/*-----map-----*/ -.map { - margin: -6px 0 83px 0; - display: inline-block; - width: 100%; - line-height: 0; -} -.map iframe { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - height: 403px; - border: none; - line-height: 0; -} -.info h2 { - margin-bottom: 25px; -} -/*-----form-----*/ -#contact-form { - position: relative; - z-index: 1; - margin: -6px 0 20px 0; - padding: 0 0 0 0; - vertical-align: top; - font-family: Arial, Helvetica, sans-serif; -} -.txt-form { - display: block; - padding-bottom: 6px; - color: #ffffff; -} -.txt-form span { - color: #ffffff; -} -.form-div-1, .form-div-2, .form-div-3 { - float: left; - width: 200px; -} -.form-div-1, .form-div-2 { - margin-right: 10px; -} -#contact-form div { - overflow: hidden; -} -#contact-form fieldset { - position: relative; - z-index: 10; - overflow: hidden; - padding: 0; - width: 100%; - border: none; -} -#contact-form label { - position: relative; - display: block; - float: left; - margin: 0; - padding: 0; - min-height: 42px; - width: 100%; -} -#contact-form .message { - display: block !important; - min-height: 129px; - width: 100%; - margin-bottom: 25px; -} -#contact-form input, #contact-form textarea { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin: 0; - padding: 5px 15px 5px 10px; - width: 100%; - outline: none; - border: 1px solid #d5d5d5; - background: #f2f2f2; - font: 12px Arial, Helvetica, sans-serif; - line-height: 21px; - color: #9d9d9d; - height: 32px; - -webkit-box-shadow: inset 0px 1px 1px #e0e0e0 !important; - -moz-box-shadow: inset 0px 1px 1px #e0e0e0 !important; - box-shadow: inset 0px 1px 1px #e0e0e0 !important; -} -#contact-form input:focus, #contact-form textarea:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -#contact-form .area .error { - float: none; -} -#contact-form textarea { - overflow: auto; - width: 100%; - height: 186px; - resize: none; -} -#contact-form .success { - position: absolute; - top: 0; - left: 0; - z-index: 20; - display: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 4px 10px; - width: 100%; - background: #f2f2f2; - border: 1px solid #d5d5d5; - color: #9d9d9d; - text-align: center; - text-transform: none; - font-size: 16px; - font-family: Arial, Helvetica, sans-serif; - line-height: 22px; -} -#contact-form .error, #contact-form .empty { - position: absolute; - bottom: 10px; - text-align: right; - right: 2px; - display: none; - overflow: hidden; - padding: 1px 4px 0px 0; - width: 100%; - color: #2f2f2f; - text-transform: none; - font-size: 11px; - line-height: 1.27em; - font-family: Arial, Helvetica, sans-serif; -} -#contact-form .message .error, #contact-form .message .empty { - bottom: -15px; - text-align: right; -} -.btns .btn.btn-primary { - float: left; -} -.btns p { - margin-top: 11px; - float: left; - margin-left: 19px; -} -/*-----footer-----*/ -footer .container { - border-top: 1px solid #dadada; - background-color: #ffffff; - padding-bottom: 28px; -} -footer .span8 { - overflow: hidden; -} -footer .privacy-box p { - text-transform: uppercase; - color: #35292e; - -} -footer .privacy-box a { - color: #3191FE; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -footer .privacy-box a:hover { - color: #35292e; - -webkit-transition: all 0.35s ease; - -moz-transition: all 0.35s ease; - -o-transition: all 0.35s ease; - transition: all 0.35s ease; -} -footer .privacy-box > img { - float: none; - margin-top: 0; - margin-right: 0; - margin-bottom: 10px; -} -footer h4 { - font-weight: bold; - color: #3d3d3d; - margin: 43px 0 28px 0; -} -footer .list1 { - margin-top: 0; -} -footer .list1 li a { - color: #939393; -} -footer .list1 li a:hover { - color: #3191FE; -} -footer .list1 li { - background: url(img/list_arrow3.png) left center no-repeat; - margin-bottom: 12px !important; -} -.follow_icon { - margin: 0; - list-style: none; - margin-top: 24px; -} -.follow_icon li { - margin-right: 6px; - float: left; -} -.follow_icon li a { - -webkit-transition: 0 !important; - -moz-transition: 0 !important; - -o-transition: 0 !important; - transition: 0 !important; -} -.select-menu { - display: none !important; -} -/*-------------------------------------------------------media queries----------------------------------------------------------*/ -@media (min-width: 1380px) { - .main { - max-width: 1400px; -} - .nav-collapse_ { - display: block; -} - .box-thumb1 { - width: 236px; -} - #contact-form label { - display: inline-block; -} - .form-div-1, .form-div-2, .form-div-3 { - width: 250px; -} - .caroufredsel_wrapper { - height: 72px !important; -} - #search input { - width: 270px; -} - footer .privacy-box > img { - float: left; - margin-top: -4px; - margin-right: 5px; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (min-width: 980px) and (max-width: 1199px) { - .nav-collapse_ { - height: auto !important; -} - .box-thumb1 { - width: 182px; -} - .caroufredsel_wrapper { - height: 72px !important; -} - #subscribe-form .success { - width: 218px; -} - #search input { - width: 200px; -} - footer .privacy-box > img { - float: none; - margin-top: 0; - margin-right: 0; - margin-bottom: 10px; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (max-width: 979px) { -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -@media (min-width: 768px) and (max-width: 979px) { - .form-div-1, .form-div-2, .form-div-3 { - width: 100%; -} - .form-div-1, .form-div-2 { - margin-right: 20px; -} - #contact-form .error, #contact-form .empty { - bottom: 0; -} - .supportBanner .title1 { - font-size: 55px; -} - .supportBanner .title2 { - font-size: 25px; - line-height: 23px; - margin-top: 0px; -} - .thumb-pad8 .thumbnail .caption h4 { - font-size: 19px; - line-height: 21px; -} - .box-thumb1 { - width: 215px; -} - #search-404 input { - margin-right: 0; - width: 100%; -} - h1.brand { - padding: 41px 10px 24px 10px !important; -} - header { - padding-bottom: 32px; -} - h1.brand { - text-align: center; - width: 100%; -} - .banner-box .title { - font-size: 15px; -} - .navbar_ .nav-collapse_ { - width: 100%; - padding: 0; -} - .thumb-pad0 figure { - width: 100%; - float: none; - margin-right: 0; - margin-bottom: 15px; -} - header { - padding-bottom: 0; -} - header .container { - text-align: center; -} - header .user_link { - float: none; - display: inline-block; - margin-top: 0px; - margin-bottom: 20px; -} - #search { - float: none; -} - .list5 li figure { - width: 100%; - float: none; - margin-bottom: 10px; -} - #subscribe-form .success { - width: 164px; -} - .list3 li p > span { - display: block; - width: auto; -} - .follow_icon li { - margin-bottom: 5px; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -/*@media (max-width: 767px) { - header { - padding-bottom: 0; - border: none; -} - h1.brand { - text-align: center; - width: 100%; - padding: 41px 10px 28px 10px !important; - -} - .banner-box .span3 { - margin-bottom: 50px; -} - .select-menu { - margin-bottom: 14px; -} - .navbar_ { - padding: 11px 10px 0 10px; -} - .navbar_ .nav-collapse_ { - width: 100%; - padding: 0; -} - .thumb-pad1 { - margin-bottom: 0; -} - .box4 { - width: 29%; - float: left; - margin-right: 20px; -} - .thumb-pad8 .thumbnail .caption h4 { - font-size: 16px; - line-height: 18px; -} - .box-list1 { - float: left; - width: 45%; - margin-right: 10px; -} - .navbar_ { - float: none; -} - .navbar_ .nav-collapse_ { - width: 100%; -} - .box-thumb1 { - width: 30%; - float: left; - margin-left: 0; - margin-right: 18px; -} - .navbar_ .nav-collapse_ { - padding: 0; - margin: 0; - border: none; -} - .navbar_ .nav-collapse_ .nav { - display: none; -} - .navbar_ .nav-collapse_ { - height: auto !important; - padding-bottom: 5px; - background: none; -} - .select-menu { - display: block !important; - width: 100%; - border: 1px solid #000; - background: #d9d9d9; - color: #000000; - cursor: pointer; - margin-top: 10px; - margin-bottom: 14px; -} - .top { - display: none; -} - .form-div-1, .form-div-2, .form-div-3 { - float: none; - width: 100%; - margin: 0 0 0 0; -} - .list1 { - width: 100%; -} - .box-thumb1 { - width: 30%; -} - .error { - text-align: center; -} - .thumb-pad0 figure { - margin: 0; - float: left; - margin-right: 22px; -} - .thumb-pad1 { - margin-bottom: 40px; -} - header { - padding-bottom: 0; -} - header .container { - text-align: center; -} - header .user_link { - float: none; - display: inline-block; - margin-top: 0px; - margin-bottom: 20px; -} - #search { - float: none; -} - .box-pad1 { - width: 45%; - float: left; - margin-right: 20px; -} - .thumb-pad2 figure { - float: left; - margin-right: 20px; -} - .box1 { - width: 29%; - float: left; - margin-right: 20px; -} - #subscribe-form .success { - width: 100%; -} - .thumb-pad1 figure { - float: left; - margin-right: 20px; -} - .testimonials-box { - margin-top: 35px; -} - .info { - margin-bottom: 70px; -} - footer .span8 .span2 { - width: 20%; - margin-right: 20px; - float: left; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -/*@media (min-width: 626px) and (max-width: 767px) { -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -/*@media (max-width: 626px) { - .box-thumb1 { - width: 45%; -} - .box4 { - width: 28%; - float: left; - margin-right: 20px; -} - .thumb-pad8 .thumbnail .caption h4 { - font-size: 16px; - line-height: 18px; -} - .thumb-pad8 .btn.btn-link { - font-weight: normal; - font-size: 11px; - padding-bottom: 1px; -} - .foo-btn { - position: relative; - top: 0; - float: none; - left: 0; - text-align: center; - margin-bottom: 20px; -} - .list5 li figure { - width: 100%; - float: none; - margin-bottom: 10px; -} - .projects-box.box4 { - width: 45%; - float: left; - margin-right: 20px; -} - .thumb-pad2 figure { - width: 100%; - margin-right: 0; - float: none; -} - footer .span8 .span2 { - width: 20%; - margin-right: 20px; - float: left; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -/*@media (max-width: 560px) { - #search-404 input { - margin-right: 0; - width: 100%; -} - .box-thumb1 { - width: 45%; -} - .box1 { - width: 28%; -} - .thumb-pad2 figure { - width: 100%; - margin-right: 0; - float: none; -} - footer .span8 .span2 { - width: 20%; - margin-right: 20px; - float: left; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -/*@media (min-width: 482px) and (max-width: 625px) { -} -@media (max-width: 480px) { - .box-thumb1 { - width: 100%; - float: none; - margin-left: 0; -} - .box4 { - width: 100%; - float: none; - margin-right: 0; -} - .box-list1 { - float: none; - width: 100%; - margin-right: 0; -} - .list4 li .extra-wrap a { - display: block; - float: none; - margin-bottom: 5px; -} - .map iframe { - height: 200px; -} - .thumb-pad5 figure { - float: none; - margin-right: 0; - width: 100%; - margin-bottom: 10px; -} - .thumb-pad0 figure { - width: 100%; - float: none; - margin-right: 0; - margin-bottom: 15px; -} - #search, #search input { - width: 100%; -} - .box-pad1 { - width: 100%; - float: none; - margin-right: 0; -} - footer p { - float: none; - margin-bottom: 10px; -} - footer ul { - float: none; - display: block; -} - #subscribe-form { - margin-bottom: 30px; -} - .box1 { - width: 42%; -} - .list1 li figure { - float: left; - margin-right: 0; - width: 100%; - margin-bottom: 15px; -} - .supportBanner .title1 { - font-size: 55px; -} - .supportBanner .title2 { - font-size: 25px; - line-height: 23px; - margin-top: 0px; -} - .thumb-pad1 figure { - float: none; - margin-right: 0; -} - .projects-box.box4 { - width: 100%; - float: none; - margin-right: 0; -} - footer .span8 .span2 { - width: 100%; - margin-right: 0; - float: none; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/ -/*@media (min-width: 320px) and (max-width: 481px) { -} -@media (max-width: 320px) { - .box-thumb1 { - width: 100%; - float: none; - margin-right: 0; -} - .list1 li figure { - width: 100%; - margin-right: 0; - float: none; - margin-bottom: 10px; -} - .box1 { - width: 100%; - margin-right: 0; - float: none; -} - header .user_link li { - margin-bottom: 5px; -} - .banner-box .title { - font-size: 19px; -} -} -/*---------------------------------------------------------------------------------------------------------------------------*/.error img { - max-width: 100% !important; - margin-top: 36px; -} -.margBot { - margin-bottom: 47px; -} -.margBot2 { - margin-bottom: 44px; -} -.padBot { - padding-bottom: 75px; -} -.padBot1 { - padding-bottom: 33px; -} -.padBot2 { - padding-bottom: 19px; -} -/*---------------------------------------------------------------------------------------------------------------------------*//*Core variables and mixins*/ -.clearfix { - *zoom: 1; -} -.clearfix:before, .clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 31px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} +@import url(https://fonts.googleapis.com/css?family=Ubuntu:400,700); +/*------ template stylization ------*/ +body { + font: 14px Arial, Helvetica, sans-serif; + line-height: 21px; + color: #000000; +} +p { + margin-bottom: 0; +} +a[href^="tel:"] { + color: inherit; + text-decoration: none; +} +a { + outline: none; +} +a:hover { + text-decoration: none; +} +h1.brand { + font-size: 30px !important; + line-height: 0 !important; + display: block; + margin: 0 !important; + padding: 41px 10px 18px 10px!important; + margin-bottom: 10px !important; +} +h1.brand a { + display: inline-block; +} +h2 { + color: #3a3a3a; + font: bold 30px/30px 'Ubuntu', Arial, Helvetica, sans-serif; + margin: 10px 0px 10px 0px; + text-transform: uppercase; + letter-spacing: -2px; +} +h3 { + color: #60b6e6; + font: 12px/12px Arial, Helvetica, sans-serif; + margin: 0; + margin-bottom: 21px; + text-transform: uppercase; +} +h4 { + color: #3a3a3a; + font: 18px/18px 'Ubuntu', Arial, Helvetica, sans-serif; + margin: 10px 0px 10px 0px; + letter-spacing: -1px; + text-transform: uppercase; +} +#content ul { + /*list-style: none;*/ +} +.extra-wrap { + overflow: hidden; +} +.main { + margin: 0 auto; + background-color: #ffffff; + max-width: 1050px; +} +/*-----btn-----*/ +.btn.btn-primary { + box-shadow: none; + background: none; + position: relative; + display: inline-block; + padding: 13px 26px 13px 26px; + font: 13px Arial, Helvetica, sans-serif; + color: #ffffff; + border: none; + background-color: #bad9ed; + letter-spacing: 0; + text-transform: uppercase; + text-shadow: none; + text-decoration: none !important; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.btn.btn-primary:hover { + background: none; + color: #ffffff; + background-color: #3191FE; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.btn.btn-link { + box-shadow: none; + position: relative; + text-decoration: underline; + padding: 0; + font: bold 12px 'Ubuntu', Arial, Helvetica, sans-serif; + color: #ffffff; + text-transform: uppercase; + text-decoration: none; + border: none; + letter-spacing: 0; + text-shadow: none; + padding-left: 16px; + display: inline-block; + background: url(img/more_arrow.png) left center no-repeat; + -webkit-transition: all 0.2s ease !important; + -moz-transition: all 0.2s ease !important; + -o-transition: all 0.2s ease !important; + transition: all 0.2s ease !important; +} +.btn.btn-link.btn2 { + background: url(img/more_arrow2.png) left center no-repeat; + color: #60b6e6; +} +.btn.btn-link.btn2:hover { + text-decoration: underline; +} +/*-----list-----*/ +.list1 { + margin: 0; + list-style: none; + margin-top: -8px; + margin-bottom: -1px; +} +.list1 li { + font-size: 12px; + line-height: 11px; + padding-left: 11px; + margin-bottom: 6px; + background: url(img/list_arrow.png) left 9px no-repeat; +} +.list1 li:first-child + li + li + li + li { + margin-bottom: 0; +} +.list1 li a { + font: bold 10px Arial, Helvetica, sans-serif; + text-transform: uppercase; + color: #a2cbe6; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.list1 li a:hover { + color: #a2a2a2; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.list2 { + margin: 0; + list-style: none; + margin-top: -5px; +} +.list2 li { + font-size: 12px; + line-height: 21px; +} +.list2 li p { + line-height: 21px; +} +.list2 li > div > img { + float: left; + margin-right: 12px; +} +.list2 li > div { + margin-bottom: 44px; +} +.list3 { + margin: 0; + list-style: none; + margin-top: 43px; + margin-bottom: 41px; +} +.list3 li { + font-size: 12px; + line-height: 21px; + margin-bottom: 43px; +} +.list3 li p { + color: #a0a0a0 !important; + text-transform: none !important; +} +.list3 li:first-child + li { + margin-bottom: 0; +} +.list3 li > img { + float: left; + margin-right: 13px; + margin-top: 4px; +} +.list3 li p > span { + display: inline-block; + width: 67px; +} +.list4 { + margin: 0; + list-style: none; + margin-bottom: 20px; + margin-top: -10px; +} +.list4.box-list4 { + margin-bottom: 54px; +} +.list4 li { + font-size: 12px; + line-height: 21px; + margin-bottom: 49px; +} +.list4 .badge { + padding: 0; + margin: 0; + -webkit-border-radius: 50px; + -moz-border-radius: 50px; + border-radius: 50px; + width: 55px; + height: 44px; + text-align: center; + padding-top: 11px; + text-shadow: none; + background-color: #bad9ed; + font: bold 30px/30px 'Ubuntu', Arial, Helvetica, sans-serif; + color: #ffffff; + float: left; + margin-right: 15px; + margin-top: 4px; +} +.list5 { + margin: 0; + list-style: none; + margin-top: 14px; +} +.list5 li { + font-size: 12px; + line-height: 21px; + margin-bottom: 28px; + overflow: hidden; +} +.list5 li figure { + margin: 0; + float: left; + margin-right: 20px; +} +.list5 li figure img { + width: 100%; +} +.list5 li .caption { + overflow: hidden; +} +.list5 li .caption p { + margin-bottom: 20px; +} +.list5 li .caption a { + margin-bottom: 11px; + display: inline-block; + color: #378673; + font: 16px/20px Arial, Helvetica, sans-serif; + margin: 0; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.list5 li .caption a:hover { + color: #2b3329; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +/*-----thumbs-----*/ +.thumb-pad0 { + margin: 0; + margin-top: 30px; +} +.thumb-pad0 .thumbnail { + position: relative; + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad0 .thumbnail .caption { + padding: 0; + color: #a0a0a0; +} +.thumb-pad0 .thumbnail .caption ul { + margin: 0; + overflow: hidden; + margin-bottom: 54px; +} +.thumb-pad0 .thumbnail .caption ul li { + background: url(img/list_arrow.png) left 5px no-repeat; + padding-left: 20px; + margin-bottom: 10px; +} +.thumb-pad0 .thumbnail .caption ul li a { + font: 12px Arial, Helvetica, sans-serif; + line-height: 21px; + color: #f1511f; + display: inline-block; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.thumb-pad0 .thumbnail .caption ul li a:hover { + color: #181818; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.thumb-pad0 figure { + margin: 0; + float: left; + margin-right: 22px; +} +.thumb-pad0 figure img { + width: 100%; +} +.thumb-pad1 { + margin-top: -6px; + margin-bottom: 53px; + overflow: hidden; +} +.thumb-pad1 .thumbnail { + position: relative; + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad1 .thumbnail .caption { + padding: 0; + color: #a0a0a0; +} +.thumb-pad1 .thumbnail .caption p { + margin-bottom: 5px; +} +.thumb-pad1 figure { + margin: 0; + margin-bottom: 16px; +} +.thumb-pad1 figure img { + width: 100%; +} +.thumb-pad2 { + margin-bottom: 0; + display: inline-block; + margin-top: -6px; +} +.thumb-pad2 .thumbnail { + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad2 .thumbnail .caption { + padding: 0; + color: #a0a0a0; +} +.thumb-pad2 .thumbnail .caption p { + margin-bottom: 22px; +} +.thumb-pad2 figure { + margin: 0; + margin-bottom: 16px; +} +.thumb-pad2 figure img { + width: 100%; +} +.thumb-pad3 { + width: 100%; + margin-bottom: 36px; + margin-top: -6px; +} +.thumb-pad3 .thumbnail { + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad3 .thumbnail .caption { + padding: 0; + color: #a0a0a0; +} +.thumb-pad3 figure { + margin: 0; + display: inline-block; + width: 100%; +} +.thumb-pad3 figure img { + width: 100%; + max-width: 100%; +} +.thumb-pad4 { + padding: 20px 20px 15px 20px; + margin-bottom: 30px; + background-color: #e7e7e7; +} +.thumb-pad4 .thumbnail { + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad4 figure { + margin: 0; + width: 100%; + margin-bottom: 16px; +} +.thumb-pad4 figure img { + width: 100%; + max-width: 100%; +} +.thumb-pad4 .thumbnail .caption { + padding: 0; +} +.thumb-pad4 .thumbnail .caption p { + color: #7b7b7b; + margin-top: 11px; +} +.thumb-pad4 .thumbnail .caption a { + color: #378673; + font: 16px/20px Arial, Helvetica, sans-serif; + margin: 0; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.thumb-pad4 .thumbnail .caption a:hover { + color: #9bd156; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.thumb-pad5 { + margin: 0; + display: inline-block; + margin-bottom: 25px !important; +} +.thumb-pad5 .thumbnail { + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad5 .thumbnail .caption { + padding: 0; + color: #a0a0a0; + padding-right: 34px; +} +.thumb-pad5 figure { + margin: 0; + overflow: hidden; + display: inline-block; + float: left; + margin-right: 30px; +} +.thumb-pad5 figure img { + width: 100%; +} +.box4-box { + margin-top: 0; + padding-bottom: 17px; +} +.projects-box figure { + padding-bottom: 0 !important; + border-bottom: none !important; + margin-bottom: 12px !important; +} +.projects-box h4 { + font-weight: normal !important; +} +.projects-box .caption p { + text-transform: none !important; + font-size: 12px !important; + font-weight: normal !important; +} +.projects-box .thumb-pad8 { + margin-bottom: 36px !important; + padding-bottom: 23px !important; +} +.thumb-pad8 { + position: relative; + padding: 20px 20px 26px 20px; + margin-bottom: 23px; + margin-top: -6px; +} +.thumb-pad8 span { + background-color: #000; + width: 100%; + height: 0; + position: absolute; + z-index: 2; + bottom: 0; + left: 0; + right: 0; + -webkit-transition: all 0.4s ease; + -moz-transition: all 0.4s ease; + -o-transition: all 0.4s ease; + transition: all 0.4s ease; +} +.thumb-pad8 strong { + background-color: #D1D1D1; + width: 100%; + height: 100%; + position: absolute; + z-index: 1; + bottom: 0; + left: 0; + right: 0; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} +.thumb-pad8 .thumbnail { + position: relative; + z-index: 3; + padding: 0; + margin: 0; + border: none; + border-radius: 0; + box-shadow: none; +} +.thumb-pad8 figure { + margin: 0; + width: 100%; + margin-bottom: 16px; + padding-bottom: 22px; + border-bottom: 1px dashed #cdd0d2; +} +.thumb-pad8 figure img { + width: 100%; + max-width: 100%; +} +.thumb-pad8 .thumbnail .caption { + padding: 0; + color: #a0a0a0; +} +.thumb-pad8 .thumbnail .caption p { + text-transform: uppercase; + color: #afafaf; + margin-bottom: 8px; + font: bold 10px Arial, Helvetica, sans-serif; + line-height: 21px; + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -o-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.thumb-pad8 .thumbnail .caption h4 { + margin-bottom: 7px; + font-size: 24px; + line-height: 28px; + font-weight: bold; + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -o-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.projects-box .thumb-pad8 .thumbnail .caption h4 { + font-size: 17px; +} +.projects-box .thumb-pad8 .thumbnail .caption p { + margin-bottom: 5px; +} +/*-----carousel-----*/ +.list_carousel { + position: relative; +} +.caroufredsel_wrapper { + height: 72px !important; +} +.list_carousel #foo { + margin: 0; + padding: 0; + list-style: none; + display: block; + cursor: default; + height: 100% !important; +} +.list_carousel #foo > li { + padding: 0; + float: left; + cursor: default; +} +.list_carousel #foo li figure { + margin: 0; +} +.list_carousel.responsive { + width: auto; + margin: 0; +} +.list_carousel.responsive .caroufredsel_wrapper { + cursor: default !important; +} +.list_carousel .prev, .list_carousel .next { + display: inline-block; + width: 9px; + height: 13px; + cursor: pointer; +} +.list_carousel .prev { + background: url(img/prev_arrow.html) 0 top no-repeat; + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -o-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.foo-btn span { + border-right: 1px solid #d5d5d5; + margin-left: 17px; + margin-right: 20px; + padding-top: 6px; + padding-bottom: 6px; +} +.list_carousel .next { + background: url(img/next_arrow.html) 0 top no-repeat; + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -o-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.list_carousel .prev:hover { + background: url(img/prev_arrow.html) 0 bottom no-repeat; + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -o-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.list_carousel .next:hover { + background: url(img/next_arrow.html) 0 bottom no-repeat; + -webkit-transition: all 0.25s ease; + -moz-transition: all 0.25s ease; + -o-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.foo-btn { + position: absolute; + float: left; + top: -74px; + left: 310px; +} +/*-----blockquote-----*/blockquote { + padding: 0; + border: none; + margin: 0; + margin-bottom: 48px; + margin-top: -10px; +} +blockquote img { + float: left; + margin-top: -6px; + margin-right: 6px; +} +blockquote p { + margin-bottom: 18px; + font: 12px Arial, Helvetica, sans-serif; + line-height: 21px; +} +blockquote a { + color: #60b6e6; + font: 12px Arial, Helvetica, sans-serif; + text-transform: uppercase; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +blockquote a:hover { + color: #3a3a3a; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +/*-----header-----*/ +header { + padding: 0; + margin-bottom: 14px; +} +header figure { + margin: 14px 0 0 0; + width: 100%; + border: 1px solid #e7e7e7; + margin-bottom: 44px; +} +header figure > img { + width: 100%; +} +/*-----menu-----*/ +#menu { + +} +.navbar_ { + margin-bottom: 0 !important; + background-color: #000000; + padding: 5px 0px 5px 0px; + -moz-border-radius: none; + border-radius: none; +} +.nav-collapse .nav { + float: none !important; +} +.navbar_ .collapse { + overflow: visible; + line-height: 0 !important; + font-size: 0; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar_ .nav-collapse_ .nav li li { + font-size: 24px; + line-height: 24px; + display: block; +} +.navbar_ .navbar-inner { + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + margin: 0; + padding: 0px 20px 0px 20px; + min-height: inherit; + border: none; + background: none; + -webkit-border-radius: none; + -moz-border-radius: none; + border-radius: none; +} +.navbar_ .nav-collapse_ { + padding: 0; +} +.nav-collapse_ { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + position: relative; + float: none; + margin: 0; + padding: 0; + background: none; + text-align: center; +} +.nav-collapse_ .nav { + float: left; + margin: 0; + padding: 0; +} +.nav-collapse_ .nav li { + position: relative; + display: inline-block; + margin: 0px 0px 0px 20px; + padding: 0; + float: left; + text-transform: none; + zoom: 1; + +} +.nav-collapse_ .nav > li > a { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + margin: 0; + color: #8e8e8e; + box-shadow: none !important; + font: bold 25px 'Ubuntu', Arial, Helvetica, sans-serif; + text-transform: uppercase; + text-shadow: none; + background: none; + padding: 0; + text-align: center; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.nav-collapse_ .nav > li.active > a { + color: #8e8e8e !important; + background: none !important; + box-shadow: none; +} +.nav-collapse_ .nav > li a:hover { + color: #ffffff !important; + border: none; + background: none !important; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.nav-collapse_ .nav > .sfHover > a { + color: #ffffff !important; + background: none !important; + box-shadow: none; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} + +/*-----subMenu1-----*/ +.nav-collapse .sub-menu > ul { + position: absolute; + display: none; + width: 130px; + left: 0px; + top: 30px; + list-style: none !important; + zoom: 1; + z-index: 11; + background: #000000; + padding: 0px 0px 10px 10px; + margin: 0; + text-align: left; +} +.nav-collapse .sub-menu > ul li { + background: none; + float: none; + margin: 0; + padding: 0; + border-right: none; + margin-bottom: 0px; +} +.nav-collapse .sub-menu li:last-child { + border-bottom: none; +} +.nav-collapse .sub-menu > ul li a { + display: block; + background: none; + padding: 0; + margin: 0; + font: 18px Arial, Helvetica, sans-serif; + color: #8e8e8e; + text-transform: uppercase; + display: inline-block; + letter-spacing: -1px; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.nav-collapse .sub-menu > ul li a span { + margin-left: 10px; + display: inline-block; + background: url(img/menu-marker2.png) no-repeat; + width: 6px; + height: 5px; + position: relative; + top: -3px; +} +.nav-collapse .sub-menu > ul li a:hover { + text-decoration: none; + color: #ffffff !important; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} +.nav-collapse .sub-menu > ul li.sfHover > a { + text-decoration: none; + color: #ffffff !important; +} + +/*-----subMenu2-----*/ +.nav-collapse .submenu2 > ul ul { + position: absolute; + display: none; + width: 80px; + left: 96px; + top: -25px; + list-style: none !important; + zoom: 1; + z-index: 11; + background: #3191FE; + padding: 25px 0 21px 21px; + margin: 0; + text-align: left; +} +.nav-collapse .submenu2 > ul ul li a { + display: block; + background: none; + padding: 0; + margin: 0; + font: 12px Arial, Helvetica, sans-serif; + color: #ffffff; + text-transform: uppercase; + display: inline-block; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.nav-collapse .submenu2 > ul ul li a:hover { + text-decoration: none; + color: #000000 !important; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} + +#menu a { + text-decoration: none; +} + +/*----content-----*/ +#content { + position: relative; + padding: 0 0 0 0; +} +.img-polaroid { + position: relative; + background: none; + padding: 0; + box-shadow: none; + border: 1px solid #ffffff; + max-width: inherit; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +#toTop { + display: none; + width: 42px; + height: 42px; + overflow: hidden; + background: url(img/top.png) 0 top no-repeat; + position: fixed; + margin-right: -690px !important; + right: 50%; + bottom: 40px; + z-index: 999; + -webkit-border-radius: 42px; + -moz-border-radius: 42px; + border-radius: 42px; +} +#toTop:hover { + background: url(img/top.png) 0 bottom no-repeat; +} +.mail { + font: 12px Arial, Helvetica, sans-serif; + line-height: 21px; + color: #3191FE; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.mail:hover { + color: #3a3a3a; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.box1 p > a { + color: #f1511f; + font-size: 11px; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.box1 p > a:hover { + color: #181818; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +.box1 ul { + margin: 0; + list-style: none; + overflow: hidden; + margin-bottom: 10px; +} +.box1 ul li { + margin-bottom: 19px; +} +.content-box { + background: #f2f2f2 url(img/contBox_bg.html) 0 top repeat-x; + padding-top: 4px; + margin-bottom: 22px; +} +.banner-box { + margin-bottom: 67px; +} +.banner-box .title { + font: bold 24px 'Ubuntu'; + color: #373737; + text-transform: uppercase; + height: 34px; + margin-bottom: 25px; + letter-spacing: -1px; +} +.banner-box .title > img { + float: left; + margin-right: 6px; + margin-top: -5px; +} +.banner-box hr { + border-bottom: none; + border-color: #ececec; + margin: 23px 0 25px 0; +} +.supportBanner { + margin-bottom: 60px; +} +.supportBanner > div { + background-color: #3a3a3a; + padding: 19px 25px 41px 26px; +} +.supportBanner .title1 { + font: bold 90px 'Ubuntu'; + color: #ffffff; + letter-spacing: -4px; + margin-bottom: 5px; +} +.supportBanner .title2 { + font: bold 30px 'Ubuntu'; + color: #ffffff; + text-transform: uppercase; + margin-top: -16px; + letter-spacing: -1px; +} +.supportBanner hr { + margin: 17px 0 31px 0; + border-bottom: none; + border-color: #8c8c8c; +} +.supportBanner h3 { + color: #ffffff; + margin-bottom: 27px; +} +.supportBanner .marg { + margin-bottom: 19px; + line-height: 20px; +} +.supportBanner a:hover { + color: #3191FE; +} +.error-search h2 { + margin-top: 30px; + line-height: 35px; + margin-bottom: 21px; +} +.capabilities-box h2 { + margin-top: 16px; +} +.testimonials-box { + margin-top: 31px; +} +.services-box { + margin-bottom: 21px; +} +/*-----subscribeForm-----*/ +#subscribe-form { + margin: 0; + position: relative; + margin-top: 11px; +} +#subscribe-form .error { + display: block; + overflow: hidden; + height: 0px; + position: absolute; + top: 45px; + text-align: left; + left: 0; + font: 11px Arial, Helvetica, sans-serif; + color: #a0a0a0; + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; +} +#subscribe-form input { + width: 100%; + outline: 0; + box-shadow: none; + color: #787878; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 19px; + border-radius: 0; + padding: 3px 10px 4px 29px; + margin-right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-color: #e0e0e0; + border-top: 1px solid #a9a9a9; + border-bottom: 1px solid #ffffff; + border-left: 1px solid #c5c5c5; + margin-bottom: 6px; + height: 43px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +#subscribe-form label.invalid .error { + height: 19px; +} +#subscribe-form .success { + display: none; + border: 1px solid #fff; + border-radius: 0; + padding: 10px 0 10px 0; + background-color: #4c544a; + text-align: center; + color: #fff; + position: absolute; + z-index: 10; + left: 0; + right: 0; + top: 0; + width: 268px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} +/*-----search-----*/ +#search-404 { + position: relative; + margin: 0; + margin-top: 12px; +} +#search-404 input { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin: 0; + padding: 2px 15px 2px 10px; + width: 100%; + outline: none; + border: 1px solid #d5d5d5; + background: #f2f2f2; + font: 12px Arial, Helvetica, sans-serif; + line-height: 21px; + color: #9d9d9d; + height: 32px; + margin-bottom: 25px; + -webkit-box-shadow: inset 0px 1px 1px #e0e0e0 !important; + -moz-box-shadow: inset 0px 1px 1px #e0e0e0 !important; + box-shadow: inset 0px 1px 1px #e0e0e0 !important; +} +.search_link { + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} +#search-404 .btn.btn-primary { + margin: 0; + padding: 14px 20px 14px 19px; +} +#search { + margin: 0; + position: relative; + display: inline-block; + margin-top: 11px; + float: right; +} +#search a { + position: absolute; + top: 6px; + right: 14px; +} +#search input { + width: 200px; + outline: none; + box-shadow: none; + border: none; + color: #b9beaa; + font: 12px Arial, Helvetica, sans-serif; + -webkit-border-radius: 35px; + -moz-border-radius: 35px; + border-radius: 35px; + padding: 9px 10px 13px 13px; + margin-right: 0; + float: left; + background: #2b3329; + text-transform: uppercase; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 35px; + border-top: 1px solid #282d27; +} +/*-----map-----*/ +.map { + margin: -6px 0 83px 0; + display: inline-block; + width: 100%; + line-height: 0; +} +.map iframe { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 403px; + border: none; + line-height: 0; +} +.info h2 { + margin-bottom: 25px; +} +/*-----form-----*/ +#contact-form { + position: relative; + z-index: 1; + margin: -6px 0 20px 0; + padding: 0 0 0 0; + vertical-align: top; + font-family: Arial, Helvetica, sans-serif; +} +.txt-form { + display: block; + padding-bottom: 6px; + color: #ffffff; +} +.txt-form span { + color: #ffffff; +} +.form-div-1, .form-div-2, .form-div-3 { + float: left; + width: 200px; +} +.form-div-1, .form-div-2 { + margin-right: 10px; +} +#contact-form div { + overflow: hidden; +} +#contact-form fieldset { + position: relative; + z-index: 10; + overflow: hidden; + padding: 0; + width: 100%; + border: none; +} +#contact-form label { + position: relative; + display: block; + float: left; + margin: 0; + padding: 0; + min-height: 42px; + width: 100%; +} +#contact-form .message { + display: block !important; + min-height: 129px; + width: 100%; + margin-bottom: 25px; +} +#contact-form input, #contact-form textarea { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin: 0; + padding: 5px 15px 5px 10px; + width: 100%; + outline: none; + border: 1px solid #d5d5d5; + background: #f2f2f2; + font: 12px Arial, Helvetica, sans-serif; + line-height: 21px; + color: #9d9d9d; + height: 32px; + -webkit-box-shadow: inset 0px 1px 1px #e0e0e0 !important; + -moz-box-shadow: inset 0px 1px 1px #e0e0e0 !important; + box-shadow: inset 0px 1px 1px #e0e0e0 !important; +} +#contact-form input:focus, #contact-form textarea:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +#contact-form .area .error { + float: none; +} +#contact-form textarea { + overflow: auto; + width: 100%; + height: 186px; + resize: none; +} +#contact-form .success { + position: absolute; + top: 0; + left: 0; + z-index: 20; + display: none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 4px 10px; + width: 100%; + background: #f2f2f2; + border: 1px solid #d5d5d5; + color: #9d9d9d; + text-align: center; + text-transform: none; + font-size: 16px; + font-family: Arial, Helvetica, sans-serif; + line-height: 22px; +} +#contact-form .error, #contact-form .empty { + position: absolute; + bottom: 10px; + text-align: right; + right: 2px; + display: none; + overflow: hidden; + padding: 1px 4px 0px 0; + width: 100%; + color: #2f2f2f; + text-transform: none; + font-size: 11px; + line-height: 1.27em; + font-family: Arial, Helvetica, sans-serif; +} +#contact-form .message .error, #contact-form .message .empty { + bottom: -15px; + text-align: right; +} +.btns .btn.btn-primary { + float: left; +} +.btns p { + margin-top: 11px; + float: left; + margin-left: 19px; +} +/*-----footer-----*/ +footer .container { + border-top: 1px solid #dadada; + background-color: #ffffff; + padding-bottom: 28px; +} +footer .span8 { + overflow: hidden; +} +footer .privacy-box p { + text-transform: uppercase; + color: #35292e; + +} +footer .privacy-box a { + color: #3191FE; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +footer .privacy-box a:hover { + color: #35292e; + -webkit-transition: all 0.35s ease; + -moz-transition: all 0.35s ease; + -o-transition: all 0.35s ease; + transition: all 0.35s ease; +} +footer .privacy-box > img { + float: none; + margin-top: 0; + margin-right: 0; + margin-bottom: 10px; +} +footer h4 { + font-weight: bold; + color: #3d3d3d; + margin: 43px 0 28px 0; +} +footer .list1 { + margin-top: 0; +} +footer .list1 li a { + color: #939393; +} +footer .list1 li a:hover { + color: #3191FE; +} +footer .list1 li { + background: url(img/list_arrow3.png) left center no-repeat; + margin-bottom: 12px !important; +} +.follow_icon { + margin: 0; + list-style: none; + margin-top: 24px; +} +.follow_icon li { + margin-right: 6px; + float: left; +} +.follow_icon li a { + -webkit-transition: 0 !important; + -moz-transition: 0 !important; + -o-transition: 0 !important; + transition: 0 !important; +} +.select-menu { + display: none !important; +} +/*-------------------------------------------------------media queries----------------------------------------------------------*/ +@media (min-width: 1380px) { + .main { + max-width: 1400px; +} + .nav-collapse_ { + display: block; +} + .box-thumb1 { + width: 236px; +} + #contact-form label { + display: inline-block; +} + .form-div-1, .form-div-2, .form-div-3 { + width: 250px; +} + .caroufredsel_wrapper { + height: 72px !important; +} + #search input { + width: 270px; +} + footer .privacy-box > img { + float: left; + margin-top: -4px; + margin-right: 5px; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (min-width: 980px) and (max-width: 1199px) { + .nav-collapse_ { + height: auto !important; +} + .box-thumb1 { + width: 182px; +} + .caroufredsel_wrapper { + height: 72px !important; +} + #subscribe-form .success { + width: 218px; +} + #search input { + width: 200px; +} + footer .privacy-box > img { + float: none; + margin-top: 0; + margin-right: 0; + margin-bottom: 10px; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (max-width: 979px) { +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +@media (min-width: 768px) and (max-width: 979px) { + .form-div-1, .form-div-2, .form-div-3 { + width: 100%; +} + .form-div-1, .form-div-2 { + margin-right: 20px; +} + #contact-form .error, #contact-form .empty { + bottom: 0; +} + .supportBanner .title1 { + font-size: 55px; +} + .supportBanner .title2 { + font-size: 25px; + line-height: 23px; + margin-top: 0px; +} + .thumb-pad8 .thumbnail .caption h4 { + font-size: 19px; + line-height: 21px; +} + .box-thumb1 { + width: 215px; +} + #search-404 input { + margin-right: 0; + width: 100%; +} + h1.brand { + padding: 41px 10px 24px 10px !important; +} + header { + padding-bottom: 32px; +} + h1.brand { + text-align: center; + width: 100%; +} + .banner-box .title { + font-size: 15px; +} + .navbar_ .nav-collapse_ { + width: 100%; + padding: 0; +} + .thumb-pad0 figure { + width: 100%; + float: none; + margin-right: 0; + margin-bottom: 15px; +} + header { + padding-bottom: 0; +} + header .container { + text-align: center; +} + header .user_link { + float: none; + display: inline-block; + margin-top: 0px; + margin-bottom: 20px; +} + #search { + float: none; +} + .list5 li figure { + width: 100%; + float: none; + margin-bottom: 10px; +} + #subscribe-form .success { + width: 164px; +} + .list3 li p > span { + display: block; + width: auto; +} + .follow_icon li { + margin-bottom: 5px; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +/*@media (max-width: 767px) { + header { + padding-bottom: 0; + border: none; +} + h1.brand { + text-align: center; + width: 100%; + padding: 41px 10px 28px 10px !important; + +} + .banner-box .span3 { + margin-bottom: 50px; +} + .select-menu { + margin-bottom: 14px; +} + .navbar_ { + padding: 11px 10px 0 10px; +} + .navbar_ .nav-collapse_ { + width: 100%; + padding: 0; +} + .thumb-pad1 { + margin-bottom: 0; +} + .box4 { + width: 29%; + float: left; + margin-right: 20px; +} + .thumb-pad8 .thumbnail .caption h4 { + font-size: 16px; + line-height: 18px; +} + .box-list1 { + float: left; + width: 45%; + margin-right: 10px; +} + .navbar_ { + float: none; +} + .navbar_ .nav-collapse_ { + width: 100%; +} + .box-thumb1 { + width: 30%; + float: left; + margin-left: 0; + margin-right: 18px; +} + .navbar_ .nav-collapse_ { + padding: 0; + margin: 0; + border: none; +} + .navbar_ .nav-collapse_ .nav { + display: none; +} + .navbar_ .nav-collapse_ { + height: auto !important; + padding-bottom: 5px; + background: none; +} + .select-menu { + display: block !important; + width: 100%; + border: 1px solid #000; + background: #d9d9d9; + color: #000000; + cursor: pointer; + margin-top: 10px; + margin-bottom: 14px; +} + .top { + display: none; +} + .form-div-1, .form-div-2, .form-div-3 { + float: none; + width: 100%; + margin: 0 0 0 0; +} + .list1 { + width: 100%; +} + .box-thumb1 { + width: 30%; +} + .error { + text-align: center; +} + .thumb-pad0 figure { + margin: 0; + float: left; + margin-right: 22px; +} + .thumb-pad1 { + margin-bottom: 40px; +} + header { + padding-bottom: 0; +} + header .container { + text-align: center; +} + header .user_link { + float: none; + display: inline-block; + margin-top: 0px; + margin-bottom: 20px; +} + #search { + float: none; +} + .box-pad1 { + width: 45%; + float: left; + margin-right: 20px; +} + .thumb-pad2 figure { + float: left; + margin-right: 20px; +} + .box1 { + width: 29%; + float: left; + margin-right: 20px; +} + #subscribe-form .success { + width: 100%; +} + .thumb-pad1 figure { + float: left; + margin-right: 20px; +} + .testimonials-box { + margin-top: 35px; +} + .info { + margin-bottom: 70px; +} + footer .span8 .span2 { + width: 20%; + margin-right: 20px; + float: left; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +/*@media (min-width: 626px) and (max-width: 767px) { +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +/*@media (max-width: 626px) { + .box-thumb1 { + width: 45%; +} + .box4 { + width: 28%; + float: left; + margin-right: 20px; +} + .thumb-pad8 .thumbnail .caption h4 { + font-size: 16px; + line-height: 18px; +} + .thumb-pad8 .btn.btn-link { + font-weight: normal; + font-size: 11px; + padding-bottom: 1px; +} + .foo-btn { + position: relative; + top: 0; + float: none; + left: 0; + text-align: center; + margin-bottom: 20px; +} + .list5 li figure { + width: 100%; + float: none; + margin-bottom: 10px; +} + .projects-box.box4 { + width: 45%; + float: left; + margin-right: 20px; +} + .thumb-pad2 figure { + width: 100%; + margin-right: 0; + float: none; +} + footer .span8 .span2 { + width: 20%; + margin-right: 20px; + float: left; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +/*@media (max-width: 560px) { + #search-404 input { + margin-right: 0; + width: 100%; +} + .box-thumb1 { + width: 45%; +} + .box1 { + width: 28%; +} + .thumb-pad2 figure { + width: 100%; + margin-right: 0; + float: none; +} + footer .span8 .span2 { + width: 20%; + margin-right: 20px; + float: left; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +/*@media (min-width: 482px) and (max-width: 625px) { +} +@media (max-width: 480px) { + .box-thumb1 { + width: 100%; + float: none; + margin-left: 0; +} + .box4 { + width: 100%; + float: none; + margin-right: 0; +} + .box-list1 { + float: none; + width: 100%; + margin-right: 0; +} + .list4 li .extra-wrap a { + display: block; + float: none; + margin-bottom: 5px; +} + .map iframe { + height: 200px; +} + .thumb-pad5 figure { + float: none; + margin-right: 0; + width: 100%; + margin-bottom: 10px; +} + .thumb-pad0 figure { + width: 100%; + float: none; + margin-right: 0; + margin-bottom: 15px; +} + #search, #search input { + width: 100%; +} + .box-pad1 { + width: 100%; + float: none; + margin-right: 0; +} + footer p { + float: none; + margin-bottom: 10px; +} + footer ul { + float: none; + display: block; +} + #subscribe-form { + margin-bottom: 30px; +} + .box1 { + width: 42%; +} + .list1 li figure { + float: left; + margin-right: 0; + width: 100%; + margin-bottom: 15px; +} + .supportBanner .title1 { + font-size: 55px; +} + .supportBanner .title2 { + font-size: 25px; + line-height: 23px; + margin-top: 0px; +} + .thumb-pad1 figure { + float: none; + margin-right: 0; +} + .projects-box.box4 { + width: 100%; + float: none; + margin-right: 0; +} + footer .span8 .span2 { + width: 100%; + margin-right: 0; + float: none; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/ +/*@media (min-width: 320px) and (max-width: 481px) { +} +@media (max-width: 320px) { + .box-thumb1 { + width: 100%; + float: none; + margin-right: 0; +} + .list1 li figure { + width: 100%; + margin-right: 0; + float: none; + margin-bottom: 10px; +} + .box1 { + width: 100%; + margin-right: 0; + float: none; +} + header .user_link li { + margin-bottom: 5px; +} + .banner-box .title { + font-size: 19px; +} +} +/*---------------------------------------------------------------------------------------------------------------------------*/.error img { + max-width: 100% !important; + margin-top: 36px; +} +.margBot { + margin-bottom: 47px; +} +.margBot2 { + margin-bottom: 44px; +} +.padBot { + padding-bottom: 75px; +} +.padBot1 { + padding-bottom: 33px; +} +.padBot2 { + padding-bottom: 19px; +} +/*---------------------------------------------------------------------------------------------------------------------------*//*Core variables and mixins*/ +.clearfix { + *zoom: 1; +} +.clearfix:before, .clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 31px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} diff --git a/web/footer.html b/docs/footer.html similarity index 100% rename from web/footer.html rename to docs/footer.html diff --git a/web/header.html b/docs/header.html similarity index 100% rename from web/header.html rename to docs/header.html diff --git a/web/img/PU_logo.png b/docs/img/PU_logo.png similarity index 100% rename from web/img/PU_logo.png rename to docs/img/PU_logo.png diff --git a/web/img/Thumbs.db b/docs/img/Thumbs.db similarity index 100% rename from web/img/Thumbs.db rename to docs/img/Thumbs.db diff --git a/web/img/arrows.png b/docs/img/arrows.png similarity index 100% rename from web/img/arrows.png rename to docs/img/arrows.png diff --git a/web/img/assignment.png b/docs/img/assignment.png similarity index 100% rename from web/img/assignment.png rename to docs/img/assignment.png diff --git a/web/img/background.png b/docs/img/background.png similarity index 100% rename from web/img/background.png rename to docs/img/background.png diff --git a/web/img/camera-loader.gif b/docs/img/camera-loader.gif similarity index 100% rename from web/img/camera-loader.gif rename to docs/img/camera-loader.gif diff --git a/web/img/chosen-sprite.png b/docs/img/chosen-sprite.png similarity index 100% rename from web/img/chosen-sprite.png rename to docs/img/chosen-sprite.png diff --git a/web/img/chosen-sprite@2x.png b/docs/img/chosen-sprite@2x.png similarity index 100% rename from web/img/chosen-sprite@2x.png rename to docs/img/chosen-sprite@2x.png diff --git a/web/img/download.png b/docs/img/download.png similarity index 100% rename from web/img/download.png rename to docs/img/download.png diff --git a/web/img/images.jpg b/docs/img/images.jpg similarity index 100% rename from web/img/images.jpg rename to docs/img/images.jpg diff --git a/web/img/messages.png b/docs/img/messages.png similarity index 100% rename from web/img/messages.png rename to docs/img/messages.png diff --git a/web/img/next.png b/docs/img/next.png similarity index 100% rename from web/img/next.png rename to docs/img/next.png diff --git a/web/img/preloader.gif b/docs/img/preloader.gif similarity index 100% rename from web/img/preloader.gif rename to docs/img/preloader.gif diff --git a/web/img/prev.png b/docs/img/prev.png similarity index 100% rename from web/img/prev.png rename to docs/img/prev.png diff --git a/web/img/slideshow/HovdeHallofAdministration.jpg b/docs/img/slideshow/HovdeHallofAdministration.jpg similarity index 100% rename from web/img/slideshow/HovdeHallofAdministration.jpg rename to docs/img/slideshow/HovdeHallofAdministration.jpg diff --git a/web/img/slideshow/NeilArmstrong.jpg b/docs/img/slideshow/NeilArmstrong.jpg similarity index 100% rename from web/img/slideshow/NeilArmstrong.jpg rename to docs/img/slideshow/NeilArmstrong.jpg diff --git a/web/img/slideshow/PurdueBelltower.jpg b/docs/img/slideshow/PurdueBelltower.jpg similarity index 100% rename from web/img/slideshow/PurdueBelltower.jpg rename to docs/img/slideshow/PurdueBelltower.jpg diff --git a/web/img/slideshow/Thumbs.db b/docs/img/slideshow/Thumbs.db similarity index 100% rename from web/img/slideshow/Thumbs.db rename to docs/img/slideshow/Thumbs.db diff --git a/web/img/upload.png b/docs/img/upload.png similarity index 100% rename from web/img/upload.png rename to docs/img/upload.png diff --git a/web/index.html b/docs/index.html similarity index 98% rename from web/index.html rename to docs/index.html index 2a0a1e0..2e3d945 100644 --- a/web/index.html +++ b/docs/index.html @@ -1,86 +1,86 @@ - - - - - - - - - - - - - - - -ECE477 Homepage - - - - - - - - - - - - - - - -
-
- - - - - -
- -
-

View Our Project Demo Video Here!

-

Project Overview:

Team 4, the sowin' seeds, is building a pollination drone. This project is inspired by the premise that global pollinator populations are decreasing, and this could wreak havoc on the agricultural industry and the global food supply. This pollination drone aims to cross pollinate crops with minimal human input. For the scope of this course, our drone will target apple blossoms, but could be extended beyond one species in the future. Not only could our product be used in fields and orchards- it could also be used in, for example, greenhouses, urban gardens, and other applications where pollinators are not easily available. The drone will be equipped with a Jetson Nano to perform most of the image processing tasks, and STM32H7 to make important flight decisions and process positional data, among other control operations, and a PixHawk flight controller for the drone. - -

Project Specific Success Criteria:

-
    -
  1. PSSC #1: An ability to detect the location of a flower in an image(s) frame.
  2. -
  3. PSSC #2: An ability to communicate flower positional data between the STM32 and the Jetson Nano.
  4. -
  5. PSSC #3: An ability to actuate and detect contact with a capacitive switch on the pollen collecting appendage.
  6. -
  7. PSSC #4: An ability to monitor battery life with the STM32 during drone flight.
  8. -
  9. PSSC #5: An ability to communicate with the flight controller over the mavlink protocol.
  10. -
-
- - -
-
- - - - - - - - - - + + + + + + + + + + + + + + + +ECE477 Homepage + + + + + + + + + + + + + + + +
+
+ + + + + +
+ +
+

View Our Project Demo Video Here!

+

Project Overview:

Team 4, the sowin' seeds, is building a pollination drone. This project is inspired by the premise that global pollinator populations are decreasing, and this could wreak havoc on the agricultural industry and the global food supply. This pollination drone aims to cross pollinate crops with minimal human input. For the scope of this course, our drone will target apple blossoms, but could be extended beyond one species in the future. Not only could our product be used in fields and orchards- it could also be used in, for example, greenhouses, urban gardens, and other applications where pollinators are not easily available. The drone will be equipped with a Jetson Nano to perform most of the image processing tasks, and STM32H7 to make important flight decisions and process positional data, among other control operations, and a PixHawk flight controller for the drone. + +

Project Specific Success Criteria:

+
    +
  1. PSSC #1: An ability to detect the location of a flower in an image(s) frame.
  2. +
  3. PSSC #2: An ability to communicate flower positional data between the STM32 and the Jetson Nano.
  4. +
  5. PSSC #3: An ability to actuate and detect contact with a capacitive switch on the pollen collecting appendage.
  6. +
  7. PSSC #4: An ability to monitor battery life with the STM32 during drone flight.
  8. +
  9. PSSC #5: An ability to communicate with the flight controller over the mavlink protocol.
  10. +
+
+ + +
+
+ + + + + + + + + + diff --git a/web/js/bootstrap.js b/docs/js/bootstrap.js similarity index 96% rename from web/js/bootstrap.js rename to docs/js/bootstrap.js index 111904a..9a4bccc 100644 --- a/web/js/bootstrap.js +++ b/docs/js/bootstrap.js @@ -1,2332 +1,2332 @@ -/* =================================================== - * bootstrap-transition.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('