BS版图形系统 - 整合C++到JS中

STM32F429标准库驱动AD9834 DDS芯片实战:SPI时序、寄存器控制与相位连续切换 DDS(直接数字频率合成)是一种通过数字方式生成高精度、可编程波形的核心技术,其原理基于相位累加器与波形查找表,具备频率分辨率高、跳变快、相位可控等显著优势。在嵌入式系统中,AD9834作为经典12.5 MHz DDS芯片,常与STM32F429等高性能MCU协同实现信号源、扫频仪、函数发生器等应用。但其技术价值不仅在于‘能出波’,更在于对SPI时序的严苛要求、双寄存器组的原子切换能力,以及相位连续性保障机制。本文围绕AD9834与STM32F429标准库的深度适配,详解MODE0下SCLK下降沿采样、FS 阅读详情


QQ: 282397369
几个月下来,JavaScript/TypeScript算是基本入门了,也能编一些自认为满意的效果。从正常预期来看,BS版能达到桌面应用的效果,这可作为一个方向。
图形的应用场合很多,画电路气路液路图只是其中一个。当然在做的过程中,也比较随意,突然发现可以先做思维导图,然后居然也实现了一个初版。
在这里插入图片描述
又有点心痒,准备把这个也做得专业一点,至少先达到百度脑图的效果,然后再加上一些实用功能。
顺便看了下百度脑图,觉得界面设计上比较好,其工具栏有初步的Ribbon风格。
那就先做一个Ribbon风格的工具栏先。
先还比较顺利,但慢慢却发现一个不大不小的问题,之前各按钮的排列对齐都是左对齐,居然出不了两行
在这里插入图片描述
真是岂有此理。深究发现是计算位置时的逻辑要复杂一些,用TypeScripe进行内存操作、数组处理还比较麻烦(可能是还没有掌握相应知识点)。要是能用C++就好了。
感叹的时候,顺便在网上转了下,突然发现,用emscripten就可以把C++整合进来。
那就花两天时间把这个功能看看究竟。

C/C++面向WebAssembly编程

挑重点看了下这个教程,麻溜地实现了C++整合。中间也填了不少坑,但现在也忘了有哪些坑。
整合了结果,以后慢慢梳理。
基础东东就看上面的教程。以下内容就是一些知识点的调试汇总,两天时间就在折腾这个,中间过程给记不清了。

C++代码

#pragma region 调用JS函数
EMAPI(int) js_add(int a, int b);
EMAPI(void) js_console_log(int param);

#pragma end_region


#pragma region 一些通用功能函数
EMAPI(void) free_buf(void * buf) {
	free(buf);
}

EMAPI(int) add(int a, int b) {
	a = js_add(a, b) * a;
	js_console_log(a);
	return a * b * a + b;
}

EMAPI(const char *)get_string() {
	const char * str = "Hello, wolrd! 你好,世界,归根结底是那帮孙子的!";
	return str;
}

EMAPI(int *) fibonacci_M(int count) {
	if (count <= 0) return NULL;
	int* re = (int*)malloc(count * 4);
	if (NULL == re) {
		printf("Not enough memory.\n");
		return NULL;
	}
	re[0] = 1;
	int i0 = 0, i1 = 1;
	for (int i = 1; i < count; i++){
		re[i] = i0 + i1;
		i0 = i1;
		i1 = re[i];
	}
	return re;
}
#pragma end_region

#pragma region 测试函数

int globalValue_Int = 31;
double globalValue_Double = 3.1415926;

EMAPI(int *) get_int_ptr() {
	return &globalValue_Int;
}

EMAPI(double *) get_double_ptr() {
	return &globalValue_Double;
}

EMAPI(void) print_global_value() {
	printf("C{globalValue_Int: %d}\n", globalValue_Int);
	printf("C{globalValue_Double: %lf}\n", globalValue_Double);
}
#pragma end_region


EMAPI(int) main(int argc, char ** argv) { //
  printf("Hello World from C++ by DrGraph!\n");
  emscripten_run_script("console.log('你好,Emscripten! Printed from C++ via emscripten_run_script')");
//  EASM(console.log(''));
  return 0;
}

EMAPI(int) myFunction(int argc, char ** argv) { //
  printf("从JS里调用C++函数\n");
  return 1;
}

加上类的C++代码


enum NClassType {
	ctBaseObject = 0
};

class TObject {
private:
	std::atomic<int> refCount;
	NClassType classType;
	char * name;
public:
	__fastcall TObject();

	void __fastcall AddRef();
	int __fastcall Release();
	virtual const char * __fastcall GetHint();
	virtual void __fastcall SetName(char * value) { name = value; }
	virtual char * __fastcall GetName() { return name; }
};


#pragma region TObject

__fastcall TObject::TObject() {
	refCount = 1;
	classType = ctBaseObject;
	name = (char *)("Default Object");
}

void __fastcall TObject::AddRef() {
	++refCount;
}

int __fastcall TObject::Release() {
	int t = --refCount;
	if(t == 0)	delete this;
	return t;
}

const char * __fastcall TObject::GetHint() {
    return "TObject";
}
#pragma end_region

#pragma region 输出供JS调用函数
EMAPI(TObject *) __fastcall New(int type) {
	if(ctBaseObject == type)
		return new TObject;
	return NULL;
}

EMAPI(void) __fastcall Delete(TObject * object) {
    delete object;
}

EMAPI(const char *) __fastcall GetProperty(TObject * object, char * propertyName) {
	if(strcasecmp(propertyName, "Hint") == 0)
		return object->GetHint();
	if(strcasecmp(propertyName, "Name") == 0)
		return object->GetName();

	return "Undefined";
}

EMAPI(void) __fastcall SetProperty(TObject * object, char * propertyName, char * propertyValue) {
	if(strcasecmp(propertyName, "Name") == 0)
		object->SetName(propertyValue);
}
#pragma end_region

JS调用代码

estCPP() {
		DrGraph.Debug(`_testFun(4, 6) = ${DrCPP.cpp._add(4, 6)}`);
		let count = 20;
		let fibo = new cPointer(DrCPP.cpp._fibonacci_M(count), NDataTypeC.int32, count);
		if (fibo.ptr) {
			console.log(fibo.toString());
			fibo.Free();
		}

		let testI = new cPointer(DrCPP.cpp._get_int_ptr());
		DrGraph.Debug(`global int value = ${testI.getValueAt(0)}`);
		testI.setValueAt(0, 123);
		let testD = new cPointer(DrCPP.cpp._get_double_ptr(), NDataTypeC.double);
		DrGraph.Debug(`global double value = ${testD.getValueAt(0)}`);
		testD.setValueAt(0, 123.456457);
		this.cpp._print_global_value();

		var ptr = DrCPP.cpp._get_string();
		var str = DrCPP.cpp.UTF8ToString(ptr);
		DrGraph.Debug(`${str} 长度为 ${DrCPP.cpp.lengthBytesUTF8(str)}  [汉字长度为3!!!]`, "字符串");
		var result = DrCPP.cpp.ccall('add', 'number', ['number', 'number'], [13, 42]);
		console.log(result, "通过ccall调用");
		str = 'The answer is:42';
		DrCPP.cpp.ccall('print_string', 'null', ['string'], [str]);
		var s = DrCPP.cpp._Sum_New();
		console.log(DrCPP.cpp._Sum_Inc(s, 29));
		DrCPP.cpp._Sum_Delete(s);

		let object = DrCPP.cpp.New(0);
		DrGraph.Debug(object);
		DrGraph.Debug(DrCPP.cpp.GetProperty(object, "name"));
		DrCPP.cpp.SetProperty(object, "name", "Name Changed by DrGraph");
		DrGraph.Debug(DrCPP.cpp.GetProperty(object, "name"));
		DrCPP.cpp.Delete(object);
	}

运行结果

在这里插入图片描述
这C++的运行结果就整合进来了。明天尝试做Ribbon风格工具栏。

一个实现BS结构的c++程序 为新手介绍如何使用c++语言实现b/s结构 立即下载

相关推荐

VC实现BS结构编程

VC实现BS结构编程,本人学习的代码,是《黑客编程》中的一段原代码,对于那些想通VC实现BS编程的朋友来说是最好的参考代码!

【原】作为前端需要了解的B/S架构

其实B/S架构是属于后台方面的东西,不过作为一个前端,也是需要了解一下滴 C/S架构简要介绍 在了解什么是B/S架构之前,我们有必要了解一下什么是C/S架构: C/S架构是第一种比较早的软件架构,主要用于局域网内。也叫客户机/服务器模式。 它可以分为客户机和服务器两层:第一层是在客户机系统上结合了界面显示与业务逻辑,第二层是通过网络结合了数据库服务器。 简...

weixin_33775572的博客 3463

BS架构实现的学生成绩管理

B/S架构,使用C++语言,基本的增删改查功能,含有主要代码

C/C++嵌入BS架构的页面

最近项目要用C/C++来嵌入BS的网页,经调研发现使用QT Creator工具有直接能用的组件。废话不多说直接上代码。 第一步:创建Qt Widgets项目并修改项目.pro文件添加如下一句 QT += core gui webenginewidgets 第二步:在main.cpp代码里直接调用代码 #include "mainwindow.h" #include <QWebEngineView> #include <QWebEngineView&...

washingtin的专栏 3001

基于深度学习的时间序列预测

深度学习在时间序列数据中应用广泛,学术界已经有很多深度学习模型来适应不同领域的时间序列数据集的多样性。那么到底有哪些基于深度学习的时间序列预测模型?他们的优缺点是什么?让我们一起来看一下。

Sharon0408的博客 6580

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6563

BS调用本地应用程序的步骤

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34114823的博客 828

陀螺仪选型避坑指南:为什么IMU660RA是智能车竞赛的性价比之选?

本文针对智能车竞赛场景,提供陀螺仪选型避坑指南,并深度解析为何IMU660RA成为性价比之选。文章指出,竞赛选型应避免盲目追求高性能“黑盒”模块,而应注重原始数据获取与算法开发。IMU660RA以其良好的常温稳定性、适中的噪声水平、极致的性价比和丰富的生态支持,成为帮助参赛者深入理解姿态解算原理、进行“白盒开发”的理想教学与实践平台。

tech5的博客 879

想做C语言/C++开发?这些才是你该学的东西!

1,常见的观点:

Miscedencei的博客 432

【实战指南】OpenClaw Telegram 群聊不响应完整解决方案:从获取群 ID 到关闭隐私模式全流程

将整个从“获取群组 ID → 配置 OpenClaw Telegram 通道 → 关闭隐私模式 → 测试”的全流程都整合进去。

hampeter的博客 3488

Cadence 17.2配置CIS数据库报错?手把手解决ODBC驱动位数不匹配问题

本文详细解析了Cadence 17.2配置CIS数据库时常见的ODBC驱动位数不匹配问题,提供了从系统环境检查到分步解决方案的完整指南。重点解决32位应用程序与64位ODBC驱动之间的架构冲突,包含驱动安装、DSN配置及高级排查技巧,帮助电子工程师快速恢复设计环境。

play7的博客 970

C++/JS混合开发

1.JS &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Demo&lt;/title&gt; &lt;script type="text/javascript" src="js/channel.js&quot

冷月醉雪的博客 8566

深入解析CycloneDDS跨域通信中的XML配置文件优化策略

本文深入解析了CycloneDDS跨域通信中XML配置文件的优化策略,重点介绍了网络接口配置、多播设置、性能调优参数及复杂场景下的配置案例。通过实战技巧和调试方法,帮助开发者在SoC环境中实现高效稳定的跨域通信,提升系统性能。

soda5的博客 688

BST的C++实现

BST首先是二叉树,对应的二叉树定义和常用操作封装在以下头文件"bintree.h" // 二叉树的头文件 #ifndef bintree_h #define bintree_h #include <iostream> using namespace std; template<class Elem> struct BinNode{ Elem data; ...

吉大秦少游 1434

基于STM32L4XX、HAL库的TESEO-LIV4FTR定位模块驱动程序设计

支持多星座系统:GPS、GLONASS、Galileo和北斗。支持NMEA 0183协议和ST专有协议。高灵敏度:-167dBm跟踪灵敏度。低功耗设计,适合物联网和便携设备。内置LNA和SAW滤波器。

zhusl6688的博客 237

基于MATLAB的BOC调制信号捕获算法仿真

然而,在实际的使用过程中,由于室内信号衰减以及遮挡等因素的影响,接收机在GPS信号弱化时会很容易丢失导航信息。与其他的调制方式相比,BOC具有较好的抗多径性能和更高的频带效率。通过本文的介绍,我们可以更加深入地了解BOC调制信号的捕获算法,并且掌握了如何使用MATLAB软件对其进行仿真实现。通过实验数据的分析,我们可以看出该算法对于BOC调制信号的捕获具有较高的准确率和稳定性,因此具有一定的工程应用价值。在BOC调制完成后,我们需要进行信号的捕获,这一步涵盖了信号检测、码偏差估计、载波频率估计等过程。

2301_79326559的博客 567

c语言做bs架构_BS架构技术方案 Technology

1体系结构系统平台模式大体上分为4种:主机终端模式、文件服务器模式、客户机/服务器模式(Client/Server,简称C/S)和Web浏览器/服务器模式(Browser/Server,简称B/S)。主机终端模式由于硬件选择有限,硬件投资得不到保证,已被逐步淘汰。而文件服务器模式只适用小规模的局域网,对于用户多、数据量大的情况就会产生网络瓶颈,特别是在与互联网的结合上不能满足用户要求。因此,平台模...

weixin_39686353的博客 861

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Google V8 引擎 原理详解

Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM 的处理器,如 HTC G7 等 )。V8 最早被开发用以嵌入到 Google 的开源浏览器 Chrome 中,但是 V8 是一个可以独立的模块,完全可以嵌入您自己的应用,著名的 Node.js( 一个异步的服务器框架,可以在服务端使用 JavaScript 写出高效的网络服务器 ) 就是基于 V8 引擎的。 和其他 JavaScript

啊渊的专栏 2448

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

学了 C 语言到底能做什么, 能从事什么工作?(附课程)

资源放在前面,不想看下面的啰嗦请直接拿走。不做伸手党,请留个赞再走哦! 1、零基础学C语言,老九零基础学习编程系列之一 老九学堂 徐嵩老师主讲https://www.bilibili.com/video/BV1ax411k7P6 2、尚硅谷超经典C语言全套教程完整版(C语言零基础快速入门到精通) https://www.bilibili.com/video/BV1qJ411z7Hf 3、C语言基础-浙江大学 C语言基础课程,非常适合初学C语言的同学们 https://www.bilibili.com/vid

farley的成长之路 6481

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++之父谈C++--By BS

1. 请谈谈C++书。 没有,也不可能有一本书对于所有人来说都是最好的。不过对于那些真正的程序员来说,如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的The C++ Programming Language, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全独立于平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验

wolangjushi的专栏 2991
上一篇: BS版图形系统 - OpenCV - 第4章笔记
下一篇: BS版图形系统 - Ribbon工具栏初步
DrGraph
博客等级 码龄14年 228粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值