Initial copy of dfm17 code from my branch to the fork
|
@ -0,0 +1,240 @@
|
|||
/*
|
||||
|
||||
CollapsibleLists.js
|
||||
|
||||
An object allowing lists to dynamically expand and collapse
|
||||
|
||||
Created by Stephen Morley - http://code.stephenmorley.org/ - and released under
|
||||
the terms of the CC0 1.0 Universal legal code:
|
||||
|
||||
http://creativecommons.org/publicdomain/zero/1.0/legalcode
|
||||
|
||||
*/
|
||||
|
||||
// create the CollapsibleLists object
|
||||
var CollapsibleLists =
|
||||
new function(){
|
||||
|
||||
/* Makes all lists with the class 'collapsibleList' collapsible. The
|
||||
* parameter is:
|
||||
*
|
||||
* doNotRecurse - true if sub-lists should not be made collapsible
|
||||
*/
|
||||
this.apply = function(doNotRecurse){
|
||||
|
||||
// loop over the unordered lists
|
||||
var uls = document.getElementsByTagName('ul');
|
||||
for (var index = 0; index < uls.length; index ++){
|
||||
|
||||
// check whether this list should be made collapsible
|
||||
if (uls[index].className.match(/(^| )collapsibleList( |$)/)){
|
||||
|
||||
// make this list collapsible
|
||||
this.applyTo(uls[index], true);
|
||||
|
||||
// check whether sub-lists should also be made collapsible
|
||||
if (!doNotRecurse){
|
||||
|
||||
// add the collapsibleList class to the sub-lists
|
||||
var subUls = uls[index].getElementsByTagName('ul');
|
||||
for (var subIndex = 0; subIndex < subUls.length; subIndex ++){
|
||||
subUls[subIndex].className += ' collapsibleList';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/* Makes the specified list collapsible. The parameters are:
|
||||
*
|
||||
* node - the list element
|
||||
* doNotRecurse - true if sub-lists should not be made collapsible
|
||||
*/
|
||||
this.applyTo = function(node, doNotRecurse){
|
||||
|
||||
// loop over the list items within this node
|
||||
var lis = node.getElementsByTagName('li');
|
||||
for (var index = 0; index < lis.length; index ++){
|
||||
|
||||
// check whether this list item should be collapsible
|
||||
if (!doNotRecurse || node == lis[index].parentNode){
|
||||
|
||||
if (lis[index].title != 'enumeration'){
|
||||
|
||||
// prevent text from being selected unintentionally
|
||||
if (lis[index].addEventListener){
|
||||
lis[index].addEventListener(
|
||||
'mousedown', function (e){ e.preventDefault(); }, false);
|
||||
}else{
|
||||
lis[index].attachEvent(
|
||||
'onselectstart', function(){ event.returnValue = false; });
|
||||
}
|
||||
|
||||
// add the click listener
|
||||
if (lis[index].addEventListener){
|
||||
lis[index].addEventListener(
|
||||
'click', createClickListener(lis[index]), false);
|
||||
}else{
|
||||
lis[index].attachEvent(
|
||||
'onclick', createClickListener(lis[index]));
|
||||
}
|
||||
// close the unordered lists within this list item
|
||||
toggle(lis[index]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/* Returns a function that toggles the display status of any unordered
|
||||
* list elements within the specified node. The parameter is:
|
||||
*
|
||||
* node - the node containing the unordered list elements
|
||||
*/
|
||||
function createClickListener(node){
|
||||
|
||||
// return the function
|
||||
return function(e){
|
||||
|
||||
// ensure the event object is defined
|
||||
if (!e) e = window.event;
|
||||
|
||||
// find the list item containing the target of the event
|
||||
var li = (e.target ? e.target : e.srcElement);
|
||||
while (li.nodeName != 'LI') li = li.parentNode;
|
||||
|
||||
// toggle the state of the node if it was the target of the event
|
||||
if (li == node) toggle(node);
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
/* Expand all ul with collapsibleList className for searching
|
||||
*
|
||||
*/
|
||||
this.expandAll = function(){
|
||||
|
||||
|
||||
// loop over the unordered lists
|
||||
var uls = document.getElementsByTagName('ul');
|
||||
for (var index = 0; index < uls.length; index ++){
|
||||
|
||||
// check whether this list should be made collapsible
|
||||
if (uls[index].className.match(/(^| )collapsibleList( |$)/)){
|
||||
|
||||
// expand the list
|
||||
this.expandList(uls[index]);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/* Expand all items in list.
|
||||
*/
|
||||
this.expandList = function(node) {
|
||||
|
||||
// loop over the list items within this node
|
||||
var lis = node.getElementsByTagName('li');
|
||||
for (var index = 0; index < lis.length; index ++){
|
||||
|
||||
this.expandListItem(lis[index]);
|
||||
}
|
||||
};
|
||||
|
||||
/* Expand list item.
|
||||
*/
|
||||
this.expandListItem = function(node) {
|
||||
|
||||
// determine whether to open or close the unordered lists
|
||||
var open = node.className.match(/(^| )collapsibleListClosed( |$)/);
|
||||
|
||||
if (open)
|
||||
toggle(node);
|
||||
|
||||
};
|
||||
|
||||
/* Collapse all ul with collapsibleList className for searching
|
||||
*
|
||||
*/
|
||||
this.collapseAll = function(){
|
||||
|
||||
// loop over the unordered lists
|
||||
var uls = document.getElementsByTagName('ul');
|
||||
for (var index = 0; index < uls.length; index ++){
|
||||
|
||||
// check whether this list should be made collapsible
|
||||
if (uls[index].className.match(/(^| )collapsibleList( |$)/)){
|
||||
|
||||
// collapse the list
|
||||
this.collapseList(uls[index]);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/* Expand all items in list.
|
||||
*/
|
||||
this.collapseList = function(node) {
|
||||
|
||||
// loop over the list items within this node
|
||||
var lis = node.getElementsByTagName('li');
|
||||
for (var index = 0; index < lis.length; index ++){
|
||||
|
||||
collapseListItem(lis[index]);
|
||||
}
|
||||
};
|
||||
|
||||
/* Collapse list item.
|
||||
*/
|
||||
function collapseListItem(node){
|
||||
|
||||
// determine whether to open or close the unordered lists
|
||||
var open = node.className.match(/(^| )collapsibleListClosed( |$)/);
|
||||
|
||||
if (!open)
|
||||
toggle(node);
|
||||
|
||||
}
|
||||
/* Opens or closes the unordered list elements directly within the
|
||||
* specified node. The parameter is:
|
||||
*
|
||||
* node - the node containing the unordered list elements
|
||||
*/
|
||||
function toggle(node){
|
||||
|
||||
// determine whether to open or close the unordered lists
|
||||
var open = node.className.match(/(^| )collapsibleListClosed( |$)/);
|
||||
|
||||
// loop over the unordered list elements with the node
|
||||
var uls = node.getElementsByTagName('ul');
|
||||
for (var index = 0; index < uls.length; index ++){
|
||||
|
||||
// find the parent list item of this unordered list
|
||||
var li = uls[index];
|
||||
while (li.nodeName != 'LI') li = li.parentNode;
|
||||
|
||||
// style the unordered list if it is directly within this node
|
||||
if (li == node) uls[index].style.display = (open ? 'block' : 'none');
|
||||
|
||||
}
|
||||
|
||||
// remove the current class from the node
|
||||
node.className =
|
||||
node.className.replace(
|
||||
/(^| )collapsibleList(Open|Closed)( |$)/, '');
|
||||
|
||||
// if the node contains unordered lists, set its class
|
||||
if (uls.length > 0){
|
||||
node.className += ' collapsibleList' + (open ? 'Open' : 'Closed');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}();
|
|
@ -0,0 +1,45 @@
|
|||
|
||||
function ExpandCommandFields(ps_id_suffix)
|
||||
{
|
||||
CollapsibleLists.expandList(getItem('field_details_' + ps_id_suffix));
|
||||
toggleItems('expand_all_fields_cmd_' + ps_id_suffix,
|
||||
'collapse_all_fields_cmd_' + ps_id_suffix);
|
||||
}
|
||||
|
||||
function CollapseCommandFields(ps_id_suffix)
|
||||
{
|
||||
CollapsibleLists.collapseList(getItem('field_details_' + ps_id_suffix));
|
||||
toggleItems('expand_all_fields_cmd_' + ps_id_suffix,
|
||||
'collapse_all_fields_cmd_' + ps_id_suffix);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function ExpandCommandField(ps_id_suffix, field_id_suffix)
|
||||
{
|
||||
// expand field details
|
||||
field_item_li = getItem('field_' + field_id_suffix);
|
||||
CollapsibleLists.expandListItem(field_item_li);
|
||||
|
||||
// show collapse button image on command field details
|
||||
// hide plus button, show minus button
|
||||
getItem('expand_all_fields_cmd_' + ps_id_suffix).style.display = "none";
|
||||
getItem('collapse_all_fields_cmd_' + ps_id_suffix).style.display = "";
|
||||
|
||||
}
|
||||
|
||||
|
||||
function ExpandCommandFieldEnum(ps_id_suffix, field_id_suffix)
|
||||
{
|
||||
// expand field details
|
||||
field_item_li = getItem('field_' + field_id_suffix);
|
||||
CollapsibleLists.expandListItem(field_item_li);
|
||||
// expand enum
|
||||
CollapsibleLists.expandListItem(getItem('field_' + field_id_suffix + '_enum'));
|
||||
CollapsibleLists.expandListItem(getItem('field_' + field_id_suffix + '_enum_ul'));
|
||||
|
||||
// show collapse button image on command field details
|
||||
// hide plus button, show minus button
|
||||
getItem('expand_all_fields_cmd_' + ps_id_suffix).style.display = "none";
|
||||
getItem('collapse_all_fields_cmd_' + ps_id_suffix).style.display = "";
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
function ShowPropertyActivation(selection)
|
||||
{
|
||||
// hide all property activation div
|
||||
var i;
|
||||
var div_id;
|
||||
for (i=0 ; i < selection.length; i++)
|
||||
{
|
||||
div_id = selection.options[i].value;
|
||||
document.getElementById(div_id).style.display = "none";
|
||||
}
|
||||
// show selected index
|
||||
div_id = selection.options[selection.selectedIndex].value;
|
||||
document.getElementById(div_id).style.display = "";
|
||||
}
|
||||
|
||||
function ExpandPropertyFields(ps_id_suffix)
|
||||
{
|
||||
// get parameter set id suffix from title attribute
|
||||
CollapsibleLists.expandList(getItem('field_details_' + ps_id_suffix));
|
||||
toggleItems('expand_all_fields_prop_' + ps_id_suffix,
|
||||
'collapse_all_fields_prop_' + ps_id_suffix);
|
||||
}
|
||||
|
||||
function CollapsePropertyFields(ps_id_suffix)
|
||||
{
|
||||
CollapsibleLists.collapseList(getItem('field_details_' + ps_id_suffix));
|
||||
toggleItems('expand_all_fields_prop_' + ps_id_suffix,
|
||||
'collapse_all_fields_prop_' + ps_id_suffix);
|
||||
}
|
||||
|
||||
|
||||
function ExpandPropertyField(ps_id_suffix, field_id_suffix)
|
||||
{
|
||||
// expand field details
|
||||
field_item_li = getItem('field_' + field_id_suffix);
|
||||
CollapsibleLists.expandListItem(field_item_li);
|
||||
|
||||
// show collapse button image on property field details
|
||||
// hide plus button, show minus button
|
||||
getItem('expand_all_fields_prop_' + ps_id_suffix).style.display = "none";
|
||||
getItem('collapse_all_fields_prop_' + ps_id_suffix).style.display = "";
|
||||
}
|
||||
|
||||
|
||||
function ExpandPropertyFieldEnum(ps_id_suffix, field_id_suffix)
|
||||
{
|
||||
// expand field details
|
||||
field_item_li = getItem('field_' + field_id_suffix);
|
||||
CollapsibleLists.expandListItem(field_item_li);
|
||||
// expand enum
|
||||
CollapsibleLists.expandListItem(getItem('field_' + field_id_suffix + '_enum'));
|
||||
CollapsibleLists.expandListItem(getItem('field_' + field_id_suffix + '_enum_ul'));
|
||||
|
||||
// show collapse button image on property field details
|
||||
// hide plus button, show minus button
|
||||
getItem('expand_all_fields_prop_' + ps_id_suffix).style.display = "none";
|
||||
getItem('collapse_all_fields_prop_' + ps_id_suffix).style.display = "";
|
||||
}
|
|
@ -0,0 +1,298 @@
|
|||
|
||||
function getItem(id)
|
||||
{
|
||||
var itm = false;
|
||||
if(document.getElementById)
|
||||
itm = document.getElementById(id);
|
||||
else if(document.all)
|
||||
itm = document.all[id];
|
||||
else if(document.layers)
|
||||
itm = document.layers[id];
|
||||
|
||||
return itm;
|
||||
}
|
||||
|
||||
function toggleItems(id_expand, id_collapse)
|
||||
{
|
||||
var itm_expand = getItem(id_expand);
|
||||
var itm_collapse = getItem(id_collapse);
|
||||
|
||||
if ((!itm_expand) || (!itm_collapse)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(itm_expand.style.display == 'none') {
|
||||
itm_expand.style.display = '';
|
||||
itm_collapse.style.display = 'none';
|
||||
}
|
||||
else {
|
||||
itm_expand.style.display = 'none';
|
||||
itm_collapse.style.display = '';
|
||||
}
|
||||
}
|
||||
|
||||
function sum_cmd_set_show(cmd_set_key)
|
||||
{
|
||||
var item_names = CMD_SET_KEYS[cmd_set_key];
|
||||
|
||||
for (var i in item_names)
|
||||
{
|
||||
var item = getItem(item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = '';
|
||||
}
|
||||
}
|
||||
|
||||
function sum_cmd_set_hide(cmd_set_key)
|
||||
{
|
||||
var item_names = CMD_SET_KEYS[cmd_set_key];
|
||||
|
||||
for (var i in item_names)
|
||||
{
|
||||
var item = getItem(item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function sum_prop_grp_show_dflt(prop_grp_key)
|
||||
{
|
||||
var show_item_names = PROP_GRP_KEYS[prop_grp_key]['showItems'];
|
||||
var hide_item_names = PROP_GRP_KEYS[prop_grp_key]['hideItems'];
|
||||
|
||||
for (var i in show_item_names)
|
||||
{
|
||||
var item = getItem(show_item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = '';
|
||||
}
|
||||
for (var i in hide_item_names)
|
||||
{
|
||||
var item = getItem(hide_item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function sum_prop_grp_show_all(prop_grp_key)
|
||||
{
|
||||
var show_item_names = PROP_GRP_KEYS[prop_grp_key]['showAllItems'];
|
||||
var hide_item_names = PROP_GRP_KEYS[prop_grp_key]['hideAllItems'];
|
||||
|
||||
for (var i in show_item_names)
|
||||
{
|
||||
var item = getItem(show_item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = '';
|
||||
}
|
||||
for (var i in hide_item_names)
|
||||
{
|
||||
var item = getItem(hide_item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function sum_prop_grp_hide(prop_grp_key)
|
||||
{
|
||||
var all_item_names = [];
|
||||
all_item_names = all_item_names.concat(PROP_GRP_KEYS[prop_grp_key]['showItems']);
|
||||
all_item_names = all_item_names.concat(PROP_GRP_KEYS[prop_grp_key]['hideItems']);
|
||||
|
||||
for (var i in all_item_names) {
|
||||
var item = getItem(all_item_names[i]);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
item.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function toggle_sum_prop_grp(prop_grp_key_suffix)
|
||||
{
|
||||
grp_hdr = getItem('sum_prop_grp_hdr_' + prop_grp_key_suffix);
|
||||
|
||||
if (grp_hdr.style.display == 'none')
|
||||
{
|
||||
sum_prop_grp_show_dflt('key_' + prop_grp_key_suffix);
|
||||
} else {
|
||||
sum_prop_grp_hide('key_' + prop_grp_key_suffix);
|
||||
}
|
||||
}
|
||||
|
||||
function toggle_sum_cmd_set(cmd_set_key_suffix)
|
||||
{
|
||||
cmd_set_hdr = getItem('sum_cmd_set_hdr_' + cmd_set_key_suffix);
|
||||
|
||||
if (cmd_set_hdr.style.display == 'none')
|
||||
{
|
||||
sum_cmd_set_show('key_' + cmd_set_key_suffix);
|
||||
} else {
|
||||
sum_cmd_set_hide('key_' + cmd_set_key_suffix);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function startup() {
|
||||
CollapsibleLists.apply();
|
||||
}
|
||||
|
||||
function global_expand_all_tables() {
|
||||
|
||||
// loop over the img elements
|
||||
var imgs = document.getElementsByTagName('img');
|
||||
for (var index = 0; index < imgs.length; index ++)
|
||||
{
|
||||
// Command Set Header
|
||||
|
||||
// hide cmd set plus image
|
||||
if (imgs[index].className.match(/(^| )cmd_set_show( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
// show cmd set minus image
|
||||
else if (imgs[index].className.match(/(^| )cmd_set_hide( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// Property Group Header
|
||||
|
||||
// hide prop group plus image
|
||||
else if (imgs[index].className.match(/(^| )prop_grp_show( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
// show prop group minus image
|
||||
else if (imgs[index].className.match(/(^| )prop_grp_hide( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// Command Fields
|
||||
|
||||
// hide cmd field plus image
|
||||
else if (imgs[index].className.match(/(^| )cmd_field_expand( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
// show cmd field minus image
|
||||
else if (imgs[index].className.match(/(^| )cmd_field_collapse( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// Properties Fields
|
||||
|
||||
// hide prop field plus image
|
||||
else if (imgs[index].className.match(/(^| )prop_field_expand( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
// show prop field minus image
|
||||
else if (imgs[index].className.match(/(^| )prop_field_collapse( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
}
|
||||
CollapsibleLists.expandAll();
|
||||
for (var key in PROP_GRP_KEYS) {
|
||||
sum_prop_grp_show_all(key);
|
||||
}
|
||||
for (var key in CMD_SET_KEYS) {
|
||||
sum_cmd_set_show(key);
|
||||
}
|
||||
}
|
||||
|
||||
function global_collapse_all_tables() {
|
||||
|
||||
// loop over the img elements
|
||||
var imgs = document.getElementsByTagName('img');
|
||||
for (var index = 0; index < imgs.length; index ++)
|
||||
{
|
||||
|
||||
// Command Set Header
|
||||
|
||||
// show cmd set plus image
|
||||
if (imgs[index].className.match(/(^| )cmd_set_show( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// hide cmd set minus image
|
||||
else if (imgs[index].className.match(/(^| )cmd_set_hide( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
|
||||
// Property Group Header
|
||||
|
||||
// show prop group plus image
|
||||
else if (imgs[index].className.match(/(^| )prop_grp_show( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// hide prop group minus image
|
||||
else if (imgs[index].className.match(/(^| )prop_grp_hide( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
|
||||
// Command Fields
|
||||
|
||||
// show cmd field minus image
|
||||
else if (imgs[index].className.match(/(^| )cmd_field_expand( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// hide cmd field plus image
|
||||
else if (imgs[index].className.match(/(^| )cmd_field_collapse( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
// Property Fields
|
||||
|
||||
// show prop field minus image
|
||||
else if (imgs[index].className.match(/(^| )prop_field_expand( |$)/))
|
||||
{
|
||||
imgs[index].style.display = '';
|
||||
}
|
||||
|
||||
// hide prop field plus image
|
||||
else if (imgs[index].className.match(/(^| )prop_field_collapse( |$)/))
|
||||
{
|
||||
imgs[index].style.display = 'none';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
CollapsibleLists.collapseAll();
|
||||
for (var key in PROP_GRP_KEYS) {
|
||||
sum_prop_grp_hide(key);
|
||||
}
|
||||
for (var key in CMD_SET_KEYS) {
|
||||
sum_cmd_set_hide(key);
|
||||
}
|
||||
}
|
Po Szerokość: | Wysokość: | Rozmiar: 405 B |
|
@ -0,0 +1,240 @@
|
|||
|
||||
html *
|
||||
{
|
||||
font-family: Arial
|
||||
}
|
||||
|
||||
a:link { text-decoration: none; color: #000000; }
|
||||
a:hover { text-decoration:underline; color: #0000FF; }
|
||||
a:active { text-decoration: none; color: #000000; }
|
||||
a:visited {text-decoration: none; color: #000000; }
|
||||
|
||||
table.title {
|
||||
border: 0;
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
td.title {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
td.view_desc
|
||||
{
|
||||
border: 1;
|
||||
}
|
||||
|
||||
td.title_logo {
|
||||
border: 0;
|
||||
width: 230px;
|
||||
}
|
||||
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
padding: 1px;
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
||||
.collapse {
|
||||
border: 1px solid black;
|
||||
width:20px;
|
||||
background-color:white;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.numbers {
|
||||
font-family:Monospace;
|
||||
color:#505050;
|
||||
font-size:16px;
|
||||
}
|
||||
|
||||
td.numbers {
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
table.basic, table.narrower {
|
||||
width:95%;
|
||||
border-spacing:1;
|
||||
empty-cells:show;
|
||||
border-collapse:collapse;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
td.sum_number
|
||||
{
|
||||
width:60px;
|
||||
text-align:center;
|
||||
font-family:Monospace;
|
||||
color:#505050;
|
||||
font-size:16px;
|
||||
}
|
||||
|
||||
td.reg_view_number
|
||||
{
|
||||
width:60px;
|
||||
text-align:center;
|
||||
font-family:Monospace;
|
||||
color:#505050;
|
||||
font-size:16px;
|
||||
}
|
||||
|
||||
td.sum_name
|
||||
{
|
||||
width:250px;
|
||||
}
|
||||
|
||||
td.reg_view_name
|
||||
{
|
||||
width:100px;
|
||||
text-align:center;
|
||||
font-family:Monospace;
|
||||
}
|
||||
|
||||
td.sum_default
|
||||
{
|
||||
width:100px;
|
||||
font-family:Monospace;
|
||||
color:#505050;
|
||||
font-size:16px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
td.sum_sum
|
||||
{
|
||||
}
|
||||
|
||||
td.enum_desc
|
||||
{
|
||||
}
|
||||
|
||||
td.sum_vis
|
||||
{
|
||||
width:100px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
td.sum_status
|
||||
{
|
||||
width:100px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
td.sum_status_detail
|
||||
{
|
||||
width:100px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
td.sum_release_detail
|
||||
{
|
||||
width:100px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
td.sum_ellipsis
|
||||
{
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
table.narrower {
|
||||
width:50%;
|
||||
}
|
||||
|
||||
table.enum {
|
||||
width:75%;
|
||||
border-spacing:1;
|
||||
empty-cells:show;
|
||||
border-collapse:collapse;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
tr.header
|
||||
{
|
||||
background-color:#bbd5f0;
|
||||
}
|
||||
|
||||
ul
|
||||
{
|
||||
margin-top:0px;
|
||||
margin-bottom:0px;
|
||||
}
|
||||
|
||||
.collapsibleList {
|
||||
list-style-image:url('button.png');
|
||||
cursor:auto;
|
||||
}
|
||||
|
||||
|
||||
li.collapsibleListOpen{
|
||||
list-style-image:url('button-open.png');
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
li.collapsibleListClosed{
|
||||
list-style-image:url('button-closed.png');
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.centeredImage
|
||||
{
|
||||
width:95%;
|
||||
text-align:center;
|
||||
margin-top:0px;
|
||||
margin-bottom:2px;
|
||||
padding:0px;
|
||||
}
|
||||
|
||||
.fieldDetailsDiv
|
||||
{
|
||||
padding:2px;
|
||||
margin-left:30px;
|
||||
}
|
||||
|
||||
div.int_comments
|
||||
{
|
||||
border-width: 4px;
|
||||
border-style: groove;
|
||||
border-color: red
|
||||
}
|
||||
|
||||
.prop_field_expand
|
||||
{
|
||||
}
|
||||
|
||||
.prop_field_collapse
|
||||
{
|
||||
}
|
||||
|
||||
a.reference
|
||||
{
|
||||
color:#0000ff;
|
||||
font-style:italic;
|
||||
}
|
||||
|
||||
.restricted_doc
|
||||
{
|
||||
color:#ff0000;
|
||||
font-style:italic;
|
||||
}
|
||||
|
||||
a.part_link
|
||||
{
|
||||
color:#004080;
|
||||
}
|
||||
|
||||
a.part_group_link
|
||||
{
|
||||
color:#004080;
|
||||
}
|
||||
|
||||
h4.part_link
|
||||
{
|
||||
margin-top:2px;
|
||||
margin-bottom:0px;
|
||||
}
|
||||
|
||||
.footer-copyright
|
||||
{
|
||||
color:#505050;
|
||||
font-size:11px;
|
||||
}
|
||||
|
Po Szerokość: | Wysokość: | Rozmiar: 324 B |
Po Szerokość: | Wysokość: | Rozmiar: 298 B |
Po Szerokość: | Wysokość: | Rozmiar: 386 B |
Po Szerokość: | Wysokość: | Rozmiar: 361 B |
Po Szerokość: | Wysokość: | Rozmiar: 905 B |
|
@ -0,0 +1,347 @@
|
|||
|
||||
body {
|
||||
padding-top: 70px;
|
||||
}
|
||||
|
||||
td {
|
||||
word-wrap: break-word;
|
||||
text-wrap: normal;
|
||||
}
|
||||
|
||||
.scrollable-menu {
|
||||
height: auto;
|
||||
max-height: 300px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.dropdown-submenu {
|
||||
position:relative;
|
||||
}
|
||||
.dropdown-submenu>.dropdown-menu {
|
||||
top: 0;
|
||||
left: 100%;
|
||||
margin-top: -6px;
|
||||
margin-left: -1px;
|
||||
-webkit-border-radius: 0 6px 6px 6px;
|
||||
-moz-border-radius: 0 6px 6px 6px;
|
||||
border-radius: 0 6px 6px 6px;
|
||||
height: auto;
|
||||
max-height: 300px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
.dropdown-submenu:hover>.dropdown-menu {
|
||||
display:block;
|
||||
}
|
||||
.dropdown-submenu>a:after{
|
||||
display: block;
|
||||
content: " ";
|
||||
float: right;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-color: transparent;
|
||||
border-style: solid;
|
||||
border-width: 5px 0 5px 5px;
|
||||
border-left-color: #cccccc;
|
||||
margin-top: 5px;
|
||||
margin-right: -10px;}
|
||||
.dropdown-submenu:hover>a:after{
|
||||
border-left-color:#ffffff;
|
||||
}
|
||||
.dropdown-submenu.pull-left {
|
||||
float:none;
|
||||
}.dropdown-submenu.pull-left>.dropdown-menu {
|
||||
left:-100%;
|
||||
margin-left:10px;
|
||||
-webkit-border-radius:6px 0 6px 6px;
|
||||
-moz-border-radius:6px 0 6px 6px;
|
||||
border-radius:6px 0 6px 6px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
box-shadow: 0 0px 0px rgba(0,0,0,.05);
|
||||
}
|
||||
|
||||
.panel-body {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.panel-heading a:after {
|
||||
font-family: 'Glyphicons Halflings';
|
||||
content: "\e114";
|
||||
float: right;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
.panel-heading a.collapsed:after {
|
||||
content: "\e080";
|
||||
}
|
||||
|
||||
|
||||
.panel-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.panel-group .panel {
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
.panel-heading {
|
||||
padding: 4px 6px;
|
||||
border-bottom: 1px solid transparent;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
#width: 300px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.hover-img a { position:relative; }
|
||||
.hover-img a span { position:absolute; display:none; z-index:99; }
|
||||
.hover-img a:hover span { display:block; }
|
||||
|
||||
.panel-body {
|
||||
border: 1px solid black;
|
||||
border-color: #ccc;
|
||||
}
|
||||
|
||||
.panel-default {
|
||||
border-color: #FFF;
|
||||
}
|
||||
|
||||
.panel-default>.panel-heading {
|
||||
background-color: #ddd;
|
||||
}
|
||||
|
||||
.table-bordered>thead>tr>th,
|
||||
.table-bordered>tbody>tr>th,
|
||||
.table-bordered>tfoot>tr>th,
|
||||
.table-bordered>thead>tr>td,
|
||||
.table-bordered>tbody>tr>td,
|
||||
.table-bordered>tfoot>tr>td {
|
||||
border: 1px solid black;
|
||||
padding: 1px;
|
||||
font-size: 14px
|
||||
}
|
||||
|
||||
.table-bordered {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.dl-horizontal dt {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.dl-horizontal dd {
|
||||
margin-left: 120px;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.sum-table {
|
||||
width: 95%;
|
||||
border-spacing: 1px;
|
||||
table-layout: fixed;
|
||||
}
|
||||
.sum-header {
|
||||
text-align: center;
|
||||
background: #bbd5f0;
|
||||
}
|
||||
|
||||
.sum-control {
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.sum-number {
|
||||
width: 65px;
|
||||
text-align: center;
|
||||
font-family: Monospace;
|
||||
color: #505050;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.sum-number-hdr {
|
||||
width: 65px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sum-name {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
.sum-default {
|
||||
width: 120px;
|
||||
font-family:Monospace;
|
||||
color:#505050;
|
||||
font-size:16px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
.sum-default-hdr {
|
||||
width: 120px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
.sum-sum {
|
||||
}
|
||||
|
||||
.sum-vis {
|
||||
width: 85px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sum-status {
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sum-feature {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sum-ellipsis
|
||||
{
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
.dark-ref {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
a.reference {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.reg-view-table {
|
||||
width: 50%;
|
||||
/*display: inline-block;*/
|
||||
border-spacing: 1px;
|
||||
}
|
||||
|
||||
.reg-view-header {
|
||||
text-align: center;
|
||||
background: #bbd5f0;
|
||||
}
|
||||
|
||||
.reg-view-control {
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.reg-view-number-hdr {
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.reg-view-number {
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
font-family: Monospace;
|
||||
color: #505050;
|
||||
font-size:16px;
|
||||
}
|
||||
|
||||
.reg-view-name {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.fixed-width-bit {
|
||||
|
||||
}
|
||||
|
||||
.numbers {
|
||||
font-family: Monospace;
|
||||
color: #505050;
|
||||
#font-size:16px;
|
||||
}
|
||||
|
||||
.field-panel-title {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.footer-copyright {
|
||||
color: #505050;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.enum-table {
|
||||
width: 90%;
|
||||
border-spacing: 1px;
|
||||
font-size: 14px
|
||||
}
|
||||
|
||||
.enum-number {
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.enum-name {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.enum-feature {
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.enum-desc {
|
||||
|
||||
}
|
||||
|
||||
.enum-selection {
|
||||
text-align: center;
|
||||
width: 90px;
|
||||
}
|
||||
|
||||
.enum-status {
|
||||
text-align: center;
|
||||
width: 65px;
|
||||
}
|
||||
|
||||
|
||||
.centeredImage
|
||||
{
|
||||
width:95%;
|
||||
text-align:center;
|
||||
margin-top:0px;
|
||||
margin-bottom:2px;
|
||||
padding:0px;
|
||||
}
|
||||
|
||||
div.internal-comments {
|
||||
border-width: 4px;
|
||||
border-style: groove;
|
||||
border-color: red
|
||||
}
|
||||
|
||||
div.div-field-details {
|
||||
|
||||
}
|
||||
|
||||
.icon-img {
|
||||
margin: 0px 2px 0px 2px;
|
||||
}
|
||||
|
||||
.icon-img-right {
|
||||
margin: 0px 0px 0px 6px;
|
||||
}
|
||||
|
||||
.index-view-table {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.index-view-name {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.index-view-desc {
|
||||
}
|
||||
|
|
@ -0,0 +1,442 @@
|
|||
/*!
|
||||
* Bootstrap v3.2.0 (http://getbootstrap.com)
|
||||
* Copyright 2011-2014 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
|
||||
|
||||
.btn-default,
|
||||
.btn-primary,
|
||||
.btn-success,
|
||||
.btn-info,
|
||||
.btn-warning,
|
||||
.btn-danger {
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
|
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
||||
}
|
||||
.btn-default:active,
|
||||
.btn-primary:active,
|
||||
.btn-success:active,
|
||||
.btn-info:active,
|
||||
.btn-warning:active,
|
||||
.btn-danger:active,
|
||||
.btn-default.active,
|
||||
.btn-primary.active,
|
||||
.btn-success.active,
|
||||
.btn-info.active,
|
||||
.btn-warning.active,
|
||||
.btn-danger.active {
|
||||
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||
}
|
||||
.btn:active,
|
||||
.btn.active {
|
||||
background-image: none;
|
||||
}
|
||||
.btn-default {
|
||||
text-shadow: 0 1px 0 #fff;
|
||||
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
||||
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
|
||||
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #dbdbdb;
|
||||
border-color: #ccc;
|
||||
}
|
||||
.btn-default:hover,
|
||||
.btn-default:focus {
|
||||
background-color: #e0e0e0;
|
||||
background-position: 0 -15px;
|
||||
}
|
||||
.btn-default:active,
|
||||
.btn-default.active {
|
||||
background-color: #e0e0e0;
|
||||
border-color: #dbdbdb;
|
||||
}
|
||||
.btn-default:disabled,
|
||||
.btn-default[disabled] {
|
||||
background-color: #e0e0e0;
|
||||
background-image: none;
|
||||
}
|
||||
.btn-primary {
|
||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
|
||||
background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
|
||||
background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #2b669a;
|
||||
}
|
||||
.btn-primary:hover,
|
||||
.btn-primary:focus {
|
||||
background-color: #2d6ca2;
|
||||
background-position: 0 -15px;
|
||||
}
|
||||
.btn-primary:active,
|
||||
.btn-primary.active {
|
||||
background-color: #2d6ca2;
|
||||
border-color: #2b669a;
|
||||
}
|
||||
.btn-primary:disabled,
|
||||
.btn-primary[disabled] {
|
||||
background-color: #2d6ca2;
|
||||
background-image: none;
|
||||
}
|
||||
.btn-success {
|
||||
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
||||
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
|
||||
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #3e8f3e;
|
||||
}
|
||||
.btn-success:hover,
|
||||
.btn-success:focus {
|
||||
background-color: #419641;
|
||||
background-position: 0 -15px;
|
||||
}
|
||||
.btn-success:active,
|
||||
.btn-success.active {
|
||||
background-color: #419641;
|
||||
border-color: #3e8f3e;
|
||||
}
|
||||
.btn-success:disabled,
|
||||
.btn-success[disabled] {
|
||||
background-color: #419641;
|
||||
background-image: none;
|
||||
}
|
||||
.btn-info {
|
||||
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
||||
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
|
||||
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #28a4c9;
|
||||
}
|
||||
.btn-info:hover,
|
||||
.btn-info:focus {
|
||||
background-color: #2aabd2;
|
||||
background-position: 0 -15px;
|
||||
}
|
||||
.btn-info:active,
|
||||
.btn-info.active {
|
||||
background-color: #2aabd2;
|
||||
border-color: #28a4c9;
|
||||
}
|
||||
.btn-info:disabled,
|
||||
.btn-info[disabled] {
|
||||
background-color: #2aabd2;
|
||||
background-image: none;
|
||||
}
|
||||
.btn-warning {
|
||||
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
||||
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
|
||||
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #e38d13;
|
||||
}
|
||||
.btn-warning:hover,
|
||||
.btn-warning:focus {
|
||||
background-color: #eb9316;
|
||||
background-position: 0 -15px;
|
||||
}
|
||||
.btn-warning:active,
|
||||
.btn-warning.active {
|
||||
background-color: #eb9316;
|
||||
border-color: #e38d13;
|
||||
}
|
||||
.btn-warning:disabled,
|
||||
.btn-warning[disabled] {
|
||||
background-color: #eb9316;
|
||||
background-image: none;
|
||||
}
|
||||
.btn-danger {
|
||||
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
||||
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
|
||||
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #b92c28;
|
||||
}
|
||||
.btn-danger:hover,
|
||||
.btn-danger:focus {
|
||||
background-color: #c12e2a;
|
||||
background-position: 0 -15px;
|
||||
}
|
||||
.btn-danger:active,
|
||||
.btn-danger.active {
|
||||
background-color: #c12e2a;
|
||||
border-color: #b92c28;
|
||||
}
|
||||
.btn-danger:disabled,
|
||||
.btn-danger[disabled] {
|
||||
background-color: #c12e2a;
|
||||
background-image: none;
|
||||
}
|
||||
.thumbnail,
|
||||
.img-thumbnail {
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||
}
|
||||
.dropdown-menu > li > a:hover,
|
||||
.dropdown-menu > li > a:focus {
|
||||
background-color: #e8e8e8;
|
||||
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
||||
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.dropdown-menu > .active > a,
|
||||
.dropdown-menu > .active > a:hover,
|
||||
.dropdown-menu > .active > a:focus {
|
||||
background-color: #357ebd;
|
||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
||||
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
|
||||
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.navbar-default {
|
||||
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
||||
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
|
||||
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||
}
|
||||
.navbar-default .navbar-nav > .active > a {
|
||||
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
|
||||
background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
|
||||
background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||
}
|
||||
.navbar-brand,
|
||||
.navbar-nav > li > a {
|
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
|
||||
}
|
||||
.navbar-inverse {
|
||||
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
||||
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
|
||||
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.navbar-inverse .navbar-nav > .active > a {
|
||||
background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
|
||||
background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
|
||||
background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||
}
|
||||
.navbar-inverse .navbar-brand,
|
||||
.navbar-inverse .navbar-nav > li > a {
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
|
||||
}
|
||||
.navbar-static-top,
|
||||
.navbar-fixed-top,
|
||||
.navbar-fixed-bottom {
|
||||
border-radius: 0;
|
||||
}
|
||||
.alert {
|
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
|
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||
}
|
||||
.alert-success {
|
||||
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
||||
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
|
||||
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #b2dba1;
|
||||
}
|
||||
.alert-info {
|
||||
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
||||
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
|
||||
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #9acfea;
|
||||
}
|
||||
.alert-warning {
|
||||
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
||||
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
|
||||
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #f5e79e;
|
||||
}
|
||||
.alert-danger {
|
||||
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
||||
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
|
||||
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #dca7a7;
|
||||
}
|
||||
.progress {
|
||||
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
||||
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
|
||||
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.progress-bar {
|
||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
|
||||
background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
|
||||
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.progress-bar-success {
|
||||
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
||||
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
|
||||
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.progress-bar-info {
|
||||
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
||||
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
|
||||
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.progress-bar-warning {
|
||||
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
||||
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
|
||||
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.progress-bar-danger {
|
||||
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
||||
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
|
||||
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.progress-bar-striped {
|
||||
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||
}
|
||||
.list-group {
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||
}
|
||||
.list-group-item.active,
|
||||
.list-group-item.active:hover,
|
||||
.list-group-item.active:focus {
|
||||
text-shadow: 0 -1px 0 #3071a9;
|
||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
|
||||
background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
|
||||
background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #3278b3;
|
||||
}
|
||||
.panel {
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||
}
|
||||
.panel-default > .panel-heading {
|
||||
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
||||
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.panel-primary > .panel-heading {
|
||||
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
||||
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
|
||||
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.panel-success > .panel-heading {
|
||||
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
||||
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
|
||||
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.panel-info > .panel-heading {
|
||||
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
||||
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
|
||||
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.panel-warning > .panel-heading {
|
||||
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
||||
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
|
||||
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.panel-danger > .panel-heading {
|
||||
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
||||
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
|
||||
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
.well {
|
||||
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
||||
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
|
||||
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
|
||||
background-repeat: repeat-x;
|
||||
border-color: #dcdcdc;
|
||||
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
||||
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-theme.css.map */
|
Po Szerokość: | Wysokość: | Rozmiar: 246 B |
Po Szerokość: | Wysokość: | Rozmiar: 565 B |
Po Szerokość: | Wysokość: | Rozmiar: 620 B |
|
@ -0,0 +1,229 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||
<missing-glyph horiz-adv-x="500" />
|
||||
<glyph />
|
||||
<glyph />
|
||||
<glyph unicode="
" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
|
||||
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode=" " horiz-adv-x="652" />
|
||||
<glyph unicode=" " horiz-adv-x="1304" />
|
||||
<glyph unicode=" " horiz-adv-x="652" />
|
||||
<glyph unicode=" " horiz-adv-x="1304" />
|
||||
<glyph unicode=" " horiz-adv-x="434" />
|
||||
<glyph unicode=" " horiz-adv-x="326" />
|
||||
<glyph unicode=" " horiz-adv-x="217" />
|
||||
<glyph unicode=" " horiz-adv-x="217" />
|
||||
<glyph unicode=" " horiz-adv-x="163" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="72" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="326" />
|
||||
<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
|
||||
<glyph unicode="−" d="M200 400h900v300h-900v-300z" />
|
||||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||
<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
|
||||
<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
|
||||
<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
|
||||
<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
|
||||
<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
|
||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
|
||||
<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
|
||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
|
||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
|
||||
<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
|
||||
<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
|
||||
<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
|
||||
<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
|
||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
|
||||
<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
|
||||
<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
|
||||
<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
|
||||
<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
|
||||
<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
|
||||
<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
|
||||
<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
|
||||
<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
|
||||
<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
|
||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
|
||||
<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
|
||||
<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
|
||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
|
||||
<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
|
||||
<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
|
||||
<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
|
||||
<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
|
||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
|
||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
|
||||
<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
|
||||
<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
|
||||
<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
|
||||
<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
|
||||
<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
|
||||
<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
|
||||
<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
|
||||
<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
|
||||
<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
|
||||
<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
|
||||
<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
|
||||
<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
|
||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
|
||||
<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
|
||||
<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
|
||||
<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
|
||||
<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
|
||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
|
||||
<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
|
||||
<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
|
||||
<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
|
||||
<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />
|
||||
<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
||||
<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
||||
<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
|
||||
<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
|
||||
<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
|
||||
<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
|
||||
<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
|
||||
<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
|
||||
<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />
|
||||
<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
|
||||
<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
|
||||
<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />
|
||||
<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
|
||||
<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
|
||||
<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
|
||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
|
||||
<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
|
||||
<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
|
||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
|
||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
|
||||
<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
|
||||
<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
|
||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
|
||||
<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
|
||||
<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
|
||||
<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
|
||||
<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
|
||||
<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
|
||||
<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
|
||||
<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
|
||||
<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
|
||||
<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
|
||||
<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
|
||||
<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
|
||||
<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
|
||||
<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
|
||||
<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
|
||||
<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
|
||||
<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
|
||||
<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
|
||||
<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
|
||||
<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
|
||||
<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
|
||||
<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
|
||||
<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
|
||||
<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
|
||||
<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
|
||||
<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
|
||||
<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
|
||||
<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
|
||||
<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
|
||||
<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
|
||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
|
||||
<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
|
||||
<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
|
||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
|
||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
|
||||
<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
|
||||
<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
|
||||
<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
|
||||
<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
|
||||
<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
|
||||
<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
|
||||
<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
|
||||
<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
|
||||
<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
|
||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
|
||||
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
|
||||
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
|
||||
</font>
|
||||
</defs></svg>
|
Po Szerokość: | Wysokość: | Rozmiar: 62 KiB |
|
@ -0,0 +1,37 @@
|
|||
|
||||
function ExpandFieldPanel(ps_id, f_id)
|
||||
{
|
||||
var psPanelId = 'panel_collapse_details_' + ps_id;
|
||||
var divFieldPanelId = 'div_field_' + f_id;
|
||||
|
||||
var psPanel = document.getElementById(psPanelId);
|
||||
var divFieldPanel = document.getElementById(divFieldPanelId);
|
||||
|
||||
/* Add 'in' from the class and remove any style = "height: 0px;" settings. */
|
||||
if (!(psPanel.classList.contains("in"))) {
|
||||
psPanel.classList.add("in");
|
||||
}
|
||||
psPanel.removeAttribute("style");
|
||||
|
||||
/* Update H6 anchor class for collapsed. */
|
||||
a_field_heading = psPanel.parentNode.getElementsByTagName("div")[0].getElementsByTagName("a")[0];
|
||||
if (a_field_heading.classList.contains("collapsed")) {
|
||||
a_field_heading.classList.remove("collapsed");
|
||||
}
|
||||
/* Add 'in' from the class and remove any style = "height: 0px;" settings. */
|
||||
if (!(divFieldPanel.classList.contains("in"))) {
|
||||
divFieldPanel.classList.add("in");
|
||||
}
|
||||
divFieldPanel.removeAttribute("style");
|
||||
|
||||
/* Clear any 'collapsed' in the class list for field detail name anchor. */
|
||||
for (var a_field_details = divFieldPanel.parentNode.getElementsByTagName("a"), i = a_field_details.length; i--;) {
|
||||
dt_attr = a_field_details[i].getAttribute("data-target");
|
||||
if ((dt_attr) && (dt_attr.substring(1) == divFieldPanelId)) {
|
||||
if (a_field_details[i].classList.contains("collapsed")) {
|
||||
a_field_details[i].classList.remove("collapsed");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,156 @@
|
|||
|
||||
|
||||
var shiftWindow = function() {
|
||||
scrollBy(0, -150);
|
||||
};
|
||||
|
||||
if (location.hash) shiftWindow();
|
||||
window.addEventListener("hashchange", shiftWindow);
|
||||
|
||||
function ChangeUrl(newUrl)
|
||||
{
|
||||
document.location.href = newUrl;
|
||||
InspectUrlForField();
|
||||
shiftWindow();
|
||||
}
|
||||
|
||||
function InspectUrlForField()
|
||||
{
|
||||
|
||||
var href = document.location.hash.substring(1);
|
||||
if (href.indexOf('_field_') > -1)
|
||||
{
|
||||
for (var a_els = document.getElementsByClassName("dark-ref numbers"), i = a_els.length; i--;)
|
||||
{
|
||||
if (a_els[i].tagName.toLowerCase() == "a")
|
||||
{
|
||||
if(a_els[i].name == href)
|
||||
{
|
||||
var field_div = a_els[i].parentNode;
|
||||
var panel_body = field_div.parentNode;
|
||||
var panel_collapse = panel_body.parentNode;
|
||||
/* Remove the 'panel_collapse_details_' (23 chars) to get ps id.
|
||||
* Remove the 'field_' (6 chars) to get the field id.
|
||||
*/
|
||||
ExpandFieldPanel(panel_collapse.id.substring(23), a_els[i].id.substring(6));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function GlobalExpandAll() {
|
||||
global_expand_all_tables();
|
||||
GlobalExpandFieldHeadings();
|
||||
GlobalExpandFieldDetails();
|
||||
}
|
||||
|
||||
function GlobalExpandFieldHeadings() {
|
||||
for (var p_els = document.getElementsByClassName("panel-collapse collapse"), i = p_els.length; i--;) {
|
||||
if (p_els[i].tagName.toLowerCase() == "div") {
|
||||
/* Add 'in' from the class and remove any style = "height: 0px;" settings. */
|
||||
if (!(p_els[i].classList.contains("in"))) {
|
||||
p_els[i].classList.add("in")
|
||||
}
|
||||
p_els[i].removeAttribute("style");
|
||||
|
||||
/* Update H6 anchor class for collapsed. */
|
||||
a_field_heading = p_els[i].parentNode.getElementsByTagName("div")[0].getElementsByTagName("a")[0];
|
||||
if (a_field_heading.classList.contains("collapsed")) {
|
||||
a_field_heading.classList.remove("collapsed")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function GlobalExpandFieldDetails() {
|
||||
for (var p_els = document.getElementsByClassName("panel-collapse collapse"), i = p_els.length; i--;) {
|
||||
if (p_els[i].tagName.toLowerCase() == "div") {
|
||||
/* Add 'in' from the class and remove any style = "height: 0px;" settings. */
|
||||
if (!(p_els[i].classList.contains("in"))) {
|
||||
p_els[i].classList.add("in")
|
||||
}
|
||||
p_els[i].removeAttribute("style");
|
||||
|
||||
/* Update H6 anchor class for collapsed. */
|
||||
a_field_heading = p_els[i].parentNode.getElementsByTagName("div")[0].getElementsByTagName("a")[0];
|
||||
if (a_field_heading.classList.contains("collapsed")) {
|
||||
a_field_heading.classList.remove("collapsed");
|
||||
}
|
||||
|
||||
/* Panel collapse details. */
|
||||
/* Add 'in' from the class and remove any style = "height: 0px;" settings. */
|
||||
for (var f_els = p_els[i].getElementsByClassName("panel-body")[0].getElementsByClassName("collapse"), j = f_els.length; j--;) {
|
||||
if (!(f_els[j].classList.contains("in")))
|
||||
{
|
||||
f_els[j].classList.add("in");
|
||||
}
|
||||
f_els[j].removeAttribute("style");
|
||||
}
|
||||
|
||||
for (var a_els = p_els[i].getElementsByClassName("dark-ref numbers"), k = f_els.length; k--;) {
|
||||
if (!(a_els[k].classList.contains("collapsed")))
|
||||
{
|
||||
f_els[k].classList.remove("collapsed");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function GlobalCollapseAll() {
|
||||
global_collapse_all_tables();
|
||||
GlobalCollapseFieldDetails();
|
||||
GlobalCollapseFieldHeadings();
|
||||
}
|
||||
|
||||
function GlobalCollapseFieldHeadings() {
|
||||
for (var p_els = document.getElementsByClassName("panel-collapse collapse"), i = p_els.length; i--;) {
|
||||
/* Remove 'in' from the class and set style = "height: 0px;" settings. */
|
||||
if (p_els[i].tagName.toLowerCase() == "div") {
|
||||
if (p_els[i].classList.contains("in")) {
|
||||
p_els[i].classList.remove("in");
|
||||
}
|
||||
p_els[i].setAttribute("style", "height: 0px;");
|
||||
/* Update H6 anchor class for collapsed. */
|
||||
a_field_heading = p_els[i].parentNode.getElementsByTagName("div")[0].getElementsByTagName("a")[0];
|
||||
a_field_heading.classList.add("collapsed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function GlobalCollapseFieldDetails() {
|
||||
var i = 0;
|
||||
var j = 0;
|
||||
var p_els = [];
|
||||
|
||||
/* Updated the div class */
|
||||
for (p_els = document.getElementsByClassName("panel-collapse collapse"), i = p_els.length; i--;) {
|
||||
if (p_els[i].tagName.toLowerCase() == "div") {
|
||||
var f_els = [];
|
||||
for (f_els = p_els[i].getElementsByClassName("panel-body")[0].getElementsByClassName("collapse"), j = f_els.length; j--;) {
|
||||
if (f_els[j].classList.contains("in")) {
|
||||
f_els[j].classList.remove("in");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
/* Updated the anchor class */
|
||||
for (p_els = document.getElementsByClassName("panel-title field-panel-title"), i = p_els.length; i--;) {
|
||||
var a_els = [];
|
||||
for (a_els = p_els[i].getElementsByTagName("a"), j = a_els.length; j--;) {
|
||||
if ((a_els[j].classList.contains("dark-ref")) && (a_els[j].classList.contains("numbers"))) {
|
||||
if (!(a_els[j].classList.contains("collapsed"))) {
|
||||
a_els[j].classList.add("collapsed");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Po Szerokość: | Wysokość: | Rozmiar: 625 B |
Po Szerokość: | Wysokość: | Rozmiar: 681 B |
Po Szerokość: | Wysokość: | Rozmiar: 509 B |
Po Szerokość: | Wysokość: | Rozmiar: 527 B |
Po Szerokość: | Wysokość: | Rozmiar: 534 B |
Po Szerokość: | Wysokość: | Rozmiar: 167 B |
Po Szerokość: | Wysokość: | Rozmiar: 4.0 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 3.3 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 225 B |
Po Szerokość: | Wysokość: | Rozmiar: 2.0 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.3 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.4 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.2 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.6 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.8 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.8 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.1 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.2 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.7 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.7 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.8 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.8 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.1 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 1.6 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 16 KiB |
|
@ -1,6 +1,10 @@
|
|||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
// Define SONDE Type. Must be DFM17 or RS41
|
||||
//#define RS41
|
||||
#define DFM17
|
||||
|
||||
// Enable semihosting to receive debug logs during development
|
||||
// See the README for details on how to set up debugging and debug logs with GDB
|
||||
// NOTE: Semihosting has to be disabled when the RS41 radiosonde is not connected to an STM32 programmer dongle, otherwise the firmware will not run.
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
/*! @file bsp.h
|
||||
* @brief This file contains application specific definitions and includes.
|
||||
*
|
||||
* @b COPYRIGHT
|
||||
* @n Silicon Laboratories Confidential
|
||||
* @n Copyright 2012 Silicon Laboratories, Inc.
|
||||
* @n http://www.silabs.com
|
||||
*/
|
||||
|
||||
#ifndef BSP_H
|
||||
#define BSP_H
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
/* Application specific modificaitons for DFM17 */
|
||||
/*------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// kd2eat - define SILABS_RADIO_SI446X to enable support for Si4x6x chips.
|
||||
#define SILABS_RADIO_SI446X
|
||||
typedef unsigned char bit;
|
||||
typedef bit BIT;
|
||||
#define BITS(bitArray, bitPos) BIT bitArray ## bitPos
|
||||
#define SI446X_USER_CONFIG_USE_FRR_ABC_FOR_NIRQ
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
/* Application specific global definitions */
|
||||
/*------------------------------------------------------------------------*/
|
||||
/*! Platform definition */
|
||||
/* Note: Plaform is defined in Silabs IDE project file as
|
||||
* a command line flag for the compiler. */
|
||||
//#define SILABS_PLATFORM_WMB930
|
||||
|
||||
/*! Extended driver support
|
||||
* Known issues: Some of the example projects
|
||||
* might not build with some extended drivers
|
||||
* due to data memory overflow */
|
||||
#undef RADIO_DRIVER_EXTENDED_SUPPORT
|
||||
#undef RADIO_DRIVER_FULL_SUPPORT
|
||||
#undef SPI_DRIVER_EXTENDED_SUPPORT
|
||||
#undef HMI_DRIVER_EXTENDED_SUPPORT
|
||||
#undef TIMER_DRIVER_EXTENDED_SUPPORT
|
||||
#undef UART_DRIVER_EXTENDED_SUPPORT
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
/* Application specific includes */
|
||||
/*------------------------------------------------------------------------*/
|
||||
|
||||
//#include "drivers\compiler_defs.h"
|
||||
//#include "platform_defs.h"
|
||||
//#include "hardware_defs.h"
|
||||
|
||||
//#include "application\application_defs.h"
|
||||
|
||||
//#include "drivers\cdd_common.h"
|
||||
//#include "drivers\spi.h"
|
||||
//#include "drivers\control_IO.h"
|
||||
//#include "drivers\smbus.h"
|
||||
//#include "drivers\uart.h"
|
||||
|
||||
#if ((defined SILABS_PLATFORM_LCDBB) || (defined SILABS_MCU_DC_EMIF_F930) || (defined SILABS_PLATFORM_WMB))
|
||||
/* LCD driver includes */
|
||||
#include "drivers\ascii5x7.h"
|
||||
#include "drivers\dog_glcd.h"
|
||||
#include "drivers\pictures.h"
|
||||
#endif
|
||||
|
||||
//#include "application\radio.h"
|
||||
//#include "application\radio_config.h"
|
||||
|
||||
//#include "drivers\radio\radio_hal.h"
|
||||
#include "radio_comm.h"
|
||||
|
||||
#ifdef SILABS_RADIO_SI446X
|
||||
#include "si446x_api_lib.h"
|
||||
#include "si446x_defs.h"
|
||||
#include "si446x_nirq.h"
|
||||
#include "si446x_patch.h"
|
||||
#endif
|
||||
|
||||
#ifdef SILABS_RADIO_SI4455
|
||||
#include "drivers\radio\Si4455\si4455_api_lib.h"
|
||||
#include "drivers\radio\Si4455\si4455_defs.h"
|
||||
#include "drivers\radio\Si4455\si4455_nirq.h"
|
||||
#endif
|
||||
|
||||
#endif //BSP_H
|
|
@ -0,0 +1,246 @@
|
|||
#ifdef DFM17
|
||||
/*!
|
||||
* File:
|
||||
* radio_comm.h
|
||||
*
|
||||
* Description:
|
||||
* This file contains the RADIO communication layer.
|
||||
*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2012 Silicon Laboratories, Inc.
|
||||
*/
|
||||
|
||||
/* ======================================= *
|
||||
* I N C L U D E *
|
||||
* ======================================= */
|
||||
|
||||
#include "bsp.h"
|
||||
|
||||
/* ======================================= *
|
||||
* D E F I N I T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* G L O B A L V A R I A B L E S *
|
||||
* ======================================= */
|
||||
|
||||
#if (defined SILABS_RADIO_SI446X) || (defined SILABS_RADIO_SI4455)
|
||||
BIT ctsWentHigh = 0;
|
||||
#endif
|
||||
|
||||
|
||||
/* ======================================= *
|
||||
* L O C A L F U N C T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* P U B L I C F U N C T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
#if (defined SILABS_RADIO_SI446X) || (defined SILABS_RADIO_SI4455)
|
||||
|
||||
/*!
|
||||
* Gets a command response from the radio chip
|
||||
*
|
||||
* @param byteCount Number of bytes to get from the radio chip
|
||||
* @param pData Pointer to where to put the data
|
||||
*
|
||||
* @return CTS value
|
||||
*/
|
||||
uint8_t radio_comm_GetResp(uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
uint8_t ctsVal = 0u;
|
||||
uint16_t errCnt = RADIO_CTS_TIMEOUT;
|
||||
|
||||
while (errCnt != 0) //wait until radio IC is ready with the data
|
||||
{
|
||||
radio_hal_ClearNsel();
|
||||
radio_hal_SpiWriteByte(0x44); //read CMD buffer
|
||||
ctsVal = radio_hal_SpiReadByte();
|
||||
if (ctsVal == 0xFF)
|
||||
{
|
||||
if (byteCount)
|
||||
{
|
||||
radio_hal_SpiReadData(byteCount, pData);
|
||||
}
|
||||
radio_hal_SetNsel();
|
||||
break;
|
||||
}
|
||||
radio_hal_SetNsel();
|
||||
errCnt--;
|
||||
}
|
||||
|
||||
if (errCnt == 0)
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
/* ERROR!!!! CTS should never take this long. */
|
||||
#ifdef RADIO_COMM_ERROR_CALLBACK
|
||||
RADIO_COMM_ERROR_CALLBACK();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (ctsVal == 0xFF)
|
||||
{
|
||||
ctsWentHigh = 1;
|
||||
}
|
||||
|
||||
return ctsVal;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Sends a command to the radio chip
|
||||
*
|
||||
* @param byteCount Number of bytes in the command to send to the radio device
|
||||
* @param pData Pointer to the command to send.
|
||||
*/
|
||||
void radio_comm_SendCmd(uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
while (!ctsWentHigh)
|
||||
{
|
||||
radio_comm_PollCTS();
|
||||
}
|
||||
radio_hal_ClearNsel();
|
||||
radio_hal_SpiWriteData(byteCount, pData);
|
||||
radio_hal_SetNsel();
|
||||
ctsWentHigh = 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Gets a command response from the radio chip
|
||||
*
|
||||
* @param cmd Command ID
|
||||
* @param pollCts Set to poll CTS
|
||||
* @param byteCount Number of bytes to get from the radio chip.
|
||||
* @param pData Pointer to where to put the data.
|
||||
*/
|
||||
void radio_comm_ReadData(uint8_t cmd, BIT pollCts, uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
if(pollCts)
|
||||
{
|
||||
while(!ctsWentHigh)
|
||||
{
|
||||
radio_comm_PollCTS();
|
||||
}
|
||||
}
|
||||
radio_hal_ClearNsel();
|
||||
radio_hal_SpiWriteByte(cmd);
|
||||
radio_hal_SpiReadData(byteCount, pData);
|
||||
radio_hal_SetNsel();
|
||||
ctsWentHigh = 0;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Gets a command response from the radio chip
|
||||
*
|
||||
* @param cmd Command ID
|
||||
* @param pollCts Set to poll CTS
|
||||
* @param byteCount Number of bytes to get from the radio chip
|
||||
* @param pData Pointer to where to put the data
|
||||
*/
|
||||
void radio_comm_WriteData(uint8_t cmd, BIT pollCts, uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
if(pollCts)
|
||||
{
|
||||
while(!ctsWentHigh)
|
||||
{
|
||||
radio_comm_PollCTS();
|
||||
}
|
||||
}
|
||||
radio_hal_ClearNsel();
|
||||
radio_hal_SpiWriteByte(cmd);
|
||||
radio_hal_SpiWriteData(byteCount, pData);
|
||||
radio_hal_SetNsel();
|
||||
ctsWentHigh = 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Waits for CTS to be high
|
||||
*
|
||||
* @return CTS value
|
||||
*/
|
||||
uint8_t radio_comm_PollCTS(void)
|
||||
{
|
||||
#ifdef RADIO_USER_CFG_USE_GPIO1_FOR_CTS
|
||||
while(!radio_hal_Gpio1Level())
|
||||
{
|
||||
/* Wait...*/
|
||||
}
|
||||
ctsWentHigh = 1;
|
||||
return 0xFF;
|
||||
#else
|
||||
return radio_comm_GetResp(0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the CTS state variable.
|
||||
*/
|
||||
void radio_comm_ClearCTS()
|
||||
{
|
||||
ctsWentHigh = 0;
|
||||
}
|
||||
|
||||
#elif (defined SILABS_RADIO_SI4012)
|
||||
|
||||
/*!
|
||||
* Gets a command response from the radio chip
|
||||
*
|
||||
* @param byteCount Number of bytes to get from the radio chip
|
||||
* @param pData Pointer to where to put the data
|
||||
*
|
||||
* @return CTS value
|
||||
*/
|
||||
uint8_t radio_comm_GetResp(uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
uint8_t ctsVal = 0u;
|
||||
|
||||
if (qSmbus_SMBusRead(SI4012_SMBUS_ADDRESS, byteCount, pData) != \
|
||||
SMBUS_RX_FINISHED) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pData[0] == 0x80) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Sends a command to the radio chip
|
||||
*
|
||||
* @param byteCount Number of bytes in the command to send to the radio device
|
||||
* @param pData Pointer to the command to send.
|
||||
*/
|
||||
uint8_t radio_comm_SendCmd(uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
if (qSmbus_SMBusWrite(SI4012_SMBUS_ADDRESS, byteCount, pData) != \
|
||||
SMBUS_TRANSMISSION_OK) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* Sends a command to the radio chip and gets a response
|
||||
*
|
||||
* @param cmdByteCount Number of bytes in the command to send to the radio device
|
||||
* @param pCmdData Pointer to the command data
|
||||
* @param respByteCount Number of bytes in the response to fetch
|
||||
* @param pRespData Pointer to where to put the response data
|
||||
*
|
||||
* @return CTS value
|
||||
*/
|
||||
uint8_t radio_comm_SendCmdGetResp(uint8_t cmdByteCount, uint8_t* pCmdData, uint8_t respByteCount, uint8_t* pRespData)
|
||||
{
|
||||
radio_comm_SendCmd(cmdByteCount, pCmdData);
|
||||
return radio_comm_GetResp(respByteCount, pRespData);
|
||||
}
|
||||
|
||||
#endif //DFM17
|
|
@ -0,0 +1,53 @@
|
|||
/*!
|
||||
* File:
|
||||
* radio_comm.h
|
||||
*
|
||||
* Description:
|
||||
* This file contains the RADIO communication layer.
|
||||
*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*/
|
||||
#ifndef _RADIO_COMM_H_
|
||||
#define _RADIO_COMM_H_
|
||||
|
||||
|
||||
/* ======================================= *
|
||||
* I N C L U D E *
|
||||
* ======================================= */
|
||||
|
||||
|
||||
/* ======================================= *
|
||||
* D E F I N I T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
//#define RADIO_CTS_TIMEOUT 255
|
||||
#define RADIO_CTS_TIMEOUT 10000
|
||||
|
||||
/* ======================================= *
|
||||
* G L O B A L V A R I A B L E S *
|
||||
* ======================================= */
|
||||
|
||||
extern uint8_t radioCmd[16u];
|
||||
|
||||
|
||||
/* ======================================= *
|
||||
* F U N C T I O N P R O T O T Y P E S *
|
||||
* ======================================= */
|
||||
|
||||
#if (defined SILABS_RADIO_SI446X) || (defined SILABS_RADIO_SI4455)
|
||||
uint8_t radio_comm_GetResp(uint8_t byteCount, uint8_t* pData);
|
||||
void radio_comm_SendCmd(uint8_t byteCount, uint8_t* pData);
|
||||
void radio_comm_ReadData(uint8_t cmd, BIT pollCts, uint8_t byteCount, uint8_t* pData);
|
||||
void radio_comm_WriteData(uint8_t cmd, BIT pollCts, uint8_t byteCount, uint8_t* pData);
|
||||
#elif (defined SILABS_RADIO_SI4012)
|
||||
uint8_t radio_comm_GetResp(uint8_t byteCount, uint8_t* pData);
|
||||
uint8_t radio_comm_SendCmd(uint8_t byteCount, uint8_t* pData);
|
||||
#endif
|
||||
|
||||
uint8_t radio_comm_PollCTS(void);
|
||||
uint8_t radio_comm_SendCmdGetResp(uint8_t cmdByteCount, uint8_t* pCmdData, \
|
||||
uint8_t respByteCount, uint8_t* pRespData);
|
||||
void radio_comm_ClearCTS(void);
|
||||
|
||||
#endif //_RADIO_COMM_H_
|
|
@ -0,0 +1,195 @@
|
|||
#ifdef DFM17
|
||||
/*!
|
||||
* File:
|
||||
* radio_hal.c
|
||||
*
|
||||
* Description:
|
||||
* This file contains RADIO HAL.
|
||||
*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*/
|
||||
|
||||
/* ======================================= *
|
||||
* I N C L U D E *
|
||||
* ======================================= */
|
||||
|
||||
#include "bsp.h"
|
||||
|
||||
|
||||
/* ======================================= *
|
||||
* D E F I N I T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* G L O B A L V A R I A B L E S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* L O C A L F U N C T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* P U B L I C F U N C T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
void radio_hal_AssertShutdown(void)
|
||||
{
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB)
|
||||
RF_PWRDN = 1;
|
||||
#else
|
||||
PWRDN = 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void radio_hal_DeassertShutdown(void)
|
||||
{
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB)
|
||||
RF_PWRDN = 0;
|
||||
#else
|
||||
PWRDN = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void radio_hal_ClearNsel(void)
|
||||
{
|
||||
RF_NSEL = 0;
|
||||
}
|
||||
|
||||
void radio_hal_SetNsel(void)
|
||||
{
|
||||
RF_NSEL = 1;
|
||||
}
|
||||
|
||||
BIT radio_hal_NirqLevel(void)
|
||||
{
|
||||
return RF_NIRQ;
|
||||
}
|
||||
|
||||
void radio_hal_SpiWriteByte(uint8_t byteToWrite)
|
||||
{
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB)
|
||||
bSpi_ReadWriteSpi1(byteToWrite);
|
||||
#else
|
||||
SpiReadWrite(byteToWrite);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint8_t radio_hal_SpiReadByte(void)
|
||||
{
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB)
|
||||
return bSpi_ReadWriteSpi1(0xFF);
|
||||
#else
|
||||
return SpiReadWrite(0xFF);
|
||||
#endif
|
||||
}
|
||||
|
||||
void radio_hal_SpiWriteData(uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB)
|
||||
vSpi_WriteDataSpi1(byteCount, pData);
|
||||
#else
|
||||
SpiWriteData(byteCount, pData);
|
||||
#endif
|
||||
}
|
||||
|
||||
void radio_hal_SpiReadData(uint8_t byteCount, uint8_t* pData)
|
||||
{
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB)
|
||||
vSpi_ReadDataSpi1(byteCount, pData);
|
||||
#else
|
||||
SpiReadData(byteCount, pData);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef RADIO_DRIVER_EXTENDED_SUPPORT
|
||||
BIT radio_hal_Gpio0Level(void)
|
||||
{
|
||||
BIT retVal = FALSE;
|
||||
|
||||
#ifdef SILABS_PLATFORM_DKMB
|
||||
retVal = FALSE;
|
||||
#endif
|
||||
#ifdef SILABS_PLATFORM_UDP
|
||||
retVal = EZRP_RX_DOUT;
|
||||
#endif
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB)
|
||||
retVal = RF_GPIO0;
|
||||
#endif
|
||||
#if (defined SILABS_PLATFORM_WMB930)
|
||||
retVal = FALSE;
|
||||
#endif
|
||||
#if defined (SILABS_PLATFORM_WMB912)
|
||||
#ifdef SILABS_IO_WITH_EXTENDER
|
||||
//TODO
|
||||
retVal = FALSE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
BIT radio_hal_Gpio1Level(void)
|
||||
{
|
||||
BIT retVal = FALSE;
|
||||
|
||||
#ifdef SILABS_PLATFORM_DKMB
|
||||
retVal = FSK_CLK_OUT;
|
||||
#endif
|
||||
#ifdef SILABS_PLATFORM_UDP
|
||||
retVal = FALSE; //No Pop
|
||||
#endif
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB930)
|
||||
retVal = RF_GPIO1;
|
||||
#endif
|
||||
#if defined (SILABS_PLATFORM_WMB912)
|
||||
#ifdef SILABS_IO_WITH_EXTENDER
|
||||
//TODO
|
||||
retVal = FALSE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
BIT radio_hal_Gpio2Level(void)
|
||||
{
|
||||
BIT retVal = FALSE;
|
||||
|
||||
#ifdef SILABS_PLATFORM_DKMB
|
||||
retVal = DATA_NFFS;
|
||||
#endif
|
||||
#ifdef SILABS_PLATFORM_UDP
|
||||
retVal = FALSE; //No Pop
|
||||
#endif
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB930)
|
||||
retVal = RF_GPIO2;
|
||||
#endif
|
||||
#if defined (SILABS_PLATFORM_WMB912)
|
||||
#ifdef SILABS_IO_WITH_EXTENDER
|
||||
//TODO
|
||||
retVal = FALSE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
BIT radio_hal_Gpio3Level(void)
|
||||
{
|
||||
BIT retVal = FALSE;
|
||||
|
||||
#if (defined SILABS_PLATFORM_RFSTICK) || (defined SILABS_PLATFORM_LCDBB) || (defined SILABS_PLATFORM_WMB930)
|
||||
retVal = RF_GPIO3;
|
||||
#elif defined (SILABS_PLATFORM_WMB912)
|
||||
#ifdef SILABS_IO_WITH_EXTENDER
|
||||
//TODO
|
||||
retVal = FALSE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif //DFM17
|
|
@ -0,0 +1,50 @@
|
|||
/*!
|
||||
* File:
|
||||
* radio_hal.h
|
||||
*
|
||||
* Description:
|
||||
* This file contains RADIO HAL.
|
||||
*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _RADIO_HAL_H_
|
||||
#define _RADIO_HAL_H_
|
||||
|
||||
/* ======================================= *
|
||||
* I N C L U D E *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* D E F I N I T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* G L O B A L V A R I A B L E S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* F U N C T I O N P R O T O T Y P E S *
|
||||
* ======================================= */
|
||||
|
||||
void radio_hal_AssertShutdown(void);
|
||||
void radio_hal_DeassertShutdown(void);
|
||||
void radio_hal_ClearNsel(void);
|
||||
void radio_hal_SetNsel(void);
|
||||
BIT radio_hal_NirqLevel(void);
|
||||
|
||||
void radio_hal_SpiWriteByte(uint8_t byteToWrite);
|
||||
uint8_t radio_hal_SpiReadByte(void);
|
||||
|
||||
void radio_hal_SpiWriteData(uint8_t byteCount, uint8_t* pData);
|
||||
void radio_hal_SpiReadData(uint8_t byteCount, uint8_t* pData);
|
||||
|
||||
#ifdef DRIVERS_EXTENDED_SUPPORT
|
||||
BIT radio_hal_Gpio0Level(void);
|
||||
BIT radio_hal_Gpio1Level(void);
|
||||
BIT radio_hal_Gpio2Level(void);
|
||||
BIT radio_hal_Gpio3Level(void);
|
||||
#endif
|
||||
|
||||
#endif //_RADIO_HAL_H_
|
|
@ -0,0 +1,199 @@
|
|||
#include <stm32f10x_gpio.h>
|
||||
|
||||
#include "hal/spi.h"
|
||||
#include "si4063.h"
|
||||
#include "gpio.h"
|
||||
|
||||
#define SPI_WRITE_FLAG 0x80
|
||||
|
||||
#define SI4063_CLOCK 26.0f
|
||||
|
||||
#define GPIO_SI4063_NSEL GPIOC
|
||||
#define GPIO_PIN_SI4063_NSEL GPIO_Pin_13
|
||||
|
||||
#define GPIO_SI4063_SDI GPIOB
|
||||
#define GPIO_PIN_SI4063_SDI GPIO_Pin_15
|
||||
|
||||
static inline uint8_t si4063_write(uint8_t reg, uint8_t value)
|
||||
{
|
||||
return spi_send_and_receive(GPIO_SI4063_NSEL, GPIO_PIN_SI4063_NSEL, ((reg | SPI_WRITE_FLAG) << 8U) | value);
|
||||
}
|
||||
|
||||
static inline uint8_t si4063_read(uint8_t reg)
|
||||
{
|
||||
return spi_send_and_receive(GPIO_SI4063_NSEL, GPIO_PIN_SI4063_NSEL, (reg << 8U) | 0xFFU);
|
||||
}
|
||||
|
||||
void si4063_soft_reset()
|
||||
{
|
||||
si4063_write(0x07, 0x80);
|
||||
}
|
||||
|
||||
void si4063_enable_tx()
|
||||
{
|
||||
// Modified to set the PLL and Crystal enable bits to high. Not sure if this makes much difference.
|
||||
si4063_write(0x07, 0x4B);
|
||||
}
|
||||
|
||||
void si4063_inhibit_tx()
|
||||
{
|
||||
// Sleep mode, but with PLL idle mode enabled, in an attempt to reduce drift on key-up.
|
||||
si4063_write(0x07, 0x43);
|
||||
}
|
||||
|
||||
void si4063_disable_tx()
|
||||
{
|
||||
si4063_write(0x07, 0x40);
|
||||
}
|
||||
|
||||
void si4063_use_direct_mode(bool use)
|
||||
{
|
||||
if (use) {
|
||||
GPIO_SetBits(GPIO_SI4063_NSEL, GPIO_PIN_SI4063_NSEL);
|
||||
} else {
|
||||
GPIO_ResetBits(GPIO_SI4063_NSEL, GPIO_PIN_SI4063_NSEL);
|
||||
}
|
||||
}
|
||||
|
||||
void si4063_set_tx_frequency(const float frequency_mhz)
|
||||
{
|
||||
uint8_t hbsel = (uint8_t) ((frequency_mhz * (30.0f / SI4063_CLOCK)) >= 480.0f ? 1 : 0);
|
||||
|
||||
uint8_t fb = (uint8_t) ((((uint8_t) ((frequency_mhz * (30.0f / SI4063_CLOCK)) / 10) - 24) - (24 * hbsel)) /
|
||||
(1 + hbsel));
|
||||
uint8_t gen_div = 3; // constant - not possible to change!
|
||||
uint16_t fc = (uint16_t) (((frequency_mhz / ((SI4063_CLOCK / gen_div) * (hbsel + 1))) - fb - 24) * 64000);
|
||||
si4063_write(0x75, (uint8_t) (0b01000000 | (fb & 0b11111) | ((hbsel & 0b1) << 5)));
|
||||
si4063_write(0x76, (uint8_t) (((uint16_t) fc >> 8U) & 0xffU));
|
||||
si4063_write(0x77, (uint8_t) ((uint16_t) fc & 0xff));
|
||||
}
|
||||
|
||||
void si4063_set_tx_power(uint8_t power)
|
||||
{
|
||||
si4063_write(0x6D, power & 0x7U);
|
||||
}
|
||||
|
||||
/**
|
||||
* The frequency offset can be calculated as Offset = 156.25 Hz x (hbsel + 1) x fo[7:0]. fo[9:0] is a twos complement value. fo[9] is the sign bit.
|
||||
* For 70cm band hbsel is 1, so offset step is 312.5 Hz
|
||||
*/
|
||||
void si4063_set_frequency_offset(uint16_t offset)
|
||||
{
|
||||
si4063_write(0x73, offset);
|
||||
si4063_write(0x74, 0);
|
||||
}
|
||||
|
||||
inline void si4063_set_frequency_offset_small(uint8_t offset)
|
||||
{
|
||||
si4063_write(0x73, offset);
|
||||
}
|
||||
|
||||
void si4063_set_frequency_deviation(uint8_t deviation)
|
||||
{
|
||||
// The frequency deviation can be calculated: Fd = 625 Hz x fd[8:0].
|
||||
// Zero disables deviation between 0/1 bits
|
||||
si4063_write(0x72, deviation);
|
||||
}
|
||||
|
||||
void si4063_set_modulation_type(si4063_modulation_type type)
|
||||
{
|
||||
uint8_t value;
|
||||
switch (type) {
|
||||
case SI4063_MODULATION_TYPE_NONE:
|
||||
// No modulation (for modulating via frequency offset, e.g. for RTTY)
|
||||
value = 0x00;
|
||||
break;
|
||||
case SI4063_MODULATION_TYPE_OOK:
|
||||
// Direct Async Mode with OOK modulation
|
||||
value = 0b00010001;
|
||||
break;
|
||||
case SI4063_MODULATION_TYPE_FSK:
|
||||
// Direct Async Mode with FSK modulation
|
||||
value = 0b00010010;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
si4063_write(0x71, value);
|
||||
}
|
||||
|
||||
int32_t si4063_read_temperature_celsius_100()
|
||||
{
|
||||
// Set the input for ADC to the temperature sensor, "Register 0Fh. ADC Configuration"—adcsel[2:0] = 000
|
||||
// Set the reference for ADC, "Register 0Fh. ADC Configuration"—adcref[1:0] = 00
|
||||
si4063_write(0x0f, 0b00000000);
|
||||
// Set the temperature range for ADC, "Register 12h. Temperature Sensor Calibration"—tsrange[1:0]
|
||||
// Range: –64 ... 64 °C, Slope 8 mV/°C, ADC8 LSB 0.5 °C
|
||||
si4063_write(0x12, 0b00100000);
|
||||
// Set entsoffs = 1, "Register 12h. Temperature Sensor Calibration"
|
||||
// Trigger ADC reading, "Register 0Fh. ADC Configuration"—adcstart = 1
|
||||
si4063_write(0x0f, 0b10000000);
|
||||
// Read temperature value—Read contents of "Register 11h. ADC Value"
|
||||
int32_t raw_value = (int32_t) si4063_read(0x11);
|
||||
|
||||
int32_t temperature = (int32_t) (-6400 + (raw_value * 100 * 500 / 1000));
|
||||
|
||||
return temperature;
|
||||
}
|
||||
|
||||
static void si4063_set_nsel_pin(bool high)
|
||||
{
|
||||
if (high) {
|
||||
GPIO_SetBits(GPIO_SI4063_NSEL, GPIO_PIN_SI4063_NSEL);
|
||||
} else {
|
||||
GPIO_ResetBits(GPIO_SI4063_NSEL, GPIO_PIN_SI4063_NSEL);
|
||||
}
|
||||
}
|
||||
|
||||
void si4063_set_sdi_pin(bool high)
|
||||
{
|
||||
if (high) {
|
||||
GPIO_SetBits(GPIO_SI4063_SDI, GPIO_PIN_SI4063_SDI);
|
||||
} else {
|
||||
GPIO_ResetBits(GPIO_SI4063_SDI, GPIO_PIN_SI4063_SDI);
|
||||
}
|
||||
}
|
||||
|
||||
void si4063_use_sdi_pin(bool use)
|
||||
{
|
||||
GPIO_InitTypeDef gpio_init;
|
||||
|
||||
si4063_set_nsel_pin(true);
|
||||
|
||||
gpio_init.GPIO_Pin = GPIO_PIN_SI4063_SDI;
|
||||
gpio_init.GPIO_Mode = use ? GPIO_Mode_Out_PP : GPIO_Mode_AF_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIO_SI4063_SDI, &gpio_init);
|
||||
|
||||
si4063_set_sdi_pin(false);
|
||||
}
|
||||
|
||||
void si4063_init()
|
||||
{
|
||||
GPIO_InitTypeDef gpio_init;
|
||||
|
||||
// Si4032 chip select pin
|
||||
gpio_init.GPIO_Pin = GPIO_PIN_SI4063_NSEL;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIO_SI4063_NSEL, &gpio_init);
|
||||
|
||||
si4063_set_nsel_pin(true);
|
||||
|
||||
si4063_soft_reset();
|
||||
si4063_set_tx_power(0);
|
||||
|
||||
// Temperature Value Offset
|
||||
si4063_write(0x13, 0xF0);
|
||||
// Temperature Sensor Calibration
|
||||
si4063_write(0x12, 0x00);
|
||||
|
||||
// ADC configuration
|
||||
si4063_write(0x0f, 0x80);
|
||||
|
||||
si4063_set_frequency_offset(0);
|
||||
si4063_set_frequency_deviation(5); // Was: 5 for APRS in RS41HUP?
|
||||
|
||||
si4063_set_modulation_type(SI4063_MODULATION_TYPE_NONE);
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef __SI4063_H
|
||||
#define __SI4063_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef enum _si4063_modulation_type {
|
||||
SI4063_MODULATION_TYPE_NONE = 0,
|
||||
SI4063_MODULATION_TYPE_OOK,
|
||||
SI4063_MODULATION_TYPE_FSK,
|
||||
} si4063_modulation_type;
|
||||
|
||||
void si4063_soft_reset();
|
||||
void si4063_enable_tx();
|
||||
void si4063_inhibit_tx();
|
||||
void si4063_disable_tx();
|
||||
void si4063_use_direct_mode(bool use);
|
||||
void si4063_set_tx_frequency(float frequency_mhz);
|
||||
void si4063_set_tx_power(uint8_t power);
|
||||
void si4063_set_frequency_offset(uint16_t offset);
|
||||
void si4063_set_frequency_offset_small(uint8_t offset);
|
||||
void si4063_set_frequency_deviation(uint8_t deviation);
|
||||
void si4063_set_modulation_type(si4063_modulation_type type);
|
||||
int32_t si4063_read_temperature_celsius_100();
|
||||
void si4063_set_sdi_pin(bool high);
|
||||
void si4063_use_sdi_pin(bool use);
|
||||
void si4063_init();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,904 @@
|
|||
#ifdef DFM17
|
||||
/*!
|
||||
* File:
|
||||
* si446x_api_lib.c
|
||||
*
|
||||
* Description:
|
||||
* This file contains the Si446x API library.
|
||||
*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include "bsp.h"
|
||||
|
||||
union si446x_cmd_reply_union Si446xCmd;
|
||||
uint8_t Pro2Cmd[16];
|
||||
|
||||
#ifdef SI446X_PATCH_CMDS
|
||||
uint8_t Si446xPatchCommands[][9] = { SI446X_PATCH_CMDS };
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* This functions is used to reset the si446x radio by applying shutdown and
|
||||
* releasing it. After this function @ref si446x_boot should be called. You
|
||||
* can check if POR has completed by waiting 4 ms or by polling GPIO 0, 2, or 3.
|
||||
* When these GPIOs are high, it is safe to call @ref si446x_boot.
|
||||
*/
|
||||
void si446x_reset(void)
|
||||
{
|
||||
uint8_t loopCount;
|
||||
|
||||
/* Put radio in shutdown, wait then release */
|
||||
radio_hal_AssertShutdown();
|
||||
//! @todo this needs to be a better delay function.
|
||||
for (loopCount = 255; loopCount != 0; loopCount--);
|
||||
radio_hal_DeassertShutdown();
|
||||
for (loopCount = 255; loopCount != 0; loopCount--);
|
||||
radio_comm_ClearCTS();
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function is used to initialize after power-up the radio chip.
|
||||
* Before this function @si446x_reset should be called.
|
||||
*/
|
||||
void si446x_power_up(uint8_t BOOT_OPTIONS, uint8_t XTAL_OPTIONS, uint32_t XO_FREQ)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_POWER_UP;
|
||||
Pro2Cmd[1] = BOOT_OPTIONS;
|
||||
Pro2Cmd[2] = XTAL_OPTIONS;
|
||||
Pro2Cmd[3] = (uint8_t)(XO_FREQ >> 24);
|
||||
Pro2Cmd[4] = (uint8_t)(XO_FREQ >> 16);
|
||||
Pro2Cmd[5] = (uint8_t)(XO_FREQ >> 8);
|
||||
Pro2Cmd[6] = (uint8_t)(XO_FREQ);
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_POWER_UP, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function is used to load all properties and commands with a list of NULL terminated commands.
|
||||
* Before this function @si446x_reset should be called.
|
||||
*/
|
||||
uint8_t si446x_configuration_init(const uint8_t* pSetPropCmd)
|
||||
{
|
||||
uint8_t col;
|
||||
uint8_t numOfBytes;
|
||||
|
||||
/* While cycle as far as the pointer points to a command */
|
||||
while (*pSetPropCmd != 0x00)
|
||||
{
|
||||
/* Commands structure in the array:
|
||||
* --------------------------------
|
||||
* LEN | <LEN length of data>
|
||||
*/
|
||||
|
||||
numOfBytes = *pSetPropCmd++;
|
||||
|
||||
if (numOfBytes > 16u)
|
||||
{
|
||||
/* Number of command bytes exceeds maximal allowable length */
|
||||
return SI446X_COMMAND_ERROR;
|
||||
}
|
||||
|
||||
for (col = 0u; col < numOfBytes; col++)
|
||||
{
|
||||
Pro2Cmd[col] = *pSetPropCmd;
|
||||
pSetPropCmd++;
|
||||
}
|
||||
|
||||
if (radio_comm_SendCmdGetResp(numOfBytes, Pro2Cmd, 0, 0) != 0xFF)
|
||||
{
|
||||
/* Timeout occured */
|
||||
return SI446X_CTS_TIMEOUT;
|
||||
}
|
||||
|
||||
if (radio_hal_NirqLevel() == 0)
|
||||
{
|
||||
/* Get and clear all interrupts. An error has occured... */
|
||||
si446x_get_int_status(0, 0, 0);
|
||||
if (Si446xCmd.GET_INT_STATUS.CHIP_PEND & SI446X_CMD_GET_CHIP_STATUS_REP_CHIP_PEND_CMD_ERROR_PEND_MASK)
|
||||
{
|
||||
return SI446X_COMMAND_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SI446X_SUCCESS;
|
||||
}
|
||||
|
||||
/*! This function sends the PART_INFO command to the radio and receives the answer
|
||||
* into @Si446xCmd union.
|
||||
*/
|
||||
void si446x_part_info(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_PART_INFO;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_PART_INFO,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_PART_INFO,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.PART_INFO.CHIPREV = Pro2Cmd[0];
|
||||
Si446xCmd.PART_INFO.PART = ((uint16_t)Pro2Cmd[1] << 8) & 0xFF00;
|
||||
Si446xCmd.PART_INFO.PART |= (uint16_t)Pro2Cmd[2] & 0x00FF;
|
||||
Si446xCmd.PART_INFO.PBUILD = Pro2Cmd[3];
|
||||
Si446xCmd.PART_INFO.ID = ((uint16_t)Pro2Cmd[4] << 8) & 0xFF00;
|
||||
Si446xCmd.PART_INFO.ID |= (uint16_t)Pro2Cmd[5] & 0x00FF;
|
||||
Si446xCmd.PART_INFO.CUSTOMER = Pro2Cmd[6];
|
||||
Si446xCmd.PART_INFO.ROMID = Pro2Cmd[7];
|
||||
}
|
||||
|
||||
/*! Sends START_TX command to the radio.
|
||||
*
|
||||
* @param CHANNEL Channel number.
|
||||
* @param CONDITION Start TX condition.
|
||||
* @param TX_LEN Payload length (exclude the PH generated CRC).
|
||||
*/
|
||||
void si446x_start_tx(uint8_t CHANNEL, uint8_t CONDITION, uint16_t TX_LEN)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_START_TX;
|
||||
Pro2Cmd[1] = CHANNEL;
|
||||
Pro2Cmd[2] = CONDITION;
|
||||
Pro2Cmd[3] = (uint8_t)(TX_LEN >> 8);
|
||||
Pro2Cmd[4] = (uint8_t)(TX_LEN);
|
||||
Pro2Cmd[5] = 0x00;
|
||||
|
||||
// Don't repeat the packet,
|
||||
// ie. transmit the packet only once
|
||||
Pro2Cmd[6] = 0x00;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_START_TX, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Sends START_RX command to the radio.
|
||||
*
|
||||
* @param CHANNEL Channel number.
|
||||
* @param CONDITION Start RX condition.
|
||||
* @param RX_LEN Payload length (exclude the PH generated CRC).
|
||||
* @param NEXT_STATE1 Next state when Preamble Timeout occurs.
|
||||
* @param NEXT_STATE2 Next state when a valid packet received.
|
||||
* @param NEXT_STATE3 Next state when invalid packet received (e.g. CRC error).
|
||||
*/
|
||||
void si446x_start_rx(uint8_t CHANNEL, uint8_t CONDITION, uint16_t RX_LEN, uint8_t NEXT_STATE1, uint8_t NEXT_STATE2, uint8_t NEXT_STATE3)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_START_RX;
|
||||
Pro2Cmd[1] = CHANNEL;
|
||||
Pro2Cmd[2] = CONDITION;
|
||||
Pro2Cmd[3] = (uint8_t)(RX_LEN >> 8);
|
||||
Pro2Cmd[4] = (uint8_t)(RX_LEN);
|
||||
Pro2Cmd[5] = NEXT_STATE1;
|
||||
Pro2Cmd[6] = NEXT_STATE2;
|
||||
Pro2Cmd[7] = NEXT_STATE3;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_START_RX, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Get the Interrupt status/pending flags form the radio and clear flags if requested.
|
||||
*
|
||||
* @param PH_CLR_PEND Packet Handler pending flags clear.
|
||||
* @param MODEM_CLR_PEND Modem Status pending flags clear.
|
||||
* @param CHIP_CLR_PEND Chip State pending flags clear.
|
||||
*/
|
||||
void si446x_get_int_status(uint8_t PH_CLR_PEND, uint8_t MODEM_CLR_PEND, uint8_t CHIP_CLR_PEND)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_INT_STATUS;
|
||||
Pro2Cmd[1] = PH_CLR_PEND;
|
||||
Pro2Cmd[2] = MODEM_CLR_PEND;
|
||||
Pro2Cmd[3] = CHIP_CLR_PEND;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_INT_STATUS,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_INT_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_INT_STATUS.INT_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_INT_STATUS.INT_STATUS = Pro2Cmd[1];
|
||||
Si446xCmd.GET_INT_STATUS.PH_PEND = Pro2Cmd[2];
|
||||
Si446xCmd.GET_INT_STATUS.PH_STATUS = Pro2Cmd[3];
|
||||
Si446xCmd.GET_INT_STATUS.MODEM_PEND = Pro2Cmd[4];
|
||||
Si446xCmd.GET_INT_STATUS.MODEM_STATUS = Pro2Cmd[5];
|
||||
Si446xCmd.GET_INT_STATUS.CHIP_PEND = Pro2Cmd[6];
|
||||
Si446xCmd.GET_INT_STATUS.CHIP_STATUS = Pro2Cmd[7];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Send GPIO pin config command to the radio and reads the answer into
|
||||
* @Si446xCmd union.
|
||||
*
|
||||
* @param GPIO0 GPIO0 configuration.
|
||||
* @param GPIO1 GPIO1 configuration.
|
||||
* @param GPIO2 GPIO2 configuration.
|
||||
* @param GPIO3 GPIO3 configuration.
|
||||
* @param NIRQ NIRQ configuration.
|
||||
* @param SDO SDO configuration.
|
||||
* @param GEN_CONFIG General pin configuration.
|
||||
*/
|
||||
void si446x_gpio_pin_cfg(uint8_t GPIO0, uint8_t GPIO1, uint8_t GPIO2, uint8_t GPIO3, uint8_t NIRQ, uint8_t SDO, uint8_t GEN_CONFIG)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GPIO_PIN_CFG;
|
||||
Pro2Cmd[1] = GPIO0;
|
||||
Pro2Cmd[2] = GPIO1;
|
||||
Pro2Cmd[3] = GPIO2;
|
||||
Pro2Cmd[4] = GPIO3;
|
||||
Pro2Cmd[5] = NIRQ;
|
||||
Pro2Cmd[6] = SDO;
|
||||
Pro2Cmd[7] = GEN_CONFIG;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GPIO_PIN_CFG,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GPIO_PIN_CFG,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[0] = Pro2Cmd[0];
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[1] = Pro2Cmd[1];
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[2] = Pro2Cmd[2];
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[3] = Pro2Cmd[3];
|
||||
Si446xCmd.GPIO_PIN_CFG.NIRQ = Pro2Cmd[4];
|
||||
Si446xCmd.GPIO_PIN_CFG.SDO = Pro2Cmd[5];
|
||||
Si446xCmd.GPIO_PIN_CFG.GEN_CONFIG = Pro2Cmd[6];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Send SET_PROPERTY command to the radio.
|
||||
*
|
||||
* @param GROUP Property group.
|
||||
* @param NUM_PROPS Number of property to be set. The properties must be in ascending order
|
||||
* in their sub-property aspect. Max. 12 properties can be set in one command.
|
||||
* @param START_PROP Start sub-property address.
|
||||
*/
|
||||
#ifdef __C51__
|
||||
#pragma maxargs (13) /* allow 13 bytes for parameters */
|
||||
#endif
|
||||
void si446x_set_property( uint8_t GROUP, uint8_t NUM_PROPS, uint8_t START_PROP, ... )
|
||||
{
|
||||
va_list argList;
|
||||
uint8_t cmdIndex;
|
||||
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_SET_PROPERTY;
|
||||
Pro2Cmd[1] = GROUP;
|
||||
Pro2Cmd[2] = NUM_PROPS;
|
||||
Pro2Cmd[3] = START_PROP;
|
||||
|
||||
va_start (argList, START_PROP);
|
||||
cmdIndex = 4;
|
||||
while(NUM_PROPS--)
|
||||
{
|
||||
Pro2Cmd[cmdIndex] = va_arg (argList, uint8_t);
|
||||
cmdIndex++;
|
||||
}
|
||||
va_end(argList);
|
||||
|
||||
radio_comm_SendCmd( cmdIndex, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Issue a change state command to the radio.
|
||||
*
|
||||
* @param NEXT_STATE1 Next state.
|
||||
*/
|
||||
void si446x_change_state(uint8_t NEXT_STATE1)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_CHANGE_STATE;
|
||||
Pro2Cmd[1] = NEXT_STATE1;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_CHANGE_STATE, Pro2Cmd );
|
||||
}
|
||||
|
||||
|
||||
#ifdef RADIO_DRIVER_EXTENDED_SUPPORT
|
||||
/* Extended driver support functions */
|
||||
/*!
|
||||
* Sends NOP command to the radio. Can be used to maintain SPI communication.
|
||||
*/
|
||||
void si446x_nop(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_NOP;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_NOP, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Send the FIFO_INFO command to the radio. Optionally resets the TX/RX FIFO. Reads the radio response back
|
||||
* into @Si446xCmd.
|
||||
*
|
||||
* @param FIFO RX/TX FIFO reset flags.
|
||||
*/
|
||||
void si446x_fifo_info(uint8_t FIFO)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_FIFO_INFO;
|
||||
Pro2Cmd[1] = FIFO;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_FIFO_INFO,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_FIFO_INFO,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.FIFO_INFO.RX_FIFO_COUNT = Pro2Cmd[0];
|
||||
Si446xCmd.FIFO_INFO.TX_FIFO_SPACE = Pro2Cmd[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* The function can be used to load data into TX FIFO.
|
||||
*
|
||||
* @param numBytes Data length to be load.
|
||||
* @param pTxData Pointer to the data (uint8_t*).
|
||||
*/
|
||||
void si446x_write_tx_fifo(uint8_t numBytes, uint8_t* pTxData)
|
||||
{
|
||||
radio_comm_WriteData( SI446X_CMD_ID_WRITE_TX_FIFO, 0, numBytes, pTxData );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads the RX FIFO content from the radio.
|
||||
*
|
||||
* @param numBytes Data length to be read.
|
||||
* @param pRxData Pointer to the buffer location.
|
||||
*/
|
||||
void si446x_read_rx_fifo(uint8_t numBytes, uint8_t* pRxData)
|
||||
{
|
||||
radio_comm_ReadData( SI446X_CMD_ID_READ_RX_FIFO, 0, numBytes, pRxData );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Get property values from the radio. Reads them into Si446xCmd union.
|
||||
*
|
||||
* @param GROUP Property group number.
|
||||
* @param NUM_PROPS Number of properties to be read.
|
||||
* @param START_PROP Starting sub-property number.
|
||||
*/
|
||||
void si446x_get_property(uint8_t GROUP, uint8_t NUM_PROPS, uint8_t START_PROP)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_PROPERTY;
|
||||
Pro2Cmd[1] = GROUP;
|
||||
Pro2Cmd[2] = NUM_PROPS;
|
||||
Pro2Cmd[3] = START_PROP;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_PROPERTY,
|
||||
Pro2Cmd,
|
||||
Pro2Cmd[2],
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_PROPERTY.DATA[0 ] = Pro2Cmd[0];
|
||||
Si446xCmd.GET_PROPERTY.DATA[1 ] = Pro2Cmd[1];
|
||||
Si446xCmd.GET_PROPERTY.DATA[2 ] = Pro2Cmd[2];
|
||||
Si446xCmd.GET_PROPERTY.DATA[3 ] = Pro2Cmd[3];
|
||||
Si446xCmd.GET_PROPERTY.DATA[4 ] = Pro2Cmd[4];
|
||||
Si446xCmd.GET_PROPERTY.DATA[5 ] = Pro2Cmd[5];
|
||||
Si446xCmd.GET_PROPERTY.DATA[6 ] = Pro2Cmd[6];
|
||||
Si446xCmd.GET_PROPERTY.DATA[7 ] = Pro2Cmd[7];
|
||||
Si446xCmd.GET_PROPERTY.DATA[8 ] = Pro2Cmd[8];
|
||||
Si446xCmd.GET_PROPERTY.DATA[9 ] = Pro2Cmd[9];
|
||||
Si446xCmd.GET_PROPERTY.DATA[10] = Pro2Cmd[10];
|
||||
Si446xCmd.GET_PROPERTY.DATA[11] = Pro2Cmd[11];
|
||||
Si446xCmd.GET_PROPERTY.DATA[12] = Pro2Cmd[12];
|
||||
Si446xCmd.GET_PROPERTY.DATA[13] = Pro2Cmd[13];
|
||||
Si446xCmd.GET_PROPERTY.DATA[14] = Pro2Cmd[14];
|
||||
Si446xCmd.GET_PROPERTY.DATA[15] = Pro2Cmd[15];
|
||||
}
|
||||
|
||||
|
||||
#ifdef RADIO_DRIVER_FULL_SUPPORT
|
||||
/* Full driver support functions */
|
||||
|
||||
/*!
|
||||
* Sends the FUNC_INFO command to the radio, then reads the resonse into @Si446xCmd union.
|
||||
*/
|
||||
void si446x_func_info(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_FUNC_INFO;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_FUNC_INFO,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_FUNC_INFO,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.FUNC_INFO.REVEXT = Pro2Cmd[0];
|
||||
Si446xCmd.FUNC_INFO.REVBRANCH = Pro2Cmd[1];
|
||||
Si446xCmd.FUNC_INFO.REVINT = Pro2Cmd[2];
|
||||
Si446xCmd.FUNC_INFO.FUNC = Pro2Cmd[5];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads the Fast Response Registers starting with A register into @Si446xCmd union.
|
||||
*
|
||||
* @param respByteCount Number of Fast Response Registers to be read.
|
||||
*/
|
||||
void si446x_frr_a_read(uint8_t respByteCount)
|
||||
{
|
||||
radio_comm_ReadData(SI446X_CMD_ID_FRR_A_READ,
|
||||
0,
|
||||
respByteCount,
|
||||
Pro2Cmd);
|
||||
|
||||
Si446xCmd.FRR_A_READ.FRR_A_VALUE = Pro2Cmd[0];
|
||||
Si446xCmd.FRR_A_READ.FRR_B_VALUE = Pro2Cmd[1];
|
||||
Si446xCmd.FRR_A_READ.FRR_C_VALUE = Pro2Cmd[2];
|
||||
Si446xCmd.FRR_A_READ.FRR_D_VALUE = Pro2Cmd[3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads the Fast Response Registers starting with B register into @Si446xCmd union.
|
||||
*
|
||||
* @param respByteCount Number of Fast Response Registers to be read.
|
||||
*/
|
||||
void si446x_frr_b_read(uint8_t respByteCount)
|
||||
{
|
||||
radio_comm_ReadData(SI446X_CMD_ID_FRR_B_READ,
|
||||
0,
|
||||
respByteCount,
|
||||
Pro2Cmd);
|
||||
|
||||
Si446xCmd.FRR_B_READ.FRR_B_VALUE = Pro2Cmd[0];
|
||||
Si446xCmd.FRR_B_READ.FRR_C_VALUE = Pro2Cmd[1];
|
||||
Si446xCmd.FRR_B_READ.FRR_D_VALUE = Pro2Cmd[2];
|
||||
Si446xCmd.FRR_B_READ.FRR_A_VALUE = Pro2Cmd[3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads the Fast Response Registers starting with C register into @Si446xCmd union.
|
||||
*
|
||||
* @param respByteCount Number of Fast Response Registers to be read.
|
||||
*/
|
||||
void si446x_frr_c_read(uint8_t respByteCount)
|
||||
{
|
||||
radio_comm_ReadData(SI446X_CMD_ID_FRR_C_READ,
|
||||
0,
|
||||
respByteCount,
|
||||
Pro2Cmd);
|
||||
|
||||
Si446xCmd.FRR_C_READ.FRR_C_VALUE = Pro2Cmd[0];
|
||||
Si446xCmd.FRR_C_READ.FRR_D_VALUE = Pro2Cmd[1];
|
||||
Si446xCmd.FRR_C_READ.FRR_A_VALUE = Pro2Cmd[2];
|
||||
Si446xCmd.FRR_C_READ.FRR_B_VALUE = Pro2Cmd[3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads the Fast Response Registers starting with D register into @Si446xCmd union.
|
||||
*
|
||||
* @param respByteCount Number of Fast Response Registers to be read.
|
||||
*/
|
||||
void si446x_frr_d_read(uint8_t respByteCount)
|
||||
{
|
||||
radio_comm_ReadData(SI446X_CMD_ID_FRR_D_READ,
|
||||
0,
|
||||
respByteCount,
|
||||
Pro2Cmd);
|
||||
|
||||
Si446xCmd.FRR_D_READ.FRR_D_VALUE = Pro2Cmd[0];
|
||||
Si446xCmd.FRR_D_READ.FRR_A_VALUE = Pro2Cmd[1];
|
||||
Si446xCmd.FRR_D_READ.FRR_B_VALUE = Pro2Cmd[2];
|
||||
Si446xCmd.FRR_D_READ.FRR_C_VALUE = Pro2Cmd[3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads the ADC values from the radio into @Si446xCmd union.
|
||||
*
|
||||
* @param ADC_EN ADC enable parameter.
|
||||
*/
|
||||
void si446x_get_adc_reading(uint8_t ADC_EN)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_ADC_READING;
|
||||
Pro2Cmd[1] = ADC_EN;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_ADC_READING,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_ADC_READING,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_ADC_READING.GPIO_ADC = ((uint16_t)Pro2Cmd[0] << 8) & 0xFF00;
|
||||
Si446xCmd.GET_ADC_READING.GPIO_ADC |= (uint16_t)Pro2Cmd[1] & 0x00FF;
|
||||
Si446xCmd.GET_ADC_READING.BATTERY_ADC = ((uint16_t)Pro2Cmd[2] << 8) & 0xFF00;
|
||||
Si446xCmd.GET_ADC_READING.BATTERY_ADC |= (uint16_t)Pro2Cmd[3] & 0x00FF;
|
||||
Si446xCmd.GET_ADC_READING.TEMP_ADC = ((uint16_t)Pro2Cmd[4] << 8) & 0xFF00;
|
||||
Si446xCmd.GET_ADC_READING.TEMP_ADC |= (uint16_t)Pro2Cmd[5] & 0x00FF;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Receives information from the radio of the current packet. Optionally can be used to modify
|
||||
* the Packet Handler properties during packet reception.
|
||||
*
|
||||
* @param FIELD_NUMBER_MASK Packet Field number mask value.
|
||||
* @param LEN Length value.
|
||||
* @param DIFF_LEN Difference length.
|
||||
*/
|
||||
void si446x_get_packet_info(uint8_t FIELD_NUMBER_MASK, uint16_t LEN, int16_t DIFF_LEN )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_PACKET_INFO;
|
||||
Pro2Cmd[1] = FIELD_NUMBER_MASK;
|
||||
Pro2Cmd[2] = (uint8_t)(LEN >> 8);
|
||||
Pro2Cmd[3] = (uint8_t)(LEN);
|
||||
// the different of the byte, althrough it is signed, but to command hander
|
||||
// it can treat it as unsigned
|
||||
Pro2Cmd[4] = (uint8_t)((uint16_t)DIFF_LEN >> 8);
|
||||
Pro2Cmd[5] = (uint8_t)(DIFF_LEN);
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_PACKET_INFO,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_PACKET_INFO,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.PACKET_INFO.LENGTH = ((uint16_t)Pro2Cmd[0] << 8) & 0xFF00;
|
||||
Si446xCmd.PACKET_INFO.LENGTH |= (uint16_t)Pro2Cmd[1] & 0x00FF;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Gets the Packet Handler status flags. Optionally clears them.
|
||||
*
|
||||
* @param PH_CLR_PEND Flags to clear.
|
||||
*/
|
||||
void si446x_get_ph_status(uint8_t PH_CLR_PEND)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_PH_STATUS;
|
||||
Pro2Cmd[1] = PH_CLR_PEND;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_PH_STATUS,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_PH_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_PH_STATUS.PH_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_PH_STATUS.PH_STATUS = Pro2Cmd[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Gets the Modem status flags. Optionally clears them.
|
||||
*
|
||||
* @param MODEM_CLR_PEND Flags to clear.
|
||||
*/
|
||||
void si446x_get_modem_status( uint8_t MODEM_CLR_PEND )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_MODEM_STATUS;
|
||||
Pro2Cmd[1] = MODEM_CLR_PEND;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_MODEM_STATUS,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_MODEM_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_MODEM_STATUS.MODEM_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_MODEM_STATUS.MODEM_STATUS = Pro2Cmd[1];
|
||||
Si446xCmd.GET_MODEM_STATUS.CURR_RSSI = Pro2Cmd[2];
|
||||
Si446xCmd.GET_MODEM_STATUS.LATCH_RSSI = Pro2Cmd[3];
|
||||
Si446xCmd.GET_MODEM_STATUS.ANT1_RSSI = Pro2Cmd[4];
|
||||
Si446xCmd.GET_MODEM_STATUS.ANT2_RSSI = Pro2Cmd[5];
|
||||
Si446xCmd.GET_MODEM_STATUS.AFC_FREQ_OFFSET = ((uint16_t)Pro2Cmd[6] << 8) & 0xFF00;
|
||||
Si446xCmd.GET_MODEM_STATUS.AFC_FREQ_OFFSET |= (uint16_t)Pro2Cmd[7] & 0x00FF;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Gets the Chip status flags. Optionally clears them.
|
||||
*
|
||||
* @param CHIP_CLR_PEND Flags to clear.
|
||||
*/
|
||||
void si446x_get_chip_status( uint8_t CHIP_CLR_PEND )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_CHIP_STATUS;
|
||||
Pro2Cmd[1] = CHIP_CLR_PEND;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_CHIP_STATUS,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_CHIP_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_CHIP_STATUS.CHIP_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_CHIP_STATUS.CHIP_STATUS = Pro2Cmd[1];
|
||||
Si446xCmd.GET_CHIP_STATUS.CMD_ERR_STATUS = Pro2Cmd[2];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Performs image rejection calibration. Completion can be monitored by polling CTS or waiting for CHIP_READY interrupt source.
|
||||
*
|
||||
* @param SEARCHING_STEP_SIZE
|
||||
* @param SEARCHING_RSSI_AVG
|
||||
* @param RX_CHAIN_SETTING1
|
||||
* @param RX_CHAIN_SETTING2
|
||||
*/
|
||||
void si446x_ircal(uint8_t SEARCHING_STEP_SIZE, uint8_t SEARCHING_RSSI_AVG, uint8_t RX_CHAIN_SETTING1, uint8_t RX_CHAIN_SETTING2)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_IRCAL;
|
||||
Pro2Cmd[1] = SEARCHING_STEP_SIZE;
|
||||
Pro2Cmd[2] = SEARCHING_RSSI_AVG;
|
||||
Pro2Cmd[3] = RX_CHAIN_SETTING1;
|
||||
Pro2Cmd[4] = RX_CHAIN_SETTING2;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_IRCAL, Pro2Cmd);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Image rejection calibration. Forces a specific value for IR calibration, and reads back calibration values from previous calibrations
|
||||
*
|
||||
* @param IRCAL_AMP
|
||||
* @param IRCAL_PH
|
||||
*/
|
||||
void si446x_ircal_manual(uint8_t IRCAL_AMP, uint8_t IRCAL_PH)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_IRCAL_MANUAL;
|
||||
Pro2Cmd[1] = IRCAL_AMP;
|
||||
Pro2Cmd[2] = IRCAL_PH;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_IRCAL_MANUAL,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_IRCAL_MANUAL,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.IRCAL_MANUAL.IRCAL_AMP_REPLY = Pro2Cmd[0];
|
||||
Si446xCmd.IRCAL_MANUAL.IRCAL_PH_REPLY = Pro2Cmd[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Requests the current state of the device and lists pending TX and RX requests
|
||||
*/
|
||||
void si446x_request_device_state(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_REQUEST_DEVICE_STATE;
|
||||
|
||||
radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_REQUEST_DEVICE_STATE,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_REQUEST_DEVICE_STATE,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.REQUEST_DEVICE_STATE.CURR_STATE = Pro2Cmd[0];
|
||||
Si446xCmd.REQUEST_DEVICE_STATE.CURRENT_CHANNEL = Pro2Cmd[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* While in TX state this will hop to the frequency specified by the parameters
|
||||
*
|
||||
* @param INTE New INTE register value.
|
||||
* @param FRAC2 New FRAC2 register value.
|
||||
* @param FRAC1 New FRAC1 register value.
|
||||
* @param FRAC0 New FRAC0 register value.
|
||||
* @param VCO_CNT1 New VCO_CNT1 register value.
|
||||
* @param VCO_CNT0 New VCO_CNT0 register value.
|
||||
* @param PLL_SETTLE_TIME1 New PLL_SETTLE_TIME1 register value.
|
||||
* @param PLL_SETTLE_TIME0 New PLL_SETTLE_TIME0 register value.
|
||||
*/
|
||||
void si446x_tx_hop(uint8_t INTE, uint8_t FRAC2, uint8_t FRAC1, uint8_t FRAC0, uint8_t VCO_CNT1, uint8_t VCO_CNT0, uint8_t PLL_SETTLE_TIME1, uint8_t PLL_SETTLE_TIME0)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_TX_HOP;
|
||||
Pro2Cmd[1] = INTE;
|
||||
Pro2Cmd[2] = FRAC2;
|
||||
Pro2Cmd[3] = FRAC1;
|
||||
Pro2Cmd[4] = FRAC0;
|
||||
Pro2Cmd[5] = VCO_CNT1;
|
||||
Pro2Cmd[6] = VCO_CNT0;
|
||||
Pro2Cmd[7] = PLL_SETTLE_TIME1;
|
||||
Pro2Cmd[8] = PLL_SETTLE_TIME0;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_TX_HOP, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* While in RX state this will hop to the frequency specified by the parameters and start searching for a preamble.
|
||||
*
|
||||
* @param INTE New INTE register value.
|
||||
* @param FRAC2 New FRAC2 register value.
|
||||
* @param FRAC1 New FRAC1 register value.
|
||||
* @param FRAC0 New FRAC0 register value.
|
||||
* @param VCO_CNT1 New VCO_CNT1 register value.
|
||||
* @param VCO_CNT0 New VCO_CNT0 register value.
|
||||
*/
|
||||
void si446x_rx_hop(uint8_t INTE, uint8_t FRAC2, uint8_t FRAC1, uint8_t FRAC0, uint8_t VCO_CNT1, uint8_t VCO_CNT0)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_RX_HOP;
|
||||
Pro2Cmd[1] = INTE;
|
||||
Pro2Cmd[2] = FRAC2;
|
||||
Pro2Cmd[3] = FRAC1;
|
||||
Pro2Cmd[4] = FRAC0;
|
||||
Pro2Cmd[5] = VCO_CNT1;
|
||||
Pro2Cmd[6] = VCO_CNT0;
|
||||
|
||||
radio_comm_SendCmd( SI446X_CMD_ARG_COUNT_RX_HOP, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*! Sends START_TX command ID to the radio with no input parameters
|
||||
*
|
||||
*/
|
||||
void si446x_start_tx_fast( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_START_TX;
|
||||
|
||||
radio_comm_SendCmd( 1, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Sends START_RX command ID to the radio with no input parameters
|
||||
*
|
||||
*/
|
||||
void si446x_start_rx_fast( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_START_RX;
|
||||
|
||||
radio_comm_SendCmd( 1, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear all Interrupt status/pending flags. Does NOT read back interrupt flags
|
||||
*
|
||||
*/
|
||||
void si446x_get_int_status_fast_clear( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_INT_STATUS;
|
||||
|
||||
radio_comm_SendCmd( 1, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear and read all Interrupt status/pending flags
|
||||
*
|
||||
*/
|
||||
void si446x_get_int_status_fast_clear_read(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_INT_STATUS;
|
||||
|
||||
radio_comm_SendCmdGetResp( 1,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_INT_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_INT_STATUS.INT_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_INT_STATUS.INT_STATUS = Pro2Cmd[1];
|
||||
Si446xCmd.GET_INT_STATUS.PH_PEND = Pro2Cmd[2];
|
||||
Si446xCmd.GET_INT_STATUS.PH_STATUS = Pro2Cmd[3];
|
||||
Si446xCmd.GET_INT_STATUS.MODEM_PEND = Pro2Cmd[4];
|
||||
Si446xCmd.GET_INT_STATUS.MODEM_STATUS = Pro2Cmd[5];
|
||||
Si446xCmd.GET_INT_STATUS.CHIP_PEND = Pro2Cmd[6];
|
||||
Si446xCmd.GET_INT_STATUS.CHIP_STATUS = Pro2Cmd[7];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads back current GPIO pin configuration. Does NOT configure GPIO pins
|
||||
*
|
||||
*/
|
||||
void si446x_gpio_pin_cfg_fast( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GPIO_PIN_CFG;
|
||||
|
||||
radio_comm_SendCmdGetResp( 1,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GPIO_PIN_CFG,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[0] = Pro2Cmd[0];
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[1] = Pro2Cmd[1];
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[2] = Pro2Cmd[2];
|
||||
Si446xCmd.GPIO_PIN_CFG.GPIO[3] = Pro2Cmd[3];
|
||||
Si446xCmd.GPIO_PIN_CFG.NIRQ = Pro2Cmd[4];
|
||||
Si446xCmd.GPIO_PIN_CFG.SDO = Pro2Cmd[5];
|
||||
Si446xCmd.GPIO_PIN_CFG.GEN_CONFIG = Pro2Cmd[6];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Clear all Packet Handler status flags. Does NOT read back interrupt flags
|
||||
*
|
||||
*/
|
||||
void si446x_get_ph_status_fast_clear( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_PH_STATUS;
|
||||
Pro2Cmd[1] = 0;
|
||||
|
||||
radio_comm_SendCmd( 2, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear and read all Packet Handler status flags.
|
||||
*
|
||||
*/
|
||||
void si446x_get_ph_status_fast_clear_read(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_PH_STATUS;
|
||||
|
||||
radio_comm_SendCmdGetResp( 1,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_PH_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_PH_STATUS.PH_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_PH_STATUS.PH_STATUS = Pro2Cmd[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear all Modem status flags. Does NOT read back interrupt flags
|
||||
*
|
||||
*/
|
||||
void si446x_get_modem_status_fast_clear( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_MODEM_STATUS;
|
||||
Pro2Cmd[1] = 0;
|
||||
|
||||
radio_comm_SendCmd( 2, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear and read all Modem status flags.
|
||||
*
|
||||
*/
|
||||
void si446x_get_modem_status_fast_clear_read( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_MODEM_STATUS;
|
||||
|
||||
radio_comm_SendCmdGetResp( 1,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_MODEM_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_MODEM_STATUS.MODEM_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_MODEM_STATUS.MODEM_STATUS = Pro2Cmd[1];
|
||||
Si446xCmd.GET_MODEM_STATUS.CURR_RSSI = Pro2Cmd[2];
|
||||
Si446xCmd.GET_MODEM_STATUS.LATCH_RSSI = Pro2Cmd[3];
|
||||
Si446xCmd.GET_MODEM_STATUS.ANT1_RSSI = Pro2Cmd[4];
|
||||
Si446xCmd.GET_MODEM_STATUS.ANT2_RSSI = Pro2Cmd[5];
|
||||
Si446xCmd.GET_MODEM_STATUS.AFC_FREQ_OFFSET = ((uint16_t)Pro2Cmd[6] << 8) & 0xFF00;
|
||||
Si446xCmd.GET_MODEM_STATUS.AFC_FREQ_OFFSET |= (uint16_t)Pro2Cmd[7] & 0x00FF;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear all Chip status flags. Does NOT read back interrupt flags
|
||||
*
|
||||
*/
|
||||
void si446x_get_chip_status_fast_clear( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_CHIP_STATUS;
|
||||
Pro2Cmd[1] = 0;
|
||||
|
||||
radio_comm_SendCmd( 2, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Clear and read all Chip status flags.
|
||||
*
|
||||
*/
|
||||
void si446x_get_chip_status_fast_clear_read( void )
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_GET_CHIP_STATUS;
|
||||
|
||||
radio_comm_SendCmdGetResp( 1,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_GET_CHIP_STATUS,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.GET_CHIP_STATUS.CHIP_PEND = Pro2Cmd[0];
|
||||
Si446xCmd.GET_CHIP_STATUS.CHIP_STATUS = Pro2Cmd[1];
|
||||
Si446xCmd.GET_CHIP_STATUS.CMD_ERR_STATUS = Pro2Cmd[2];
|
||||
}
|
||||
|
||||
/*!
|
||||
* Resets the RX/TX FIFO. Does not read back anything from TX/RX FIFO
|
||||
*
|
||||
*/
|
||||
void si446x_fifo_info_fast_reset(uint8_t FIFO)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_FIFO_INFO;
|
||||
Pro2Cmd[1] = FIFO;
|
||||
|
||||
radio_comm_SendCmd( 2, Pro2Cmd );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Reads RX/TX FIFO count space. Does NOT reset RX/TX FIFO
|
||||
*
|
||||
*/
|
||||
void si446x_fifo_info_fast_read(void)
|
||||
{
|
||||
Pro2Cmd[0] = SI446X_CMD_ID_FIFO_INFO;
|
||||
|
||||
radio_comm_SendCmdGetResp( 1,
|
||||
Pro2Cmd,
|
||||
SI446X_CMD_REPLY_COUNT_FIFO_INFO,
|
||||
Pro2Cmd );
|
||||
|
||||
Si446xCmd.FIFO_INFO.RX_FIFO_COUNT = Pro2Cmd[0];
|
||||
Si446xCmd.FIFO_INFO.TX_FIFO_SPACE = Pro2Cmd[1];
|
||||
}
|
||||
|
||||
#endif /* RADIO_DRIVER_FULL_SUPPORT */
|
||||
|
||||
#endif /* RADIO_DRIVER_EXTENDED_SUPPORT */
|
||||
#endif //DFM17
|
|
@ -0,0 +1,104 @@
|
|||
/*!
|
||||
* File:
|
||||
* si446x_api_lib.h
|
||||
*
|
||||
* Description:
|
||||
* This file contains the Si446x API library.
|
||||
*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _SI446X_API_LIB_H_
|
||||
#define _SI446X_API_LIB_H_
|
||||
|
||||
extern union si446x_cmd_reply_union Si446xCmd;
|
||||
extern uint8_t Pro2Cmd[16];
|
||||
|
||||
|
||||
#define SI466X_FIFO_SIZE 64
|
||||
|
||||
enum
|
||||
{
|
||||
SI446X_SUCCESS,
|
||||
SI446X_NO_PATCH,
|
||||
SI446X_CTS_TIMEOUT,
|
||||
SI446X_PATCH_FAIL,
|
||||
SI446X_COMMAND_ERROR
|
||||
};
|
||||
|
||||
/* Minimal driver support functions */
|
||||
void si446x_reset(void);
|
||||
void si446x_power_up(uint8_t BOOT_OPTIONS, uint8_t XTAL_OPTIONS, uint32_t XO_FREQ);
|
||||
|
||||
uint8_t si446x_configuration_init(const uint8_t* pSetPropCmd);
|
||||
uint8_t si446x_apply_patch(void);
|
||||
void si446x_part_info(void);
|
||||
|
||||
void si446x_start_tx(uint8_t CHANNEL, uint8_t CONDITION, uint16_t TX_LEN);
|
||||
void si446x_start_rx(uint8_t CHANNEL, uint8_t CONDITION, uint16_t RX_LEN, uint8_t NEXT_STATE1, uint8_t NEXT_STATE2, uint8_t NEXT_STATE3);
|
||||
|
||||
void si446x_get_int_status(uint8_t PH_CLR_PEND, uint8_t MODEM_CLR_PEND, uint8_t CHIP_CLR_PEND);
|
||||
void si446x_gpio_pin_cfg(uint8_t GPIO0, uint8_t GPIO1, uint8_t GPIO2, uint8_t GPIO3, uint8_t NIRQ, uint8_t SDO, uint8_t GEN_CONFIG);
|
||||
|
||||
void si446x_set_property( uint8_t GROUP, uint8_t NUM_PROPS, uint8_t START_PROP, ... );
|
||||
void si446x_change_state(uint8_t NEXT_STATE1);
|
||||
|
||||
#ifdef RADIO_DRIVER_EXTENDED_SUPPORT
|
||||
/* Extended driver support functions */
|
||||
void si446x_nop(void);
|
||||
|
||||
void si446x_fifo_info(uint8_t FIFO);
|
||||
void si446x_write_tx_fifo( uint8_t numBytes, uint8_t* pData );
|
||||
void si446x_read_rx_fifo( uint8_t numBytes, uint8_t* pRxData );
|
||||
|
||||
void si446x_get_property(uint8_t GROUP, uint8_t NUM_PROPS, uint8_t START_PROP);
|
||||
|
||||
#ifdef RADIO_DRIVER_FULL_SUPPORT
|
||||
/* Full driver support functions */
|
||||
void si446x_func_info(void);
|
||||
|
||||
void si446x_frr_a_read(uint8_t respByteCount);
|
||||
void si446x_frr_b_read(uint8_t respByteCount);
|
||||
void si446x_frr_c_read(uint8_t respByteCount);
|
||||
void si446x_frr_d_read(uint8_t respByteCount);
|
||||
|
||||
void si446x_get_adc_reading(uint8_t ADC_EN);
|
||||
void si446x_get_packet_info(uint8_t FIELD_NUMBER_MASK, uint16_t LEN, int16_t DIFF_LEN );
|
||||
void si446x_get_ph_status(uint8_t PH_CLR_PEND);
|
||||
void si446x_get_modem_status( uint8_t MODEM_CLR_PEND );
|
||||
void si446x_get_chip_status( uint8_t CHIP_CLR_PEND );
|
||||
|
||||
void si446x_ircal_manual(uint8_t IRCAL_AMP, uint8_t IRCAL_PH);
|
||||
void si446x_protocol_cfg(uint8_t PROTOCOL);
|
||||
|
||||
void si446x_request_device_state(void);
|
||||
|
||||
void si446x_tx_hop(uint8_t INTE, uint8_t FRAC2, uint8_t FRAC1, uint8_t FRAC0, uint8_t VCO_CNT1, uint8_t VCO_CNT0, uint8_t PLL_SETTLE_TIME1, uint8_t PLL_SETTLE_TIME0);
|
||||
void si446x_rx_hop(uint8_t INTE, uint8_t FRAC2, uint8_t FRAC1, uint8_t FRAC0, uint8_t VCO_CNT1, uint8_t VCO_CNT0);
|
||||
|
||||
void si446x_start_tx_fast( void );
|
||||
void si446x_start_rx_fast( void );
|
||||
|
||||
void si446x_get_int_status_fast_clear( void );
|
||||
void si446x_get_int_status_fast_clear_read( void );
|
||||
|
||||
void si446x_gpio_pin_cfg_fast( void );
|
||||
|
||||
void si446x_get_ph_status_fast_clear( void );
|
||||
void si446x_get_ph_status_fast_clear_read( void );
|
||||
|
||||
void si446x_get_modem_status_fast_clear( void );
|
||||
void si446x_get_modem_status_fast_clear_read( void );
|
||||
|
||||
void si446x_get_chip_status_fast_clear( void );
|
||||
void si446x_get_chip_status_fast_clear_read( void );
|
||||
|
||||
void si446x_fifo_info_fast_reset(uint8_t FIFO);
|
||||
void si446x_fifo_info_fast_read(void);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#endif //_SI446X_API_LIB_H_
|
|
@ -0,0 +1,14 @@
|
|||
/*!
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _SI446X_DEFS_H_
|
||||
#define _SI446X_DEFS_H_
|
||||
|
||||
#include "si446x_cmd.h"
|
||||
|
||||
#include "si446x_prop.h"
|
||||
|
||||
#endif // _SI446X_DEFS_H_
|
|
@ -0,0 +1,109 @@
|
|||
#ifdef DFM17
|
||||
/*
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*
|
||||
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
|
||||
*/
|
||||
|
||||
#include "stdint.h"
|
||||
#include "bsp.h"
|
||||
|
||||
|
||||
//SEGMENT_VARIABLE( Si446xChipPend, U8, SEG_BDATA );
|
||||
//SBIT(Si446xWUTPend,Si446xChipPend,0);
|
||||
//SBIT(Si446xLowBattPend,Si446xChipPend,1);
|
||||
//SBIT(Si446xChipReadyPend,Si446xChipPend,2);
|
||||
//SBIT(Si446xCmdErrPend,Si446xChipPend,2);
|
||||
//SBIT(Si446xStateChangePend,Si446xChipPend,2);
|
||||
//SBIT(Si446xFifoUnderflowOverflowErrorPend,Si446xChipPend,2);
|
||||
//SEGMENT_VARIABLE( Si446xPhPend, U8, SEG_BDATA );
|
||||
//SEGMENT_VARIABLE( Si446xModemPend, U8, SEG_BDATA );
|
||||
|
||||
#define Si446xWUTPend Si446xPhPend0
|
||||
#define Si446xLowBattPend Si446xPhPend1
|
||||
#define Si446xChipReadyPend Si446xPhPend2
|
||||
#define Si446xCmdErrPend Si446xPhPend3
|
||||
#define Si446xStateChangePend Si446xPhPend4
|
||||
#define Si446xFifoUnderflowOverflowErrorPend Si446xPhPend5
|
||||
#define Si446xDummyPhPend6 Si446xPhPend6
|
||||
#define Si446xDummyPhPend7 Si446xPhPend7
|
||||
|
||||
#define Si446xSyncDetectPend Si446xModemPend0
|
||||
#define Si446xPreambleDetectPend Si446xModemPend1
|
||||
#define Si446xInvalidPreamblePend Si446xModemPend2
|
||||
#define Si446xRssiPend Si446xModemPend3
|
||||
#define Si446xRssiJumpPend Si446xModemPend4
|
||||
#define Si446xInvalidSyncPend Si446xModemPend5
|
||||
#define Si446xDummyModemPend6 Si446xModemPend6
|
||||
#define Si446xDummyModemPend7 Si446xModemPend7
|
||||
|
||||
#define Si446xRxFifoAlmostFullPend Si446xChipPend0
|
||||
#define Si446xTxFifoAlmostEmptyPend Si446xChipPend1
|
||||
#define Si446xCrc16ErrorPend Si446xChipPend2
|
||||
#define Si446xCrc32ErrorPend Si446xChipPend3
|
||||
#define Si446xPacketRxPend Si446xChipPend4
|
||||
#define Si446xPacketSentPend Si446xChipPend5
|
||||
#define Si446xFilterMissPend Si446xChipPend6
|
||||
#define Si446xFilterMatchPend Si446xChipPend7
|
||||
|
||||
/*!
|
||||
* Do NOT use SEG_BDATA as that is not understood by SDCC!
|
||||
* Use BITS, WRITE_TO_BIT_ARRAY and READ_FROM_BIT_ARRAY instead to allocate and
|
||||
* handle bit arrays in a convenient way.
|
||||
*
|
||||
* Allocate all 8bits if WRITE_TO_BIT_ARRAY and READ_FROM_BIT_ARRAY macros
|
||||
* are to be used. Otherwise these macros would read/write bits that are
|
||||
* placed within that byte by the linker.
|
||||
*/
|
||||
BITS(Si446xPhPend, 0);
|
||||
BITS(Si446xPhPend, 1);
|
||||
BITS(Si446xPhPend, 2);
|
||||
BITS(Si446xPhPend, 3);
|
||||
BITS(Si446xPhPend, 4);
|
||||
BITS(Si446xPhPend, 5);
|
||||
BITS(Si446xPhPend, 6);
|
||||
BITS(Si446xPhPend, 7);
|
||||
|
||||
BITS(Si446xModemPend, 0);
|
||||
BITS(Si446xModemPend, 1);
|
||||
BITS(Si446xModemPend, 2);
|
||||
BITS(Si446xModemPend, 3);
|
||||
BITS(Si446xModemPend, 4);
|
||||
BITS(Si446xModemPend, 5);
|
||||
BITS(Si446xModemPend, 6);
|
||||
BITS(Si446xModemPend, 7);
|
||||
|
||||
BITS(Si446xChipPend, 0);
|
||||
BITS(Si446xChipPend, 1);
|
||||
BITS(Si446xChipPend, 2);
|
||||
BITS(Si446xChipPend, 3);
|
||||
BITS(Si446xChipPend, 4);
|
||||
BITS(Si446xChipPend, 5);
|
||||
BITS(Si446xChipPend, 6);
|
||||
BITS(Si446xChipPend, 7);
|
||||
|
||||
/*!
|
||||
* This function is used to handle the assertion of nIRQ of the si446x chip.
|
||||
*
|
||||
* @note This function can take up to 6 ms depending on the startup time of the
|
||||
* si446x chip.
|
||||
*
|
||||
*/
|
||||
void si446x_nirq_process(void)
|
||||
{
|
||||
#ifdef SI446X_USER_CONFIG_USE_FRR_ABC_FOR_NIRQ
|
||||
uint8_t pendBits[3];
|
||||
|
||||
si446x_frr_read();
|
||||
#else
|
||||
si446x_get_int_status(0, 0, 0);
|
||||
// Si446xPhPend = Si446xCmd.GET_INT_STATUS.PH_PEND;
|
||||
// Si446xModemPend = Si446xCmd.GET_INT_STATUS.MODEM_PEND;
|
||||
// Si446xChipPend = Si446xCmd.GET_INT_STATUS.CHIP_PEND;
|
||||
WRITE_TO_BIT_ARRAY(Si446xPhPend, Si446xCmd.GET_INT_STATUS.PH_PEND);
|
||||
WRITE_TO_BIT_ARRAY(Si446xModemPend, Si446xCmd.GET_INT_STATUS.MODEM_PEND);
|
||||
WRITE_TO_BIT_ARRAY(Si446xChipPend, Si446xCmd.GET_INT_STATUS.CHIP_PEND);
|
||||
#endif
|
||||
}
|
||||
#endif //DFM17
|
|
@ -0,0 +1,29 @@
|
|||
/*!
|
||||
* Silicon Laboratories Confidential
|
||||
* Copyright 2011 Silicon Laboratories, Inc.
|
||||
*
|
||||
* Public API for the Si446x nIRQ interface.
|
||||
*/
|
||||
|
||||
#ifndef _SI446X_NIRQ_H
|
||||
#define _SI446X_NIRQ_H
|
||||
|
||||
|
||||
/* ======================================= *
|
||||
* I N C L U D E *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* D E F I N I T I O N S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* G L O B A L V A R I A B L E S *
|
||||
* ======================================= */
|
||||
|
||||
/* ======================================= *
|
||||
* F U N C T I O N P R O T O T Y P E S *
|
||||
* ======================================= */
|
||||
|
||||
|
||||
#endif //_SI446X_NIRQ_H
|
|
@ -0,0 +1,80 @@
|
|||
// COPYRIGHT=2015 Silicon Laboratories, Inc.
|
||||
// GENERATED=09:13 October 20 2015
|
||||
// ROMID=0x06
|
||||
// FUNCTION=TEST
|
||||
// MAJOR=0
|
||||
// MINOR=0
|
||||
// BUILD=0
|
||||
// PATCHID=0xCA90
|
||||
// REQUIRES=NONE
|
||||
// SIZE=512
|
||||
// CRCT=0x714b
|
||||
|
||||
#define SI446X_PATCH_ROMID 00
|
||||
#define SI446X_PATCH_ID 00
|
||||
|
||||
#define SI446X_PATCH_CMDS \
|
||||
{ 0x08,0x04,0x21,0x71,0x4B,0x00,0x00,0xDC,0x95, },\
|
||||
{ 0x08,0x05,0xA6,0x22,0x21,0xF0,0x41,0x5B,0x26, },\
|
||||
{ 0x08,0xE2,0x2F,0x1C,0xBB,0x0A,0xA8,0x94,0x28, },\
|
||||
{ 0x08,0x05,0x87,0x67,0xE2,0x58,0x1A,0x07,0x5B, },\
|
||||
{ 0x08,0xE1,0xD0,0x72,0xD8,0x8A,0xB8,0x5B,0x7D, },\
|
||||
{ 0x08,0x05,0x11,0xEC,0x9E,0x28,0x23,0x1B,0x6D, },\
|
||||
{ 0x08,0xE2,0x4F,0x8A,0xB2,0xA9,0x29,0x14,0x13, },\
|
||||
{ 0x08,0x05,0xD1,0x2E,0x71,0x6A,0x51,0x4C,0x2C, },\
|
||||
{ 0x08,0xE5,0x80,0x27,0x42,0xA4,0x69,0xB0,0x7F, },\
|
||||
{ 0x08,0x05,0xAA,0x81,0x2A,0xBD,0x45,0xE8,0xA8, },\
|
||||
{ 0x08,0xEA,0xE4,0xF0,0x24,0xC9,0x9F,0xCC,0x3C, },\
|
||||
{ 0x08,0x05,0x08,0xF5,0x05,0x04,0x27,0x62,0x98, },\
|
||||
{ 0x08,0xEA,0x6B,0x62,0x84,0xA1,0xF9,0x4A,0xE2, },\
|
||||
{ 0x08,0x05,0xE9,0x77,0x05,0x4F,0x84,0xEE,0x35, },\
|
||||
{ 0x08,0xE2,0x43,0xC3,0x8D,0xFB,0xAD,0x54,0x25, },\
|
||||
{ 0x08,0x05,0x14,0x06,0x5E,0x39,0x36,0x2F,0x45, },\
|
||||
{ 0x08,0xEA,0x0C,0x1C,0x74,0xD0,0x11,0xFC,0x32, },\
|
||||
{ 0x08,0x05,0xDA,0x38,0xBA,0x0E,0x3C,0xE7,0x8B, },\
|
||||
{ 0x08,0xEA,0xB0,0x09,0xE6,0xFF,0x94,0xBB,0xA9, },\
|
||||
{ 0x08,0x05,0xD7,0x11,0x29,0xFE,0xDC,0x71,0xD5, },\
|
||||
{ 0x08,0xEA,0x7F,0x83,0xA7,0x60,0x90,0x62,0x18, },\
|
||||
{ 0x08,0x05,0x84,0x7F,0x6A,0xD1,0x91,0xC6,0x52, },\
|
||||
{ 0x08,0xEA,0x2A,0xD8,0x7B,0x8E,0x4A,0x9F,0x91, },\
|
||||
{ 0x08,0x05,0xBD,0xAA,0x9D,0x16,0x18,0x06,0x15, },\
|
||||
{ 0x08,0xE2,0x55,0xAD,0x2D,0x0A,0x14,0x1F,0x5D, },\
|
||||
{ 0x08,0x05,0xD3,0xE0,0x7C,0x39,0xCF,0x01,0xF0, },\
|
||||
{ 0x08,0xEF,0x3A,0x91,0x72,0x6A,0x03,0xBB,0x96, },\
|
||||
{ 0x08,0xE7,0x83,0x6D,0xA4,0x92,0xFC,0x13,0xA7, },\
|
||||
{ 0x08,0xEF,0xF8,0xFD,0xCF,0x62,0x07,0x6F,0x1E, },\
|
||||
{ 0x08,0xE7,0x4C,0xEA,0x4A,0x75,0x4F,0xD6,0xCF, },\
|
||||
{ 0x08,0xE2,0xF6,0x11,0xE4,0x26,0x0D,0x4D,0xC6, },\
|
||||
{ 0x08,0x05,0xFB,0xBF,0xE8,0x07,0x89,0xC3,0x51, },\
|
||||
{ 0x08,0xEF,0x82,0x27,0x04,0x3F,0x96,0xA8,0x58, },\
|
||||
{ 0x08,0xE7,0x41,0x29,0x3C,0x75,0x2A,0x03,0x1C, },\
|
||||
{ 0x08,0xEF,0xAF,0x59,0x98,0x36,0xAA,0x0F,0x06, },\
|
||||
{ 0x08,0xE6,0xF6,0x93,0x41,0x2D,0xEC,0x0E,0x99, },\
|
||||
{ 0x08,0x05,0x29,0x19,0x90,0xE5,0xAA,0x36,0x40, },\
|
||||
{ 0x08,0xE7,0xFB,0x68,0x10,0x7D,0x77,0x5D,0xC0, },\
|
||||
{ 0x08,0xE7,0xCB,0xB4,0xDD,0xCE,0x90,0x54,0xBE, },\
|
||||
{ 0x08,0xE7,0x72,0x8A,0xD6,0x02,0xF4,0xDD,0xCC, },\
|
||||
{ 0x08,0xE7,0x6A,0x21,0x0B,0x02,0x86,0xEC,0x15, },\
|
||||
{ 0x08,0xE7,0x7B,0x7C,0x3D,0x6B,0x81,0x03,0xD0, },\
|
||||
{ 0x08,0xEF,0x7D,0x61,0x36,0x94,0x7C,0xA0,0xDF, },\
|
||||
{ 0x08,0xEF,0xCC,0x85,0x3B,0xDA,0xE0,0x5C,0x1C, },\
|
||||
{ 0x08,0xE7,0xE3,0x75,0xBB,0x39,0x22,0x4B,0xA8, },\
|
||||
{ 0x08,0xEF,0xF9,0xCE,0xE0,0x5E,0xEB,0x1D,0xCB, },\
|
||||
{ 0x08,0xE7,0xBD,0xE2,0x70,0xD5,0xAB,0x4E,0x3F, },\
|
||||
{ 0x08,0xE7,0xB7,0x8D,0x20,0x68,0x6B,0x09,0x52, },\
|
||||
{ 0x08,0xEF,0xA1,0x1B,0x90,0xCD,0x98,0x00,0x63, },\
|
||||
{ 0x08,0xEF,0x54,0x67,0x5D,0x9C,0x11,0xFC,0x45, },\
|
||||
{ 0x08,0xE7,0xD4,0x9B,0xC8,0x97,0xBE,0x8A,0x07, },\
|
||||
{ 0x08,0xEF,0x52,0x8D,0x90,0x63,0x73,0xD5,0x2A, },\
|
||||
{ 0x08,0xEF,0x03,0xBC,0x6E,0x1C,0x76,0xBE,0x4A, },\
|
||||
{ 0x08,0xE7,0xC2,0xED,0x67,0xBA,0x5E,0x66,0x21, },\
|
||||
{ 0x08,0xEF,0xE7,0x3F,0x87,0xBE,0xE0,0x7A,0x6D, },\
|
||||
{ 0x08,0xE7,0xC9,0x70,0x93,0x1D,0x64,0xF5,0x6C, },\
|
||||
{ 0x08,0xEF,0xF5,0x28,0x08,0x34,0xB3,0xB6,0x2C, },\
|
||||
{ 0x08,0xEF,0x3A,0x0A,0xEC,0x0F,0xDB,0x56,0xCA, },\
|
||||
{ 0x08,0xEF,0x39,0xA0,0x6E,0xED,0x79,0xD0,0x24, },\
|
||||
{ 0x08,0xE7,0x6C,0x0B,0xAF,0xA9,0x4E,0x40,0xB5, },\
|
||||
{ 0x08,0xE9,0xB9,0xAF,0xBF,0x25,0x50,0xD1,0x37, },\
|
||||
{ 0x08,0x05,0x9E,0xDB,0xDE,0x3F,0x94,0xE9,0x6B, },\
|
||||
{ 0x08,0xEC,0xC5,0x05,0xAA,0x57,0xDC,0x8A,0x5E, },\
|
||||
{ 0x08,0x05,0x70,0xDA,0x84,0x84,0xDD,0xCA,0x90 },
|
|
@ -0,0 +1,103 @@
|
|||
#ifndef __GPIO_H
|
||||
#define __GPIO_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
// GPIO definitions for devices we use
|
||||
|
||||
#if defined (RS41)
|
||||
|
||||
#define BANK_SHUTDOWN GPIOA
|
||||
#define PIN_SHUTDOWN GPIO_Pin_12
|
||||
|
||||
#define BANK_VOLTAGE GPIOA
|
||||
#define PIN_VOLTAGE GPIO_Pin_5
|
||||
#define ADC_VOLTAGE ADC1
|
||||
#define CHANNEL_VOLTAGE ADC_Channel_5
|
||||
|
||||
#define BANK_BUTTON GPIOA
|
||||
#define PIN_BUTTON GPIO_Pin_6
|
||||
#define ADC_BUTTON ADC1
|
||||
#define CHANNEL_BUTTON ADC_Channel_6
|
||||
|
||||
#define BANK_RED_LED GPIOB
|
||||
#define PIN_RED_LED GPIO_Pin_8
|
||||
|
||||
#define BANK_GREEN_LED GPIOB
|
||||
#define PIN_GREEN_LED GPIO_Pin_7
|
||||
|
||||
#define BANK_MOSI GPIOB
|
||||
#define PIN_MOSI GPIO_Pin_15
|
||||
#define BANK_SCK GPIOB
|
||||
#define PIN_SCK GPIO_Pin_13
|
||||
#define BANK_MISO GPIOB
|
||||
#define PIN_MISO GPIO_Pin_14
|
||||
#define APBPERIPHERAL_SPI RCC_APB1Periph_SPI2
|
||||
#define PERIPHERAL_SPI SPI2
|
||||
|
||||
#define PIN_USART_TX GPIO_Pin_9
|
||||
#define BANK_USART_TX GPIOA
|
||||
#define PIN_USART_RX GPIO_Pin_10
|
||||
#define BANK_USART_RX GPIOA
|
||||
#define USART_IRQ USART1_IRQn
|
||||
#define USART_IT USART1
|
||||
#define APBPERIPHERAL_USART RCC_APB2Periph_USART1
|
||||
#define USART_IRQ_HANDLER USART1_IRQHandler
|
||||
|
||||
#elif defined (DFM17)
|
||||
|
||||
#define BANK_SHUTDOWN GPIOC
|
||||
#define PIN_SHUTDOWN GPIO_Pin_0
|
||||
|
||||
#define BANK_VOLTAGE GPIOA // Needs confirmation
|
||||
#define PIN_VOLTAGE GPIO_Pin_0 // Needs confirmation
|
||||
#define ADC_VOLTAGE ADC1 // Needs confirmation
|
||||
#define CHANNEL_VOLTAGE ADC_Channel_0 // Needs confirmation
|
||||
|
||||
#define BANK_BUTTON GPIOC
|
||||
#define PIN_BUTTON GPIO_Pin_8
|
||||
// No ADC available on the GPIOC, so we have to use digital reads/writes for the button
|
||||
|
||||
#define BANK_RED_LED GPIOB
|
||||
#define PIN_RED_LED GPIO_Pin_12
|
||||
|
||||
#define BANK_GREEN_LED GPIOC
|
||||
#define PIN_GREEN_LED GPIO_Pin_6
|
||||
|
||||
#define BANK_MOSI GPIOA
|
||||
#define PIN_MOSI GPIO_Pin_7
|
||||
#define BANK_SCK GPIOA
|
||||
#define PIN_SCK GPIO_Pin_5
|
||||
#define BANK_MISO GPIOA
|
||||
#define PIN_MISO GPIO_Pin_6
|
||||
#define BANK_NSEL GPIOB
|
||||
#define PIN_NSEL GPIO_Pin_2
|
||||
#define BANK_SDN GPIOC
|
||||
#define PIN_SDN GPIO_Pin_3
|
||||
#define BANK_4063_GPIO2 GPIOD
|
||||
#define PIN_4064_GPIO2 GPIO_Pin_0
|
||||
#define BANK_4063_GPIO3 GPIOA
|
||||
#define PIN_4064_GPIO3 GPIO_Pin_4
|
||||
#define APBPERIPHERAL_SPI RCC_APB2Periph_SPI1
|
||||
#define PERIPHERAL_SPI SPI1
|
||||
|
||||
#define PIN_USART_TX GPIO_Pin_2
|
||||
#define BANK_USART_TX GPIOA
|
||||
#define PIN_USART_RX GPIO_Pin_3
|
||||
#define BANK_USART_RX GPIOA
|
||||
#define USART_IRQ USART2_IRQn
|
||||
#define USART_IT USART2
|
||||
#define APBPERIPHERAL_USART RCC_APB1Periph_USART2
|
||||
#define USART_IRQ_HANDLER USART2_IRQHandler
|
||||
|
||||
#else
|
||||
Compiler error. You must define RS41 or DFM17.
|
||||
#endif // RS41 or DFM17
|
||||
|
||||
// Hardware Sanity Check
|
||||
|
||||
#if defined (RS41) && defined (DFM17)
|
||||
Compiler error. You must define RS41 or DFM17 but not both.
|
||||
#endif
|
||||
|
||||
#endif // __GPIO_H
|
|
@ -3,24 +3,31 @@
|
|||
#include <stm32f10x_spi.h>
|
||||
|
||||
#include "spi.h"
|
||||
#include "gpio.h"
|
||||
|
||||
void spi_init()
|
||||
{
|
||||
GPIO_InitTypeDef gpio_init;
|
||||
|
||||
// SPI2_SCK & SPI2_MOSI
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
|
||||
// SCK
|
||||
gpio_init.GPIO_Pin = PIN_SCK;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOB, &gpio_init);
|
||||
GPIO_Init(BANK_SCK, &gpio_init);
|
||||
|
||||
// SPI2_MISO
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_14;
|
||||
// MOSI
|
||||
gpio_init.GPIO_Pin = PIN_MOSI;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(BANK_MOSI, &gpio_init);
|
||||
|
||||
// MISO
|
||||
gpio_init.GPIO_Pin = PIN_MISO;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOB, &gpio_init);
|
||||
GPIO_Init(BANK_MISO, &gpio_init);
|
||||
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
|
||||
RCC_APB1PeriphClockCmd(APBPERIPHERAL_SPI, ENABLE);
|
||||
|
||||
SPI_InitTypeDef spi_init;
|
||||
SPI_StructInit(&spi_init);
|
||||
|
@ -33,55 +40,55 @@ void spi_init()
|
|||
spi_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
|
||||
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
|
||||
spi_init.SPI_CRCPolynomial = 7;
|
||||
SPI_Init(SPI2, &spi_init);
|
||||
SPI_Init(PERIPHERAL_SPI, &spi_init);
|
||||
|
||||
SPI_SSOutputCmd(SPI2, ENABLE);
|
||||
SPI_SSOutputCmd(PERIPHERAL_SPI, ENABLE);
|
||||
|
||||
SPI_Cmd(SPI2, ENABLE);
|
||||
SPI_Init(SPI2, &spi_init);
|
||||
SPI_Cmd(PERIPHERAL_SPI, ENABLE);
|
||||
SPI_Init(PERIPHERAL_SPI, &spi_init);
|
||||
}
|
||||
|
||||
void spi_uninit()
|
||||
{
|
||||
SPI_I2S_DeInit(SPI2);
|
||||
SPI_Cmd(SPI2, DISABLE);
|
||||
SPI_SSOutputCmd(SPI2, DISABLE);
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, DISABLE);
|
||||
SPI_I2S_DeInit(PERIPHERAL_SPI);
|
||||
SPI_Cmd(PERIPHERAL_SPI, DISABLE);
|
||||
SPI_SSOutputCmd(PERIPHERAL_SPI, DISABLE);
|
||||
RCC_APB1PeriphClockCmd(APBPERIPHERAL_SPI, DISABLE);
|
||||
|
||||
GPIO_InitTypeDef gpio_init;
|
||||
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_14;
|
||||
gpio_init.GPIO_Pin = PIN_MISO;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOB, &gpio_init);
|
||||
GPIO_Init(BANK_MISO, &gpio_init);
|
||||
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_15;
|
||||
gpio_init.GPIO_Pin = PIN_MOSI;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP; // was: GPIO_Mode_Out_PP; // GPIO_Mode_AF_PP
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOB, &gpio_init);
|
||||
GPIO_Init(BANK_MOSI, &gpio_init);
|
||||
}
|
||||
|
||||
inline void spi_send(uint16_t data)
|
||||
{
|
||||
// Wait for TX buffer
|
||||
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
|
||||
SPI_I2S_SendData(SPI2, data);
|
||||
while (SPI_I2S_GetFlagStatus(PERIPHERAL_SPI, SPI_I2S_FLAG_TXE) == RESET);
|
||||
SPI_I2S_SendData(PERIPHERAL_SPI, data);
|
||||
}
|
||||
|
||||
inline uint8_t spi_receive()
|
||||
{
|
||||
// Wait for data in RX buffer
|
||||
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
|
||||
return (uint8_t) SPI_I2S_ReceiveData(SPI2);
|
||||
while (SPI_I2S_GetFlagStatus(PERIPHERAL_SPI, SPI_I2S_FLAG_RXNE) == RESET);
|
||||
return (uint8_t) SPI_I2S_ReceiveData(PERIPHERAL_SPI);
|
||||
}
|
||||
|
||||
uint8_t spi_send_and_receive(GPIO_TypeDef *gpio_cs, uint16_t pin_cs, uint16_t data) {
|
||||
GPIO_ResetBits(gpio_cs, pin_cs);
|
||||
|
||||
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
|
||||
SPI_I2S_SendData(SPI2, data);
|
||||
while (SPI_I2S_GetFlagStatus(PERIPHERAL_SPI, SPI_I2S_FLAG_TXE) == RESET);
|
||||
SPI_I2S_SendData(PERIPHERAL_SPI, data);
|
||||
|
||||
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
|
||||
while (SPI_I2S_GetFlagStatus(PERIPHERAL_SPI, SPI_I2S_FLAG_RXNE) == RESET);
|
||||
GPIO_SetBits(gpio_cs, pin_cs);
|
||||
return (uint8_t) SPI_I2S_ReceiveData(SPI2);
|
||||
return (uint8_t) SPI_I2S_ReceiveData(PERIPHERAL_SPI);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "system.h"
|
||||
#include "delay.h"
|
||||
#include "log.h"
|
||||
#include "gpio.h"
|
||||
|
||||
#define BUTTON_PRESS_LONG_COUNT SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND
|
||||
|
||||
|
@ -38,6 +39,8 @@ static void nvic_init()
|
|||
static void rcc_init()
|
||||
{
|
||||
RCC_DeInit();
|
||||
#ifdef RS41
|
||||
// We don't have an external clock on the DFM17.
|
||||
RCC_HSEConfig(RCC_HSE_ON);
|
||||
|
||||
ErrorStatus hse_status = RCC_WaitForHSEStartUp();
|
||||
|
@ -45,6 +48,7 @@ static void rcc_init()
|
|||
// If HSE fails to start up, the application will have incorrect clock configuration.
|
||||
while (true) {}
|
||||
}
|
||||
#endif //RS41
|
||||
//SystemInit();
|
||||
|
||||
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
|
||||
|
@ -55,9 +59,12 @@ static void rcc_init()
|
|||
RCC_HCLKConfig(RCC_SYSCLK_Div1); // Was: RCC_SYSCLK_Div4
|
||||
RCC_PCLK2Config(RCC_HCLK_Div1); // Was: 4
|
||||
RCC_PCLK1Config(RCC_HCLK_Div1); // Was: 2
|
||||
#ifdef RS41
|
||||
// DFM17 does not have an external clock
|
||||
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
|
||||
|
||||
while (RCC_GetSYSCLKSource() != 0x04);
|
||||
#endif //RS41
|
||||
}
|
||||
|
||||
static void gpio_init()
|
||||
|
@ -72,28 +79,38 @@ static void gpio_init()
|
|||
GPIO_InitTypeDef gpio_init;
|
||||
|
||||
// Shutdown request
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_12;
|
||||
gpio_init.GPIO_Pin = PIN_SHUTDOWN;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOA, &gpio_init);
|
||||
GPIO_Init(BANK_SHUTDOWN, &gpio_init);
|
||||
#ifdef DFM17
|
||||
GPIO_SetBits(BANK_SHUTDOWN, PIN_SHUTDOWN); // Pull high to keep BMS from removing battery power after startup
|
||||
#endif //DFM17
|
||||
|
||||
// Battery voltage (analog)
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_5;
|
||||
gpio_init.GPIO_Pin = PIN_VOLTAGE;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AIN;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
|
||||
GPIO_Init(GPIOA, &gpio_init);
|
||||
GPIO_Init(BANK_VOLTAGE, &gpio_init);
|
||||
|
||||
// Button state (analog)
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_6;
|
||||
gpio_init.GPIO_Pin = PIN_BUTTON;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AIN;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
|
||||
GPIO_Init(GPIOA, &gpio_init);
|
||||
GPIO_Init(BANK_BUTTON, &gpio_init);
|
||||
|
||||
// LEDs
|
||||
gpio_init.GPIO_Pin = GPIO_PIN_LED_GREEN | GPIO_PIN_LED_RED;
|
||||
|
||||
// Green LED
|
||||
gpio_init.GPIO_Pin = PIN_GREEN_LED;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOB, &gpio_init);
|
||||
GPIO_Init(BANK_GREEN_LED, &gpio_init);
|
||||
|
||||
// Red LED
|
||||
gpio_init.GPIO_Pin = PIN_RED_LED;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(BANK_RED_LED, &gpio_init);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -108,7 +125,12 @@ static void dma_adc_init()
|
|||
|
||||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
|
||||
|
||||
#ifdef RS41
|
||||
dma_init.DMA_BufferSize = 2;
|
||||
#endif //RS41
|
||||
#ifdef DFM17
|
||||
dma_init.DMA_BufferSize = 1;
|
||||
#endif //DFM17
|
||||
dma_init.DMA_DIR = DMA_DIR_PeripheralSRC;
|
||||
dma_init.DMA_M2M = DMA_M2M_Disable;
|
||||
dma_init.DMA_MemoryBaseAddr = (uint32_t) &dma_buffer_adc;
|
||||
|
@ -132,11 +154,21 @@ static void dma_adc_init()
|
|||
adc_init.ADC_ContinuousConvMode = ENABLE;
|
||||
adc_init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
|
||||
adc_init.ADC_DataAlign = ADC_DataAlign_Right;
|
||||
#ifdef RS41
|
||||
adc_init.ADC_NbrOfChannel = 2;
|
||||
#endif //RS41
|
||||
#ifdef DFM17
|
||||
adc_init.ADC_NbrOfChannel = 1;
|
||||
#endif //DFM17
|
||||
ADC_Init(ADC1, &adc_init);
|
||||
|
||||
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_28Cycles5);
|
||||
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_28Cycles5);
|
||||
ADC_RegularChannelConfig(ADC1, CHANNEL_VOLTAGE, 1, ADC_SampleTime_28Cycles5);
|
||||
#ifdef RS41
|
||||
ADC_RegularChannelConfig(ADC1, CHANNEL_BUTTON, 2, ADC_SampleTime_28Cycles5);
|
||||
#endif //RS41
|
||||
#ifdef DFM17
|
||||
// Not using ADC for button on DFM17
|
||||
#endif //DFM17
|
||||
|
||||
// ADC1 DMA requests are routed to DMA1 Channel1
|
||||
ADC_DMACmd(ADC1, ENABLE);
|
||||
|
@ -160,12 +192,23 @@ uint16_t system_get_battery_voltage_millivolts()
|
|||
|
||||
uint16_t system_get_button_adc_value()
|
||||
{
|
||||
#ifdef RS41
|
||||
return (uint16_t) dma_buffer_adc[1];
|
||||
#endif //RS41
|
||||
#ifdef DFM17
|
||||
// Fake being an ADC. Take the binary value and if non-zero, make it trigger button-down
|
||||
return ( ((int) GPIO_ReadInputDataBit(BANK_BUTTON,PIN_BUTTON)) * 2100);
|
||||
#endif //DFM17
|
||||
}
|
||||
|
||||
void system_shutdown()
|
||||
{
|
||||
GPIO_SetBits(GPIOA, GPIO_Pin_12);
|
||||
#ifdef RS41
|
||||
GPIO_SetBits(BANK_SHUTDOWN, PIN_SHUTDOWN);
|
||||
#endif // RS41
|
||||
#ifdef DFM17
|
||||
GPIO_ResetBits(BANK_SHUTDOWN, PIN_SHUTDOWN);
|
||||
#endif //DFM17
|
||||
}
|
||||
|
||||
void system_handle_button()
|
||||
|
@ -252,18 +295,18 @@ void system_enable_tick()
|
|||
void system_set_green_led(bool enabled)
|
||||
{
|
||||
if (enabled) {
|
||||
GPIO_ResetBits(GPIOB, GPIO_PIN_LED_GREEN);
|
||||
GPIO_ResetBits(BANK_GREEN_LED, PIN_GREEN_LED);
|
||||
} else {
|
||||
GPIO_SetBits(GPIOB, GPIO_PIN_LED_GREEN);
|
||||
GPIO_SetBits(BANK_GREEN_LED, PIN_GREEN_LED);
|
||||
}
|
||||
}
|
||||
|
||||
void system_set_red_led(bool enabled)
|
||||
{
|
||||
if (enabled) {
|
||||
GPIO_ResetBits(GPIOB, GPIO_PIN_LED_RED);
|
||||
GPIO_ResetBits(BANK_RED_LED, PIN_RED_LED);
|
||||
} else {
|
||||
GPIO_SetBits(GPIOB, GPIO_PIN_LED_RED);
|
||||
GPIO_SetBits(BANK_RED_LED, PIN_RED_LED);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <misc.h>
|
||||
|
||||
#include "usart_gps.h"
|
||||
#include "gpio.h"
|
||||
|
||||
void (*usart_gps_handle_incoming_byte)(uint8_t data) = NULL;
|
||||
|
||||
|
@ -13,25 +14,29 @@ void usart_gps_init(uint32_t baud_rate, bool enable_irq)
|
|||
{
|
||||
GPIO_InitTypeDef gpio_init;
|
||||
|
||||
// USART1 TX
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_9;
|
||||
// USART TX
|
||||
gpio_init.GPIO_Pin = PIN_USART_TX;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(GPIOA, &gpio_init);
|
||||
GPIO_Init(BANK_USART_TX, &gpio_init);
|
||||
|
||||
// USART1 RX
|
||||
gpio_init.GPIO_Pin = GPIO_Pin_10;
|
||||
// USART RX
|
||||
gpio_init.GPIO_Pin = PIN_USART_RX;
|
||||
gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
GPIO_Init(GPIOA, &gpio_init);
|
||||
GPIO_Init(BANK_USART_RX, &gpio_init);
|
||||
|
||||
NVIC_DisableIRQ(USART1_IRQn);
|
||||
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
|
||||
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
|
||||
USART_ClearITPendingBit(USART1, USART_IT_ORE);
|
||||
NVIC_DisableIRQ(USART_IRQ);
|
||||
USART_ITConfig(USART_IT, USART_IT_RXNE, DISABLE);
|
||||
USART_ClearITPendingBit(USART_IT, USART_IT_RXNE);
|
||||
USART_ClearITPendingBit(USART_IT, USART_IT_ORE);
|
||||
|
||||
USART_Cmd(USART1, DISABLE);
|
||||
USART_Cmd(USART_IT, DISABLE);
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
||||
#if defined(RS41)
|
||||
RCC_APB2PeriphClockCmd(APBPERIPHERAL_USART, ENABLE);
|
||||
#elif defined(DFM17)
|
||||
RCC_APB1PeriphClockCmd(APBPERIPHERAL_USART, ENABLE);
|
||||
#endif
|
||||
|
||||
USART_InitTypeDef usart_init;
|
||||
usart_init.USART_BaudRate = baud_rate;
|
||||
|
@ -40,65 +45,69 @@ void usart_gps_init(uint32_t baud_rate, bool enable_irq)
|
|||
usart_init.USART_Parity = USART_Parity_No;
|
||||
usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||||
usart_init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
|
||||
USART_Init(USART1, &usart_init);
|
||||
USART_Init(USART_IT, &usart_init);
|
||||
|
||||
NVIC_InitTypeDef nvic_init;
|
||||
nvic_init.NVIC_IRQChannel = USART1_IRQn;
|
||||
nvic_init.NVIC_IRQChannel = USART_IRQ;
|
||||
nvic_init.NVIC_IRQChannelPreemptionPriority = 15;
|
||||
nvic_init.NVIC_IRQChannelSubPriority = 2;
|
||||
nvic_init.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&nvic_init);
|
||||
|
||||
USART_Cmd(USART1, ENABLE);
|
||||
USART_Cmd(USART_IT, ENABLE);
|
||||
if (enable_irq) {
|
||||
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
|
||||
NVIC_EnableIRQ(USART1_IRQn);
|
||||
USART_ITConfig(USART_IT, USART_IT_RXNE, ENABLE);
|
||||
NVIC_EnableIRQ(USART_IRQ);
|
||||
}
|
||||
}
|
||||
|
||||
static void usart_gps_enable_irq(bool enabled) {
|
||||
if (enabled) {
|
||||
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
|
||||
NVIC_EnableIRQ(USART1_IRQn);
|
||||
USART_ITConfig(USART_IT, USART_IT_RXNE, ENABLE);
|
||||
NVIC_EnableIRQ(USART_IRQ);
|
||||
} else {
|
||||
NVIC_DisableIRQ(USART1_IRQn);
|
||||
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
|
||||
NVIC_DisableIRQ(USART_IRQ);
|
||||
USART_ITConfig(USART_IT, USART_IT_RXNE, DISABLE);
|
||||
}
|
||||
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
|
||||
USART_ClearITPendingBit(USART1, USART_IT_ORE);
|
||||
USART_ClearITPendingBit(USART_IT, USART_IT_RXNE);
|
||||
USART_ClearITPendingBit(USART_IT, USART_IT_ORE);
|
||||
}
|
||||
|
||||
void usart_gps_uninit()
|
||||
{
|
||||
usart_gps_enable_irq(false);
|
||||
USART_Cmd(USART1, DISABLE);
|
||||
USART_DeInit(USART1);
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
|
||||
USART_Cmd(USART_IT, DISABLE);
|
||||
USART_DeInit(USART_IT);
|
||||
#ifdef defined(RS41)
|
||||
RCC_APB2PeriphClockCmd(APBPERIPHERAL_USART, DISABLE);
|
||||
#elif defined(DFM17)
|
||||
RCC_APB1PeriphClockCmd(APBPERIPHERAL_USART, DISABLE);
|
||||
#endif
|
||||
}
|
||||
|
||||
void usart_gps_enable(bool enabled)
|
||||
{
|
||||
usart_gps_enable_irq(enabled);
|
||||
USART_Cmd(USART1, enabled ? ENABLE : DISABLE);
|
||||
USART_Cmd(USART_IT, enabled ? ENABLE : DISABLE);
|
||||
}
|
||||
|
||||
void usart_gps_send_byte(uint8_t data)
|
||||
{
|
||||
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
|
||||
USART_SendData(USART1, data);
|
||||
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
|
||||
while (USART_GetFlagStatus(USART_IT, USART_FLAG_TC) == RESET) {}
|
||||
USART_SendData(USART_IT, data);
|
||||
while (USART_GetFlagStatus(USART_IT, USART_FLAG_TC) == RESET) {}
|
||||
}
|
||||
|
||||
void USART1_IRQHandler(void)
|
||||
void USART_IRQ_HANDLER(void)
|
||||
{
|
||||
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
|
||||
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
|
||||
uint8_t data = (uint8_t) USART_ReceiveData(USART1);
|
||||
if (USART_GetITStatus(USART_IT, USART_IT_RXNE) != RESET) {
|
||||
USART_ClearITPendingBit(USART_IT, USART_IT_RXNE);
|
||||
uint8_t data = (uint8_t) USART_ReceiveData(USART_IT);
|
||||
usart_gps_handle_incoming_byte(data);
|
||||
} else if (USART_GetITStatus(USART1, USART_IT_ORE) != RESET) {
|
||||
USART_ClearITPendingBit(USART1, USART_IT_ORE);
|
||||
USART_ReceiveData(USART1);
|
||||
} else if (USART_GetITStatus(USART_IT, USART_IT_ORE) != RESET) {
|
||||
USART_ClearITPendingBit(USART_IT, USART_IT_ORE);
|
||||
USART_ReceiveData(USART_IT);
|
||||
} else {
|
||||
USART_ReceiveData(USART1);
|
||||
USART_ReceiveData(USART_IT);
|
||||
}
|
||||
}
|
||||
|
|
16
src/main.c
|
@ -90,7 +90,10 @@ int main(void)
|
|||
pulse_counter_init(PULSE_COUNTER_PIN_MODE, PULSE_COUNTER_INTERRUPT_EDGE);
|
||||
} else {
|
||||
log_info("I2C init: clock speed %d kHz\n", I2C_BUS_CLOCK_SPEED / 1000);
|
||||
#ifdef RS41
|
||||
// dfm17 does not use i2c
|
||||
i2c_init(I2C_BUS_CLOCK_SPEED);
|
||||
#endif //RS41
|
||||
}
|
||||
|
||||
log_info("SPI init\n");
|
||||
|
@ -105,8 +108,15 @@ int main(void)
|
|||
goto gps_init;
|
||||
}
|
||||
|
||||
#if defined(RS41)
|
||||
log_info("Si4032 init\n");
|
||||
si4032_init();
|
||||
#elif defined(DFM17)
|
||||
log_info("Si4063 init\n");
|
||||
si4063_init();
|
||||
#else
|
||||
Error. Must defined RS41 or DFM17
|
||||
#endif
|
||||
|
||||
if (bmp280_enabled) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
|
@ -162,6 +172,12 @@ int main(void)
|
|||
radio_handle_main_loop();
|
||||
//NVIC_SystemLPConfig(NVIC_LP_SEVONPEND, DISABLE);
|
||||
//__WFI();
|
||||
#ifdef DFM17
|
||||
//DFM17 testing... delete next two lines eventually
|
||||
log_info("Fix: %d, Time: %02d:%02d:%02d.\n", (int) current_gps_data.fix_ok, current_gps_data.hours, current_gps_data.minutes, current_gps_data.seconds);
|
||||
delay_ms(1000);
|
||||
#endif //DFM17
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
typedef enum _radio_type {
|
||||
RADIO_TYPE_SI4032 = 1,
|
||||
RADIO_TYPE_SI5351,
|
||||
RADIO_TYPE_SI4063,
|
||||
} radio_type;
|
||||
|
||||
typedef enum _radio_data_mode {
|
||||
|
|
|
@ -0,0 +1,406 @@
|
|||
#ifdef DFM17
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hal/system.h"
|
||||
#include "hal/spi.h"
|
||||
#include "hal/pwm.h"
|
||||
#include "hal/delay.h"
|
||||
#include "hal/datatimer.h"
|
||||
#include "drivers/si4063/si4063.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "radio_si4063.h"
|
||||
#include "codecs/mfsk/mfsk.h"
|
||||
|
||||
#define CW_SYMBOL_RATE_MULTIPLIER 4
|
||||
|
||||
/**
|
||||
* I have attempted to implement Bell 202 frequency generation using hardware DMA and PWM, but have failed to generate
|
||||
* correct symbol rate that other APRS equipment are able to decode. I have tried to decode the DMA-based modulation with
|
||||
* some tools intended for debugging APRS and while some bytes are decoded correctly every once in a while,
|
||||
* the timings are mostly off for some unknown reason.
|
||||
*
|
||||
* The Bell 202 modulation implementation uses hardware PWM to generate the individual tone frequencies,
|
||||
* but when si4063_use_dma is false, the symbol timing is created in a loop with delay that was chosen
|
||||
* carefully via experiments.
|
||||
*/
|
||||
static bool si4063_use_dma = false;
|
||||
|
||||
// TODO: Add support for multiple APRS baud rates
|
||||
uint16_t symbol_delay_bell_202_1200bps_us = 823;
|
||||
|
||||
static volatile bool radio_si4063_state_change = false;
|
||||
static volatile uint32_t radio_si4063_freq = 0;
|
||||
static volatile int8_t radio_dma_transfer_stop_after_counter = -1;
|
||||
|
||||
uint32_t precalculated_pwm_periods[FSK_TONE_COUNT_MAX];
|
||||
|
||||
uint16_t radio_si4063_fill_pwm_buffer(uint16_t offset, uint16_t length, uint16_t *buffer);
|
||||
|
||||
bool radio_start_transmit_si4063(radio_transmit_entry *entry, radio_module_state *shared_state)
|
||||
{
|
||||
uint16_t frequency_offset;
|
||||
si4063_modulation_type modulation_type;
|
||||
bool use_direct_mode;
|
||||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
frequency_offset = 1;
|
||||
modulation_type = SI4063_MODULATION_TYPE_OOK;
|
||||
use_direct_mode = false;
|
||||
|
||||
data_timer_init(entry->symbol_rate * CW_SYMBOL_RATE_MULTIPLIER);
|
||||
break;
|
||||
case RADIO_DATA_MODE_RTTY:
|
||||
frequency_offset = 0;
|
||||
modulation_type = SI4063_MODULATION_TYPE_NONE;
|
||||
use_direct_mode = false;
|
||||
break;
|
||||
case RADIO_DATA_MODE_APRS_1200:
|
||||
frequency_offset = 0;
|
||||
modulation_type = SI4063_MODULATION_TYPE_FSK;
|
||||
use_direct_mode = true;
|
||||
if (si4063_use_dma) {
|
||||
pwm_data_timer_init();
|
||||
radio_si4063_fill_pwm_buffer(0, PWM_TIMER_DMA_BUFFER_SIZE, pwm_timer_dma_buffer);
|
||||
}
|
||||
break;
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
case RADIO_DATA_MODE_HORUS_V2: {
|
||||
fsk_tone *idle_tone = mfsk_get_idle_tone(&entry->fsk_encoder);
|
||||
frequency_offset = (uint16_t) idle_tone->index + HORUS_FREQUENCY_OFFSET_SI4063;
|
||||
modulation_type = SI4063_MODULATION_TYPE_OOK;
|
||||
use_direct_mode = false;
|
||||
|
||||
data_timer_init(entry->fsk_encoder_api->get_symbol_rate(&entry->fsk_encoder));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
si4063_set_tx_frequency(((float) entry->frequency) / 1000000.0f);
|
||||
si4063_set_tx_power(entry->tx_power);
|
||||
si4063_set_frequency_offset(frequency_offset);
|
||||
si4063_set_modulation_type(modulation_type);
|
||||
|
||||
si4063_enable_tx();
|
||||
|
||||
if (use_direct_mode) {
|
||||
spi_uninit();
|
||||
pwm_timer_init(100 * 100); // TODO: Idle tone
|
||||
pwm_timer_use(true);
|
||||
pwm_timer_pwm_enable(true);
|
||||
si4063_use_direct_mode(true);
|
||||
}
|
||||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
spi_uninit();
|
||||
system_disable_tick();
|
||||
si4063_use_sdi_pin(true);
|
||||
shared_state->radio_interrupt_transmit_active = true;
|
||||
break;
|
||||
case RADIO_DATA_MODE_APRS_1200:
|
||||
if (si4063_use_dma) {
|
||||
shared_state->radio_dma_transfer_active = true;
|
||||
radio_dma_transfer_stop_after_counter = -1;
|
||||
system_disable_tick();
|
||||
pwm_dma_start();
|
||||
} else {
|
||||
shared_state->radio_manual_transmit_active = true;
|
||||
}
|
||||
break;
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
case RADIO_DATA_MODE_HORUS_V2:
|
||||
system_disable_tick();
|
||||
shared_state->radio_interrupt_transmit_active = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static uint32_t radio_next_symbol_si4063(radio_transmit_entry *entry, radio_module_state *shared_state)
|
||||
{
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
return 0;
|
||||
case RADIO_DATA_MODE_RTTY:
|
||||
return 0;
|
||||
case RADIO_DATA_MODE_APRS_1200: {
|
||||
int8_t next_tone_index = entry->fsk_encoder_api->next_tone(&entry->fsk_encoder);
|
||||
if (next_tone_index < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return shared_state->radio_current_fsk_tones[next_tone_index].frequency_hz_100;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool radio_transmit_symbol_si4063(radio_transmit_entry *entry, radio_module_state *shared_state)
|
||||
{
|
||||
uint32_t frequency = radio_next_symbol_si4063(entry, shared_state);
|
||||
|
||||
if (frequency == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
radio_si4063_freq = frequency;
|
||||
radio_si4063_state_change = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void radio_handle_main_loop_manual_si4063(radio_transmit_entry *entry, radio_module_state *shared_state)
|
||||
{
|
||||
fsk_encoder_api *fsk_encoder_api = entry->fsk_encoder_api;
|
||||
fsk_encoder *fsk_enc = &entry->fsk_encoder;
|
||||
|
||||
for (uint8_t i = 0; i < shared_state->radio_current_fsk_tone_count; i++) {
|
||||
precalculated_pwm_periods[i] = pwm_calculate_period(shared_state->radio_current_fsk_tones[i].frequency_hz_100);
|
||||
}
|
||||
|
||||
system_disable_tick();
|
||||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_APRS_1200: {
|
||||
int8_t tone_index;
|
||||
|
||||
while ((tone_index = fsk_encoder_api->next_tone(fsk_enc)) >= 0) {
|
||||
pwm_timer_set_frequency(precalculated_pwm_periods[tone_index]);
|
||||
shared_state->radio_symbol_count_loop++;
|
||||
delay_us(symbol_delay_bell_202_1200bps_us);
|
||||
}
|
||||
|
||||
radio_si4063_state_change = false;
|
||||
shared_state->radio_transmission_finished = true;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
system_enable_tick();
|
||||
}
|
||||
|
||||
void radio_handle_main_loop_si4063(radio_transmit_entry *entry, radio_module_state *shared_state)
|
||||
{
|
||||
if (entry->radio_type != RADIO_TYPE_SI4063 || shared_state->radio_interrupt_transmit_active) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (shared_state->radio_manual_transmit_active) {
|
||||
radio_handle_main_loop_manual_si4063(entry, shared_state);
|
||||
return;
|
||||
}
|
||||
|
||||
if (radio_si4063_state_change) {
|
||||
radio_si4063_state_change = false;
|
||||
pwm_timer_set_frequency(radio_si4063_freq);
|
||||
shared_state->radio_symbol_count_loop++;
|
||||
}
|
||||
}
|
||||
|
||||
inline void radio_handle_data_timer_si4063()
|
||||
{
|
||||
static int cw_symbol_rate_multiplier = CW_SYMBOL_RATE_MULTIPLIER;
|
||||
|
||||
if (radio_current_transmit_entry->radio_type != RADIO_TYPE_SI4063 || !radio_shared_state.radio_interrupt_transmit_active) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (radio_current_transmit_entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP: {
|
||||
cw_symbol_rate_multiplier--;
|
||||
if (cw_symbol_rate_multiplier > 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
cw_symbol_rate_multiplier = CW_SYMBOL_RATE_MULTIPLIER;
|
||||
|
||||
fsk_encoder_api *fsk_encoder_api = radio_current_transmit_entry->fsk_encoder_api;
|
||||
fsk_encoder *fsk_enc = &radio_current_transmit_entry->fsk_encoder;
|
||||
int8_t tone_index;
|
||||
|
||||
tone_index = fsk_encoder_api->next_tone(fsk_enc);
|
||||
if (tone_index < 0) {
|
||||
si4063_set_sdi_pin(false);
|
||||
log_info("CW TX finished\n");
|
||||
radio_shared_state.radio_interrupt_transmit_active = false;
|
||||
radio_shared_state.radio_transmission_finished = true;
|
||||
system_enable_tick();
|
||||
break;
|
||||
}
|
||||
|
||||
si4063_set_sdi_pin(tone_index == 0 ? false : true);
|
||||
|
||||
radio_shared_state.radio_symbol_count_interrupt++;
|
||||
break;
|
||||
}
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
case RADIO_DATA_MODE_HORUS_V2: {
|
||||
fsk_encoder_api *fsk_encoder_api = radio_current_transmit_entry->fsk_encoder_api;
|
||||
fsk_encoder *fsk_enc = &radio_current_transmit_entry->fsk_encoder;
|
||||
int8_t tone_index;
|
||||
|
||||
tone_index = fsk_encoder_api->next_tone(fsk_enc);
|
||||
if (tone_index < 0) {
|
||||
log_info("Horus V1 TX finished\n");
|
||||
radio_shared_state.radio_interrupt_transmit_active = false;
|
||||
radio_shared_state.radio_transmission_finished = true;
|
||||
system_enable_tick();
|
||||
break;
|
||||
}
|
||||
|
||||
si4063_set_frequency_offset_small(tone_index + HORUS_FREQUENCY_OFFSET_SI4063);
|
||||
|
||||
radio_shared_state.radio_symbol_count_interrupt++;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool radio_stop_transmit_si4063(radio_transmit_entry *entry, radio_module_state *shared_state)
|
||||
{
|
||||
bool use_direct_mode = false;
|
||||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
si4063_use_sdi_pin(false);
|
||||
data_timer_uninit();
|
||||
spi_init();
|
||||
break;
|
||||
case RADIO_DATA_MODE_RTTY:
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
case RADIO_DATA_MODE_HORUS_V2:
|
||||
data_timer_uninit();
|
||||
break;
|
||||
case RADIO_DATA_MODE_APRS_1200:
|
||||
use_direct_mode = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (use_direct_mode) {
|
||||
si4063_use_direct_mode(false);
|
||||
pwm_timer_pwm_enable(false);
|
||||
pwm_timer_use(false);
|
||||
pwm_timer_uninit();
|
||||
spi_init();
|
||||
}
|
||||
|
||||
si4063_inhibit_tx();
|
||||
|
||||
switch (entry->data_mode) {
|
||||
case RADIO_DATA_MODE_CW:
|
||||
case RADIO_DATA_MODE_PIP:
|
||||
system_enable_tick();
|
||||
break;
|
||||
case RADIO_DATA_MODE_APRS_1200:
|
||||
if (si4063_use_dma) {
|
||||
pwm_data_timer_uninit();
|
||||
system_enable_tick();
|
||||
}
|
||||
break;
|
||||
case RADIO_DATA_MODE_HORUS_V1:
|
||||
case RADIO_DATA_MODE_HORUS_V2:
|
||||
system_enable_tick();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint16_t radio_si4063_fill_pwm_buffer(uint16_t offset, uint16_t length, uint16_t *buffer)
|
||||
{
|
||||
uint16_t count = 0;
|
||||
for (uint16_t i = offset; i < (offset + length); i++, count++) {
|
||||
uint32_t frequency = radio_next_symbol_si4063(radio_current_transmit_entry, &radio_shared_state);
|
||||
if (frequency == 0) {
|
||||
// TODO: fill the other side of the buffer with zeroes too?
|
||||
memset(buffer + offset, 0, (length - i) * sizeof(uint16_t));
|
||||
break;
|
||||
}
|
||||
buffer[i] = pwm_calculate_period(frequency);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
bool radio_si4063_stop_dma_transfer_if_requested(radio_module_state *shared_state)
|
||||
{
|
||||
if (radio_dma_transfer_stop_after_counter > 0) {
|
||||
radio_dma_transfer_stop_after_counter--;
|
||||
} else if (radio_dma_transfer_stop_after_counter == 0) {
|
||||
pwm_dma_stop();
|
||||
radio_dma_transfer_stop_after_counter = -1;
|
||||
shared_state->radio_transmission_finished = true;
|
||||
shared_state->radio_dma_transfer_active = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint16_t radio_si4063_handle_pwm_transfer_half(uint16_t buffer_size, uint16_t *buffer)
|
||||
{
|
||||
if (radio_si4063_stop_dma_transfer_if_requested(&radio_shared_state)) {
|
||||
return 0;
|
||||
}
|
||||
if (radio_shared_state.radio_transmission_finished) {
|
||||
log_info("Should not be here, half-transfer!\n");
|
||||
}
|
||||
|
||||
uint16_t length = radio_si4063_fill_pwm_buffer(0, buffer_size / 2, buffer);
|
||||
if (radio_dma_transfer_stop_after_counter < 0 && length < buffer_size / 2) {
|
||||
radio_dma_transfer_stop_after_counter = 2;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
uint16_t radio_si4063_handle_pwm_transfer_full(uint16_t buffer_size, uint16_t *buffer)
|
||||
{
|
||||
if (radio_si4063_stop_dma_transfer_if_requested(&radio_shared_state)) {
|
||||
return 0;
|
||||
}
|
||||
if (radio_shared_state.radio_transmission_finished) {
|
||||
log_info("Should not be here, transfer complete!\n");
|
||||
}
|
||||
|
||||
uint16_t length = radio_si4063_fill_pwm_buffer(buffer_size / 2, buffer_size / 2, buffer);
|
||||
if (radio_dma_transfer_stop_after_counter < 0 && length < buffer_size / 2) {
|
||||
radio_dma_transfer_stop_after_counter = 2;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
void radio_init_si4063()
|
||||
{
|
||||
pwm_handle_dma_transfer_half = radio_si4063_handle_pwm_transfer_half;
|
||||
pwm_handle_dma_transfer_full = radio_si4063_handle_pwm_transfer_full;
|
||||
|
||||
if (si4063_use_dma) {
|
||||
pwm_data_timer_init();
|
||||
pwm_dma_init();
|
||||
}
|
||||
}
|
||||
#endif //DFM17
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef __RADIO_SI4063_H
|
||||
#define __RADIO_SI4063_H
|
||||
|
||||
#ifdef DFM17
|
||||
#include "radio_internal.h"
|
||||
|
||||
bool radio_start_transmit_si4063(radio_transmit_entry *entry, radio_module_state *shared_state);
|
||||
bool radio_transmit_symbol_si4063(radio_transmit_entry *entry, radio_module_state *shared_state);
|
||||
void radio_handle_main_loop_si4063(radio_transmit_entry *entry, radio_module_state *shared_state);
|
||||
void radio_handle_data_timer_si4063();
|
||||
bool radio_stop_transmit_si4063(radio_transmit_entry *entry, radio_module_state *shared_state);
|
||||
void radio_init_si4063();
|
||||
#endif //DFM17
|
||||
#endif //__RADIO_SI4063_H
|